@@ -1297,32 +1297,42 @@ export const ClaudeCodeSession: React.FC<ClaudeCodeSessionProps> = ({
1297
1297
animate = { { opacity : 1 , y : 0 } }
1298
1298
exit = { { opacity : 0 , y : 20 } }
1299
1299
className = "fixed bottom-24 left-1/2 -translate-x-1/2 z-30 w-full max-w-3xl px-4"
1300
+ role = "region"
1301
+ aria-label = "Prompt queue"
1302
+ aria-live = "polite"
1300
1303
>
1301
1304
< div className = "bg-background/95 backdrop-blur-md border rounded-lg shadow-lg p-3 space-y-2" >
1302
1305
< div className = "flex items-center justify-between" >
1303
- < div className = "text-xs font-medium text-muted-foreground mb-1" >
1306
+ < div id = "queue-header" className = "text-xs font-medium text-muted-foreground mb-1" >
1304
1307
Queued Prompts ({ queuedPrompts . length } )
1305
1308
</ div >
1306
1309
< TooltipSimple content = { queuedPromptsCollapsed ? "Expand queue" : "Collapse queue" } side = "top" >
1307
1310
< motion . div
1308
1311
whileTap = { { scale : 0.97 } }
1309
1312
transition = { { duration : 0.15 } }
1310
1313
>
1311
- < Button variant = "ghost" size = "icon" onClick = { ( ) => setQueuedPromptsCollapsed ( prev => ! prev ) } >
1312
- { queuedPromptsCollapsed ? < ChevronUp className = "h-3 w-3" /> : < ChevronDown className = "h-3 w-3" /> }
1314
+ < Button
1315
+ variant = "ghost"
1316
+ size = "icon"
1317
+ onClick = { ( ) => setQueuedPromptsCollapsed ( prev => ! prev ) }
1318
+ aria-label = { queuedPromptsCollapsed ? "Expand queued prompts" : "Collapse queued prompts" }
1319
+ >
1320
+ { queuedPromptsCollapsed ? < ChevronUp className = "h-3 w-3" aria-hidden = "true" /> : < ChevronDown className = "h-3 w-3" aria-hidden = "true" /> }
1313
1321
</ Button >
1314
1322
</ motion . div >
1315
1323
</ TooltipSimple >
1316
1324
</ div >
1317
- { ! queuedPromptsCollapsed && queuedPrompts . map ( ( queuedPrompt , index ) => (
1318
- < motion . div
1319
- key = { queuedPrompt . id }
1320
- initial = { { opacity : 0 , y : 4 } }
1321
- animate = { { opacity : 1 , y : 0 } }
1322
- exit = { { opacity : 0 , y : - 4 } }
1323
- transition = { { duration : 0.15 , delay : index * 0.02 } }
1324
- className = "flex items-start gap-2 bg-muted/50 rounded-md p-2"
1325
- >
1325
+ { ! queuedPromptsCollapsed && (
1326
+ < ul role = "list" aria-labelledby = "queue-header" className = "space-y-2" >
1327
+ { queuedPrompts . map ( ( queuedPrompt , index ) => (
1328
+ < motion . li
1329
+ key = { queuedPrompt . id }
1330
+ initial = { { opacity : 0 , y : 4 } }
1331
+ animate = { { opacity : 1 , y : 0 } }
1332
+ exit = { { opacity : 0 , y : - 4 } }
1333
+ transition = { { duration : 0.15 , delay : index * 0.02 } }
1334
+ className = "flex items-start gap-2 bg-muted/50 rounded-md p-2"
1335
+ >
1326
1336
< div className = "flex-1 min-w-0" >
1327
1337
< div className = "flex items-center gap-2 mb-1" >
1328
1338
< span className = "text-xs font-medium text-muted-foreground" > #{ index + 1 } </ span >
@@ -1341,12 +1351,15 @@ export const ClaudeCodeSession: React.FC<ClaudeCodeSessionProps> = ({
1341
1351
size = "icon"
1342
1352
className = "h-6 w-6 flex-shrink-0"
1343
1353
onClick = { ( ) => setQueuedPrompts ( prev => prev . filter ( p => p . id !== queuedPrompt . id ) ) }
1354
+ aria-label = { `Remove queued prompt: ${ queuedPrompt . prompt . slice ( 0 , 50 ) } ${ queuedPrompt . prompt . length > 50 ? '...' : '' } ` }
1344
1355
>
1345
1356
< X className = "h-3 w-3" />
1346
1357
</ Button >
1347
1358
</ motion . div >
1348
- </ motion . div >
1349
- ) ) }
1359
+ </ motion . li >
1360
+ ) ) }
1361
+ </ ul >
1362
+ ) }
1350
1363
</ div >
1351
1364
</ motion . div >
1352
1365
) }
@@ -1395,7 +1408,8 @@ export const ClaudeCodeSession: React.FC<ClaudeCodeSessionProps> = ({
1395
1408
} }
1396
1409
className = "px-3 py-2 hover:bg-accent rounded-none"
1397
1410
>
1398
- < ChevronUp className = "h-4 w-4" />
1411
+ < ChevronUp className = "h-4 w-4"
1412
+ aria-label = "Scroll to top" />
1399
1413
</ Button >
1400
1414
</ motion . div >
1401
1415
</ TooltipSimple >
@@ -1423,7 +1437,8 @@ export const ClaudeCodeSession: React.FC<ClaudeCodeSessionProps> = ({
1423
1437
} }
1424
1438
className = "px-3 py-2 hover:bg-accent rounded-none"
1425
1439
>
1426
- < ChevronDown className = "h-4 w-4" />
1440
+ < ChevronDown className = "h-4 w-4"
1441
+ aria-label = "Scroll to bottom" />
1427
1442
</ Button >
1428
1443
</ motion . div >
1429
1444
</ TooltipSimple >
@@ -1455,6 +1470,9 @@ export const ClaudeCodeSession: React.FC<ClaudeCodeSessionProps> = ({
1455
1470
size = "icon"
1456
1471
onClick = { ( ) => setShowTimeline ( ! showTimeline ) }
1457
1472
className = "h-9 w-9 text-muted-foreground hover:text-foreground"
1473
+ aria-label = "Session timeline"
1474
+ aria-haspopup = "dialog"
1475
+ aria-expanded = { showTimeline }
1458
1476
>
1459
1477
< GitBranch className = { cn ( "h-3.5 w-3.5" , showTimeline && "text-primary" ) } />
1460
1478
</ Button >
@@ -1473,6 +1491,8 @@ export const ClaudeCodeSession: React.FC<ClaudeCodeSessionProps> = ({
1473
1491
variant = "ghost"
1474
1492
size = "icon"
1475
1493
className = "h-9 w-9 text-muted-foreground hover:text-foreground"
1494
+ aria-label = "Copy Conversation"
1495
+ aria-haspopup = "menu"
1476
1496
>
1477
1497
< Copy className = "h-3.5 w-3.5" />
1478
1498
</ Button >
@@ -1515,6 +1535,8 @@ export const ClaudeCodeSession: React.FC<ClaudeCodeSessionProps> = ({
1515
1535
size = "icon"
1516
1536
onClick = { ( ) => setShowSettings ( ! showSettings ) }
1517
1537
className = "h-8 w-8 text-muted-foreground hover:text-foreground"
1538
+ aria-label = "Checkpoint Settings"
1539
+ aria-haspopup = "dialog"
1518
1540
>
1519
1541
< Wrench className = { cn ( "h-3.5 w-3.5" , showSettings && "text-primary" ) } />
1520
1542
</ Button >
0 commit comments