Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/sessions/browser/media/style.css
13394 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
/* ---- Sidebar & Auxiliary Bar Card Appearance ---- */
7
8
.agent-sessions-workbench .part.sidebar {
9
background: var(--vscode-agents-background);
10
}
11
12
.agent-sessions-workbench > .monaco-grid-view {
13
background-color: var(--vscode-agents-background);
14
}
15
16
.agent-sessions-workbench.shell-gradient-background {
17
position: relative;
18
isolation: isolate;
19
background: var(--vscode-agents-background);
20
}
21
22
.agent-sessions-workbench.shell-gradient-background::before {
23
content: '';
24
position: absolute;
25
inset: 0;
26
z-index: 0;
27
pointer-events: none;
28
background: var(--vscode-agents-background);
29
}
30
31
@supports (background: color-mix(in srgb, black 0%, white)) {
32
.agent-sessions-workbench.shell-gradient-background::before {
33
background:
34
linear-gradient(
35
to bottom right,
36
transparent 0%,
37
color-mix(in srgb, var(--vscode-agentsGradient-tintColor) 5%, transparent) 58%,
38
color-mix(in srgb, var(--vscode-agentsGradient-tintColor) 7%, transparent) 82%,
39
color-mix(in srgb, var(--vscode-agentsGradient-tintColor) 9%, transparent) 100%
40
),
41
var(--vscode-agents-background);
42
}
43
44
.monaco-workbench.vs.agent-sessions-workbench.shell-gradient-background::before {
45
background:
46
linear-gradient(
47
to bottom right,
48
transparent 0%,
49
color-mix(in srgb, var(--vscode-agentsGradient-tintColor) 1%, transparent) 45%,
50
color-mix(in srgb, var(--vscode-agentsGradient-tintColor) 6%, transparent) 75%,
51
color-mix(in srgb, var(--vscode-agentsGradient-tintColor) 12%, transparent) 100%
52
),
53
var(--vscode-agents-background);
54
}
55
56
.monaco-workbench.vs-dark.agent-sessions-workbench.shell-gradient-background::before {
57
background: linear-gradient(
58
to bottom right,
59
var(--vscode-agents-background) 0%,
60
color-mix(in srgb, var(--vscode-agentsGradient-tintColor) 7%, var(--vscode-agents-background)) 56%,
61
color-mix(in srgb, var(--vscode-agentsGradient-tintColor) 10%, var(--vscode-agents-background)) 82%,
62
color-mix(in srgb, var(--vscode-agentsGradient-tintColor) 13%, var(--vscode-agents-background)) 100%
63
);
64
}
65
}
66
67
.monaco-workbench.hc-black.agent-sessions-workbench.shell-gradient-background::before,
68
.monaco-workbench.hc-light.agent-sessions-workbench.shell-gradient-background::before {
69
display: none;
70
}
71
72
.monaco-workbench.agent-sessions-workbench > .notifications-center {
73
right: 15px;
74
bottom: 15px;
75
}
76
77
.monaco-workbench.agent-sessions-workbench > .notifications-toasts {
78
right: 15px;
79
bottom: 15px;
80
}
81
82
.monaco-workbench.agent-sessions-workbench.nostatusbar > .notifications-center {
83
bottom: 15px;
84
}
85
86
.monaco-workbench.agent-sessions-workbench.nostatusbar > .notifications-toasts {
87
bottom: 15px;
88
}
89
90
.monaco-workbench.agent-sessions-workbench > .notifications-center.bottom-left {
91
right: auto;
92
left: 15px;
93
bottom: 15px;
94
}
95
96
.monaco-workbench.agent-sessions-workbench > .notifications-toasts.bottom-left {
97
right: auto;
98
left: 15px;
99
bottom: 15px;
100
}
101
102
.monaco-workbench.agent-sessions-workbench > .notifications-center.top-right {
103
top: 40px;
104
right: 15px;
105
bottom: auto;
106
}
107
108
.agent-sessions-workbench.shell-gradient-background > .monaco-grid-view {
109
position: relative;
110
z-index: 1;
111
background: transparent;
112
}
113
114
/**
115
* The auxiliary bar and panel use a card-like appearance with margins and border-radius
116
* applied directly on the .part element. The grid allocates full space; CSS margin shrinks
117
* the part within its split-view-view wrapper. Layout dimensions are reduced in code
118
* (AgenticAuxiliaryBarPart) to keep internal layout correct.
119
*
120
* No z-index or stacking-context changes - sashes render naturally on top.
121
*
122
* Margin values (must match the constants in the Part classes):
123
* Sidebar: no card (flush, spans full height)
124
* Auxiliary bar: top=16, bottom=18, right=16
125
* Panel: bottom=18, left=16, right=16
126
*/
127
128
.agent-sessions-workbench.shell-gradient-background .part.titlebar,
129
.agent-sessions-workbench.shell-gradient-background .part.sidebar,
130
.agent-sessions-workbench.shell-gradient-background .part.titlebar > .content,
131
.agent-sessions-workbench.shell-gradient-background .part.titlebar > .titlebar-container,
132
.agent-sessions-workbench.shell-gradient-background .part.titlebar > .sessions-titlebar-container,
133
.agent-sessions-workbench.shell-gradient-background .part.sidebar > .composite.title,
134
.agent-sessions-workbench.shell-gradient-background .part.sidebar > .content,
135
.agent-sessions-workbench.shell-gradient-background .part.sidebar > .sidebar-footer {
136
background: transparent !important;
137
}
138
139
.agent-sessions-workbench .part.sidebar.mobile-overlay-sidebar {
140
background: var(--vscode-agents-background) !important;
141
}
142
143
.agent-sessions-workbench .part.chatbar {
144
margin: 0 10px 0px 10px;
145
background: var(--part-background);
146
border: 1px solid var(--part-border-color, transparent);
147
border-radius: 8px;
148
box-sizing: border-box;
149
}
150
151
.agent-sessions-workbench .part.editor:not(.modal-editor-part) {
152
margin: 0 0 0 0;
153
background: var(--vscode-agentsPanel-background);
154
border: 1px solid var(--vscode-agentsPanel-border, transparent);
155
border-right-width: 0;
156
border-top-right-radius: 0;
157
border-bottom-right-radius: 0;
158
border-top-left-radius: 8px;
159
border-bottom-left-radius: 8px;
160
box-sizing: border-box;
161
overflow: hidden;
162
}
163
164
.agent-sessions-workbench .part.editor:not(.modal-editor-part)::after {
165
box-shadow: none;
166
}
167
168
.agent-sessions-workbench .part.editor .multiDiffEntry {
169
padding: 6px 8px 0;
170
box-sizing: border-box;
171
}
172
173
.agent-sessions-workbench .part.editor .multiDiffEntry .header-content {
174
border-radius: 6px;
175
border: none;
176
background: var(--vscode-sideBarSectionHeader-background);
177
margin: 0;
178
align-items: center;
179
}
180
181
.agent-sessions-workbench .part.editor .multiDiffEntry .header:not(.collapsed) .header-content {
182
border-bottom: none;
183
}
184
185
.agent-sessions-workbench .part.editor .multiDiffEntry .header-content .file-path .title {
186
font-size: 13px;
187
line-height: 22px;
188
}
189
190
.agent-sessions-workbench .part.editor .multiDiffEntry .header {
191
cursor: pointer;
192
}
193
194
.agent-sessions-workbench .part.editor .multiDiffEntry .header:focus,
195
.agent-sessions-workbench .part.editor .multiDiffEntry .header:focus-visible {
196
outline: none;
197
}
198
199
.agent-sessions-workbench .part.editor .multiDiffEntry .header:focus .header-content,
200
.agent-sessions-workbench .part.editor .multiDiffEntry .header:focus-visible .header-content {
201
box-shadow: inset 0 0 0 1px var(--vscode-focusBorder);
202
}
203
204
.agent-sessions-workbench .part.editor .multiDiffEntry .header:hover .header-content {
205
background: color-mix(in srgb, var(--vscode-sideBarSectionHeader-background) 95%, var(--vscode-foreground));
206
}
207
208
.agent-sessions-workbench .part.editor .multiDiffEntry .header-content .actions {
209
opacity: 0;
210
pointer-events: none;
211
padding: 0 0 0 8px;
212
}
213
214
.agent-sessions-workbench .part.editor .multiDiffEntry .header:hover .header-content .actions,
215
.agent-sessions-workbench .part.editor .multiDiffEntry .header:focus-within .header-content .actions {
216
opacity: 1;
217
pointer-events: auto;
218
}
219
220
.agent-sessions-workbench .part.editor .multiDiffEntry .collapse-button a {
221
border-radius: 4px;
222
}
223
224
.agent-sessions-workbench .part.editor .multiDiffEntry .editorParent {
225
border-bottom: none;
226
}
227
228
.agent-sessions-workbench .part.editor .diff-hidden-lines .center {
229
box-shadow: none;
230
}
231
232
.agent-sessions-workbench .part.editor .multiDiffEntry .header-content .status {
233
display: inline-flex;
234
align-items: center;
235
justify-content: center;
236
width: 16px;
237
min-width: 16px;
238
font-size: 11px;
239
font-weight: 600;
240
opacity: 0.9;
241
}
242
243
.agent-sessions-workbench .part.editor .multiDiffEntry .header-content .status.added {
244
color: var(--vscode-gitDecoration-addedResourceForeground);
245
}
246
247
.agent-sessions-workbench .part.editor .multiDiffEntry .header-content .status.deleted {
248
color: var(--vscode-gitDecoration-deletedResourceForeground);
249
}
250
251
.agent-sessions-workbench .part.editor .multiDiffEntry .header-content .status.renamed {
252
color: var(--vscode-gitDecoration-modifiedResourceForeground);
253
}
254
255
.agent-sessions-workbench .part.editor .title.tabs {
256
background-color: transparent !important;
257
--editor-group-tab-height: 26px !important;
258
}
259
260
/* Editor tabs: match chat composite bar tab style */
261
.agent-sessions-workbench .part.editor .tabs-container > .tab {
262
background-color: transparent !important;
263
border-right: none !important;
264
border-radius: 4px;
265
font-size: 12px;
266
font-weight: 500;
267
box-shadow: none !important;
268
padding: 0 0 0 4px !important;
269
--tab-border-top-color: transparent !important;
270
}
271
272
/* Allow tabs to shrink in narrow viewports so the close button stays reachable.
273
* The default `sizing-fit` rule sets `min-width: fit-content; flex-shrink: 0;`
274
* which prevents the tab from shrinking below its label width and pushes the
275
* close button out of view. */
276
.agent-sessions-workbench .part.editor .tabs-container > .tab.sizing-fit {
277
min-width: 0 !important;
278
flex-shrink: 1 !important;
279
}
280
281
.agent-sessions-workbench .part.editor .tabs-container > .tab.sizing-fit .monaco-icon-label,
282
.agent-sessions-workbench .part.editor .tabs-container > .tab.sizing-fit .monaco-icon-label > .monaco-icon-label-container {
283
overflow: hidden;
284
text-overflow: ellipsis;
285
min-width: 0;
286
}
287
288
/* Keep the close button reserved within the tab so it remains accessible when
289
* the tab shrinks. Without this the action sits in an `overflow: hidden`
290
* container that only reveals on hover, which combined with the smaller tab
291
* makes the close target hard to hit. */
292
.agent-sessions-workbench .part.editor .tabs-container > .tab > .tab-actions {
293
flex: 0 0 auto;
294
overflow: visible;
295
}
296
297
.agent-sessions-workbench .part.editor .tabs-and-actions-container {
298
--tabs-border-bottom-color: transparent !important;
299
align-items: center;
300
padding: 4px;
301
}
302
303
.agent-sessions-workbench .part.editor .tabs-container > .tab.active {
304
background-color: color-mix(in srgb, var(--vscode-foreground) 5%, transparent) !important;
305
}
306
307
.agent-sessions-workbench .part.editor .tabs-container > .tab .tab-border-top-container,
308
.agent-sessions-workbench .part.editor .tabs-container > .tab .tab-border-bottom-container {
309
display: none !important;
310
}
311
312
.agent-sessions-workbench:not(.nosidebar) .part.chatbar {
313
margin-left: 0;
314
}
315
316
.agent-sessions-workbench .part.auxiliarybar {
317
margin: 0 10px 0px 0;
318
background: var(--part-background);
319
border: 1px solid var(--part-border-color, transparent);
320
border-top-left-radius: 0;
321
border-bottom-left-radius: 0;
322
border-top-right-radius: 8px;
323
border-bottom-right-radius: 8px;
324
box-sizing: border-box;
325
}
326
327
.agent-sessions-workbench.nomaineditorarea .part.auxiliarybar {
328
border-top-left-radius: 8px;
329
border-bottom-left-radius: 8px;
330
}
331
332
.agent-sessions-workbench .part.auxiliarybar > .content .pane-body {
333
background-color: var(--vscode-agentsPanel-background);
334
}
335
336
.agent-sessions-workbench .part.panel {
337
margin: 0 10px 10px 10px;
338
background: var(--part-background);
339
border: 1px solid var(--part-border-color, transparent);
340
border-radius: 8px;
341
box-sizing: border-box;
342
}
343
344
.agent-sessions-workbench:not(.nosidebar) .part.panel {
345
margin-left: 0;
346
}
347
348
.agent-sessions-workbench .monaco-sash:before {
349
border-radius: calc(var(--vscode-sash-hover-size) / 2);
350
}
351
352
.agent-sessions-workbench .monaco-sash:not(.disabled) > .orthogonal-drag-handle {
353
border-radius: var(--vscode-sash-size);
354
}
355
356
/* ---- Scrollbars ---- */
357
358
/* Thinner, rounded scrollbar sliders scoped to the agents app.
359
* The scrollbar widget sets the slider's size inline to match the full
360
* track. We hide that default background and paint a narrower, rounded
361
* slider with an inset ::before pseudo-element so all four corners round
362
* consistently and the full hit area is preserved. */
363
.agent-sessions-workbench .monaco-scrollable-element > .scrollbar > .slider {
364
background: transparent !important;
365
}
366
367
.agent-sessions-workbench .monaco-scrollable-element > .scrollbar.vertical > .slider::before,
368
.agent-sessions-workbench .monaco-scrollable-element > .scrollbar.horizontal > .slider::before {
369
content: '';
370
position: absolute;
371
inset: 1px;
372
border-radius: 999px;
373
background: var(--vscode-scrollbarSlider-background);
374
}
375
376
.agent-sessions-workbench .monaco-scrollable-element > .scrollbar > .slider:hover::before {
377
background: var(--vscode-scrollbarSlider-hoverBackground);
378
}
379
380
.agent-sessions-workbench .monaco-scrollable-element > .scrollbar > .slider.active::before {
381
background: var(--vscode-scrollbarSlider-activeBackground);
382
}
383
384
.monaco-workbench.vs.agent-sessions-workbench .part.chatbar,
385
.monaco-workbench.vs.agent-sessions-workbench .part.auxiliarybar,
386
.monaco-workbench.vs.agent-sessions-workbench .part.panel {
387
border-color: var(--vscode-editorWidget-border, var(--vscode-widget-border, transparent));
388
}
389
390
/* ---- Chat Layout ---- */
391
392
/* Remove max-width from the session container so the scrollbar extends full width */
393
.agent-sessions-workbench .interactive-session {
394
max-width: none;
395
}
396
397
.monaco-workbench.vs.agent-sessions-workbench .part.chatbar .interactive-list > .monaco-list > .monaco-scrollable-element > .monaco-list-rows {
398
background: transparent !important;
399
}
400
401
.monaco-workbench.vs.agent-sessions-workbench .part.chatbar .interactive-list > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.request:hover,
402
.monaco-workbench.vs.agent-sessions-workbench .part.chatbar .interactive-list > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.response:hover,
403
.monaco-workbench.vs.agent-sessions-workbench .part.chatbar .interactive-list > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.focused.request,
404
.monaco-workbench.vs.agent-sessions-workbench .part.chatbar .interactive-list > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.focused.response,
405
.monaco-workbench.vs.agent-sessions-workbench .part.chatbar .interactive-list > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.selected.request,
406
.monaco-workbench.vs.agent-sessions-workbench .part.chatbar .interactive-list > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.selected.response {
407
background: transparent !important;
408
}
409
410
/* Constrain content items to the same max-width, centered */
411
.agent-sessions-workbench .interactive-session .interactive-item-container {
412
max-width: 950px;
413
margin: 0 auto;
414
padding-left: 12px !important;
415
padding-right: 12px !important;
416
box-sizing: border-box;
417
}
418
419
.agent-sessions-workbench .interactive-session > .chat-suggest-next-widget {
420
max-width: 950px;
421
margin: 0 auto;
422
padding-left: 12px !important;
423
padding-right: 12px !important;
424
box-sizing: border-box;
425
}
426
427
/* ---- Chat Output ---- */
428
429
/* Top fade overlay: dims content scrolled near the top edge of the chat bar card.
430
* Use the Monaco scroll shadow element, which is only shown when scrollTop > 0. */
431
.agent-sessions-workbench .part.chatbar .monaco-scrollable-element > .shadow.top {
432
height: 16px;
433
background: linear-gradient(to bottom, var(--part-background), transparent);
434
box-shadow: none;
435
}
436
437
/* Same fade overlay for the chat renderer inside an editor (e.g. floating aux window). */
438
.agent-sessions-workbench .chat-editor-relative .interactive-list .monaco-scrollable-element > .shadow.top {
439
height: 16px;
440
background: linear-gradient(to bottom, var(--vscode-editor-background), transparent);
441
box-shadow: none;
442
}
443
444
/* ---- Chat Input ---- */
445
446
.agent-sessions-workbench .interactive-session .chat-input-container {
447
border-radius: var(--vscode-cornerRadius-large);
448
border-color: var(--vscode-agentsChatInput-border) !important;
449
background-color: var(--vscode-agentsChatInput-background);
450
color: var(--vscode-agentsChatInput-foreground);
451
}
452
453
.agent-sessions-workbench .interactive-session .chat-input-container.focused {
454
border-color: var(--vscode-agentsChatInput-focusBorder, var(--vscode-focusBorder)) !important;
455
}
456
457
/* While the developer-joy animated border is active, keep a faint
458
persistent ring so the input still has a visible boundary throughout
459
the comet animation (improves visuals + accessibility). The spinning
460
gradient ring overlays this. When focused, the regular focus border
461
is blended/dimmed during the animation to avoid competing visually. */
462
.agent-sessions-workbench .interactive-session .chat-input-container.working:not(.focused) {
463
border-color: var(--vscode-agentsChatInput-border) !important;
464
}
465
466
/* Dim the focus border while the comet is animating so the bright focus
467
ring doesn't visually fight with the spinning gradient. */
468
.agent-sessions-workbench .interactive-session .chat-input-container.working.focused {
469
border-color: color-mix(in srgb, var(--vscode-agentsChatInput-focusBorder, var(--vscode-focusBorder)) 40%, transparent) !important;
470
}
471
472
/* Make the Monaco editor inside the chat input transparent so it inherits the chatInput.background */
473
.agent-sessions-workbench .interactive-session .interactive-input-part .chat-editor-container .interactive-input-editor .monaco-editor,
474
.agent-sessions-workbench .interactive-session .interactive-input-part .chat-editor-container .interactive-input-editor .monaco-editor .monaco-editor-background {
475
background-color: transparent !important;
476
}
477
478
.agent-sessions-workbench .interactive-session .interactive-input-part {
479
width: 100%;
480
max-width: 950px;
481
margin: 0 auto !important;
482
display: inherit !important;
483
/* Align with panel (terminal) card margin */
484
padding: 4px 10px !important;
485
box-sizing: border-box;
486
}
487
488
/* Hide shared chat-session option-group pickers in the sessions app active chat UI.
489
* The sessions workbench provides its own new-session configuration controls and
490
* should not surface the shared workbench chat session pickers here. */
491
.agent-sessions-workbench .interactive-session .chat-input-toolbars .chat-sessionPicker-container {
492
display: none;
493
}
494
495
/* ---- Sessions Action Widget Pickers ---- */
496
497
.agent-sessions-workbench .action-widget {
498
background-color: var(--vscode-agentsPanel-background);
499
}
500
501
.agent-sessions-workbench .action-widget .action-widget-action-bar,
502
.agent-sessions-workbench .action-widget .action-list-filter {
503
background-color: var(--vscode-agentsPanel-background);
504
}
505
506
.agent-sessions-workbench .action-widget .action-list-filter-row {
507
padding-right: 0;
508
}
509
510
.agent-sessions-workbench .action-widget .monaco-scrollable-element > .monaco-list-rows {
511
background-color: var(--vscode-agentsPanel-background) !important;
512
}
513
514
/* ---- Sessions Quick Picks ---- */
515
516
.agent-sessions-workbench .quick-input-widget,
517
.agent-sessions-workbench .quick-input-titlebar {
518
background-color: var(--vscode-agentsPanel-background) !important;
519
}
520
521
.agent-sessions-workbench .quick-input-header,
522
.agent-sessions-workbench .quick-input-html-widget,
523
.agent-sessions-workbench .quick-input-list .monaco-scrollable-element > .monaco-list-rows,
524
.agent-sessions-workbench .quick-input-tree .monaco-scrollable-element > .monaco-list-rows {
525
background-color: var(--vscode-agentsPanel-background) !important;
526
}
527
528
.agent-sessions-workbench .quick-input-header {
529
border-radius: var(--vscode-cornerRadius-xLarge);
530
}
531
532
/* ---- Sessions Context Menus ---- */
533
534
.agent-sessions-workbench .context-view.monaco-menu-container,
535
.agent-sessions-workbench .context-view.monaco-menu-container .monaco-menu,
536
.agent-sessions-workbench .context-view.monaco-menu-container .monaco-scrollable-element {
537
background-color: var(--vscode-agentsPanel-background) !important;
538
}
539
540
/* Keep code block backgrounds stable across themes; add separation in older light themes via border only */
541
.agent-sessions-workbench .interactive-session .interactive-response .interactive-result-code-block {
542
border-color: var(--vscode-editorWidget-border, var(--vscode-widget-border));
543
}
544
/* ---- Modal Editor Block ---- */
545
546
.agent-sessions-workbench .monaco-modal-editor-block {
547
background: rgba(0, 0, 0, 0.5);
548
}
549
550
.agent-sessions-workbench .monaco-modal-editor-block .modal-editor-sidebar .monaco-tl-twistie.force-no-twistie {
551
width: 0 !important;
552
padding-left: 0 !important;
553
padding-right: 0 !important;
554
}
555
556
557
/* ---- Customization Empty State ---- */
558
559
/* Icon + title side by side in a row, description underneath */
560
.agent-sessions-workbench .ai-customization-list-widget .list-empty-state .empty-state-header {
561
display: flex;
562
flex-direction: row;
563
align-items: center;
564
gap: 6px;
565
}
566
567
.agent-sessions-workbench .ai-customization-list-widget .list-empty-state .empty-state-header > .empty-state-icon {
568
font-size: 16px;
569
margin-bottom: 0;
570
flex-shrink: 0;
571
}
572
573
/* MCP / Plugin empty state: icon + title side by side */
574
.agent-sessions-workbench .mcp-empty-state .empty-state-header {
575
display: flex;
576
flex-direction: row;
577
align-items: center;
578
gap: 6px;
579
}
580
581
.agent-sessions-workbench .mcp-empty-state .empty-state-header > .empty-icon {
582
font-size: 16px;
583
margin-bottom: 0;
584
flex-shrink: 0;
585
}
586
587
/* ---- Part Appear Transitions ---- */
588
589
/*
590
* Subtle appear animation when parts transition from display:none → visible
591
* (via split-view-view .visible class).
592
*
593
* Auxiliary bar, panel, and chat bar animate their container via opacity,
594
* margin, border-color, and background. The sidebar reveal animation applies
595
* only to `.part.sidebar > .content`, using opacity + transform so the
596
* sidebar container, header, and footer stay visually fixed.
597
*
598
* Opacity transiently creates a stacking context while it animates from 0 to 1
599
* over 250ms — once settled at opacity: 1, no additional stacking context is
600
* introduced by this animation. Margin and transform shifts are purely visual
601
* within the grid-allocated space.
602
*/
603
604
.agent-sessions-workbench .part.auxiliarybar,
605
.agent-sessions-workbench .part.panel,
606
.agent-sessions-workbench .part.chatbar {
607
transition:
608
opacity 250ms ease-out,
609
margin-top 250ms ease-out,
610
margin-right 250ms ease-out,
611
margin-bottom 250ms ease-out;
612
}
613
614
/* Auxiliary bar also transitions horizontal margin */
615
.agent-sessions-workbench .part.auxiliarybar {
616
transition:
617
opacity 250ms ease-out,
618
margin 250ms ease-out;
619
}
620
621
.agent-sessions-workbench .part.sidebar > .content {
622
transition:
623
opacity 250ms ease-out,
624
transform 250ms ease-out;
625
}
626
627
@starting-style {
628
/* Shared starting values */
629
.agent-sessions-workbench .part.auxiliarybar,
630
.agent-sessions-workbench .part.panel,
631
.agent-sessions-workbench .part.chatbar {
632
opacity: 0;
633
border-color: transparent;
634
}
635
636
/* Card parts: blend from surrounding background */
637
.agent-sessions-workbench .part.auxiliarybar,
638
.agent-sessions-workbench .part.panel,
639
.agent-sessions-workbench .part.chatbar {
640
background: color-mix(in srgb, var(--part-background) 60%, var(--vscode-sideBar-background));
641
}
642
643
.agent-sessions-workbench .part.sidebar > .content {
644
opacity: 0;
645
transform: translateX(-6px);
646
}
647
648
/* Panel (bottom): slides down from 6px above → margin: 0 10px 10px 10px */
649
.agent-sessions-workbench .part.panel {
650
margin: 6px 16px 16px 16px;
651
}
652
653
/* Auxiliary bar (right): slides in from 6px right → margin: 0 10px 0px 0 */
654
.agent-sessions-workbench .part.auxiliarybar {
655
margin: 0 16px 0px 6px;
656
}
657
658
/* Chat bar (center-bottom): slides up from 6px below → margin: 0 10px 0px 10px */
659
.agent-sessions-workbench .part.chatbar {
660
margin: 6px 16px 0px 16px;
661
}
662
}
663
664
@media (prefers-reduced-motion: reduce) {
665
.agent-sessions-workbench .part.auxiliarybar,
666
.agent-sessions-workbench .part.panel,
667
.agent-sessions-workbench .part.chatbar {
668
transition: none;
669
}
670
671
.agent-sessions-workbench .part.sidebar > .content {
672
transition: none;
673
}
674
}
675
676
/* ---- Widget Customizations ---- */
677
678
/* Action Widget */
679
.agent-sessions-workbench .action-widget .monaco-list .monaco-list-row {
680
padding-right: 0;
681
}
682
683
/* Badge */
684
.agent-sessions-workbench .badge > .badge-content {
685
border-radius: 4px !important;
686
}
687
688
/* Phone-layout rules for parts, sashes, max-width constraints, and grid
689
background live in mobileChatShell.css — do not duplicate them here. */
690
691
/*
692
* Phone layout (< 640px) styles. Currently the only mobile form factor
693
* supported by the sessions workbench; tablet/larger viewports fall back
694
* to the desktop layout.
695
*/
696
697
/* ---- Phone Layout: Overscroll Containment ---- */
698
699
/* Prevent body rubber-band on iOS and Chrome pull-to-refresh on Android */
700
.agent-sessions-workbench.phone-layout .monaco-scrollable-element > .scrollable-element {
701
overscroll-behavior: contain;
702
}
703
704
.agent-sessions-workbench.phone-layout .interactive-session {
705
overscroll-behavior: contain;
706
}
707
708
.agent-sessions-workbench.phone-layout .monaco-list {
709
overscroll-behavior: contain;
710
}
711
712
/* ---- Phone Layout: Touch Target Sizing ---- */
713
714
/* Ensure interactive elements meet 44px minimum touch target.
715
Excludes:
716
- Quick pick toolbars: 44x44 icons crowd the small popup header.
717
- Chat input toolbars: a dense row of picker buttons (Local, Auto,
718
agent, model, tools, send...). Enforcing 44px makes items 50px tall
719
and shows a huge hover/active background next to smaller adjacent
720
labels, making the bar feel unbalanced. */
721
.agent-sessions-workbench.phone-layout .action-item > .action-label {
722
min-height: 44px;
723
min-width: 44px;
724
}
725
726
.agent-sessions-workbench.phone-layout .quick-input-widget .action-item > .action-label,
727
.agent-sessions-workbench.phone-layout .chat-input-toolbars .action-item > .action-label {
728
min-height: 0;
729
min-width: 0;
730
}
731
732
/* Touch action for tap responsiveness */
733
.agent-sessions-workbench.phone-layout .action-item,
734
.agent-sessions-workbench.phone-layout button {
735
touch-action: manipulation;
736
}
737
738
/* Disable text selection callout on interactive elements */
739
.agent-sessions-workbench.phone-layout .action-item,
740
.agent-sessions-workbench.phone-layout .monaco-toolbar,
741
.agent-sessions-workbench.phone-layout .sidebar-footer {
742
-webkit-touch-callout: none;
743
user-select: none;
744
-webkit-user-select: none;
745
}
746
747
/* Titlebar safe-area inset lives in mobileChatShell.css */
748
749
/* ---- Phone Layout: Mobile Quick Picks ---- */
750
751
/* On phone, expand quick picks to use the viewport with safe-area gutters
752
rather than the desktop-default narrow popup near the trigger. Position
753
is left untouched so the picker stays anchored where the user invoked
754
it (avoids feeling modal/jumpy). */
755
.agent-sessions-workbench.phone-layout .quick-input-widget {
756
left: 8px !important;
757
right: 8px !important;
758
width: auto !important;
759
max-width: none !important;
760
}
761
762
.agent-sessions-workbench.phone-layout .quick-input-widget .quick-input-list,
763
.agent-sessions-workbench.phone-layout .quick-input-widget .quick-input-tree {
764
max-height: 50vh;
765
}
766
767
.agent-sessions-workbench.phone-layout .quick-input-widget .quick-input-list .monaco-list-row,
768
.agent-sessions-workbench.phone-layout .quick-input-widget .quick-input-tree .monaco-list-row {
769
min-height: 44px;
770
}
771
772
/* ---- Phone Layout: Mobile Dialogs ---- */
773
774
/* Make dialogs near-full-width with larger buttons on phone */
775
.agent-sessions-workbench.phone-layout .monaco-dialog-box {
776
width: calc(100% - 32px);
777
max-width: calc(100% - 32px);
778
}
779
780
.agent-sessions-workbench.phone-layout .monaco-dialog-box .dialog-buttons-row .monaco-button {
781
min-height: 44px;
782
font-size: 16px;
783
}
784
785
/* ---- Phone Layout: Mobile Notifications ---- */
786
787
/* Full-width notification toasts at top of screen */
788
.agent-sessions-workbench.phone-layout .notifications-toasts {
789
left: 8px !important;
790
right: 8px !important;
791
bottom: auto !important;
792
top: calc(env(safe-area-inset-top) + 48px) !important;
793
width: auto !important;
794
}
795
796
.agent-sessions-workbench.phone-layout .notifications-toasts .notification-toast {
797
width: 100%;
798
max-width: 100%;
799
}
800
801
.agent-sessions-workbench.phone-layout .notifications-toasts .notification-toast .notification-toast-container {
802
border-radius: 12px;
803
}
804
805
/* ---- Phone Layout: Hover Cards ---- */
806
807
/* Disable delayed hover cards on touch devices — they never trigger */
808
.agent-sessions-workbench.phone-layout .monaco-hover {
809
display: none;
810
}
811
812
/* Exception: keep hovers that are explicitly triggered (e.g., info buttons) */
813
.agent-sessions-workbench.phone-layout .monaco-hover.visible-on-mobile {
814
display: block;
815
}
816
817
/* ---- Phone Layout: Mobile Editor Modal ---- */
818
819
/* Full-screen editor modal on phone — no margins, covers entire viewport */
820
.agent-sessions-workbench.phone-layout .monaco-modal-editor-part {
821
top: 0 !important;
822
left: 0 !important;
823
right: 0 !important;
824
bottom: 0 !important;
825
width: 100% !important;
826
height: 100% !important;
827
border-radius: 0 !important;
828
margin: 0 !important;
829
animation: editor-slide-up 250ms ease-out;
830
}
831
832
@keyframes editor-slide-up {
833
from {
834
transform: translateY(30%);
835
opacity: 0.5;
836
}
837
to {
838
transform: translateY(0);
839
opacity: 1;
840
}
841
}
842
843
/* Make the modal backdrop fully cover the screen on phone */
844
.agent-sessions-workbench.phone-layout .monaco-modal-editor-block {
845
background: rgba(0, 0, 0, 0.7);
846
}
847
848
/* Safe area padding for editor titlebar on phone */
849
.agent-sessions-workbench.phone-layout .monaco-modal-editor-part .title {
850
padding-top: env(safe-area-inset-top);
851
}
852
853
/* ---- Phone Layout: Input Auto-Zoom Prevention ---- */
854
855
/* iOS Safari zooms in on input focus when font-size < 16px.
856
Force minimum 16px on all input elements on phone. */
857
.agent-sessions-workbench.phone-layout input,
858
.agent-sessions-workbench.phone-layout textarea,
859
.agent-sessions-workbench.phone-layout .monaco-inputbox input,
860
.agent-sessions-workbench.phone-layout .chat-input-container textarea {
861
font-size: 16px;
862
}
863
864
/* ---- Phone Layout: Native Scroll Preservation ---- */
865
866
/* Ensure chat content uses momentum scrolling on phone.
867
The -webkit-overflow-scrolling property is needed for older iOS. */
868
.agent-sessions-workbench.phone-layout .interactive-session .monaco-scrollable-element {
869
-webkit-overflow-scrolling: touch;
870
}
871
872
/* ---- Phone Layout: Bottom Sheet Panel ---- */
873
874
/* Panel slides up from bottom as a sheet on phone */
875
.agent-sessions-workbench.phone-layout .split-view-view:has(> .part.panel) {
876
position: absolute !important;
877
bottom: 0 !important;
878
left: 0 !important;
879
right: 0 !important;
880
height: 60vh !important;
881
z-index: 200;
882
animation: panel-slide-up 250ms ease-out;
883
border-radius: 16px 16px 0 0;
884
overflow: hidden;
885
}
886
887
@keyframes panel-slide-up {
888
from {
889
transform: translateY(100%);
890
opacity: 0.5;
891
}
892
to {
893
transform: translateY(0);
894
opacity: 1;
895
}
896
}
897
898
/* Panel drag handle visual indicator */
899
.agent-sessions-workbench.phone-layout .part.panel::before {
900
content: '';
901
display: block;
902
width: 36px;
903
height: 5px;
904
background: var(--vscode-foreground);
905
opacity: 0.3;
906
border-radius: 3px;
907
margin: 8px auto 4px auto;
908
}
909
910
/* ---- Phone Layout: Auxiliary Bar Overlay ---- */
911
912
/* Auxiliary bar slides in from the right as a full-height overlay on phone */
913
.agent-sessions-workbench.phone-layout .split-view-view:has(> .part.auxiliarybar) {
914
position: absolute !important;
915
top: 0 !important;
916
right: 0 !important;
917
bottom: 0 !important;
918
width: 85vw !important;
919
max-width: 400px;
920
z-index: 200;
921
animation: auxbar-slide-in 250ms ease-out;
922
}
923
924
@keyframes auxbar-slide-in {
925
from {
926
transform: translateX(100%);
927
opacity: 0;
928
}
929
to {
930
transform: translateX(0);
931
opacity: 1;
932
}
933
}
934
935