Skip to content

Commit e324e47

Browse files
authoredJul 14, 2016
feat(menu): add md-menu standalone overlay (#855)
1 parent 14c1765 commit e324e47

File tree

8 files changed

+99
-14
lines changed

8 files changed

+99
-14
lines changed
 

‎src/components/button/_button-base.scss

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11

22
@import 'variables';
33
@import 'elevation';
4+
@import 'button-mixins';
45

56
// TODO(jelbourn): This goes away.
67
@import 'default-theme';
@@ -34,12 +35,7 @@ $md-mini-fab-padding: 8px !default;
3435
position: relative;
3536

3637
// Reset browser <button> styles.
37-
background: transparent;
38-
text-align: center;
39-
cursor: pointer;
40-
user-select: none;
41-
outline: none;
42-
border: none;
38+
@include md-button-reset();
4339

4440
// Make anchors render like buttons.
4541
display: inline-block;
@@ -52,6 +48,7 @@ $md-mini-fab-padding: 8px !default;
5248
font-family: $md-font-family;
5349
font-weight: 500;
5450
color: currentColor;
51+
text-align: center;
5552

5653
// Sizing.
5754
margin: $md-button-margin;

‎src/components/menu/menu.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<div class="md-menu">
2+
<ng-content></ng-content>
3+
</div>
4+

‎src/components/menu/menu.scss

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// TODO(kara): update vars for desktop when MD team responds
2+
3+
@import 'variables';
4+
@import 'elevation';
5+
@import 'default-theme';
6+
@import 'button-mixins';
7+
@import 'list-shared';
8+
9+
// menu width must be a multiple of 56px
10+
$md-menu-overlay-min-width: 112px !default; // 56 * 2
11+
$md-menu-overlay-max-width: 280px !default; // 56 * 5
12+
13+
$md-menu-item-height: 48px !default;
14+
$md-menu-font-size: 16px !default;
15+
$md-menu-side-padding: 16px !default;
16+
17+
.md-menu {
18+
@include md-elevation(2);
19+
min-width: $md-menu-overlay-min-width;
20+
max-width: $md-menu-overlay-max-width;
21+
22+
// max height must be 100% of the viewport height + one row height
23+
max-height: calc(100vh + 48px);
24+
overflow: scroll;
25+
-webkit-overflow-scrolling: touch; // for momentum scroll on mobile
26+
27+
background: md-color($md-background, 'background');
28+
}
29+
30+
[md-menu-item] {
31+
@include md-button-reset();
32+
@include md-truncate-line();
33+
34+
display: block;
35+
width: 100%;
36+
height: $md-menu-item-height;
37+
padding: 0 $md-menu-side-padding;
38+
39+
font-size: $md-menu-font-size;
40+
font-family: $md-font-family;
41+
text-align: start;
42+
color: md-color($md-foreground, 'text');
43+
44+
&[disabled] {
45+
color: md-color($md-foreground, 'disabled');
46+
cursor: default;
47+
}
48+
49+
&:hover:not([disabled]) {
50+
background: md-color($md-background, 'hover');
51+
}
52+
}
53+

‎src/components/menu/menu.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,21 @@
1-
import {Component, ViewEncapsulation} from '@angular/core';
1+
import {Component, Directive, ViewEncapsulation} from '@angular/core';
22

33
@Component({
44
moduleId: module.id,
55
selector: 'md-menu',
6+
host: {'role': 'menu'},
67
templateUrl: 'menu.html',
78
styleUrls: ['menu.css'],
8-
encapsulation: ViewEncapsulation.None
9+
encapsulation: ViewEncapsulation.None,
10+
exportAs: 'mdMenu'
911
})
1012
export class MdMenu {}
1113

12-
export const MD_MENU_DIRECTIVES = [MdMenu];
14+
@Directive({
15+
selector: '[md-menu-item]',
16+
host: {'role': 'menuitem'}
17+
})
18+
export class MdMenuItem {}
19+
20+
export const MD_MENU_DIRECTIVES = [MdMenu, MdMenuItem];
1321

‎src/core/style/_button-mixins.scss

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/**
2+
* This mixin overrides default button styles like the gray background,
3+
* the border, and the outline.
4+
*/
5+
@mixin md-button-reset {
6+
background: transparent;
7+
cursor: pointer;
8+
user-select: none;
9+
outline: none;
10+
border: none;
11+
}

‎src/core/style/_list-shared.scss

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,21 @@
1+
/**
2+
* This mixin will ensure that lines that overflow the container will
3+
* hide the overflow and truncate neatly with an ellipsis.
4+
*/
5+
@mixin md-truncate-line() {
6+
white-space: nowrap;
7+
overflow-x: hidden;
8+
text-overflow: ellipsis;
9+
}
10+
111
/**
212
* This mixin provides all md-line styles, changing secondary font size
313
* based on whether the list is in dense mode.
414
*/
515
@mixin md-line-base($secondary-font-size) {
616
[md-line] {
17+
@include md-truncate-line();
718
display: block;
8-
white-space: nowrap;
9-
overflow-x: hidden;
10-
text-overflow: ellipsis;
1119
box-sizing: border-box;
1220

1321
// all lines but the top line should have smaller text

‎src/demo-app/menu/menu-demo.html

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,5 @@
1-
menu
1+
<md-menu>
2+
<button md-menu-item>Refresh</button>
3+
<button md-menu-item>Settings</button>
4+
<button md-menu-item disabled>Help</button>
5+
</md-menu>

‎stylelint-config.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
"unit-case": "lower",
2121
"unit-no-unknown": true,
22-
"unit-whitelist": ["px", "%", "deg", "ms", "em"],
22+
"unit-whitelist": ["px", "%", "deg", "ms", "em", "vh"],
2323

2424
"value-list-comma-space-after": "always-single-line",
2525
"value-list-comma-space-before": "never",

0 commit comments

Comments
 (0)
Please sign in to comment.