Skip to content

Commit 0670596

Browse files
committed
improve scrollable menus
1 parent 95bbc2b commit 0670596

File tree

2 files changed

+116
-9
lines changed

2 files changed

+116
-9
lines changed

src/vs/base/browser/ui/contextview/contextview.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,24 +79,25 @@ export interface ILayoutAnchor {
7979
*/
8080
export function layout(viewportSize: number, viewSize: number, anchor: ILayoutAnchor): number {
8181
const anchorEnd = anchor.offset + anchor.size;
82+
const viewportBorderBuffer = 5;
8283

8384
if (anchor.position === LayoutAnchorPosition.Before) {
84-
if (viewSize <= viewportSize - anchorEnd) {
85+
if (viewSize <= viewportSize - anchorEnd - viewportBorderBuffer) {
8586
return anchorEnd; // happy case, lay it out after the anchor
8687
}
8788

88-
if (viewSize <= anchor.offset) {
89+
if (viewSize <= anchor.offset - viewportBorderBuffer) {
8990
return anchor.offset - viewSize; // ok case, lay it out before the anchor
9091
}
9192

92-
return Math.max(viewportSize - viewSize, 0); // sad case, lay it over the anchor
93+
return Math.max(viewportSize - viewSize - viewportBorderBuffer, 0); // sad case, lay it over the anchor
9394
} else {
94-
if (viewSize <= anchor.offset) {
95+
if (viewSize <= anchor.offset - viewportBorderBuffer) {
9596
return anchor.offset - viewSize; // happy case, lay it out before the anchor
9697
}
9798

9899
if (viewSize <= viewportSize - anchorEnd) {
99-
return anchorEnd; // ok case, lay it out after the anchor
100+
return anchorEnd - viewportBorderBuffer; // ok case, lay it out after the anchor
100101
}
101102

102103
return 0; // sad case, lay it over the anchor

src/vs/base/browser/ui/menu/menu.ts

Lines changed: 110 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ export class Menu extends ActionBar {
203203
e.preventDefault();
204204
}));
205205

206-
menuElement.style.maxHeight = `${Math.max(10, window.innerHeight - container.getBoundingClientRect().top - 30)}px`;
206+
menuElement.style.maxHeight = `${Math.max(10, window.innerHeight - container.getBoundingClientRect().top - 35)}px`;
207207

208208
actions = actions.filter(a => {
209209
if (options.submenuIds?.has(a.id)) {
@@ -1141,11 +1141,11 @@ ${formatRule(menuSubmenuIcon)}
11411141
11421142
11431143
/* High Contrast Theming */
1144-
.hc-black .context-view.monaco-menu-container {
1144+
:host-context(.hc-black) .context-view.monaco-menu-container {
11451145
box-shadow: none;
11461146
}
11471147
1148-
.hc-black .monaco-menu .monaco-action-bar.vertical .action-item.focused {
1148+
:host-context(.hc-black) .monaco-menu .monaco-action-bar.vertical .action-item.focused {
11491149
background: none;
11501150
}
11511151
@@ -1176,7 +1176,7 @@ ${formatRule(menuSubmenuIcon)}
11761176
margin-bottom: 0.2em;
11771177
}
11781178
1179-
linux .monaco-menu .monaco-action-bar.vertical .action-label.separator {
1179+
:host-context(.linux) .monaco-menu .monaco-action-bar.vertical .action-label.separator {
11801180
margin-left: 0;
11811181
margin-right: 0;
11821182
}
@@ -1196,4 +1196,110 @@ linux .monaco-menu .monaco-action-bar.vertical .action-label.separator {
11961196
cursor: default;
11971197
}
11981198
1199+
/* Arrows */
1200+
.monaco-scrollable-element > .scrollbar > .scra {
1201+
cursor: pointer;
1202+
font-size: 11px !important;
1203+
}
1204+
1205+
.monaco-scrollable-element > .visible {
1206+
opacity: 1;
1207+
1208+
/* Background rule added for IE9 - to allow clicks on dom node */
1209+
background:rgba(0,0,0,0);
1210+
1211+
transition: opacity 100ms linear;
1212+
}
1213+
.monaco-scrollable-element > .invisible {
1214+
opacity: 0;
1215+
pointer-events: none;
1216+
}
1217+
.monaco-scrollable-element > .invisible.fade {
1218+
transition: opacity 800ms linear;
1219+
}
1220+
1221+
/* Scrollable Content Inset Shadow */
1222+
.monaco-scrollable-element > .shadow {
1223+
position: absolute;
1224+
display: none;
1225+
}
1226+
.monaco-scrollable-element > .shadow.top {
1227+
display: block;
1228+
top: 0;
1229+
left: 3px;
1230+
height: 3px;
1231+
width: 100%;
1232+
box-shadow: #DDD 0 6px 6px -6px inset;
1233+
}
1234+
.monaco-scrollable-element > .shadow.left {
1235+
display: block;
1236+
top: 3px;
1237+
left: 0;
1238+
height: 100%;
1239+
width: 3px;
1240+
box-shadow: #DDD 6px 0 6px -6px inset;
1241+
}
1242+
.monaco-scrollable-element > .shadow.top-left-corner {
1243+
display: block;
1244+
top: 0;
1245+
left: 0;
1246+
height: 3px;
1247+
width: 3px;
1248+
}
1249+
.monaco-scrollable-element > .shadow.top.left {
1250+
box-shadow: #DDD 6px 6px 6px -6px inset;
1251+
}
1252+
1253+
/* ---------- Default Style ---------- */
1254+
1255+
:host-context(.vs) .monaco-scrollable-element > .scrollbar > .slider {
1256+
background: rgba(100, 100, 100, .4);
1257+
}
1258+
:host-context(.vs-dark) .monaco-scrollable-element > .scrollbar > .slider {
1259+
background: rgba(121, 121, 121, .4);
1260+
}
1261+
:host-context(.hc-black) .monaco-scrollable-element > .scrollbar > .slider {
1262+
background: rgba(111, 195, 223, .6);
1263+
}
1264+
1265+
.monaco-scrollable-element > .scrollbar > .slider:hover {
1266+
background: rgba(100, 100, 100, .7);
1267+
}
1268+
:host-context(.hc-black) .monaco-scrollable-element > .scrollbar > .slider:hover {
1269+
background: rgba(111, 195, 223, .8);
1270+
}
1271+
1272+
.monaco-scrollable-element > .scrollbar > .slider.active {
1273+
background: rgba(0, 0, 0, .6);
1274+
}
1275+
:host-context(.vs-dark) .monaco-scrollable-element > .scrollbar > .slider.active {
1276+
background: rgba(191, 191, 191, .4);
1277+
}
1278+
:host-context(.hc-black) .monaco-scrollable-element > .scrollbar > .slider.active {
1279+
background: rgba(111, 195, 223, 1);
1280+
}
1281+
1282+
:host-context(.vs-dark) .monaco-scrollable-element .shadow.top {
1283+
box-shadow: none;
1284+
}
1285+
1286+
:host-context(.vs-dark) .monaco-scrollable-element .shadow.left {
1287+
box-shadow: #000 6px 0 6px -6px inset;
1288+
}
1289+
1290+
:host-context(.vs-dark) .monaco-scrollable-element .shadow.top.left {
1291+
box-shadow: #000 6px 6px 6px -6px inset;
1292+
}
1293+
1294+
:host-context(.hc-black) .monaco-scrollable-element .shadow.top {
1295+
box-shadow: none;
1296+
}
1297+
1298+
:host-context(.hc-black) .monaco-scrollable-element .shadow.left {
1299+
box-shadow: none;
1300+
}
1301+
1302+
:host-context(.hc-black) .monaco-scrollable-element .shadow.top.left {
1303+
box-shadow: none;
1304+
}
11991305
`;

0 commit comments

Comments
 (0)