From 8241575d7b8e1de38e4f27c591d4a49fdb921dc6 Mon Sep 17 00:00:00 2001 From: Marcos Moura Date: Sun, 1 Oct 2017 19:18:58 -0300 Subject: [PATCH] comp(MdMenu): add menu component (#21) * comp(MdMenu): add menus * feat(MdMenu): move menu styles to md-menu-component * test(MdMenu): fix broken tests * comp(MdMenu): create menus * docs(MdMenu): add docs for menus --- docs/app/components/ApiTable.vue | 2 +- docs/app/i18n/en-US.js | 3 + .../Components/Card/examples/Layouts.vue | 44 +++- docs/app/pages/Components/Menu/Menu.vue | 177 ++++++++++++++ .../Components/Menu/examples/Alignments.vue | 45 ++++ .../Components/Menu/examples/Directions.vue | 55 +++++ .../Menu/examples/MultipleContent.vue | 118 ++++++++++ .../pages/Components/Menu/examples/Sizes.vue | 66 ++++++ docs/app/routes.js | 5 + docs/app/template/MainNavContent.vue | 1 + .../MdList/MdListItem/MdListItem.vue | 14 +- src/components/MdList/theme.scss | 2 +- src/components/MdMenu/MdMenu.test.js | 9 + src/components/MdMenu/MdMenu.vue | 124 ++++++++++ src/components/MdMenu/MdMenuContent.vue | 216 ++++++++++++++++++ src/components/MdMenu/MdMenuItem.vue | 44 ++++ src/components/MdMenu/index.js | 11 + src/components/MdMenu/theme.scss | 6 + src/components/MdPopover/MdPopover.vue | 31 ++- src/components/MdPortal/MdPortal.vue | 30 ++- src/components/index.js | 2 + src/core/utils/MdInteractionEvents.js | 6 + src/core/utils/MdObserveEvent.js | 11 + src/core/utils/MdPropValidator.js | 4 +- src/theme/all.scss | 1 + 25 files changed, 988 insertions(+), 39 deletions(-) create mode 100644 docs/app/pages/Components/Menu/Menu.vue create mode 100644 docs/app/pages/Components/Menu/examples/Alignments.vue create mode 100644 docs/app/pages/Components/Menu/examples/Directions.vue create mode 100644 docs/app/pages/Components/Menu/examples/MultipleContent.vue create mode 100644 docs/app/pages/Components/Menu/examples/Sizes.vue create mode 100644 src/components/MdMenu/MdMenu.test.js create mode 100644 src/components/MdMenu/MdMenu.vue create mode 100644 src/components/MdMenu/MdMenuContent.vue create mode 100644 src/components/MdMenu/MdMenuItem.vue create mode 100644 src/components/MdMenu/index.js create mode 100644 src/components/MdMenu/theme.scss create mode 100644 src/core/utils/MdInteractionEvents.js create mode 100644 src/core/utils/MdObserveEvent.js diff --git a/docs/app/components/ApiTable.vue b/docs/app/components/ApiTable.vue index 42a5ae860..c7a3bc3d8 100644 --- a/docs/app/components/ApiTable.vue +++ b/docs/app/components/ApiTable.vue @@ -104,7 +104,7 @@ export default { .description { >>> code { - color: md-get-palette-color(blue, A200); + color: md-get-palette-color(red, A200); font-family: 'Roboto Mono', monospace; } } diff --git a/docs/app/i18n/en-US.js b/docs/app/i18n/en-US.js index af8c87fe8..f0b3cbe6d 100644 --- a/docs/app/i18n/en-US.js +++ b/docs/app/i18n/en-US.js @@ -76,6 +76,9 @@ export default { file: { title: 'File' }, + menu: { + title: 'Menu' + }, switch: { title: 'Switch' }, diff --git a/docs/app/pages/Components/Card/examples/Layouts.vue b/docs/app/pages/Components/Card/examples/Layouts.vue index 678dc6054..49dc98030 100644 --- a/docs/app/pages/Components/Card/examples/Layouts.vue +++ b/docs/app/pages/Components/Card/examples/Layouts.vue @@ -22,9 +22,9 @@ - + Avatar - +
Title goes here
Subtitle here
@@ -141,9 +141,23 @@
Subtitle here
- - more_vert - + + + more_vert + + + + + Call + phone + + + + Send a message + message + + +
@@ -158,6 +172,20 @@ + + - - diff --git a/docs/app/pages/Components/Menu/Menu.vue b/docs/app/pages/Components/Menu/Menu.vue new file mode 100644 index 000000000..76c985cfd --- /dev/null +++ b/docs/app/pages/Components/Menu/Menu.vue @@ -0,0 +1,177 @@ + + + + + + + + diff --git a/docs/app/pages/Components/Menu/examples/Alignments.vue b/docs/app/pages/Components/Menu/examples/Alignments.vue new file mode 100644 index 000000000..410e852c9 --- /dev/null +++ b/docs/app/pages/Components/Menu/examples/Alignments.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/docs/app/pages/Components/Menu/examples/Directions.vue b/docs/app/pages/Components/Menu/examples/Directions.vue new file mode 100644 index 000000000..ce3a4a87a --- /dev/null +++ b/docs/app/pages/Components/Menu/examples/Directions.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/docs/app/pages/Components/Menu/examples/MultipleContent.vue b/docs/app/pages/Components/Menu/examples/MultipleContent.vue new file mode 100644 index 000000000..543cc5e8d --- /dev/null +++ b/docs/app/pages/Components/Menu/examples/MultipleContent.vue @@ -0,0 +1,118 @@ + + + + + + diff --git a/docs/app/pages/Components/Menu/examples/Sizes.vue b/docs/app/pages/Components/Menu/examples/Sizes.vue new file mode 100644 index 000000000..1f0628227 --- /dev/null +++ b/docs/app/pages/Components/Menu/examples/Sizes.vue @@ -0,0 +1,66 @@ + + + + + + diff --git a/docs/app/routes.js b/docs/app/routes.js index 4c4b0b70b..a8c58f016 100644 --- a/docs/app/routes.js +++ b/docs/app/routes.js @@ -4,6 +4,11 @@ import VueRouter from 'vue-router' Vue.use(VueRouter) export const routes = [ + { + path: '/components/menu', + name: 'components/menu', + component: () => import(/* webpackChunkName: "menu" */ './pages/Components/Menu/Menu.vue') + }, { path: '/components/tooltip', name: 'components/tooltip', diff --git a/docs/app/template/MainNavContent.vue b/docs/app/template/MainNavContent.vue index feeb7a45f..8245bf11e 100644 --- a/docs/app/template/MainNavContent.vue +++ b/docs/app/template/MainNavContent.vue @@ -28,6 +28,7 @@ {{ $t('pages.icon.title') }} {{ $t('pages.list.title') }} + {{ $t('pages.menu.title') }} {{ $t('pages.snackbar.title') }} {{ $t('pages.speedDial.title') }} {{ $t('pages.subheader.title') }} diff --git a/src/components/MdList/MdListItem/MdListItem.vue b/src/components/MdList/MdListItem/MdListItem.vue index daab929c9..dd19fd14d 100644 --- a/src/components/MdList/MdListItem/MdListItem.vue +++ b/src/components/MdList/MdListItem/MdListItem.vue @@ -1,4 +1,5 @@ + + diff --git a/src/components/MdMenu/MdMenuContent.vue b/src/components/MdMenu/MdMenuContent.vue new file mode 100644 index 000000000..8e46324f6 --- /dev/null +++ b/src/components/MdMenu/MdMenuContent.vue @@ -0,0 +1,216 @@ + + + + + diff --git a/src/components/MdMenu/MdMenuItem.vue b/src/components/MdMenu/MdMenuItem.vue new file mode 100644 index 000000000..04b6d9e38 --- /dev/null +++ b/src/components/MdMenu/MdMenuItem.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/src/components/MdMenu/index.js b/src/components/MdMenu/index.js new file mode 100644 index 000000000..212d3e0ca --- /dev/null +++ b/src/components/MdMenu/index.js @@ -0,0 +1,11 @@ +import init from 'vue-material/material' +import MdMenu from './MdMenu' +import MdMenuContent from './MdMenuContent' +import MdMenuItem from './MdMenuItem' + +export default Vue => { + init(Vue) + Vue.component(MdMenu.name, MdMenu) + Vue.component(MdMenuContent.name, MdMenuContent) + Vue.component(MdMenuItem.name, MdMenuItem) +} diff --git a/src/components/MdMenu/theme.scss b/src/components/MdMenu/theme.scss new file mode 100644 index 000000000..f933061f1 --- /dev/null +++ b/src/components/MdMenu/theme.scss @@ -0,0 +1,6 @@ +.md-menu-content { + @include md-theme-component() { + @include md-theme-property(background-color, background); + @include md-theme-property(color, text-primary, background); + } +} diff --git a/src/components/MdPopover/MdPopover.vue b/src/components/MdPopover/MdPopover.vue index 4d9d36d63..1365a95a6 100644 --- a/src/components/MdPopover/MdPopover.vue +++ b/src/components/MdPopover/MdPopover.vue @@ -1,9 +1,3 @@ - - diff --git a/src/components/MdPortal/MdPortal.vue b/src/components/MdPortal/MdPortal.vue index d61a22f8a..f1a37998c 100644 --- a/src/components/MdPortal/MdPortal.vue +++ b/src/components/MdPortal/MdPortal.vue @@ -1,11 +1,3 @@ - - diff --git a/src/components/index.js b/src/components/index.js index 8bb395f9b..b1b2e511e 100644 --- a/src/components/index.js +++ b/src/components/index.js @@ -16,6 +16,7 @@ import MdIcon from './MdIcon' import MdImage from './MdImage' import MdLayout from './MdLayout' import MdList from './MdList' +import MdMenu from './MdMenu' import MdRadio from './MdRadio' import MdRipple from './MdRipple' import MdSnackbar from './MdSnackbar' @@ -45,6 +46,7 @@ export { MdImage, MdLayout, MdList, + MdMenu, MdRadio, MdRipple, MdSnackbar, diff --git a/src/core/utils/MdInteractionEvents.js b/src/core/utils/MdInteractionEvents.js new file mode 100644 index 000000000..65a5325d8 --- /dev/null +++ b/src/core/utils/MdInteractionEvents.js @@ -0,0 +1,6 @@ +export default [ + 'click', + 'dblclick', + 'mousedown', + 'mouseup' +] diff --git a/src/core/utils/MdObserveEvent.js b/src/core/utils/MdObserveEvent.js new file mode 100644 index 000000000..812d6af9b --- /dev/null +++ b/src/core/utils/MdObserveEvent.js @@ -0,0 +1,11 @@ +export default (el, eventName, observerFn, options) => { + function killObserver () { + el.removeEventListener(eventName, observerFn) + } + + el.addEventListener(eventName, observerFn, options || false) + + return { + destroy: killObserver + } +} diff --git a/src/core/utils/MdPropValidator.js b/src/core/utils/MdPropValidator.js index 57229247f..cf0297f56 100644 --- a/src/core/utils/MdPropValidator.js +++ b/src/core/utils/MdPropValidator.js @@ -1,4 +1,4 @@ -import { util } from 'vue' +import Vue from 'vue' export default (name, options) => { return { @@ -7,7 +7,7 @@ export default (name, options) => { return true } - util.warn(`The ${name} prop is invalid. Given value: ${value}. Available options: ${options.join(', ')}.`, this) + Vue.util.warn(`The ${name} prop is invalid. Given value: ${value}. Available options: ${options.join(', ')}.`, this) return false } diff --git a/src/theme/all.scss b/src/theme/all.scss index 3de2c5d8d..4470bde64 100644 --- a/src/theme/all.scss +++ b/src/theme/all.scss @@ -14,6 +14,7 @@ @import "../components/MdIcon/theme"; @import "../components/MdImage/theme"; @import "../components/MdList/theme"; +@import "../components/MdMenu/theme"; @import "../components/MdRadio/theme"; @import "../components/MdSnackbar/theme"; @import "../components/MdSpeedDial/theme";