notebookEditor.ts 18.1 KB
Newer Older
P
Peng Lyu 已提交
1 2 3 4 5 6 7 8 9 10 11
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

import 'vs/css!./notebook';
import * as DOM from 'vs/base/browser/dom';
import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService';
import { IStorageService } from 'vs/platform/storage/common/storage';
P
Peng Lyu 已提交
12
import { NotebookEditorInput, NotebookEditorModel } from 'vs/workbench/contrib/notebook/browser/notebookEditorInput';
R
rebornix 已提交
13
import { EditorOptions, IEditorMemento } from 'vs/workbench/common/editor';
P
Peng Lyu 已提交
14 15 16 17
import { CancellationToken } from 'vs/base/common/cancellation';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { IModelService } from 'vs/editor/common/services/modelService';
import { getExtraColor } from 'vs/workbench/contrib/welcome/walkThrough/common/walkThroughUtils';
P
Peng Lyu 已提交
18 19
import { textLinkForeground, textLinkActiveForeground, focusBorder, textPreformatForeground, contrastBorder, textBlockQuoteBackground, textBlockQuoteBorder, editorBackground, foreground } from 'vs/platform/theme/common/colorRegistry';
import { WorkbenchList } from 'vs/platform/list/browser/listService';
P
Peng Lyu 已提交
20
import { IModeService } from 'vs/editor/common/services/modeService';
21
import { NotebookHandler, ViewCell, MarkdownCellRenderer, CodeCellRenderer, NotebookCellListDelegate, CELL_MARGIN } from 'vs/workbench/contrib/notebook/browser/cellRenderer';
R
rebornix 已提交
22
import { IEditorGroup, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService';
P
Peng Lyu 已提交
23
import { IWebviewService } from 'vs/workbench/contrib/webview/browser/webview';
P
Peng Lyu 已提交
24
import { BackLayerWebView } from 'vs/workbench/contrib/notebook/browser/contentWidget';
P
Peng Lyu 已提交
25
import { IMouseWheelEvent } from 'vs/base/browser/mouseEvent';
26
import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle';
R
rebornix 已提交
27
import { INotebookService } from 'vs/workbench/contrib/notebook/browser/notebookService';
28 29 30 31
import { BareFontInfo } from 'vs/editor/common/config/fontInfo';
import { IEditorOptions } from 'vs/editor/common/config/editorOptions';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { getZoomLevel } from 'vs/base/browser/browser';
R
rebornix 已提交
32
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
R
rebornix 已提交
33
import { INotebook } from 'vs/editor/common/modes';
R
rebornix 已提交
34
import { IContextKeyService, IContextKey, RawContextKey } from 'vs/platform/contextkey/common/contextkey';
P
Peng Lyu 已提交
35 36

const $ = DOM.$;
R
rebornix 已提交
37 38
const NOTEBOOK_EDITOR_VIEW_STATE_PREFERENCE_KEY = 'NotebookEditorViewState';

R
rebornix 已提交
39 40
export const NOTEBOOK_EDITOR_FOCUSED = new RawContextKey<boolean>('notebookEditorFocused', false);

R
rebornix 已提交
41 42 43
interface INotebookEditorViewState {
	editingCells: { [key: number]: boolean };
}
P
Peng Lyu 已提交
44

P
Peng Lyu 已提交
45
export class NotebookEditor extends BaseEditor implements NotebookHandler {
P
Peng Lyu 已提交
46 47 48
	static readonly ID: string = 'workbench.editor.notebook';
	private rootElement!: HTMLElement;
	private body!: HTMLElement;
P
Peng Lyu 已提交
49
	private contentWidgets!: HTMLElement;
P
Peng Lyu 已提交
50
	private webview: BackLayerWebView | null = null;
P
Peng Lyu 已提交
51

P
Peng Lyu 已提交
52
	private list: WorkbenchList<ViewCell> | undefined;
P
Peng Lyu 已提交
53
	private model: NotebookEditorModel | undefined;
R
rebornix 已提交
54 55
	private notebook: INotebook | undefined;
	private viewType: string | undefined;
P
Peng Lyu 已提交
56
	private viewCells: ViewCell[] = [];
57
	private localStore: DisposableStore = new DisposableStore();
R
rebornix 已提交
58
	private editorMemento: IEditorMemento<INotebookEditorViewState>;
59
	private fontInfo: BareFontInfo | undefined;
60 61
	private relayoutDisposable: IDisposable | null = null;
	private dimension: DOM.Dimension | null = null;
R
rebornix 已提交
62
	private editorFocus: IContextKey<boolean> | null = null;
P
Peng Lyu 已提交
63 64 65 66 67

	constructor(
		@ITelemetryService telemetryService: ITelemetryService,
		@IThemeService themeService: IThemeService,
		@IInstantiationService private readonly instantiationService: IInstantiationService,
P
Peng Lyu 已提交
68 69
		@IModelService private readonly modelService: IModelService,
		@IModeService private readonly modeService: IModeService,
P
Peng Lyu 已提交
70
		@IStorageService storageService: IStorageService,
R
rebornix 已提交
71
		@IWebviewService private webviewService: IWebviewService,
R
rebornix 已提交
72
		@INotebookService private notebookService: INotebookService,
73
		@IEditorGroupsService editorGroupService: IEditorGroupsService,
R
rebornix 已提交
74
		@IConfigurationService private readonly configurationService: IConfigurationService,
R
rebornix 已提交
75 76
		@IEnvironmentService private readonly environmentSerice: IEnvironmentService,
		@IContextKeyService private readonly contextKeyService: IContextKeyService
P
Peng Lyu 已提交
77 78
	) {
		super(NotebookEditor.ID, telemetryService, themeService, storageService);
R
rebornix 已提交
79 80

		this.editorMemento = this.getEditorMemento<INotebookEditorViewState>(editorGroupService, NOTEBOOK_EDITOR_VIEW_STATE_PREFERENCE_KEY);
P
Peng Lyu 已提交
81
	}
P
Peng Lyu 已提交
82

P
Peng Lyu 已提交
83 84 85 86 87 88 89 90 91 92 93
	get minimumWidth(): number { return 375; }
	get maximumWidth(): number { return Number.POSITIVE_INFINITY; }

	// these setters need to exist because this extends from BaseEditor
	set minimumWidth(value: number) { /*noop*/ }
	set maximumWidth(value: number) { /*noop*/ }


	protected createEditor(parent: HTMLElement): void {
		this.rootElement = DOM.append(parent, $('.notebook-editor'));
		this.createBody(this.rootElement);
94
		this.generateFontInfo();
R
rebornix 已提交
95 96 97 98 99 100 101 102
		this.editorFocus = NOTEBOOK_EDITOR_FOCUSED.bindTo(this.contextKeyService);
		this._register(this.onDidFocus(() => {
			this.editorFocus?.set(true);
		}));

		this._register(this.onDidBlur(() => {
			this.editorFocus?.set(false);
		}));
103 104 105 106 107
	}

	private generateFontInfo(): void {
		const editorOptions = this.configurationService.getValue<IEditorOptions>('editor');
		this.fontInfo = BareFontInfo.createFromRawSettings(editorOptions, getZoomLevel());
P
Peng Lyu 已提交
108 109 110
	}

	private createBody(parent: HTMLElement): void {
P
Peng Lyu 已提交
111
		this.body = document.createElement('div');
P
Peng Lyu 已提交
112 113 114
		DOM.addClass(this.body, 'cell-list-container');
		this.createCellList();
		DOM.append(parent, this.body);
P
Peng Lyu 已提交
115 116 117 118

		this.contentWidgets = document.createElement('div');
		DOM.addClass(this.contentWidgets, 'notebook-content-widgets');
		DOM.append(this.body, this.contentWidgets);
P
Peng Lyu 已提交
119 120
	}

P
Peng Lyu 已提交
121 122
	private createCellList(): void {
		DOM.addClass(this.body, 'cell-list-container');
P
Peng Lyu 已提交
123

P
Peng Lyu 已提交
124
		const renders = [
P
Peng Lyu 已提交
125 126
			this.instantiationService.createInstance(MarkdownCellRenderer, this),
			this.instantiationService.createInstance(CodeCellRenderer, this)
P
Peng Lyu 已提交
127 128
		];

P
Peng Lyu 已提交
129
		this.list = this.instantiationService.createInstance<typeof WorkbenchList, WorkbenchList<ViewCell>>(
P
Peng Lyu 已提交
130 131 132 133 134 135 136 137 138 139
			WorkbenchList,
			'NotebookCellList',
			this.body,
			this.instantiationService.createInstance(NotebookCellListDelegate),
			renders,
			{
				setRowLineHeight: false,
				supportDynamicHeights: true,
				horizontalScrolling: false,
				keyboardSupport: false,
R
rebornix 已提交
140
				mouseSupport: true,
P
Peng Lyu 已提交
141 142 143 144 145 146 147 148 149 150 151
				multipleSelectionSupport: false,
				overrideStyles: {
					listBackground: editorBackground,
					listActiveSelectionBackground: editorBackground,
					listActiveSelectionForeground: foreground,
					listFocusAndSelectionBackground: editorBackground,
					listFocusAndSelectionForeground: foreground,
					listFocusBackground: editorBackground,
					listFocusForeground: foreground,
					listHoverForeground: foreground,
					listHoverBackground: editorBackground,
152 153
					listHoverOutline: focusBorder,
					listFocusOutline: focusBorder,
154 155 156 157
					listInactiveSelectionBackground: editorBackground,
					listInactiveSelectionForeground: foreground,
					listInactiveFocusBackground: editorBackground,
					listInactiveFocusOutline: editorBackground,
P
Peng Lyu 已提交
158 159 160
				}
			}
		);
P
Peng Lyu 已提交
161

R
rebornix 已提交
162
		this.webview = new BackLayerWebView(this.webviewService, this.notebookService, this, this.environmentSerice);
P
Peng Lyu 已提交
163
		this.list.view.rowsContainer.appendChild(this.webview.element);
P
Peng Lyu 已提交
164 165 166
		this._register(this.list);
	}

167 168 169 170
	getFontInfo(): BareFontInfo | undefined {
		return this.fontInfo;
	}

171 172 173 174
	getListDimension(): DOM.Dimension | null {
		return this.dimension;
	}

P
Peng Lyu 已提交
175 176
	triggerWheel(event: IMouseWheelEvent) {
		this.list?.triggerScrollFromMouseWheelEvent(event);
P
Peng Lyu 已提交
177 178
	}

R
rebornix 已提交
179
	createContentWidget(cell: ViewCell, outputIndex: number, shadowContent: string, offset: number) {
180 181 182 183
		if (!this.webview) {
			return;
		}

P
Peng Lyu 已提交
184 185 186
		if (!this.webview!.mapping.has(cell.id)) {
			let index = this.model!.getNotebook().cells.indexOf(cell.cell);
			let top = this.list?.getElementTop(index) || 0;
187
			this.webview!.createContentWidget(cell, offset, shadowContent, top + offset);
R
rebornix 已提交
188 189 190 191 192 193
			this.webview!.outputMapping.set(cell.id + `-${outputIndex}`, true);
		} else if (!this.webview!.outputMapping.has(cell.id + `-${outputIndex}`)) {
			let index = this.model!.getNotebook().cells.indexOf(cell.cell);
			let top = this.list?.getElementTop(index) || 0;
			this.webview!.outputMapping.set(cell.id + `-${outputIndex}`, true);
			this.webview!.createContentWidget(cell, offset, shadowContent, top + offset);
P
Peng Lyu 已提交
194
		} else {
P
Peng Lyu 已提交
195 196 197 198
			let index = this.model!.getNotebook().cells.indexOf(cell.cell);
			let top = this.list?.getElementTop(index) || 0;
			let scrollTop = this.list?.scrollTop || 0;

199
			this.webview!.updateViewScrollTop(-scrollTop, [{ id: cell.id, top: top + offset }]);
P
Peng Lyu 已提交
200
		}
P
Peng Lyu 已提交
201
	}
P
Peng Lyu 已提交
202

P
Peng Lyu 已提交
203 204 205
	disposeViewCell(cell: ViewCell) {
	}

P
Peng Lyu 已提交
206
	onHide() {
R
rebornix 已提交
207 208 209 210 211
		this.viewCells.forEach(cell => {
			if (cell.getText() !== '') {
				cell.isEditing = false;
			}
		});
212 213 214 215 216 217 218 219 220 221

		if (this.webview) {
			this.localStore.clear();
			this.list?.view.rowsContainer.removeChild(this.webview?.element);
			this.webview?.dispose();
			this.webview = null;
		}

		this.list?.splice(0, this.list?.length);
		super.onHide();
P
Peng Lyu 已提交
222 223
	}

224
	setVisible(visible: boolean, group?: IEditorGroup): void {
R
rebornix 已提交
225
		super.setVisible(visible, group);
226
		if (!visible) {
R
rebornix 已提交
227 228 229 230 231
			this.viewCells.forEach(cell => {
				if (cell.getText() !== '') {
					cell.isEditing = false;
				}
			});
232 233 234
		}
	}

P
Peng Lyu 已提交
235
	setInput(input: NotebookEditorInput, options: EditorOptions | undefined, token: CancellationToken): Promise<void> {
R
rebornix 已提交
236 237 238 239
		if (this.input instanceof NotebookEditorInput) {
			this.saveTextEditorViewState(this.input);
		}

240 241 242 243 244
		return super.setInput(input, options, token)
			.then(() => {
				return input.resolve();
			})
			.then(model => {
245
				if (this.model !== undefined && this.model.textModel === model.textModel && this.webview !== null) {
P
Peng Lyu 已提交
246 247 248
					return;
				}

249
				this.localStore.clear();
P
Peng Lyu 已提交
250 251 252 253
				this.viewCells.forEach(cell => {
					cell.save();
				});

254 255 256
				if (this.webview) {
					this.webview?.clearContentWidgets();
				} else {
R
rebornix 已提交
257
					this.webview = new BackLayerWebView(this.webviewService, this.notebookService, this, this.environmentSerice);
258 259 260
					this.list?.view.rowsContainer.insertAdjacentElement('afterbegin', this.webview!.element);
				}

P
Peng Lyu 已提交
261
				this.model = model;
R
rebornix 已提交
262 263 264 265
				this.localStore.add(this.model.onDidChangeCells(() => {
					this.updateViewCells();
				}));

R
rebornix 已提交
266
				let viewState = this.loadTextEditorViewState(input);
R
rebornix 已提交
267 268 269
				let notebook = model.getNotebook();
				this.viewType = input.viewType;
				this.viewCells = notebook.cells.map(cell => {
R
rebornix 已提交
270
					const isEditing = viewState && viewState.editingCells[cell.handle];
R
rebornix 已提交
271
					return new ViewCell(input.viewType!, notebook.handle, cell, !!isEditing, this.modelService, this.modeService);
P
Peng Lyu 已提交
272
				});
273 274 275 276 277 278

				const updateScrollPosition = () => {
					let scrollTop = this.list?.scrollTop || 0;
					this.webview!.element.style.top = `${scrollTop}px`;
					let updateItems: { top: number, id: string }[] = [];

R
rebornix 已提交
279
					// const date = new Date();
280 281 282 283 284 285 286 287 288 289 290 291 292 293
					this.webview?.mapping.forEach((item) => {
						let index = this.model!.getNotebook().cells.indexOf(item.cell.cell);
						let top = this.list?.getElementTop(index) || 0;
						let newTop = this.webview!.shouldRenderContentWidget(item.cell.id, top);

						if (newTop !== undefined) {
							updateItems.push({
								top: newTop,
								id: item.cell.id
							});
						}
					});

					if (updateItems.length > 0) {
R
rebornix 已提交
294
						// console.log('----- did scroll ----  ', date.getMinutes() + ':' + date.getSeconds() + ':' + date.getMilliseconds());
295 296 297 298
						this.webview?.updateViewScrollTop(-scrollTop, updateItems);
					}
				};
				this.localStore.add(this.list!.onWillScroll(e => {
R
rebornix 已提交
299 300
					// const date = new Date();
					// console.log('----- will scroll ----  ', date.getMinutes() + ':' + date.getSeconds() + ':' + date.getMilliseconds());
301 302 303 304
					this.webview?.updateViewScrollTop(-e.scrollTop, []);
				}));
				this.localStore.add(this.list!.onDidScroll(() => updateScrollPosition()));
				this.localStore.add(this.list!.onDidChangeContentHeight(() => updateScrollPosition()));
R
rebornix 已提交
305 306 307 308 309
				this.localStore.add(this.list!.onFocusChange((e) => {
					if (e.elements.length > 0) {
						this.notebookService.updateNotebookActiveCell(input.viewType!, input.getResource()!, e.elements[0].cell.handle);
					}
				}));
310

311 312
				this.list?.splice(0, this.list?.length);
				this.list?.splice(0, 0, this.viewCells);
313 314
				this.list?.layout();
			});
P
Peng Lyu 已提交
315 316
	}

P
Peng Lyu 已提交
317
	layoutElement(cell: ViewCell, height: number) {
R
rebornix 已提交
318
		let relayout = (cell: ViewCell, height: number) => {
P
Peng Lyu 已提交
319
			let index = this.model!.getNotebook().cells.indexOf(cell.cell);
R
rebornix 已提交
320 321 322
			if (index >= 0) {
				this.list?.updateDynamicHeight(index, cell, height);
			}
R
rebornix 已提交
323 324 325
		};

		if (this.list?.view.isRendering) {
326 327 328 329 330
			if (this.relayoutDisposable) {
				this.relayoutDisposable.dispose();
				this.relayoutDisposable = null;
			}
			this.relayoutDisposable = DOM.scheduleAtNextAnimationFrame(() => {
R
rebornix 已提交
331
				relayout(cell, height);
332
				this.relayoutDisposable = null;
R
rebornix 已提交
333 334 335 336
			});
		} else {
			relayout(cell, height);
		}
337 338
	}

R
rebornix 已提交
339
	updateViewCells() {
R
rebornix 已提交
340
		if (this.list?.view.isRendering) {
341 342 343 344 345 346
			if (this.relayoutDisposable) {
				this.relayoutDisposable.dispose();
				this.relayoutDisposable = null;
			}

			this.relayoutDisposable = DOM.scheduleAtNextAnimationFrame(() => {
R
rebornix 已提交
347
				this.list?.rerender();
348
				this.relayoutDisposable = null;
R
rebornix 已提交
349 350
			});
		} else {
R
rebornix 已提交
351
			this.list?.rerender();
R
rebornix 已提交
352
		}
R
rebornix 已提交
353 354
	}

355
	insertEmptyNotebookCell(listIndex: number | undefined, cell: ViewCell, type: 'code' | 'markdown', direction: 'above' | 'below') {
R
rebornix 已提交
356
		let newCell = new ViewCell(this.viewType!, this.notebook!.handle, {
R
rebornix 已提交
357
			handle: -1,
P
Peng Lyu 已提交
358
			cell_type: type,
R
rebornix 已提交
359
			language: '',
P
Peng Lyu 已提交
360
			source: [],
P
Peng Lyu 已提交
361
			outputs: []
P
Peng Lyu 已提交
362
		}, false, this.modelService, this.modeService);
P
Peng Lyu 已提交
363

364
		let index = listIndex ? listIndex : this.model!.getNotebook().cells.indexOf(cell.cell);
P
Peng Lyu 已提交
365 366
		const insertIndex = direction === 'above' ? index : index + 1;

P
Peng Lyu 已提交
367 368
		this.viewCells!.splice(insertIndex, 0, newCell);
		this.model!.insertCell(newCell.cell, insertIndex);
P
Peng Lyu 已提交
369
		this.list?.splice(insertIndex, 0, [newCell]);
P
Peng Lyu 已提交
370 371 372 373 374 375

		if (type === 'markdown') {
			newCell.isEditing = true;
		}
	}

376
	editNotebookCell(listIndex: number | undefined, cell: ViewCell): void {
P
Peng Lyu 已提交
377 378 379
		cell.isEditing = true;
	}

380
	saveNotebookCell(listIndex: number | undefined, cell: ViewCell): void {
P
Peng Lyu 已提交
381
		cell.isEditing = false;
P
Peng Lyu 已提交
382 383
	}

384
	deleteNotebookCell(listIndex: number | undefined, cell: ViewCell) {
P
Peng Lyu 已提交
385
		let index = this.model!.getNotebook().cells.indexOf(cell.cell);
P
Peng Lyu 已提交
386

P
Peng Lyu 已提交
387 388
		this.viewCells!.splice(index, 1);
		this.model!.deleteCell(cell.cell);
P
Peng Lyu 已提交
389 390 391
		this.list?.splice(index, 1);
	}

P
Peng Lyu 已提交
392
	layout(dimension: DOM.Dimension): void {
393
		this.dimension = new DOM.Dimension(dimension.width, dimension.height);
P
Peng Lyu 已提交
394 395
		DOM.toggleClass(this.rootElement, 'mid-width', dimension.width < 1000 && dimension.width >= 600);
		DOM.toggleClass(this.rootElement, 'narrow-width', dimension.width < 600);
396 397
		DOM.size(this.body, dimension.width, dimension.height);
		this.list?.layout(dimension.height, dimension.width);
P
Peng Lyu 已提交
398
	}
R
rebornix 已提交
399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424

	protected saveState(): void {
		if (this.input instanceof NotebookEditorInput) {
			this.saveTextEditorViewState(this.input);
		}

		super.saveState();
	}

	private saveTextEditorViewState(input: NotebookEditorInput): void {
		if (this.group) {
			let state: { [key: number]: boolean } = {};
			this.viewCells.filter(cell => cell.isEditing).forEach(cell => state[cell.cell.handle] = true);
			this.editorMemento.saveEditorState(this.group, input, {
				editingCells: state
			});
		}
	}

	private loadTextEditorViewState(input: NotebookEditorInput): INotebookEditorViewState | undefined {
		if (this.group) {
			return this.editorMemento.loadEditorState(this.group, input);
		}

		return;
	}
425

P
Peng Lyu 已提交
426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461
}

const embeddedEditorBackground = 'walkThrough.embeddedEditorBackground';

registerThemingParticipant((theme, collector) => {
	const color = getExtraColor(theme, embeddedEditorBackground, { dark: 'rgba(0, 0, 0, .4)', extra_dark: 'rgba(200, 235, 255, .064)', light: '#f4f4f4', hc: null });
	if (color) {
		collector.addRule(`.monaco-workbench .part.editor > .content .notebook-editor .monaco-editor-background,
			.monaco-workbench .part.editor > .content .notebook-editor .margin-view-overlays { background: ${color}; }`);
	}
	const link = theme.getColor(textLinkForeground);
	if (link) {
		collector.addRule(`.monaco-workbench .part.editor > .content .notebook-editor a { color: ${link}; }`);
	}
	const activeLink = theme.getColor(textLinkActiveForeground);
	if (activeLink) {
		collector.addRule(`.monaco-workbench .part.editor > .content .notebook-editor a:hover,
			.monaco-workbench .part.editor > .content .notebook-editor a:active { color: ${activeLink}; }`);
	}
	const shortcut = theme.getColor(textPreformatForeground);
	if (shortcut) {
		collector.addRule(`.monaco-workbench .part.editor > .content .notebook-editor code,
			.monaco-workbench .part.editor > .content .notebook-editor .shortcut { color: ${shortcut}; }`);
	}
	const border = theme.getColor(contrastBorder);
	if (border) {
		collector.addRule(`.monaco-workbench .part.editor > .content .notebook-editor .monaco-editor { border-color: ${border}; }`);
	}
	const quoteBackground = theme.getColor(textBlockQuoteBackground);
	if (quoteBackground) {
		collector.addRule(`.monaco-workbench .part.editor > .content .notebook-editor blockquote { background: ${quoteBackground}; }`);
	}
	const quoteBorder = theme.getColor(textBlockQuoteBorder);
	if (quoteBorder) {
		collector.addRule(`.monaco-workbench .part.editor > .content .notebook-editor blockquote { border-color: ${quoteBorder}; }`);
	}
462 463 464 465 466 467

	const inactiveListItem = theme.getColor('list.inactiveSelectionBackground');

	if (inactiveListItem) {
		collector.addRule(`.monaco-workbench .part.editor > .content .notebook-editor .output { background-color: ${inactiveListItem}; }`);
	}
468 469 470 471

	// Cell Margin
	collector.addRule(`.monaco-workbench .part.editor > .content .notebook-editor .monaco-list-row > div.cell { padding: 8px ${CELL_MARGIN}px 8px ${CELL_MARGIN}px; }`);
	collector.addRule(`.monaco-workbench .part.editor > .content .notebook-editor .output { margin: 0px ${CELL_MARGIN}px; }`);
P
Peng Lyu 已提交
472
});