diff --git a/src/vs/workbench/browser/parts/overlay/onboardingShadow/shadowOverlayService.ts b/src/vs/workbench/browser/parts/overlay/onboardingShadow/shadowOverlayService.ts new file mode 100644 index 0000000000000..c62c281361eae --- /dev/null +++ b/src/vs/workbench/browser/parts/overlay/onboardingShadow/shadowOverlayService.ts @@ -0,0 +1,94 @@ +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { registerSingleton, InstantiationType } from 'vs/platform/instantiation/common/extensions'; +import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; +import { CommandsRegistry } from 'vs/platform/commands/common/commands'; + +export const IShadowOverlayService = createDecorator('shadowOverlayService'); + +export interface IShadowOverlayService extends IDisposable { + readonly _serviceBrand: undefined; + + highlight(elements: string[]): void; + restoreStyles(elements: string[]): void; +} + + +export class ShadowOverlayService extends Disposable implements IShadowOverlayService { + declare readonly _serviceBrand: undefined; + private highlightedElements: Map = new Map(); + + constructor( + ) { + super(); + this.registerCommands(); + } + + private registerCommands(): void { + CommandsRegistry.registerCommand('pearai.highlightElements', (accessor, ...args) => { + + const selectors = args[0] as string[]; // array of CSS selectors + this.highlight(selectors); + }); + + CommandsRegistry.registerCommand('pearai.removeHighlight', (accessor, ...args) => { + const selectors = args[0] as string[]; // array of CSS selectors + // Convert selectors to elements + this.restoreStyles(selectors); + }); + } + + restoreStyles(selectors: string[]): void { + selectors.forEach(selector => { + const originalStyles = this.highlightedElements.get(selector); + + const element = document.querySelector(selector) as HTMLElement + + if (originalStyles) { + element.style.position = originalStyles.position; + element.style.zIndex = originalStyles.zIndex; + element.style.isolation = originalStyles.isolation; + element.style.pointerEvents = originalStyles.pointerEvents; + element.style.backgroundColor = originalStyles.backgroundColor; + element.style.boxShadow = originalStyles.boxShadow; + + // Remove this element from the tracked elements + this.highlightedElements.delete(selector); + } + }); + } + + highlight(selectors: string[]): void { + selectors.forEach(selector => { + if (selector) { + const element = document.querySelector(selector) as HTMLElement + + // save original styles + if (!this.highlightedElements.has(selector)) { + this.highlightedElements.set(selector, { + position: element.style.position, + zIndex: element.style.zIndex, + isolation: element.style.isolation, + pointerEvents: element.style.pointerEvents, + backgroundColor: element.style.backgroundColor, + boxShadow: element.style.boxShadow, + }); + } + element.style.position = 'absolute'; + element.style.zIndex = '3000'; + element.style.isolation = 'isolate'; + element.style.pointerEvents = 'auto'; + element.style.backgroundColor = 'transparent'; + element.style.boxShadow = '0 0 0 9999px rgba(0, 0, 0, 0.6)'; + } + }); + } +} + +registerSingleton(IShadowOverlayService, ShadowOverlayService, InstantiationType.Eager,); diff --git a/src/vs/workbench/browser/workbench.ts b/src/vs/workbench/browser/workbench.ts index aa49871a65857..2396206520c6e 100644 --- a/src/vs/workbench/browser/workbench.ts +++ b/src/vs/workbench/browser/workbench.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +<<<<<<< HEAD import './style.js'; import { runWhenWindowIdle } from '../../base/browser/dom.js'; import { Event, Emitter, setGlobalLeakWarningThreshold } from '../../base/common/event.js'; @@ -50,6 +51,57 @@ import { setProgressAcccessibilitySignalScheduler } from '../../base/browser/ui/ import { AccessibleViewRegistry } from '../../platform/accessibility/browser/accessibleViewRegistry.js'; import { NotificationAccessibleView } from './parts/notifications/notificationAccessibleView.js'; import { IPearOverlayService } from '../../parts/overlay/pearOverlayService'; +======= +import 'vs/workbench/browser/style'; +import { localize } from 'vs/nls'; +import { runWhenWindowIdle } from 'vs/base/browser/dom'; +import { Event, Emitter, setGlobalLeakWarningThreshold } from 'vs/base/common/event'; +import { RunOnceScheduler, timeout } from 'vs/base/common/async'; +import { isFirefox, isSafari, isChrome } from 'vs/base/browser/browser'; +import { mark } from 'vs/base/common/performance'; +import { onUnexpectedError, setUnexpectedErrorHandler } from 'vs/base/common/errors'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { isWindows, isLinux, isWeb, isNative, isMacintosh } from 'vs/base/common/platform'; +import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; +import { IEditorFactoryRegistry, EditorExtensions } from 'vs/workbench/common/editor'; +import { getSingletonServiceDescriptors } from 'vs/platform/instantiation/common/extensions'; +import { Position, Parts, IWorkbenchLayoutService, positionToString } from 'vs/workbench/services/layout/browser/layoutService'; +import { IStorageService, WillSaveStateReason, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; +import { IConfigurationChangeEvent, IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +import { LifecyclePhase, ILifecycleService, WillShutdownEvent } from 'vs/workbench/services/lifecycle/common/lifecycle'; +import { INotificationService } from 'vs/platform/notification/common/notification'; +import { NotificationService } from 'vs/workbench/services/notification/common/notificationService'; +import { NotificationsCenter } from 'vs/workbench/browser/parts/notifications/notificationsCenter'; +import { NotificationsAlerts } from 'vs/workbench/browser/parts/notifications/notificationsAlerts'; +import { NotificationsStatus } from 'vs/workbench/browser/parts/notifications/notificationsStatus'; +import { NotificationsTelemetry } from 'vs/workbench/browser/parts/notifications/notificationsTelemetry'; +import { registerNotificationCommands } from 'vs/workbench/browser/parts/notifications/notificationsCommands'; +import { NotificationsToasts } from 'vs/workbench/browser/parts/notifications/notificationsToasts'; +import { setARIAContainer } from 'vs/base/browser/ui/aria/aria'; +import { FontMeasurements } from 'vs/editor/browser/config/fontMeasurements'; +import { BareFontInfo } from 'vs/editor/common/config/fontInfo'; +import { ILogService } from 'vs/platform/log/common/log'; +import { toErrorMessage } from 'vs/base/common/errorMessage'; +import { WorkbenchContextKeysHandler } from 'vs/workbench/browser/contextkeys'; +import { coalesce } from 'vs/base/common/arrays'; +import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; +import { Layout } from 'vs/workbench/browser/layout'; +import { IHostService } from 'vs/workbench/services/host/browser/host'; +import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; +import { mainWindow } from 'vs/base/browser/window'; +import { PixelRatio } from 'vs/base/browser/pixelRatio'; +import { IHoverService, WorkbenchHoverDelegate } from 'vs/platform/hover/browser/hover'; +import { setHoverDelegateFactory } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; +import { setBaseLayerHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegate2'; +import { AccessibilityProgressSignalScheduler } from 'vs/platform/accessibilitySignal/browser/progressAccessibilitySignalScheduler'; +import { setProgressAcccessibilitySignalScheduler } from 'vs/base/browser/ui/progressbar/progressAccessibilitySignal'; +import { AccessibleViewRegistry } from 'vs/platform/accessibility/browser/accessibleViewRegistry'; +import { NotificationAccessibleView } from 'vs/workbench/browser/parts/notifications/notificationAccessibleView'; +import { IPearOverlayService } from 'vs/workbench/browser/parts/overlay/pearOverlayService'; +import { IShadowOverlayService } from 'vs/workbench/browser/parts/overlay/onboardingShadow/shadowOverlayService'; +>>>>>>> 80f8c8e0b8f (highlight cmd i onboarding (#105)) export interface IWorkbenchOptions { @@ -353,6 +405,11 @@ export class Workbench extends Layout { }); } + // instantiate highlighting + instantiationService.invokeFunction(accessor => { + accessor.get(IShadowOverlayService); + }); + mark(`code/willCreatePart/${id}`); this.getPart(id).create(partContainer, options); mark(`code/didCreatePart/${id}`);