From 7a472fbf9544ff1187f08df0a7b2e3e4c0f48824 Mon Sep 17 00:00:00 2001 From: Sergei Shmakov Date: Mon, 1 Dec 2025 18:46:20 +0100 Subject: [PATCH 01/12] Adds welcome page webview for first-time installs (#4769, #4773, PLG-138) --- contributions.json | 5 ++ docs/telemetry-events.md | 39 +++++++++ package.json | 10 +++ src/constants.commands.generated.ts | 1 + src/constants.views.ts | 2 +- src/container.ts | 4 + src/extension.ts | 6 ++ src/webviews/apps/welcome/context.ts | 4 + src/webviews/apps/welcome/stateProvider.ts | 16 ++++ src/webviews/apps/welcome/welcome.html | 26 ++++++ src/webviews/apps/welcome/welcome.scss | 1 + src/webviews/apps/welcome/welcome.ts | 95 ++++++++++++++++++++++ src/webviews/welcome/protocol.ts | 7 ++ src/webviews/welcome/registration.ts | 34 ++++++++ src/webviews/welcome/welcomeWebview.ts | 41 ++++++++++ webpack.config.mjs | 1 + 16 files changed, 291 insertions(+), 1 deletion(-) create mode 100644 src/webviews/apps/welcome/context.ts create mode 100644 src/webviews/apps/welcome/stateProvider.ts create mode 100644 src/webviews/apps/welcome/welcome.html create mode 100644 src/webviews/apps/welcome/welcome.scss create mode 100644 src/webviews/apps/welcome/welcome.ts create mode 100644 src/webviews/welcome/protocol.ts create mode 100644 src/webviews/welcome/registration.ts create mode 100644 src/webviews/welcome/welcomeWebview.ts diff --git a/contributions.json b/contributions.json index 38e6b212fc10f..9d4036c644679 100644 --- a/contributions.json +++ b/contributions.json @@ -5691,6 +5691,11 @@ "label": "Show Visual File History View", "commandPalette": "gitlens:enabled" }, + "gitlens.showWelcomePage": { + "label": "Show Welcome", + "icon": "$(heart)", + "commandPalette": "gitlens:enabled" + }, "gitlens.showWorkspacesView": { "label": "Show Cloud Workspaces View", "commandPalette": "gitlens:enabled && !gitlens:hasVirtualFolders" diff --git a/docs/telemetry-events.md b/docs/telemetry-events.md index fb36aa38e84f8..5052df96c2e55 100644 --- a/docs/telemetry-events.md +++ b/docs/telemetry-events.md @@ -3538,3 +3538,42 @@ or } ``` +### welcome/closed + +```typescript +{ + [`context.${string}`]: string | number | boolean, + 'context.webview.host': 'view' | 'editor', + 'context.webview.id': string, + 'context.webview.instanceId': string, + 'context.webview.type': string +} +``` + +### welcome/showAborted + +```typescript +{ + 'context.webview.host': 'view' | 'editor', + 'context.webview.id': string, + 'context.webview.instanceId': string, + 'context.webview.type': string, + 'duration': number, + 'loading': boolean +} +``` + +### welcome/shown + +```typescript +{ + [`context.${string}`]: string | number | boolean, + 'context.webview.host': 'view' | 'editor', + 'context.webview.id': string, + 'context.webview.instanceId': string, + 'context.webview.type': string, + 'duration': number, + 'loading': boolean +} +``` + diff --git a/package.json b/package.json index 018cbfa5207dc..58246ff40d7ae 100644 --- a/package.json +++ b/package.json @@ -8364,6 +8364,12 @@ "title": "Show Visual File History View", "category": "GitLens" }, + { + "command": "gitlens.showWelcomePage", + "title": "Show Welcome", + "category": "GitLens", + "icon": "$(heart)" + }, { "command": "gitlens.showWorkspacesView", "title": "Show Cloud Workspaces View", @@ -13216,6 +13222,10 @@ "command": "gitlens.showTimelineView", "when": "gitlens:enabled" }, + { + "command": "gitlens.showWelcomePage", + "when": "gitlens:enabled" + }, { "command": "gitlens.showWorkspacesView", "when": "gitlens:enabled && !gitlens:hasVirtualFolders" diff --git a/src/constants.commands.generated.ts b/src/constants.commands.generated.ts index 8b5a7742267e1..8ca2138d43b16 100644 --- a/src/constants.commands.generated.ts +++ b/src/constants.commands.generated.ts @@ -1004,6 +1004,7 @@ export type ContributedPaletteCommands = | 'gitlens.showTagsView' | 'gitlens.showTimelinePage' | 'gitlens.showTimelineView' + | 'gitlens.showWelcomePage' | 'gitlens.showWorkspacesView' | 'gitlens.showWorktreesView' | 'gitlens.startWork' diff --git a/src/constants.views.ts b/src/constants.views.ts index cac195cb613e7..eb050b733fa8f 100644 --- a/src/constants.views.ts +++ b/src/constants.views.ts @@ -43,7 +43,7 @@ export type GroupableTreeViewTypes = Extract< >; export type GroupableTreeViewIds = TreeViewIds; -export type WebviewTypes = 'composer' | 'graph' | 'patchDetails' | 'settings' | 'timeline'; +export type WebviewTypes = 'composer' | 'graph' | 'patchDetails' | 'settings' | 'timeline' | 'welcome'; export type WebviewIds = `gitlens.${WebviewTypes}`; export type WebviewViewTypes = 'commitDetails' | 'graph' | 'graphDetails' | 'home' | 'patchDetails' | 'timeline'; diff --git a/src/container.ts b/src/container.ts index 26242ae5fbe14..ec3f484790806 100644 --- a/src/container.ts +++ b/src/container.ts @@ -78,6 +78,7 @@ import { registerTimelineWebviewCommands, registerTimelineWebviewPanel } from '. import { RebaseEditorProvider } from './webviews/rebase/rebaseEditor'; import { registerSettingsWebviewCommands, registerSettingsWebviewPanel } from './webviews/settings/registration'; import { WebviewsController } from './webviews/webviewsController'; +import { registerWelcomeWebviewPanel } from './webviews/welcome/registration'; export type Environment = 'dev' | 'staging' | 'production'; @@ -257,6 +258,9 @@ export class Container { this._disposables.push(settingsPanels); this._disposables.push(registerSettingsWebviewCommands(settingsPanels)); + const welcomePanels = registerWelcomeWebviewPanel(webviews); + this._disposables.push(welcomePanels); + this._disposables.push(new ViewFileDecorationProvider()); const patchDetailsPanels = registerPatchDetailsWebviewPanel(webviews); diff --git a/src/extension.ts b/src/extension.ts index be844d156207a..e92c14013b265 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -366,6 +366,12 @@ async function showWhatsNew( if (previousVersion == null) { Logger.log(`GitLens first-time install; window.focused=${window.state.focused}`); + // Show welcome webview on first install for IDEs that don't support walkthroughs (e.g., Cursor) + // For IDEs that support walkthroughs, the walkthrough will be shown instead + if (window.state.focused && !container.walkthrough.isWalkthroughSupported) { + void executeCommand('gitlens.showWelcomePage'); + } + return; } diff --git a/src/webviews/apps/welcome/context.ts b/src/webviews/apps/welcome/context.ts new file mode 100644 index 0000000000000..23e34c3ce6190 --- /dev/null +++ b/src/webviews/apps/welcome/context.ts @@ -0,0 +1,4 @@ +import { createContext } from '@lit/context'; +import type { State } from '../../welcome/protocol'; + +export const stateContext = createContext('state'); diff --git a/src/webviews/apps/welcome/stateProvider.ts b/src/webviews/apps/welcome/stateProvider.ts new file mode 100644 index 0000000000000..d75615aff6433 --- /dev/null +++ b/src/webviews/apps/welcome/stateProvider.ts @@ -0,0 +1,16 @@ +import { ContextProvider } from '@lit/context'; +import type { IpcMessage } from '../../protocol'; +import type { State } from '../../welcome/protocol'; +import type { ReactiveElementHost } from '../shared/appHost'; +import { StateProviderBase } from '../shared/stateProviderBase'; +import { stateContext } from './context'; + +export class WelcomeStateProvider extends StateProviderBase { + protected override createContextProvider(state: State): ContextProvider { + return new ContextProvider(this.host, { context: stateContext, initialValue: state }); + } + + protected override onMessageReceived(_msg: IpcMessage): void { + // Welcome webview doesn't need to handle any messages + } +} diff --git a/src/webviews/apps/welcome/welcome.html b/src/webviews/apps/welcome/welcome.html new file mode 100644 index 0000000000000..b72c8c2f8c41f --- /dev/null +++ b/src/webviews/apps/welcome/welcome.html @@ -0,0 +1,26 @@ + + + + + + + + + + + diff --git a/src/webviews/apps/welcome/welcome.scss b/src/webviews/apps/welcome/welcome.scss new file mode 100644 index 0000000000000..fbfa976037705 --- /dev/null +++ b/src/webviews/apps/welcome/welcome.scss @@ -0,0 +1 @@ +@use '../shared/styles/theme'; diff --git a/src/webviews/apps/welcome/welcome.ts b/src/webviews/apps/welcome/welcome.ts new file mode 100644 index 0000000000000..9ffe5c3032db4 --- /dev/null +++ b/src/webviews/apps/welcome/welcome.ts @@ -0,0 +1,95 @@ +/*global*/ +import './welcome.scss'; +import { html } from 'lit'; +import { customElement } from 'lit/decorators.js'; +import type { State } from '../../welcome/protocol'; +import { GlAppHost } from '../shared/appHost'; +import { scrollableBase } from '../shared/components/styles/lit/base.css'; +import type { LoggerContext } from '../shared/contexts/logger'; +import type { HostIpc } from '../shared/ipc'; +import { WelcomeStateProvider } from './stateProvider'; +import '../shared/components/gitlens-logo'; + +@customElement('gl-welcome-app') +export class GlWelcomeApp extends GlAppHost { + static override styles = [scrollableBase]; + + protected override createStateProvider( + bootstrap: string, + ipc: HostIpc, + logger: LoggerContext, + ): WelcomeStateProvider { + return new WelcomeStateProvider(this, bootstrap, ipc, logger); + } + + override render(): unknown { + return html` +
+
+

+

Supercharge Git in Cursor with GitLens

+
+ +
+

🚀 Getting Started

+

+ GitLens is now installed and ready to help you visualize code authorship, navigate Git history, + and collaborate more effectively. +

+
+ +
+

✨ Key Features

+
    +
  • + 📝 + Blame Annotations - See who changed each line and when +
  • +
  • + 📊 + Commit Graph - Visualize your repository's history +
  • +
  • + 🔍 + File History - Track changes to any file over time +
  • +
  • + 🌿 + Branch Management - Easily manage branches and remotes +
  • +
  • + 🤖 + AI Features - Generate commit messages and explanations +
  • +
+
+ +
+

🎯 Next Steps

+
    +
  • + 1. + Open the GitLens Home view in the sidebar to see your active work +
  • +
  • + 2. + Try the Commit Graph to visualize your repository +
  • +
  • + 3. + Hover over any line to see inline blame information +
  • +
  • + 4. + Explore the Command Palette (Cmd/Ctrl+Shift+P) and search for "GitLens" +
  • +
+
+ +
+

GitLens ${this.state?.version ?? ''} is ready to use!

+
+
+ `; + } +} diff --git a/src/webviews/welcome/protocol.ts b/src/webviews/welcome/protocol.ts new file mode 100644 index 0000000000000..da42f89197426 --- /dev/null +++ b/src/webviews/welcome/protocol.ts @@ -0,0 +1,7 @@ +import type { IpcScope, WebviewState } from '../protocol'; + +export const scope: IpcScope = 'welcome'; + +export interface State extends WebviewState<'gitlens.welcome'> { + version: string; +} diff --git a/src/webviews/welcome/registration.ts b/src/webviews/welcome/registration.ts new file mode 100644 index 0000000000000..20fe4c5466c9a --- /dev/null +++ b/src/webviews/welcome/registration.ts @@ -0,0 +1,34 @@ +import { ViewColumn } from 'vscode'; +import type { WebviewPanelsProxy, WebviewsController } from '../webviewsController'; +import type { State } from './protocol'; + +export type WelcomeWebviewShowingArgs = []; + +export function registerWelcomeWebviewPanel( + controller: WebviewsController, +): WebviewPanelsProxy<'gitlens.welcome', WelcomeWebviewShowingArgs, State> { + return controller.registerWebviewPanel<'gitlens.welcome', State, State, WelcomeWebviewShowingArgs>( + { id: 'gitlens.showWelcomePage' }, + { + id: 'gitlens.welcome', + fileName: 'welcome.html', + iconPath: 'images/gitlens-icon.png', + title: 'Welcome to GitLens', + contextKeyPrefix: `gitlens:webview:welcome`, + trackingFeature: 'welcomeWebview', + type: 'welcome', + plusFeature: false, + column: ViewColumn.Active, + webviewHostOptions: { + retainContextWhenHidden: false, + enableFindWidget: false, + }, + }, + async (container, host) => { + const { WelcomeWebviewProvider } = await import( + /* webpackChunkName: "webview-welcome" */ './welcomeWebview' + ); + return new WelcomeWebviewProvider(container, host); + }, + ); +} diff --git a/src/webviews/welcome/welcomeWebview.ts b/src/webviews/welcome/welcomeWebview.ts new file mode 100644 index 0000000000000..c193519455f29 --- /dev/null +++ b/src/webviews/welcome/welcomeWebview.ts @@ -0,0 +1,41 @@ +import { Disposable } from 'vscode'; +import type { WebviewTelemetryContext } from '../../constants.telemetry'; +import type { Container } from '../../container'; +import type { WebviewHost, WebviewProvider } from '../webviewProvider'; +import type { State } from './protocol'; +import type { WelcomeWebviewShowingArgs } from './registration'; + +export class WelcomeWebviewProvider implements WebviewProvider { + private readonly _disposable: Disposable; + + constructor( + private readonly container: Container, + private readonly host: WebviewHost<'gitlens.welcome'>, + ) { + this.host.title = 'Welcome to GitLens'; + this._disposable = Disposable.from(); + } + + dispose(): void { + this._disposable.dispose(); + } + + getTelemetryContext(): WebviewTelemetryContext { + return { + ...this.host.getTelemetryContext(), + }; + } + + includeBootstrap(): State { + return this.getState(); + } + + private getState(): State { + return { + webviewId: 'gitlens.welcome', + webviewInstanceId: this.host.instanceId, + timestamp: Date.now(), + version: this.container.version, + }; + } +} diff --git a/webpack.config.mjs b/webpack.config.mjs index 5818125c9adf3..cbad2506128ba 100644 --- a/webpack.config.mjs +++ b/webpack.config.mjs @@ -369,6 +369,7 @@ function getWebviewsConfigs(mode, env) { settings: { entry: './settings/settings.ts' }, timeline: { entry: './plus/timeline/timeline.ts', plus: true }, patchDetails: { entry: './plus/patchDetails/patchDetails.ts', plus: true }, + welcome: { entry: './welcome/welcome.ts' }, }, {}, mode, From 0be97a2230fd79be35213aa6ca43925b2199db54 Mon Sep 17 00:00:00 2001 From: Sergei Shmakov Date: Tue, 2 Dec 2025 18:20:28 +0100 Subject: [PATCH 02/12] Layout of the header of the welcome page (#4769, #4773, PLG-138) --- src/webviews/apps/welcome/welcome.css.ts | 50 ++++++++++++++++++++++++ src/webviews/apps/welcome/welcome.ts | 20 +++++----- 2 files changed, 60 insertions(+), 10 deletions(-) create mode 100644 src/webviews/apps/welcome/welcome.css.ts diff --git a/src/webviews/apps/welcome/welcome.css.ts b/src/webviews/apps/welcome/welcome.css.ts new file mode 100644 index 0000000000000..687aa0eb02c09 --- /dev/null +++ b/src/webviews/apps/welcome/welcome.css.ts @@ -0,0 +1,50 @@ +import { css } from 'lit'; + +export const welcomeStyles = css` + .welcome::before { + content: ' '; + position: absolute; + top: 0; + left: 50%; + transform: translateX(-50%) translateY(-40%); + z-index: -1; + + width: 620px; + height: 517px; + + border-radius: 100%; + background: radial-gradient(76.32% 76.32% at 50% 7.24%, #7b00ff 29.72%, rgba(255, 0, 242, 0) 100%); + opacity: 0.25; + mix-blend-mode: color; + filter: blur(53px); + } + .welcome__section { + display: flex; + flex-flow: column; + justify-content: center; + align-items: center; + text-align: center; + } + .welcome__section p { + font-size: larger; + max-width: calc(620px * 0.75); + } + + .welcome__header { + margin-top: 5rem; + margin-bottom: 2rem; + max-width: 620px; + margin-left: auto; + margin-right: auto; + } + .welcome__header gitlens-logo { + transform: translateX(-0.75rem); + } + .welcome__header h1 { + margin-bottom: 0; + } + + .welcome__accent { + color: #cb64ff; + } +`; diff --git a/src/webviews/apps/welcome/welcome.ts b/src/webviews/apps/welcome/welcome.ts index 9ffe5c3032db4..3175188ac80db 100644 --- a/src/webviews/apps/welcome/welcome.ts +++ b/src/webviews/apps/welcome/welcome.ts @@ -9,10 +9,11 @@ import type { LoggerContext } from '../shared/contexts/logger'; import type { HostIpc } from '../shared/ipc'; import { WelcomeStateProvider } from './stateProvider'; import '../shared/components/gitlens-logo'; +import { welcomeStyles } from './welcome.css'; @customElement('gl-welcome-app') export class GlWelcomeApp extends GlAppHost { - static override styles = [scrollableBase]; + static override styles = [scrollableBase, welcomeStyles]; protected override createStateProvider( bootstrap: string, @@ -25,18 +26,17 @@ export class GlWelcomeApp extends GlAppHost { override render(): unknown { return html`
-
-

-

Supercharge Git in Cursor with GitLens

-
- -
-

🚀 Getting Started

+
+ +

GitLens is now installed in Cursor

- GitLens is now installed and ready to help you visualize code authorship, navigate Git history, - and collaborate more effectively. + Understand every line of code — instantly. GitLens reveals authorship, activity, and history + inside the editor

+
+

With PRO subscription you get more

+

✨ Key Features

From 7ca013ac464697d7d36ea67a0588b93aeb1cf271 Mon Sep 17 00:00:00 2001 From: Sergei Shmakov Date: Thu, 4 Dec 2025 14:25:57 +0100 Subject: [PATCH 03/12] Add interactive features carousel to Welcome view (#4769, #4773, PLG-138) --- src/webviews/apps/media/feature-timeline.svg | 48 ++++++ .../welcome/components/feature-carousel.ts | 147 ++++++++++++++++++ src/webviews/apps/welcome/welcome.css.ts | 34 +++- src/webviews/apps/welcome/welcome.html | 7 +- src/webviews/apps/welcome/welcome.ts | 33 +++- 5 files changed, 256 insertions(+), 13 deletions(-) create mode 100644 src/webviews/apps/media/feature-timeline.svg create mode 100644 src/webviews/apps/welcome/components/feature-carousel.ts diff --git a/src/webviews/apps/media/feature-timeline.svg b/src/webviews/apps/media/feature-timeline.svg new file mode 100644 index 0000000000000..eca1dfba8500b --- /dev/null +++ b/src/webviews/apps/media/feature-timeline.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/webviews/apps/welcome/components/feature-carousel.ts b/src/webviews/apps/welcome/components/feature-carousel.ts new file mode 100644 index 0000000000000..3bb2cfd4a88ea --- /dev/null +++ b/src/webviews/apps/welcome/components/feature-carousel.ts @@ -0,0 +1,147 @@ +import { css, html, LitElement } from 'lit'; +import { customElement, queryAssignedElements, state } from 'lit/decorators.js'; +import '../../shared/components/button'; +import '../../shared/components/code-icon'; + +declare global { + interface HTMLElementTagNameMap { + 'gl-feature-carousel': GlFeatureCarousel; + 'gl-feature-card': GlFeatureCard; + } +} + +@customElement('gl-feature-carousel') +export class GlFeatureCarousel extends LitElement { + static override styles = [ + css` + :host { + display: block; + width: 100%; + } + + .carousel { + display: flex; + gap: 1rem; + justify-content: center; + } + + .button { + display: flex; + align-items: center; + } + + .content { + flex: 1; + max-width: 520px; + display: flex; + align-items: center; + justify-content: center; + } + + + ::slotted(*) { + display: none; + } + + ::slotted([data-active]) { + display: flex; + width: 100%; + } + `, + ]; + + @queryAssignedElements({ flatten: true }) + private cards!: HTMLElement[]; + + @state() + private currentIndex = 0; + + override firstUpdated(): void { + this.updateActiveCard(); + } + + private updateActiveCard(): void { + this.cards.forEach((card, index) => { + if (index === this.currentIndex) { + card.setAttribute('data-active', ''); + } else { + card.removeAttribute('data-active'); + } + }); + } + + private handlePrevious(): void { + if (this.cards.length === 0) return; + this.currentIndex = (this.currentIndex - 1 + this.cards.length) % this.cards.length; + this.updateActiveCard(); + } + + private handleNext(): void { + if (this.cards.length === 0) return; + this.currentIndex = (this.currentIndex + 1) % this.cards.length; + this.updateActiveCard(); + } + + private handleSlotChange(): void { + this.currentIndex = 0; + this.updateActiveCard(); + } + + override render(): unknown { + return html` + + `; + } +} + +@customElement('gl-feature-card') +export class GlFeatureCard extends LitElement { + static override styles = [ + css` + :host { + display: flex; + } + + .image { + } + .content { + } + ::slotted(img) { + } + + ::slotted(h1) { + } + + ::slotted(p) { + } + `, + ]; + + override render(): unknown { + return html` +
+ +
+
+ +
+ `; + } +} diff --git a/src/webviews/apps/welcome/welcome.css.ts b/src/webviews/apps/welcome/welcome.css.ts index 687aa0eb02c09..e28904eb155ea 100644 --- a/src/webviews/apps/welcome/welcome.css.ts +++ b/src/webviews/apps/welcome/welcome.css.ts @@ -1,6 +1,12 @@ import { css } from 'lit'; -export const welcomeStyles = css` +const colorScheme = css` + :host { + --accent-color: #cb64ff; + } +`; + +const heroGradient = css` .welcome::before { content: ' '; position: absolute; @@ -18,33 +24,45 @@ export const welcomeStyles = css` mix-blend-mode: color; filter: blur(53px); } - .welcome__section { +`; + +const section = css` + .section { display: flex; flex-flow: column; justify-content: center; align-items: center; text-align: center; } - .welcome__section p { + .section p { font-size: larger; max-width: calc(620px * 0.75); } +`; - .welcome__header { +const header = css` + .header { margin-top: 5rem; margin-bottom: 2rem; max-width: 620px; margin-left: auto; margin-right: auto; } - .welcome__header gitlens-logo { + .header gitlens-logo { transform: translateX(-0.75rem); } - .welcome__header h1 { + .header h1 { margin-bottom: 0; } +`; - .welcome__accent { - color: #cb64ff; +const typography = css` + .accent { + color: var(--accent-color); } `; + +export const welcomeStyles = css` + ${colorScheme} + ${heroGradient} ${section} ${header} ${typography} +`; diff --git a/src/webviews/apps/welcome/welcome.html b/src/webviews/apps/welcome/welcome.html index b72c8c2f8c41f..4bca43a8dc78f 100644 --- a/src/webviews/apps/welcome/welcome.html +++ b/src/webviews/apps/welcome/welcome.html @@ -21,6 +21,11 @@ data-placement="#{placement}" data-vscode-context='{ "webview": "#{webviewId}", "webviewInstance": "#{webviewInstanceId}" }' > - + diff --git a/src/webviews/apps/welcome/welcome.ts b/src/webviews/apps/welcome/welcome.ts index 3175188ac80db..09da0ee455dd5 100644 --- a/src/webviews/apps/welcome/welcome.ts +++ b/src/webviews/apps/welcome/welcome.ts @@ -1,7 +1,7 @@ /*global*/ import './welcome.scss'; import { html } from 'lit'; -import { customElement } from 'lit/decorators.js'; +import { customElement, property } from 'lit/decorators.js'; import type { State } from '../../welcome/protocol'; import { GlAppHost } from '../shared/appHost'; import { scrollableBase } from '../shared/components/styles/lit/base.css'; @@ -10,6 +10,7 @@ import type { HostIpc } from '../shared/ipc'; import { WelcomeStateProvider } from './stateProvider'; import '../shared/components/gitlens-logo'; import { welcomeStyles } from './welcome.css'; +import './components/feature-carousel'; @customElement('gl-welcome-app') export class GlWelcomeApp extends GlAppHost { @@ -23,10 +24,13 @@ export class GlWelcomeApp extends GlAppHost { return new WelcomeStateProvider(this, bootstrap, ipc, logger); } + @property({ type: String }) + webroot?: string; + override render(): unknown { return html`
-
+

GitLens is now installed in Cursor

@@ -34,8 +38,29 @@ export class GlWelcomeApp extends GlAppHost { inside the editor

-
-

With PRO subscription you get more

+
+

With PRO subscription you get more

+
+ +
+ + + Commit Graph +

Commit Graph

+

Visualize your repository's history and interact with commits

+

Open Commit Graph

+
+ + Visual File History +

Visual File History

+

Track changes to any file over time

+

Open Visual File History

+
+
From c80280166c8b34fb3595a4a65cc94efec871feff Mon Sep 17 00:00:00 2001 From: Sergei Shmakov Date: Thu, 4 Dec 2025 17:00:36 +0100 Subject: [PATCH 04/12] Makes header of the welcome page responsive to the panel width (#4769, #4773, PLG-138) --- src/webviews/apps/welcome/welcome.css.ts | 65 ++++++++++++++++++------ src/webviews/apps/welcome/welcome.ts | 2 +- 2 files changed, 50 insertions(+), 17 deletions(-) diff --git a/src/webviews/apps/welcome/welcome.css.ts b/src/webviews/apps/welcome/welcome.css.ts index e28904eb155ea..58a3e2d69a2e2 100644 --- a/src/webviews/apps/welcome/welcome.css.ts +++ b/src/webviews/apps/welcome/welcome.css.ts @@ -3,6 +3,22 @@ import { css } from 'lit'; const colorScheme = css` :host { --accent-color: #cb64ff; + + --hero-gradient: radial-gradient(76.32% 76.32% at 50% 7.24%, #7b00ff 29.72%, rgba(255, 0, 242, 0) 100%); + } +`; + +const typography = css` + :host { + --h1-font-size: 1.4rem; + --p-font-size: 1rem; + } + + @media (max-width: 640px) { + :host { + --h1-font-size: 0.75rem; + --p-font-size: 0.7rem; + } } `; @@ -15,14 +31,20 @@ const heroGradient = css` transform: translateX(-50%) translateY(-40%); z-index: -1; - width: 620px; - height: 517px; - + background: var(--hero-gradient); border-radius: 100%; - background: radial-gradient(76.32% 76.32% at 50% 7.24%, #7b00ff 29.72%, rgba(255, 0, 242, 0) 100%); opacity: 0.25; - mix-blend-mode: color; filter: blur(53px); + + width: 620px; + height: 517px; + } + + @media (max-width: 640px) { + .welcome::before { + width: 328px; + height: 273px; + } } `; @@ -33,17 +55,29 @@ const section = css` justify-content: center; align-items: center; text-align: center; + font-size: var(--p-font-size); } .section p { - font-size: larger; - max-width: calc(620px * 0.75); + max-width: 30em; + } + .section .accent { + color: var(--accent-color); } `; const header = css` + .logo { + transform: scale(0.7); + } + @media (max-width: 640px) { + .logo { + transform: scale(0.5); + } + } + .header { - margin-top: 5rem; - margin-bottom: 2rem; + margin-top: 3em; + margin-bottom: 1em; max-width: 620px; margin-left: auto; margin-right: auto; @@ -53,16 +87,15 @@ const header = css` } .header h1 { margin-bottom: 0; - } -`; -const typography = css` - .accent { - color: var(--accent-color); + font-size: var(--h1-font-size); + } + .header p { + color: var(--vscode-descriptionForeground); } `; export const welcomeStyles = css` - ${colorScheme} - ${heroGradient} ${section} ${header} ${typography} + ${colorScheme} ${typography} + ${heroGradient} ${section} ${header} `; diff --git a/src/webviews/apps/welcome/welcome.ts b/src/webviews/apps/welcome/welcome.ts index 09da0ee455dd5..4305d9c566670 100644 --- a/src/webviews/apps/welcome/welcome.ts +++ b/src/webviews/apps/welcome/welcome.ts @@ -31,7 +31,7 @@ export class GlWelcomeApp extends GlAppHost { return html`
- +

GitLens is now installed in Cursor

Understand every line of code — instantly. GitLens reveals authorship, activity, and history From d1b3a5aaadea06241a4032851adac31ba21e110e Mon Sep 17 00:00:00 2001 From: Sergei Shmakov Date: Thu, 4 Dec 2025 20:36:55 +0100 Subject: [PATCH 05/12] Refines features carousel styling. Updates carousel styles for better visual consistency, including layout improvements, typography, and theming with VSCode variables. Enhances maintainability and prepares for future feature image integration. (#4769, #4773, PLG-138) --- src/webviews/apps/media/feature-graph.svg | 11 +++++ .../welcome/components/feature-carousel.ts | 25 +++++++----- src/webviews/apps/welcome/welcome.css.ts | 40 ++++++++++++++++++- 3 files changed, 66 insertions(+), 10 deletions(-) create mode 100644 src/webviews/apps/media/feature-graph.svg diff --git a/src/webviews/apps/media/feature-graph.svg b/src/webviews/apps/media/feature-graph.svg new file mode 100644 index 0000000000000..ab40260a2541a --- /dev/null +++ b/src/webviews/apps/media/feature-graph.svg @@ -0,0 +1,11 @@ + + + + + Commit Graph Placeholder + + + Replace with actual feature image + + + diff --git a/src/webviews/apps/welcome/components/feature-carousel.ts b/src/webviews/apps/welcome/components/feature-carousel.ts index 3bb2cfd4a88ea..303c646a350b4 100644 --- a/src/webviews/apps/welcome/components/feature-carousel.ts +++ b/src/webviews/apps/welcome/components/feature-carousel.ts @@ -15,6 +15,10 @@ export class GlFeatureCarousel extends LitElement { static override styles = [ css` :host { + --gl-carousel-border-radius: 0; + --gl-carousel-background-color: transparent; + --gl-carousel-padding: 1rem; + display: block; width: 100%; } @@ -36,8 +40,11 @@ export class GlFeatureCarousel extends LitElement { display: flex; align-items: center; justify-content: center; - } + border-radius: var(--gl-carousel-border-radius); + background-color: var(--gl-carousel-background-color); + padding: var(--gl-carousel-padding); + } ::slotted(*) { display: none; @@ -117,19 +124,19 @@ export class GlFeatureCard extends LitElement { css` :host { display: flex; + gap: 1rem; } .image { - } - .content { - } - ::slotted(img) { - } - - ::slotted(h1) { + width: 50%; } - ::slotted(p) { + .content { + margin-top: 0.5rem; + flex: 1; + display: flex; + flex-direction: column; + gap: 0.5rem; } `, ]; diff --git a/src/webviews/apps/welcome/welcome.css.ts b/src/webviews/apps/welcome/welcome.css.ts index 58a3e2d69a2e2..903494a1cd077 100644 --- a/src/webviews/apps/welcome/welcome.css.ts +++ b/src/webviews/apps/welcome/welcome.css.ts @@ -3,6 +3,9 @@ import { css } from 'lit'; const colorScheme = css` :host { --accent-color: #cb64ff; + --text-color: var(--vscode-descriptionForeground); + --em-color: var(--vscode-editor-foreground); + --link-color: var(--vscode-textLink-foreground); --hero-gradient: radial-gradient(76.32% 76.32% at 50% 7.24%, #7b00ff 29.72%, rgba(255, 0, 242, 0) 100%); } @@ -12,12 +15,14 @@ const typography = css` :host { --h1-font-size: 1.4rem; --p-font-size: 1rem; + --card-font-size: var(--vscode-font-size); } @media (max-width: 640px) { :host { --h1-font-size: 0.75rem; --p-font-size: 0.7rem; + --card-font-size: var(--vscode-editor-font-size); } } `; @@ -89,13 +94,46 @@ const header = css` margin-bottom: 0; font-size: var(--h1-font-size); + color: var(--em-text-color); } .header p { - color: var(--vscode-descriptionForeground); + color: var(--text-color); + } +`; + +const carousel = css` + gl-feature-carousel { + text-align: initial; + --gl-carousel-border-radius: 0.65rem; + --gl-carousel-background-color: var(--vscode-textBlockQuote-background); + } + + gl-feature-carousel h1 { + margin: 0; + font-size: var(--card-font-size); + color: var(--em-color); + } + + gl-feature-carousel p { + margin: 0.4em 0; + font-size: var(--card-font-size); + color: var(--text-color); + } + + gl-feature-carousel img { + max-width: 100%; + height: auto; + border-radius: 0.4rem; + } + + gl-feature-carousel a { + color: var(--link-color); + text-decoration: none; } `; export const welcomeStyles = css` ${colorScheme} ${typography} ${heroGradient} ${section} ${header} + ${carousel} `; From 3659236664b155f5dda46324d820b5c6738081c2 Mon Sep 17 00:00:00 2001 From: Sergei Shmakov Date: Fri, 5 Dec 2025 15:32:01 +0100 Subject: [PATCH 06/12] Enhances welcome UI for better scaling and narrow view support Refines font sizing and spacing units from rem to em to improve consistency and responsiveness across devices. Updates carousel and feature card layouts for better display on small screens, including improved media queries and more flexible padding. Adjusts section and header styling to ensure readability and visual alignment, especially on mobile. (#4769, #4773, PLG-138) --- .../welcome/components/feature-carousel.ts | 30 ++++++++++-- src/webviews/apps/welcome/welcome.css.ts | 48 ++++++++++++++----- src/webviews/apps/welcome/welcome.ts | 4 +- 3 files changed, 62 insertions(+), 20 deletions(-) diff --git a/src/webviews/apps/welcome/components/feature-carousel.ts b/src/webviews/apps/welcome/components/feature-carousel.ts index 303c646a350b4..eee74b6bbf35f 100644 --- a/src/webviews/apps/welcome/components/feature-carousel.ts +++ b/src/webviews/apps/welcome/components/feature-carousel.ts @@ -17,7 +17,7 @@ export class GlFeatureCarousel extends LitElement { :host { --gl-carousel-border-radius: 0; --gl-carousel-background-color: transparent; - --gl-carousel-padding: 1rem; + --gl-carousel-padding: 1em; display: block; width: 100%; @@ -25,7 +25,7 @@ export class GlFeatureCarousel extends LitElement { .carousel { display: flex; - gap: 1rem; + gap: 1em; justify-content: center; } @@ -124,7 +124,7 @@ export class GlFeatureCard extends LitElement { css` :host { display: flex; - gap: 1rem; + gap: 1em; } .image { @@ -132,11 +132,31 @@ export class GlFeatureCard extends LitElement { } .content { - margin-top: 0.5rem; + margin-top: 0.5em; flex: 1; display: flex; flex-direction: column; - gap: 0.5rem; + gap: 0.5em; + } + + @media (max-width: 640px) { + :host { + flex-direction: column; + } + + .image { + width: 100%; + } + + .content { + margin-top: 0; + margin-left: 0.3em; + margin-right: 0.3em; + } + + ::slotted(*) { + width: 100%; + } } `, ]; diff --git a/src/webviews/apps/welcome/welcome.css.ts b/src/webviews/apps/welcome/welcome.css.ts index 903494a1cd077..4ebcc69bb0bc7 100644 --- a/src/webviews/apps/welcome/welcome.css.ts +++ b/src/webviews/apps/welcome/welcome.css.ts @@ -13,16 +13,25 @@ const colorScheme = css` const typography = css` :host { - --h1-font-size: 1.4rem; - --p-font-size: 1rem; - --card-font-size: var(--vscode-font-size); + font-size: var(--vscode-font-size); + + --h1-font-size: 1.7em; + --p-font-size: 1.23em; + --card-font-size: 1em; } @media (max-width: 640px) { :host { - --h1-font-size: 0.75rem; - --p-font-size: 0.7rem; - --card-font-size: var(--vscode-editor-font-size); + font-size: var(--vscode-editor-font-size); + --h1-font-size: 1em; + --p-font-size: 1em; + --card-font-size: 1em; + } + } + + @media (max-width: 300px) { + :host { + font-size: calc(var(--vscode-editor-font-size) * 0.8); } } `; @@ -60,14 +69,15 @@ const section = css` justify-content: center; align-items: center; text-align: center; - font-size: var(--p-font-size); - } - .section p { - max-width: 30em; } .section .accent { color: var(--accent-color); } + + .section.plain p { + max-width: 30em; + font-size: var(--p-font-size); + } `; const header = css` @@ -104,10 +114,23 @@ const header = css` const carousel = css` gl-feature-carousel { text-align: initial; - --gl-carousel-border-radius: 0.65rem; + --gl-carousel-border-radius: 0.63em; + --gl-carousel-padding: 1.8em; --gl-carousel-background-color: var(--vscode-textBlockQuote-background); } + @media (max-width: 640px) { + gl-feature-carousel { + --gl-carousel-padding: 1em; + } + } + + @media (max-width: 300px) { + gl-feature-carousel { + --gl-carousel-padding: 0.5em; + } + } + gl-feature-carousel h1 { margin: 0; font-size: var(--card-font-size); @@ -115,7 +138,7 @@ const carousel = css` } gl-feature-carousel p { - margin: 0.4em 0; + margin: 0.4em 0 0; font-size: var(--card-font-size); color: var(--text-color); } @@ -123,7 +146,6 @@ const carousel = css` gl-feature-carousel img { max-width: 100%; height: auto; - border-radius: 0.4rem; } gl-feature-carousel a { diff --git a/src/webviews/apps/welcome/welcome.ts b/src/webviews/apps/welcome/welcome.ts index 4305d9c566670..3837645c84446 100644 --- a/src/webviews/apps/welcome/welcome.ts +++ b/src/webviews/apps/welcome/welcome.ts @@ -30,7 +30,7 @@ export class GlWelcomeApp extends GlAppHost { override render(): unknown { return html`

-
+

GitLens is now installed in Cursor

@@ -38,7 +38,7 @@ export class GlWelcomeApp extends GlAppHost { inside the editor

-
+

With PRO subscription you get more

From 75ddd92d354fd27fb798b390d32836632028d0d8 Mon Sep 17 00:00:00 2001 From: Sergei Shmakov Date: Fri, 5 Dec 2025 18:43:56 +0100 Subject: [PATCH 07/12] Separates feature card to a new file (#4769, #4773, PLG-138) --- .../apps/welcome/components/feature-card.ts | 65 +++++++++++++++++++ .../welcome/components/feature-carousel.ts | 56 ---------------- src/webviews/apps/welcome/welcome.ts | 1 + 3 files changed, 66 insertions(+), 56 deletions(-) create mode 100644 src/webviews/apps/welcome/components/feature-card.ts diff --git a/src/webviews/apps/welcome/components/feature-card.ts b/src/webviews/apps/welcome/components/feature-card.ts new file mode 100644 index 0000000000000..2e8f06a43f99c --- /dev/null +++ b/src/webviews/apps/welcome/components/feature-card.ts @@ -0,0 +1,65 @@ +import { css, html, LitElement } from 'lit'; +import { customElement } from 'lit/decorators.js'; +import '../../shared/components/button'; +import '../../shared/components/code-icon'; + +declare global { + interface HTMLElementTagNameMap { + 'gl-feature-card': GlFeatureCard; + } +} + +@customElement('gl-feature-card') +export class GlFeatureCard extends LitElement { + static override styles = [ + css` + :host { + display: flex; + gap: 1em; + } + + .image { + width: 50%; + } + + .content { + margin-top: 0.5em; + flex: 1; + display: flex; + flex-direction: column; + gap: 0.5em; + } + + @media (max-width: 640px) { + :host { + flex-direction: column; + } + + .image { + width: 100%; + } + + .content { + margin-top: 0; + margin-left: 0.3em; + margin-right: 0.3em; + } + + ::slotted(*) { + width: 100%; + } + } + `, + ]; + + override render(): unknown { + return html` +
+ +
+
+ +
+ `; + } +} diff --git a/src/webviews/apps/welcome/components/feature-carousel.ts b/src/webviews/apps/welcome/components/feature-carousel.ts index eee74b6bbf35f..14a135f4a9dfe 100644 --- a/src/webviews/apps/welcome/components/feature-carousel.ts +++ b/src/webviews/apps/welcome/components/feature-carousel.ts @@ -6,7 +6,6 @@ import '../../shared/components/code-icon'; declare global { interface HTMLElementTagNameMap { 'gl-feature-carousel': GlFeatureCarousel; - 'gl-feature-card': GlFeatureCard; } } @@ -117,58 +116,3 @@ export class GlFeatureCarousel extends LitElement { `; } } - -@customElement('gl-feature-card') -export class GlFeatureCard extends LitElement { - static override styles = [ - css` - :host { - display: flex; - gap: 1em; - } - - .image { - width: 50%; - } - - .content { - margin-top: 0.5em; - flex: 1; - display: flex; - flex-direction: column; - gap: 0.5em; - } - - @media (max-width: 640px) { - :host { - flex-direction: column; - } - - .image { - width: 100%; - } - - .content { - margin-top: 0; - margin-left: 0.3em; - margin-right: 0.3em; - } - - ::slotted(*) { - width: 100%; - } - } - `, - ]; - - override render(): unknown { - return html` -
- -
-
- -
- `; - } -} diff --git a/src/webviews/apps/welcome/welcome.ts b/src/webviews/apps/welcome/welcome.ts index 3837645c84446..1cd534b9e2272 100644 --- a/src/webviews/apps/welcome/welcome.ts +++ b/src/webviews/apps/welcome/welcome.ts @@ -11,6 +11,7 @@ import { WelcomeStateProvider } from './stateProvider'; import '../shared/components/gitlens-logo'; import { welcomeStyles } from './welcome.css'; import './components/feature-carousel'; +import './components/feature-card'; @customElement('gl-welcome-app') export class GlWelcomeApp extends GlAppHost { From ba4dc2e0f1ddb0f9614796042fc96536a577d9af Mon Sep 17 00:00:00 2001 From: Sergei Shmakov Date: Fri, 5 Dec 2025 17:51:43 +0100 Subject: [PATCH 08/12] Adds Pro trial action button for welcome webview Introduces a new "Start GitLens Pro Trial" button to the welcome webview and tracks user interactions with a dedicated telemetry event. Updates telemetry documentation and types to include "welcome" as a source and to describe the new "welcome/action" event, enabling better insight into user engagement with onboarding and trial features. (#4769, #4773, PLG-138) --- docs/telemetry-events.md | 72 ++++++++++++++++-------- src/constants.telemetry.ts | 10 ++++ src/webviews/apps/welcome/welcome.css.ts | 20 +++++++ src/webviews/apps/welcome/welcome.ts | 20 +++++++ 4 files changed, 98 insertions(+), 24 deletions(-) diff --git a/docs/telemetry-events.md b/docs/telemetry-events.md index 5052df96c2e55..f0eb089fbfff7 100644 --- a/docs/telemetry-events.md +++ b/docs/telemetry-events.md @@ -581,7 +581,7 @@ void 'attempts': number, 'autoInstall': boolean, 'error.message': string, - 'source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees' + 'source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'welcome' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees' } ``` @@ -593,7 +593,7 @@ void { 'attempts': number, 'autoInstall': boolean, - 'source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees' + 'source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'welcome' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees' } ``` @@ -605,7 +605,7 @@ void { 'attempts': number, 'autoInstall': boolean, - 'source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', + 'source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'welcome' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', 'version': string } ``` @@ -1027,7 +1027,7 @@ or 'context.operations.undo.count': number, 'context.session.duration': number, 'context.session.start': string, - 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', + 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'welcome' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', 'context.warnings.indexChanged': boolean, 'context.warnings.workingDirectoryChanged': boolean, 'context.webview.host': 'view' | 'editor', @@ -1082,7 +1082,7 @@ or 'context.operations.undo.count': number, 'context.session.duration': number, 'context.session.start': string, - 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', + 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'welcome' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', 'context.warnings.indexChanged': boolean, 'context.warnings.workingDirectoryChanged': boolean, 'context.webview.host': 'view' | 'editor', @@ -1137,7 +1137,7 @@ or 'context.operations.undo.count': number, 'context.session.duration': number, 'context.session.start': string, - 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', + 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'welcome' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', 'context.warnings.indexChanged': boolean, 'context.warnings.workingDirectoryChanged': boolean, 'context.webview.host': 'view' | 'editor', @@ -1192,7 +1192,7 @@ or 'context.operations.undo.count': number, 'context.session.duration': number, 'context.session.start': string, - 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', + 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'welcome' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', 'context.warnings.indexChanged': boolean, 'context.warnings.workingDirectoryChanged': boolean, 'context.webview.host': 'view' | 'editor', @@ -1247,7 +1247,7 @@ or 'context.operations.undo.count': number, 'context.session.duration': number, 'context.session.start': string, - 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', + 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'welcome' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', 'context.warnings.indexChanged': boolean, 'context.warnings.workingDirectoryChanged': boolean, 'context.webview.host': 'view' | 'editor', @@ -1302,7 +1302,7 @@ or 'context.operations.undo.count': number, 'context.session.duration': number, 'context.session.start': string, - 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', + 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'welcome' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', 'context.warnings.indexChanged': boolean, 'context.warnings.workingDirectoryChanged': boolean, 'context.webview.host': 'view' | 'editor', @@ -1357,7 +1357,7 @@ or 'context.operations.undo.count': number, 'context.session.duration': number, 'context.session.start': string, - 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', + 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'welcome' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', 'context.warnings.indexChanged': boolean, 'context.warnings.workingDirectoryChanged': boolean, 'context.webview.host': 'view' | 'editor', @@ -1412,7 +1412,7 @@ or 'context.operations.undo.count': number, 'context.session.duration': number, 'context.session.start': string, - 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', + 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'welcome' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', 'context.warnings.indexChanged': boolean, 'context.warnings.workingDirectoryChanged': boolean, 'context.webview.host': 'view' | 'editor', @@ -1467,7 +1467,7 @@ or 'context.operations.undo.count': number, 'context.session.duration': number, 'context.session.start': string, - 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', + 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'welcome' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', 'context.warnings.indexChanged': boolean, 'context.warnings.workingDirectoryChanged': boolean, 'context.webview.host': 'view' | 'editor', @@ -1522,7 +1522,7 @@ or 'context.operations.undo.count': number, 'context.session.duration': number, 'context.session.start': string, - 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', + 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'welcome' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', 'context.warnings.indexChanged': boolean, 'context.warnings.workingDirectoryChanged': boolean, 'context.webview.host': 'view' | 'editor', @@ -1577,7 +1577,7 @@ or 'context.operations.undo.count': number, 'context.session.duration': number, 'context.session.start': string, - 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', + 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'welcome' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', 'context.warnings.indexChanged': boolean, 'context.warnings.workingDirectoryChanged': boolean, 'context.webview.host': 'view' | 'editor', @@ -1632,7 +1632,7 @@ or 'context.operations.undo.count': number, 'context.session.duration': number, 'context.session.start': string, - 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', + 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'welcome' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', 'context.warnings.indexChanged': boolean, 'context.warnings.workingDirectoryChanged': boolean, 'context.webview.host': 'view' | 'editor', @@ -1699,7 +1699,7 @@ or 'context.operations.undo.count': number, 'context.session.duration': number, 'context.session.start': string, - 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', + 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'welcome' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', 'context.warnings.indexChanged': boolean, 'context.warnings.workingDirectoryChanged': boolean, 'context.webview.host': 'view' | 'editor', @@ -1754,7 +1754,7 @@ or 'context.operations.undo.count': number, 'context.session.duration': number, 'context.session.start': string, - 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', + 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'welcome' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', 'context.warnings.indexChanged': boolean, 'context.warnings.workingDirectoryChanged': boolean, 'context.webview.host': 'view' | 'editor', @@ -1836,7 +1836,7 @@ or 'context.operations.undo.count': number, 'context.session.duration': number, 'context.session.start': string, - 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', + 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'welcome' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', 'context.warnings.indexChanged': boolean, 'context.warnings.workingDirectoryChanged': boolean, 'context.webview.host': 'view' | 'editor', @@ -1891,7 +1891,7 @@ or 'context.operations.undo.count': number, 'context.session.duration': number, 'context.session.start': string, - 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', + 'context.source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'welcome' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees', 'context.warnings.indexChanged': boolean, 'context.warnings.workingDirectoryChanged': boolean, 'context.webview.host': 'view' | 'editor', @@ -2823,7 +2823,7 @@ void 'cli.version': string, 'error.message': string, 'reason': string, - 'source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees' + 'source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'welcome' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees' } ``` @@ -2835,7 +2835,7 @@ void { 'cli.version': string, 'requiresUserCompletion': boolean, - 'source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees' + 'source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'welcome' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees' } ``` @@ -2848,7 +2848,7 @@ void 'cli.version': string, 'error.message': string, 'reason': string, - 'source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees' + 'source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'welcome' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees' } ``` @@ -2858,7 +2858,7 @@ void ```typescript { - 'source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees' + 'source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'welcome' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees' } ``` @@ -2895,7 +2895,7 @@ void 'repoPrivacy': 'private' | 'public' | 'local', 'repository.visibility': 'private' | 'public' | 'local', // Provided for compatibility with other GK surfaces - 'source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees' + 'source': 'account' | 'subscription' | 'graph' | 'composer' | 'patchDetails' | 'settings' | 'timeline' | 'welcome' | 'home' | 'ai' | 'ai:markdown-preview' | 'ai:markdown-editor' | 'ai:picker' | 'associateIssueWithBranch' | 'cloud-patches' | 'code-suggest' | 'commandPalette' | 'deeplink' | 'editor:hover' | 'feature-badge' | 'feature-gate' | 'gk-cli-integration' | 'gk-mcp-provider' | 'inspect' | 'inspect-overview' | 'integrations' | 'launchpad' | 'launchpad-indicator' | 'launchpad-view' | 'mcp' | 'mcp-welcome-message' | 'merge-target' | 'notification' | 'prompt' | 'quick-wizard' | 'rebaseEditor' | 'remoteProvider' | 'scm' | 'scm-input' | 'startWork' | 'statusbar:hover' | 'trial-indicator' | 'view' | 'view:hover' | 'walkthrough' | 'whatsnew' | 'worktrees' } ``` @@ -3538,6 +3538,30 @@ or } ``` +### welcome/action + +> Sent when an action is taken in the welcome webview + +```typescript +{ + 'command': string, + 'detail': string, + 'name': 'plus/sign-up', + 'type': 'command' +} +``` + +or + +```typescript +{ + 'detail': string, + 'name': 'plus/sign-up', + 'type': 'url', + 'url': string +} +``` + ### welcome/closed ```typescript diff --git a/src/constants.telemetry.ts b/src/constants.telemetry.ts index a5e0ebada9a15..ef0eebf797442 100644 --- a/src/constants.telemetry.ts +++ b/src/constants.telemetry.ts @@ -356,6 +356,9 @@ export interface TelemetryEvents extends WebviewShowAbortedEvents, WebviewShownE /** Sent when the walkthrough is opened */ 'walkthrough/action': WalkthroughActionEvent; 'walkthrough/completion': WalkthroughCompletionEvent; + + /** Sent when an action is taken in the welcome webview */ + 'welcome/action': WelcomeActionEvent; } type WebviewShowAbortedEvents = { @@ -1202,6 +1205,12 @@ interface WalkthroughCompletionEvent { 'context.key': WalkthroughContextKeys; } +type WelcomeActionNames = 'plus/sign-up'; + +type WelcomeActionEvent = + | { type: 'command'; name: WelcomeActionNames; command: string; detail?: string } + | { type: 'url'; name: WelcomeActionNames; url: string; detail?: string }; + type WebviewContextEventData = { 'context.webview.id': string; 'context.webview.type': string; @@ -1282,6 +1291,7 @@ export type Sources = | 'view' | 'view:hover' | 'walkthrough' + | 'welcome' | 'whatsnew' | 'worktrees'; diff --git a/src/webviews/apps/welcome/welcome.css.ts b/src/webviews/apps/welcome/welcome.css.ts index 4ebcc69bb0bc7..3fdc1aa3e4cfc 100644 --- a/src/webviews/apps/welcome/welcome.css.ts +++ b/src/webviews/apps/welcome/welcome.css.ts @@ -8,6 +8,7 @@ const colorScheme = css` --link-color: var(--vscode-textLink-foreground); --hero-gradient: radial-gradient(76.32% 76.32% at 50% 7.24%, #7b00ff 29.72%, rgba(255, 0, 242, 0) 100%); + --trial-button-gradient: linear-gradient(90deg, #7900c9 0%, #196fff 100%); } `; @@ -78,6 +79,25 @@ const section = css` max-width: 30em; font-size: var(--p-font-size); } + + .section.start-trial { + margin: 2em 3.1em; + } + .section.start-trial p { + width: 100%; + } + .section.start-trial gl-button { + background: var(--trial-button-gradient); + border: none; + width: 100%; + } + + @media (min-width: 640px) { + .section.start-trial gl-button { + --button-padding: 0.4em 4em; + width: initial; + } + } `; const header = css` diff --git a/src/webviews/apps/welcome/welcome.ts b/src/webviews/apps/welcome/welcome.ts index 1cd534b9e2272..065f706988e66 100644 --- a/src/webviews/apps/welcome/welcome.ts +++ b/src/webviews/apps/welcome/welcome.ts @@ -2,6 +2,8 @@ import './welcome.scss'; import { html } from 'lit'; import { customElement, property } from 'lit/decorators.js'; +import type { GlCommands } from '../../../constants.commands'; +import { ExecuteCommand } from '../../protocol'; import type { State } from '../../welcome/protocol'; import { GlAppHost } from '../shared/appHost'; import { scrollableBase } from '../shared/components/styles/lit/base.css'; @@ -28,6 +30,20 @@ export class GlWelcomeApp extends GlAppHost { @property({ type: String }) webroot?: string; + private onStartTrial() { + const command: GlCommands = 'gitlens.plus.signUp'; + this._telemetry.sendEvent({ + name: 'welcome/action', + data: { + type: 'command', + name: 'plus/sign-up', + command: command, + }, + source: { source: 'welcome' }, + }); + this._ipc.sendCommand(ExecuteCommand, { command: command, args: [{ source: 'welcome' }] }); + } + override render(): unknown { return html`
@@ -64,6 +80,10 @@ export class GlWelcomeApp extends GlAppHost {
+
+ this.onStartTrial()}>Start GitLens Pro Trial +
+

✨ Key Features

    From 6053eb3ea0e34a04f21cdc09640aa459e8a4ee89 Mon Sep 17 00:00:00 2001 From: Sergei Shmakov Date: Fri, 5 Dec 2025 18:02:20 +0100 Subject: [PATCH 09/12] Removes dummy text from welcome screen (#4769, #4773, PLG-138) --- src/webviews/apps/welcome/welcome.ts | 48 ---------------------------- 1 file changed, 48 deletions(-) diff --git a/src/webviews/apps/welcome/welcome.ts b/src/webviews/apps/welcome/welcome.ts index 065f706988e66..8c4ed92ef76f5 100644 --- a/src/webviews/apps/welcome/welcome.ts +++ b/src/webviews/apps/welcome/welcome.ts @@ -84,54 +84,6 @@ export class GlWelcomeApp extends GlAppHost { this.onStartTrial()}>Start GitLens Pro Trial
-
-

✨ Key Features

-
    -
  • - 📝 - Blame Annotations - See who changed each line and when -
  • -
  • - 📊 - Commit Graph - Visualize your repository's history -
  • -
  • - 🔍 - File History - Track changes to any file over time -
  • -
  • - 🌿 - Branch Management - Easily manage branches and remotes -
  • -
  • - 🤖 - AI Features - Generate commit messages and explanations -
  • -
-
- -
-

🎯 Next Steps

-
    -
  • - 1. - Open the GitLens Home view in the sidebar to see your active work -
  • -
  • - 2. - Try the Commit Graph to visualize your repository -
  • -
  • - 3. - Hover over any line to see inline blame information -
  • -
  • - 4. - Explore the Command Palette (Cmd/Ctrl+Shift+P) and search for "GitLens" -
  • -
-
-

GitLens ${this.state?.version ?? ''} is ready to use!

From 816c4129e8e9e293c84a301e6c91c509d2081fac Mon Sep 17 00:00:00 2001 From: Sergei Shmakov Date: Fri, 5 Dec 2025 18:41:58 +0100 Subject: [PATCH 10/12] Improves typography styling (#4769, #4773, PLG-138) --- src/webviews/apps/welcome/welcome.css.ts | 27 +++++++++++++----------- src/webviews/apps/welcome/welcome.ts | 2 +- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/webviews/apps/welcome/welcome.css.ts b/src/webviews/apps/welcome/welcome.css.ts index 3fdc1aa3e4cfc..dba925d693b45 100644 --- a/src/webviews/apps/welcome/welcome.css.ts +++ b/src/webviews/apps/welcome/welcome.css.ts @@ -71,9 +71,24 @@ const section = css` align-items: center; text-align: center; } + .section h1 { + color: var(--em-color); + } + .section h2 { + color: var(--em-color); + font-weight: normal; + font-size: var(--p-font-size); + } + .section p { + color: var(--text-color); + } .section .accent { color: var(--accent-color); } + .section a { + color: var(--link-color); + text-decoration: none; + } .section.plain p { max-width: 30em; @@ -122,12 +137,7 @@ const header = css` } .header h1 { margin-bottom: 0; - font-size: var(--h1-font-size); - color: var(--em-text-color); - } - .header p { - color: var(--text-color); } `; @@ -154,24 +164,17 @@ const carousel = css` gl-feature-carousel h1 { margin: 0; font-size: var(--card-font-size); - color: var(--em-color); } gl-feature-carousel p { margin: 0.4em 0 0; font-size: var(--card-font-size); - color: var(--text-color); } gl-feature-carousel img { max-width: 100%; height: auto; } - - gl-feature-carousel a { - color: var(--link-color); - text-decoration: none; - } `; export const welcomeStyles = css` diff --git a/src/webviews/apps/welcome/welcome.ts b/src/webviews/apps/welcome/welcome.ts index 8c4ed92ef76f5..68de133a9cba1 100644 --- a/src/webviews/apps/welcome/welcome.ts +++ b/src/webviews/apps/welcome/welcome.ts @@ -56,7 +56,7 @@ export class GlWelcomeApp extends GlAppHost {

-

With PRO subscription you get more

+

With PRO subscription you get more

From ae6e51091882451a7df8e0cf4c2b2aee40dc89d6 Mon Sep 17 00:00:00 2001 From: Sergei Shmakov Date: Fri, 5 Dec 2025 19:41:50 +0100 Subject: [PATCH 11/12] Refines cards layout (#4769, #4773, PLG-138) --- .../welcome/components/feature-carousel.ts | 8 ------ src/webviews/apps/welcome/welcome.css.ts | 27 +++++++++---------- src/webviews/apps/welcome/welcome.ts | 4 +-- 3 files changed, 15 insertions(+), 24 deletions(-) diff --git a/src/webviews/apps/welcome/components/feature-carousel.ts b/src/webviews/apps/welcome/components/feature-carousel.ts index 14a135f4a9dfe..60161f6e20813 100644 --- a/src/webviews/apps/welcome/components/feature-carousel.ts +++ b/src/webviews/apps/welcome/components/feature-carousel.ts @@ -14,10 +14,6 @@ export class GlFeatureCarousel extends LitElement { static override styles = [ css` :host { - --gl-carousel-border-radius: 0; - --gl-carousel-background-color: transparent; - --gl-carousel-padding: 1em; - display: block; width: 100%; } @@ -39,10 +35,6 @@ export class GlFeatureCarousel extends LitElement { display: flex; align-items: center; justify-content: center; - - border-radius: var(--gl-carousel-border-radius); - background-color: var(--gl-carousel-background-color); - padding: var(--gl-carousel-padding); } ::slotted(*) { diff --git a/src/webviews/apps/welcome/welcome.css.ts b/src/webviews/apps/welcome/welcome.css.ts index dba925d693b45..3b4133e721ca8 100644 --- a/src/webviews/apps/welcome/welcome.css.ts +++ b/src/webviews/apps/welcome/welcome.css.ts @@ -141,44 +141,43 @@ const header = css` } `; -const carousel = css` - gl-feature-carousel { +const cards = css` + .card { + border-radius: 0.63em; + background-color: var(--vscode-textBlockQuote-background); + padding: 1.8em; text-align: initial; - --gl-carousel-border-radius: 0.63em; - --gl-carousel-padding: 1.8em; - --gl-carousel-background-color: var(--vscode-textBlockQuote-background); } @media (max-width: 640px) { - gl-feature-carousel { - --gl-carousel-padding: 1em; + .card { + padding: 1em; } } @media (max-width: 300px) { - gl-feature-carousel { - --gl-carousel-padding: 0.5em; + .card { + padding: 0.5em; } } - gl-feature-carousel h1 { + .card h1 { margin: 0; font-size: var(--card-font-size); } - gl-feature-carousel p { + .card p { margin: 0.4em 0 0; font-size: var(--card-font-size); } - gl-feature-carousel img { + .card img { max-width: 100%; - height: auto; } `; export const welcomeStyles = css` ${colorScheme} ${typography} ${heroGradient} ${section} ${header} - ${carousel} + ${cards} `; diff --git a/src/webviews/apps/welcome/welcome.ts b/src/webviews/apps/welcome/welcome.ts index 68de133a9cba1..4c1db30c856f2 100644 --- a/src/webviews/apps/welcome/welcome.ts +++ b/src/webviews/apps/welcome/welcome.ts @@ -61,13 +61,13 @@ export class GlWelcomeApp extends GlAppHost {
- + Commit Graph

Commit Graph

Visualize your repository's history and interact with commits

Open Commit Graph

- + Date: Fri, 5 Dec 2025 19:54:17 +0100 Subject: [PATCH 12/12] Adds initial layout of scrollable cards (#4769, #4773, PLG-138) --- .../apps/welcome/components/feature-card.ts | 7 +- .../welcome/components/feature-narrow-card.ts | 60 ++++++++++++++ src/webviews/apps/welcome/welcome.css.ts | 20 ++++- src/webviews/apps/welcome/welcome.ts | 82 ++++++++++++++++++- 4 files changed, 160 insertions(+), 9 deletions(-) create mode 100644 src/webviews/apps/welcome/components/feature-narrow-card.ts diff --git a/src/webviews/apps/welcome/components/feature-card.ts b/src/webviews/apps/welcome/components/feature-card.ts index 2e8f06a43f99c..47eb51d997490 100644 --- a/src/webviews/apps/welcome/components/feature-card.ts +++ b/src/webviews/apps/welcome/components/feature-card.ts @@ -24,13 +24,10 @@ export class GlFeatureCard extends LitElement { .content { margin-top: 0.5em; - flex: 1; - display: flex; - flex-direction: column; - gap: 0.5em; + display: block; } - @media (max-width: 640px) { + @media (max-width: 400px) { :host { flex-direction: column; } diff --git a/src/webviews/apps/welcome/components/feature-narrow-card.ts b/src/webviews/apps/welcome/components/feature-narrow-card.ts new file mode 100644 index 0000000000000..214bb77d5a1cd --- /dev/null +++ b/src/webviews/apps/welcome/components/feature-narrow-card.ts @@ -0,0 +1,60 @@ +import { css, html, LitElement } from 'lit'; +import { customElement } from 'lit/decorators.js'; +import '../../shared/components/button'; +import '../../shared/components/code-icon'; + +declare global { + interface HTMLElementTagNameMap { + 'gl-feature-narrow-card': GlFeatureNarrowCard; + } +} + +@customElement('gl-feature-narrow-card') +export class GlFeatureNarrowCard extends LitElement { + static override styles = [ + css` + :host { + display: flex; + flex-direction: column; + gap: 0.7em; + width: 12em; + min-width: 12em; + text-align: initial; + } + + .image ::slotted(img) { + max-height: 2.23em; + border-radius: 0.6em; + } + + ::slotted(p:last-child) { + margin-top: 0.5em; + } + + .content { + display: block; + } + + @media (max-width: 400px) { + .content { + margin-left: 0.3em; + margin-right: 0.3em; + } + } + + @media (max-width: 300px) { + } + `, + ]; + + override render(): unknown { + return html` +
+ +
+
+ +
+ `; + } +} diff --git a/src/webviews/apps/welcome/welcome.css.ts b/src/webviews/apps/welcome/welcome.css.ts index 3b4133e721ca8..54f5e8fa1226f 100644 --- a/src/webviews/apps/welcome/welcome.css.ts +++ b/src/webviews/apps/welcome/welcome.css.ts @@ -55,7 +55,7 @@ const heroGradient = css` height: 517px; } - @media (max-width: 640px) { + @media (max-width: 400px) { .welcome::before { width: 328px; height: 273px; @@ -167,17 +167,33 @@ const cards = css` } .card p { - margin: 0.4em 0 0; + margin: 0.5em 0 0; font-size: var(--card-font-size); } + .card p:last-child { + margin: 1em 0 0; + } + .card img { max-width: 100%; } `; +const scrollableFeatures = css` + gl-scrollable-features { + display: flex; + gap: 1em; + max-width: 100%; + overflow-x: auto; + overflow-y: hidden; + scrollbar-width: none; + } +`; + export const welcomeStyles = css` ${colorScheme} ${typography} ${heroGradient} ${section} ${header} + ${scrollableFeatures} ${cards} `; diff --git a/src/webviews/apps/welcome/welcome.ts b/src/webviews/apps/welcome/welcome.ts index 4c1db30c856f2..9a125f9d67086 100644 --- a/src/webviews/apps/welcome/welcome.ts +++ b/src/webviews/apps/welcome/welcome.ts @@ -14,6 +14,7 @@ import '../shared/components/gitlens-logo'; import { welcomeStyles } from './welcome.css'; import './components/feature-carousel'; import './components/feature-card'; +import './components/feature-narrow-card'; @customElement('gl-welcome-app') export class GlWelcomeApp extends GlAppHost { @@ -84,8 +85,85 @@ export class GlWelcomeApp extends GlAppHost { this.onStartTrial()}>Start GitLens Pro Trial
-
-

GitLens ${this.state?.version ?? ''} is ready to use!

+
+

You also get these free features

+
+ +
+ + + Commit Graph +

Commit Graph

+

Visualize your repository's history and interact with commits

+

Open Commit Graph

+
+ + Visual File History +

Visual File History

+

Track changes to any file over time

+

Open Visual File History

+
+ + Commit Graph +

Commit Graph

+

Visualize your repository's history and interact with commits

+

Open Commit Graph

+
+ + Visual File History +

Visual File History

+

Track changes to any file over time

+

Open Visual File History

+
+ + Commit Graph +

Commit Graph

+

Visualize your repository's history and interact with commits

+

Open Commit Graph

+
+ + Visual File History +

Visual File History

+

Track changes to any file over time

+

Open Visual File History

+
+
`;