@jupyterlab/apputils-extension 4.0.0-alpha.2 → 4.0.0-alpha.21

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.
Files changed (43) hide show
  1. package/lib/announcements.d.ts +2 -0
  2. package/lib/announcements.js +227 -0
  3. package/lib/announcements.js.map +1 -0
  4. package/lib/index.js +41 -8
  5. package/lib/index.js.map +1 -1
  6. package/lib/notificationplugin.d.ts +5 -0
  7. package/lib/notificationplugin.js +504 -0
  8. package/lib/notificationplugin.js.map +1 -0
  9. package/lib/palette.js +3 -3
  10. package/lib/palette.js.map +1 -1
  11. package/lib/settingconnector.js +4 -0
  12. package/lib/settingconnector.js.map +1 -1
  13. package/lib/settingsplugin.js +8 -2
  14. package/lib/settingsplugin.js.map +1 -1
  15. package/lib/statusbarplugin.d.ts +7 -0
  16. package/lib/statusbarplugin.js +96 -0
  17. package/lib/statusbarplugin.js.map +1 -0
  18. package/lib/themesplugins.js +3 -0
  19. package/lib/themesplugins.js.map +1 -1
  20. package/lib/toolbarregistryplugin.js +5 -1
  21. package/lib/toolbarregistryplugin.js.map +1 -1
  22. package/lib/workspacesplugin.js +6 -6
  23. package/lib/workspacesplugin.js.map +1 -1
  24. package/package.json +27 -22
  25. package/schema/notification.json +48 -0
  26. package/schema/palette.json +2 -0
  27. package/schema/sanitizer.json +25 -0
  28. package/src/announcements.ts +297 -0
  29. package/src/index.ts +684 -0
  30. package/src/notificationplugin.tsx +902 -0
  31. package/src/palette.ts +213 -0
  32. package/src/settingconnector.ts +63 -0
  33. package/src/settingsplugin.ts +65 -0
  34. package/src/statusbarplugin.ts +145 -0
  35. package/src/themesplugins.ts +266 -0
  36. package/src/toolbarregistryplugin.ts +29 -0
  37. package/src/workspacesplugin.ts +306 -0
  38. package/style/base.css +1 -1
  39. package/style/index.css +1 -0
  40. package/style/index.js +1 -0
  41. package/style/notification.css +227 -0
  42. package/style/splash.css +4 -0
  43. package/style/redirect.css +0 -15
