@@ -8,6 +8,7 @@ import { Button } from '../../../../../base/browser/ui/button/button.js';
8
8
import { renderIcon } from '../../../../../base/browser/ui/iconLabel/iconLabels.js' ;
9
9
import { Event } from '../../../../../base/common/event.js' ;
10
10
import { IMarkdownString } from '../../../../../base/common/htmlContent.js' ;
11
+ import { KeyCode } from '../../../../../base/common/keyCodes.js' ;
11
12
import { Disposable , DisposableStore } from '../../../../../base/common/lifecycle.js' ;
12
13
import { ThemeIcon } from '../../../../../base/common/themables.js' ;
13
14
import { IMarkdownRenderResult , MarkdownRenderer } from '../../../../../editor/browser/widget/markdownRenderer/browser/markdownRenderer.js' ;
@@ -22,6 +23,7 @@ import { ChatAgentLocation } from '../../common/constants.js';
22
23
import { IChatWidgetService } from '../chat.js' ;
23
24
import { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js' ;
24
25
import { chatViewsWelcomeRegistry , IChatViewsWelcomeDescriptor } from './chatViewsWelcome.js' ;
26
+ import { StandardKeyboardEvent } from '../../../../../base/browser/keyboardEvent.js' ;
25
27
26
28
const $ = dom . $ ;
27
29
@@ -187,14 +189,17 @@ export class ChatViewWelcomePart extends Disposable {
187
189
const suggestedPromptsContainer = dom . append ( this . element , $ ( '.chat-welcome-view-suggested-prompts' ) ) ;
188
190
for ( const prompt of content . suggestedPrompts ) {
189
191
const promptElement = dom . append ( suggestedPromptsContainer , $ ( '.chat-welcome-view-suggested-prompt' ) ) ;
192
+ // Make the prompt element keyboard accessible
193
+ promptElement . setAttribute ( 'role' , 'button' ) ;
194
+ promptElement . setAttribute ( 'tabindex' , '0' ) ;
195
+ promptElement . setAttribute ( 'aria-label' , localize ( 'suggestedPromptAriaLabel' , 'Suggested prompt: {0}' , prompt . label ) ) ;
190
196
if ( prompt . icon ) {
191
197
const iconElement = dom . append ( promptElement , $ ( '.chat-welcome-view-suggested-prompt-icon' ) ) ;
192
198
iconElement . appendChild ( renderIcon ( prompt . icon ) ) ;
193
199
}
194
200
const labelElement = dom . append ( promptElement , $ ( '.chat-welcome-view-suggested-prompt-label' ) ) ;
195
201
labelElement . textContent = prompt . label ;
196
- this . _register ( dom . addDisposableListener ( promptElement , dom . EventType . CLICK , ( ) => {
197
-
202
+ const executePrompt = ( ) => {
198
203
type SuggestedPromptClickEvent = { suggestedPrompt : string } ;
199
204
200
205
type SuggestedPromptClickData = {
@@ -215,6 +220,17 @@ export class ChatViewWelcomePart extends Disposable {
215
220
} else {
216
221
this . chatWidgetService . lastFocusedWidget . setInput ( prompt . prompt ) ;
217
222
}
223
+ } ;
224
+ // Add click handler
225
+ this . _register ( dom . addDisposableListener ( promptElement , dom . EventType . CLICK , executePrompt ) ) ;
226
+ // Add keyboard handler for Enter and Space keys
227
+ this . _register ( dom . addDisposableListener ( promptElement , dom . EventType . KEY_DOWN , ( e ) => {
228
+ const event = new StandardKeyboardEvent ( e ) ;
229
+ if ( event . equals ( KeyCode . Enter ) || event . equals ( KeyCode . Space ) ) {
230
+ e . preventDefault ( ) ;
231
+ e . stopPropagation ( ) ;
232
+ executePrompt ( ) ;
233
+ }
218
234
} ) ) ;
219
235
}
220
236
}
0 commit comments