diff --git a/src/vs/base/browser/event.ts b/src/vs/base/browser/event.ts index 010e7b03247..190efe95538 100644 --- a/src/vs/base/browser/event.ts +++ b/src/vs/base/browser/event.ts @@ -126,7 +126,12 @@ export const domEvent: IDomEvent = (element: EventHandler, type: string, useCapt return emitter.event; }; -export function stop(event: _Event): _Event { +export interface CancellableEvent { + preventDefault(); + stopPropagation(); +} + +export function stop(event: _Event): _Event { return mapEvent(event, e => { e.preventDefault(); e.stopPropagation(); diff --git a/src/vs/workbench/parts/holidays/electron-browser/holidays.contribution.ts b/src/vs/workbench/parts/holidays/electron-browser/holidays.contribution.ts new file mode 100644 index 00000000000..b848055fb83 --- /dev/null +++ b/src/vs/workbench/parts/holidays/electron-browser/holidays.contribution.ts @@ -0,0 +1,54 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import 'vs/css!./media/holidays'; +import { Action } from 'vs/base/common/actions'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { $, append, addClass, removeClass } from 'vs/base/browser/dom'; +import { domEvent, stop } from 'vs/base/browser/event'; +import { filterEvent, mapEvent, once, anyEvent } from 'vs/base/common/event'; +import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { KeyCode } from 'vs/base/common/keyCodes'; +import { IDisposable, toDisposable, dispose } from 'vs/base/common/lifecycle'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; +import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; + +export class HappyHolidaysAction extends Action { + + static ID = 'happyholidays'; + static LABEL = 'Happy Holidays!'; + + constructor() { + super(HappyHolidaysAction.ID, HappyHolidaysAction.LABEL, '', true); + } + + async run(): TPromise { + const disposables: IDisposable[] = []; + + const shell = document.querySelector('.monaco-shell-content') as HTMLElement; + addClass(shell, 'blur'); + disposables.push(toDisposable(() => removeClass(shell, 'blur'))); + + const el = append(document.body, $('.happy-holidays')); + const text = append(el, $('.happy-holidays-text')); + disposables.push(toDisposable(() => document.body.removeChild(el))); + + text.innerText = `The VS Code team wishes you a great Holiday season!`; + setTimeout(() => addClass(text, 'animate'), 50); + + const onKeyDown = domEvent(document.body, 'keydown', true); + const onClick = domEvent(document.body, 'click', true); + const onInteraction = anyEvent(onKeyDown, onClick); + + const close = () => dispose(disposables); + stop(once(onInteraction))(close, null, disposables); + } +} + +Registry.as(ActionExtensions.WorkbenchActions) + .registerWorkbenchAction(new SyncActionDescriptor(HappyHolidaysAction, HappyHolidaysAction.ID, HappyHolidaysAction.LABEL), 'Show Release Notes'); diff --git a/src/vs/workbench/parts/holidays/electron-browser/media/cap.svg b/src/vs/workbench/parts/holidays/electron-browser/media/cap.svg new file mode 100644 index 00000000000..abeda410242 --- /dev/null +++ b/src/vs/workbench/parts/holidays/electron-browser/media/cap.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + +image/svg+xml + + + + +Openclipart + + + + + + + + + + + diff --git a/src/vs/workbench/parts/holidays/electron-browser/media/holidays.css b/src/vs/workbench/parts/holidays/electron-browser/media/holidays.css new file mode 100644 index 00000000000..2dcbc7f27f6 --- /dev/null +++ b/src/vs/workbench/parts/holidays/electron-browser/media/holidays.css @@ -0,0 +1,55 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +.activitybar .global-activity .actions-container:before { + content: ''; + width: 100%; + height: 30px; + background-image: url(cap.svg); + position: absolute; + background-size: 21px; + background-repeat: no-repeat; + background-position: 16px 7px; +} + +.monaco-shell-content { + transition: 0.6s filter ease-out; +} + +.monaco-shell-content.blur { + filter: blur(5px); +} + +.happy-holidays { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + z-index: 100; +} + +.happy-holidays-text { + text-align: center; + width: 35%; + font-size: 4vw; + font-weight: 200; + opacity: 0; + line-height: 1.4em; + transform: translate(0,-40px); + transition-delay: 0.2s; + transition-duration: 0.8s; + transition-property: transform, opacity; + transition-timing-function: ease-out; +} + +.happy-holidays-text.animate { + transform: translate(0,0); + opacity: 1; +} \ No newline at end of file diff --git a/src/vs/workbench/parts/update/electron-browser/update.ts b/src/vs/workbench/parts/update/electron-browser/update.ts index 9e966fd3c70..cdde66ed258 100644 --- a/src/vs/workbench/parts/update/electron-browser/update.ts +++ b/src/vs/workbench/parts/update/electron-browser/update.ts @@ -33,6 +33,7 @@ import { IUpdateService, State as UpdateState } from 'vs/platform/update/common/ import * as semver from 'semver'; import { OS, isLinux, isWindows } from 'vs/base/common/platform'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { HappyHolidaysAction } from 'vs/workbench/parts/holidays/electron-browser/holidays.contribution'; class ApplyUpdateAction extends Action { constructor( @IUpdateService private updateService: IUpdateService) { @@ -433,7 +434,9 @@ export class UpdateContribution implements IGlobalActivity { new CommandAction(UpdateContribution.selectColorThemeId, nls.localize('selectTheme.label', "Color Theme"), this.commandService), new CommandAction(UpdateContribution.selectIconThemeId, nls.localize('themes.selectIconTheme.label', "File Icon Theme"), this.commandService), new Separator(), - updateAction + updateAction, + new Separator(), + new HappyHolidaysAction() ]; } diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index b624558e852..2b36b505613 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -125,3 +125,5 @@ import 'vs/workbench/parts/themes/test/electron-browser/themes.test.contribution import 'vs/workbench/parts/watermark/electron-browser/watermark'; import 'vs/workbench/parts/welcome/overlay/browser/welcomeOverlay'; + +import 'vs/workbench/parts/holidays/electron-browser/holidays.contribution';