@@ -0,0 +1,266 @@
1
+ /* -----------------------------------------------------------------------------
2
+ | Copyright (c) Jupyter Development Team.
3
+ | Distributed under the terms of the Modified BSD License.
4
+ |----------------------------------------------------------------------------*/
5
+
6
+ import {
7
+ JupyterFrontEnd,
8
+ JupyterFrontEndPlugin
9
+ } from '@jupyterlab/application';
10
+ import {
11
+ ICommandPalette,
12
+ ISplashScreen,
13
+ IThemeManager,
14
+ ThemeManager
15
+ } from '@jupyterlab/apputils';
16
+ import { PageConfig, URLExt } from '@jupyterlab/coreutils';
17
+ import { IMainMenu } from '@jupyterlab/mainmenu';
18
+ import { ISettingRegistry } from '@jupyterlab/settingregistry';
19
+ import { ITranslator } from '@jupyterlab/translation';
20
+
21
+ namespace CommandIDs {
22
+ export const changeTheme = 'apputils:change-theme';
23
+
24
+ export const themeScrollbars = 'apputils:theme-scrollbars';
25
+
26
+ export const changeFont = 'apputils:change-font';
27
+
28
+ export const incrFontSize = 'apputils:incr-font-size';
29
+
30
+ export const decrFontSize = 'apputils:decr-font-size';
31
+ }
32
+
33
+ /**
34
+ * The default theme manager provider.
35
+ */
36
+ export const themesPlugin: JupyterFrontEndPlugin<IThemeManager> = {
37
+ id: '@jupyterlab/apputils-extension:themes',
38
+ requires: [ISettingRegistry, JupyterFrontEnd.IPaths, ITranslator],
39
+ optional: [ISplashScreen],
40
+ activate: (
41
+ app: JupyterFrontEnd,
42
+ settings: ISettingRegistry,
43
+ paths: JupyterFrontEnd.IPaths,
44
+ translator: ITranslator,
45
+ splash: ISplashScreen | null
46
+ ): IThemeManager => {
47
+ const trans = translator.load('jupyterlab');
48
+ const host = app.shell;
49
+ const commands = app.commands;
50
+ const url = URLExt.join(PageConfig.getBaseUrl(), paths.urls.themes);
51
+ const key = themesPlugin.id;
52
+ const manager = new ThemeManager({
53
+ key,
54
+ host,
55
+ settings,
56
+ splash: splash ?? undefined,
57
+ url
58
+ });
59
+
60
+ // Keep a synchronously set reference to the current theme,
61
+ // since the asynchronous setting of the theme in `changeTheme`
62
+ // can lead to an incorrect toggle on the currently used theme.
63
+ let currentTheme: string;
64
+
65
+ manager.themeChanged.connect((sender, args) => {
66
+ // Set data attributes on the application shell for the current theme.
67
+ currentTheme = args.newValue;
68
+ document.body.dataset.jpThemeLight = String(
69
+ manager.isLight(currentTheme)
70
+ );
71
+ document.body.dataset.jpThemeName = currentTheme;
72
+ if (
73
+ document.body.dataset.jpThemeScrollbars !==
74
+ String(manager.themeScrollbars(currentTheme))
75
+ ) {
76
+ document.body.dataset.jpThemeScrollbars = String(
77
+ manager.themeScrollbars(currentTheme)
78
+ );
79
+ }
80
+
81
+ commands.notifyCommandChanged(CommandIDs.changeTheme);
82
+ });
83
+
84
+ commands.addCommand(CommandIDs.changeTheme, {
85
+ label: args => {
86
+ if (args.theme === undefined) {
87
+ return trans.__('Switch to the provided `theme`.');
88
+ }
89
+ const theme = args['theme'] as string;
90
+ const displayName = manager.getDisplayName(theme);
91
+ return args['isPalette']
92
+ ? trans.__('Use Theme: %1', displayName)
93
+ : displayName;
94
+ },
95
+ isToggled: args => args['theme'] === currentTheme,
96
+ execute: args => {
97
+ const theme = args['theme'] as string;
98
+ if (theme === manager.theme) {
99
+ return;
100
+ }
101
+ return manager.setTheme(theme);
102
+ }
103
+ });
104
+
105
+ commands.addCommand(CommandIDs.themeScrollbars, {
106
+ label: trans.__('Theme Scrollbars'),
107
+ isToggled: () => manager.isToggledThemeScrollbars(),
108
+ execute: () => manager.toggleThemeScrollbars()
109
+ });
110
+
111
+ commands.addCommand(CommandIDs.changeFont, {
112
+ label: args =>
113
+ args['enabled'] ? `${args['font']}` : trans.__('waiting for fonts'),
114
+ isEnabled: args => args['enabled'] as boolean,
115
+ isToggled: args => manager.getCSS(args['key'] as string) === args['font'],
116
+ execute: args =>
117
+ manager.setCSSOverride(args['key'] as string, args['font'] as string)
118
+ });
119
+
120
+ commands.addCommand(CommandIDs.incrFontSize, {
121
+ label: args => {
122
+ switch (args.key) {
123
+ case 'code-font-size':
124
+ return trans.__('Increase Code Font Size');
125
+ case 'content-font-size1':
126
+ return trans.__('Increase Content Font Size');
127
+ case 'ui-font-size1':
128
+ return trans.__('Increase UI Font Size');
129
+ default:
130
+ return trans.__('Increase Font Size');
131
+ }
132
+ },
133
+ execute: args => manager.incrFontSize(args['key'] as string)
134
+ });
135
+
136
+ commands.addCommand(CommandIDs.decrFontSize, {
137
+ label: args => {
138
+ switch (args.key) {
139
+ case 'code-font-size':
140
+ return trans.__('Decrease Code Font Size');
141
+ case 'content-font-size1':
142
+ return trans.__('Decrease Content Font Size');
143
+ case 'ui-font-size1':
144
+ return trans.__('Decrease UI Font Size');
145
+ default:
146
+ return trans.__('Decrease Font Size');
147
+ }
148
+ },
149
+ execute: args => manager.decrFontSize(args['key'] as string)
150
+ });
151
+
152
+ return manager;
153
+ },
154
+ autoStart: true,
155
+ provides: IThemeManager
156
+ };
157
+
158
+ /**
159
+ * The default theme manager's UI command palette and main menu functionality.
160
+ *
161
+ * #### Notes
162
+ * This plugin loads separately from the theme manager plugin in order to
163
+ * prevent blocking of the theme manager while it waits for the command palette
164
+ * and main menu to become available.
165
+ */
166
+ export const themesPaletteMenuPlugin: JupyterFrontEndPlugin<void> = {
167
+ id: '@jupyterlab/apputils-extension:themes-palette-menu',
168
+ requires: [IThemeManager, ITranslator],
169
+ optional: [ICommandPalette, IMainMenu],
170
+ activate: (
171
+ app: JupyterFrontEnd,
172
+ manager: IThemeManager,
173
+ translator: ITranslator,
174
+ palette: ICommandPalette | null,
175
+ mainMenu: IMainMenu | null
176
+ ): void => {
177
+ const trans = translator.load('jupyterlab');
178
+
179
+ // If we have a main menu, add the theme manager to the settings menu.
180
+ if (mainMenu) {
181
+ void app.restored.then(() => {
182
+ const isPalette = false;
183
+
184
+ const themeMenu = mainMenu.settingsMenu.items.find(
185
+ item =>
186
+ item.type === 'submenu' &&
187
+ item.submenu?.id === 'jp-mainmenu-settings-apputilstheme'
188
+ )?.submenu;
189
+
190
+ // choose a theme
191
+ if (themeMenu) {
192
+ manager.themes.forEach((theme, index) => {
193
+ themeMenu.insertItem(index, {
194
+ command: CommandIDs.changeTheme,
195
+ args: { isPalette, theme }
196
+ });
197
+ });
198
+ }
199
+ });
200
+ }
201
+
202
+ // If we have a command palette, add theme switching options to it.
203
+ if (palette) {
204
+ void app.restored.then(() => {
205
+ const category = trans.__('Theme');
206
+ const command = CommandIDs.changeTheme;
207
+ const isPalette = true;
208
+
209
+ // choose a theme
210
+ manager.themes.forEach(theme => {
211
+ palette.addItem({ command, args: { isPalette, theme }, category });
212
+ });
213
+
214
+ // toggle scrollbar theming
215
+ palette.addItem({ command: CommandIDs.themeScrollbars, category });
216
+
217
+ // increase/decrease code font size
218
+ palette.addItem({
219
+ command: CommandIDs.incrFontSize,
220
+ args: {
221
+ key: 'code-font-size'
222
+ },
223
+ category
224
+ });
225
+ palette.addItem({
226
+ command: CommandIDs.decrFontSize,
227
+ args: {
228
+ key: 'code-font-size'
229
+ },
230
+ category
231
+ });
232
+ // increase/decrease content font size
233
+ palette.addItem({
234
+ command: CommandIDs.incrFontSize,
235
+ args: {
236
+ key: 'content-font-size1'
237
+ },
238
+ category
239
+ });
240
+ palette.addItem({
241
+ command: CommandIDs.decrFontSize,
242
+ args: {
243
+ key: 'content-font-size1'
244
+ },
245
+ category
246
+ });
247
+ // increase/decrease ui font size
248
+ palette.addItem({
249
+ command: CommandIDs.incrFontSize,
250
+ args: {
251
+ key: 'ui-font-size1'
252
+ },
253
+ category
254
+ });
255
+ palette.addItem({
256
+ command: CommandIDs.decrFontSize,
257
+ args: {
258
+ key: 'ui-font-size1'
259
+ },
260
+ category
261
+ });
262
+ });
263
+ }
264
+ },
265
+ autoStart: true
266
+ };
@@ -0,0 +1,29 @@
1
+ /*
2
+ * Copyright (c) Jupyter Development Team.
3
+ * Distributed under the terms of the Modified BSD License.
4
+ */
5
+
6
+ import {
7
+ JupyterFrontEnd,
8
+ JupyterFrontEndPlugin
9
+ } from '@jupyterlab/application';
10
+ import {
11
+ createDefaultFactory,
12
+ IToolbarWidgetRegistry,
13
+ ToolbarWidgetRegistry
14
+ } from '@jupyterlab/apputils';
15
+
16
+ /**
17
+ * The default toolbar registry.
18
+ */
19
+ export const toolbarRegistry: JupyterFrontEndPlugin<IToolbarWidgetRegistry> = {
20
+ id: '@jupyterlab/apputils-extension:toolbar-registry',
21
+ autoStart: true,
22
+ provides: IToolbarWidgetRegistry,
23
+ activate: (app: JupyterFrontEnd) => {
24
+ const registry = new ToolbarWidgetRegistry({
25
+ defaultFactory: createDefaultFactory(app.commands)
26
+ });
27
+ return registry;
28
+ }
29
+ };
@@ -0,0 +1,306 @@
1
+ // Copyright (c) Jupyter Development Team.
2
+ // Distributed under the terms of the Modified BSD License.
3
+
4
+ import {
5
+ IRouter,
6
+ JupyterFrontEnd,
7
+ JupyterFrontEndPlugin
8
+ } from '@jupyterlab/application';
9
+ import { Dialog, IWindowResolver, showDialog } from '@jupyterlab/apputils';
10
+ import { URLExt } from '@jupyterlab/coreutils';
11
+ import {
12
+ ABCWidgetFactory,
13
+ DocumentRegistry,
14
+ DocumentWidget,
15
+ IDocumentWidget
16
+ } from '@jupyterlab/docregistry';
17
+ import { IDefaultFileBrowser } from '@jupyterlab/filebrowser';
18
+ import { Contents, Workspace, WorkspaceManager } from '@jupyterlab/services';
19
+ import { IStateDB } from '@jupyterlab/statedb';
20
+ import { ITranslator, nullTranslator } from '@jupyterlab/translation';
21
+ import { Widget } from '@lumino/widgets';
22
+
23
+ namespace CommandIDs {
24
+ export const saveWorkspace = 'workspace-ui:save';
25
+
26
+ export const saveWorkspaceAs = 'workspace-ui:save-as';
27
+ }
28
+
29
+ const WORKSPACE_NAME = 'jupyterlab-workspace';
30
+ const WORKSPACE_EXT = '.' + WORKSPACE_NAME;
31
+ const LAST_SAVE_ID = 'workspace-ui:lastSave';
32
+ const ICON_NAME = 'jp-JupyterIcon';
33
+
34
+ /**
35
+ * The workspace MIME renderer and save plugin.
36
+ */
37
+ export const workspacesPlugin: JupyterFrontEndPlugin<void> = {
38
+ id: '@jupyterlab/apputils-extension:workspaces',
39
+ autoStart: true,
40
+ requires: [
41
+ IDefaultFileBrowser,
42
+ IWindowResolver,
43
+ IStateDB,
44
+ ITranslator,
45
+ JupyterFrontEnd.IPaths
46
+ ],
47
+ optional: [IRouter],
48
+ activate: (
49
+ app: JupyterFrontEnd,
50
+ fileBrowser: IDefaultFileBrowser,
51
+ resolver: IWindowResolver,
52
+ state: IStateDB,
53
+ translator: ITranslator,
54
+ paths: JupyterFrontEnd.IPaths,
55
+ router: IRouter | null
56
+ ): void => {
57
+ // The workspace factory creates dummy widgets to load a new workspace.
58
+ const factory = new Private.WorkspaceFactory({
59
+ workspaces: app.serviceManager.workspaces,
60
+ router,
61
+ state,
62
+ translator,
63
+ paths
64
+ });
65
+ const trans = translator.load('jupyterlab');
66
+
67
+ app.docRegistry.addFileType({
68
+ name: WORKSPACE_NAME,
69
+ contentType: 'file',
70
+ fileFormat: 'text',
71
+ displayName: trans.__('JupyterLab workspace File'),
72
+ extensions: [WORKSPACE_EXT],
73
+ mimeTypes: ['text/json'],
74
+ iconClass: ICON_NAME
75
+ });
76
+ app.docRegistry.addWidgetFactory(factory);
77
+ app.commands.addCommand(CommandIDs.saveWorkspaceAs, {
78
+ label: trans.__('Save Current Workspace As…'),
79
+ execute: async () => {
80
+ const data = app.serviceManager.workspaces.fetch(resolver.name);
81
+ await Private.saveAs(
82
+ fileBrowser,
83
+ app.serviceManager.contents,
84
+ data,
85
+ state,
86
+ translator
87
+ );
88
+ }
89
+ });
90
+
91
+ app.commands.addCommand(CommandIDs.saveWorkspace, {
92
+ label: trans.__('Save Current Workspace'),
93
+ execute: async () => {
94
+ const { contents } = app.serviceManager;
95
+ const data = app.serviceManager.workspaces.fetch(resolver.name);
96
+ const lastSave = (await state.fetch(LAST_SAVE_ID)) as string;
97
+ if (lastSave === undefined) {
98
+ await Private.saveAs(fileBrowser, contents, data, state, translator);
99
+ } else {
100
+ await Private.save(lastSave, contents, data, state);
101
+ }
102
+ }
103
+ });
104
+ }
105
+ };
106
+
107
+ namespace Private {
108
+ /**
109
+ * Save workspace to a user provided location
110
+ */
111
+ export async function save(
112
+ userPath: string,
113
+ contents: Contents.IManager,
114
+ data: Promise<Workspace.IWorkspace>,
115
+ state: IStateDB
116
+ ): Promise<void> {
117
+ let name = userPath.split('/').pop();
118
+
119
+ // Add extension if not provided or remove extension from name if it was.
120
+ if (name !== undefined && name.includes('.')) {
121
+ name = name.split('.')[0];
122
+ } else {
123
+ userPath = userPath + WORKSPACE_EXT;
124
+ }
125
+
126
+ // Save last save location, for save button to work
127
+ await state.save(LAST_SAVE_ID, userPath);
128
+
129
+ const resolvedData = await data;
130
+ resolvedData.metadata.id = `${name}`;
131
+ await contents.save(userPath, {
132
+ type: 'file',
133
+ format: 'text',
134
+ content: JSON.stringify(resolvedData)
135
+ });
136
+ }
137
+
138
+ /**
139
+ * Ask user for location, and save workspace.
140
+ * Default location is the current directory in the file browser
141
+ */
142
+ export async function saveAs(
143
+ browser: IDefaultFileBrowser,
144
+ contents: Contents.IManager,
145
+ data: Promise<Workspace.IWorkspace>,
146
+ state: IStateDB,
147
+ translator?: ITranslator
148
+ ): Promise<void> {
149
+ translator = translator || nullTranslator;
150
+ const lastSave = await state.fetch(LAST_SAVE_ID);
151
+
152
+ let defaultName;
153
+ if (lastSave === undefined) {
154
+ defaultName = 'new-workspace';
155
+ } else {
156
+ defaultName = (lastSave as string).split('/').pop()?.split('.')[0];
157
+ }
158
+
159
+ const defaultPath = browser.model.path + '/' + defaultName + WORKSPACE_EXT;
160
+ const userPath = await getSavePath(defaultPath, translator);
161
+
162
+ if (userPath) {
163
+ await save(userPath, contents, data, state);
164
+ }
165
+ }
166
+
167
+ /**
168
+ * This widget factory is used to handle double click on workspace
169
+ */
170
+ export class WorkspaceFactory extends ABCWidgetFactory<IDocumentWidget> {
171
+ /**
172
+ * Construct a widget factory that uploads a workspace and navigates to it.
173
+ *
174
+ * @param options - The instantiation options for a `WorkspaceFactory`.
175
+ */
176
+ constructor(options: WorkspaceFactory.IOptions) {
177
+ const trans = (options.translator || nullTranslator).load('jupyterlab');
178
+ super({
179
+ name: 'Workspace loader',
180
+ label: trans.__('Workspace loader'),
181
+ fileTypes: [WORKSPACE_NAME],
182
+ defaultFor: [WORKSPACE_NAME],
183
+ readOnly: true
184
+ });
185
+ this._application = options.paths.urls.app;
186
+ this._router = options.router;
187
+ this._state = options.state;
188
+ this._workspaces = options.workspaces;
189
+ }
190
+
191
+ /**
192
+ * Loads the workspace into load, and jump to it
193
+ * @param context This is used queried to query the workspace content
194
+ */
195
+ protected createNewWidget(
196
+ context: DocumentRegistry.Context
197
+ ): IDocumentWidget {
198
+ // Save a file's contents as a workspace and navigate to that workspace.
199
+ void context.ready.then(async () => {
200
+ const file = context.model;
201
+ const workspace = file.toJSON() as unknown as Workspace.IWorkspace;
202
+ const path = context.path;
203
+ const id = workspace.metadata.id;
204
+
205
+ // Save the file contents as a workspace.
206
+ await this._workspaces.save(id, workspace);
207
+
208
+ // Save last save location for the save command.
209
+ await this._state.save(LAST_SAVE_ID, path);
210
+
211
+ // Navigate to new workspace.
212
+ const url = URLExt.join(this._application, 'workspaces', id);
213
+ if (this._router) {
214
+ this._router.navigate(url, { hard: true });
215
+ } else {
216
+ document.location.href = url;
217
+ }
218
+ });
219
+ return dummyWidget(context);
220
+ }
221
+
222
+ private _application: string;
223
+ private _router: IRouter | null;
224
+ private _state: IStateDB;
225
+ private _workspaces: WorkspaceManager;
226
+ }
227
+
228
+ /**
229
+ * A namespace for `WorkspaceFactory`
230
+ */
231
+ export namespace WorkspaceFactory {
232
+ /**
233
+ * Instantiation options for a `WorkspaceFactory`
234
+ */
235
+ export interface IOptions {
236
+ paths: JupyterFrontEnd.IPaths;
237
+ router: IRouter | null;
238
+ state: IStateDB;
239
+ translator: ITranslator;
240
+ workspaces: WorkspaceManager;
241
+ }
242
+ }
243
+
244
+ /**
245
+ * Returns a dummy widget with disposed content that doesn't render in the UI.
246
+ *
247
+ * @param context - The file context.
248
+ */
249
+ function dummyWidget(context: DocumentRegistry.Context): IDocumentWidget {
250
+ const widget = new DocumentWidget({ content: new Widget(), context });
251
+ widget.content.dispose();
252
+ return widget;
253
+ }
254
+
255
+ /**
256
+ * Ask user for a path to save to.
257
+ * @param defaultPath Path already present when the dialog is shown
258
+ */
259
+ async function getSavePath(
260
+ defaultPath: string,
261
+ translator?: ITranslator
262
+ ): Promise<string | null> {
263
+ translator = translator || nullTranslator;
264
+ const trans = translator.load('jupyterlab');
265
+ const saveBtn = Dialog.okButton({ label: trans.__('Save') });
266
+ const result = await showDialog({
267
+ title: trans.__('Save Current Workspace As…'),
268
+ body: new SaveWidget(defaultPath),
269
+ buttons: [Dialog.cancelButton(), saveBtn]
270
+ });
271
+ if (result.button.label === trans.__('Save')) {
272
+ return result.value;
273
+ } else {
274
+ return null;
275
+ }
276
+ }
277
+
278
+ /**
279
+ * A widget that gets a file path from a user.
280
+ */
281
+ class SaveWidget extends Widget {
282
+ /**
283
+ * Gets a modal node for getting save location. Will have a default to the current opened directory
284
+ * @param path Default location
285
+ */
286
+ constructor(path: string) {
287
+ super({ node: createSaveNode(path) });
288
+ }
289
+
290
+ /**
291
+ * Gets the save path entered by the user
292
+ */
293
+ getValue(): string {
294
+ return (this.node as HTMLInputElement).value;
295
+ }
296
+ }
297
+
298
+ /**
299
+ * Create the node for a save widget.
300
+ */
301
+ function createSaveNode(path: string): HTMLElement {
302
+ const input = document.createElement('input');
303
+ input.value = path;
304
+ return input;
305
+ }
306
+ }
package/style/base.css CHANGED
@@ -4,5 +4,5 @@
4
4
  | Distributed under the terms of the Modified BSD License.
5
5
  |----------------------------------------------------------------------------*/
6
6
 
7
- @import './redirect.css';
7
+ @import './notification.css';
8
8
  @import './splash.css';
package/style/index.css CHANGED
@@ -6,6 +6,7 @@
6
6
  /* This file was auto-generated by ensurePackage() in @jupyterlab/buildutils */
7
7
  @import url('~@lumino/widgets/style/index.css');
8
8
  @import url('~@jupyterlab/ui-components/style/index.css');
9
+ @import url('~@jupyterlab/statusbar/style/index.css');
9
10
  @import url('~@jupyterlab/apputils/style/index.css');
10
11
  @import url('~@jupyterlab/docregistry/style/index.css');
11
12
  @import url('~@jupyterlab/application/style/index.css');
package/style/index.js CHANGED
@@ -6,6 +6,7 @@
6
6
  /* This file was auto-generated by ensurePackage() in @jupyterlab/buildutils */
7
7
  import '@lumino/widgets/style/index.js';
8
8
  import '@jupyterlab/ui-components/style/index.js';
9
+ import '@jupyterlab/statusbar/style/index.js';
9
10
  import '@jupyterlab/apputils/style/index.js';
10
11
  import '@jupyterlab/docregistry/style/index.js';
11
12
  import '@jupyterlab/application/style/index.js';