diff --git a/docs/src/App.vue b/docs/src/App.vue index ecc83c9..f81d4c6 100644 --- a/docs/src/App.vue +++ b/docs/src/App.vue @@ -47,6 +47,10 @@ Checkbox + + Dialog + + Icon diff --git a/docs/src/pages/components/Dialog.vue b/docs/src/pages/components/Dialog.vue new file mode 100644 index 0000000..0ecf682 --- /dev/null +++ b/docs/src/pages/components/Dialog.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/docs/src/routes.js b/docs/src/routes.js index edf8fbe..11150a0 100644 --- a/docs/src/routes.js +++ b/docs/src/routes.js @@ -12,6 +12,7 @@ import Buttons from './pages/components/Buttons'; import ButtonToggle from './pages/components/ButtonToggle'; import Card from './pages/components/Card'; import Checkbox from './pages/components/Checkbox'; +import Dialog from './pages/components/Dialog'; import Icon from './pages/components/Icon'; import Input from './pages/components/Input'; import List from './pages/components/List'; @@ -95,6 +96,11 @@ const components = [ name: 'components:checkbox', component: Checkbox }, + { + path: '/components/dialog', + name: 'components:dialog', + component: Dialog + }, { path: '/components/icon', name: 'components:icon', diff --git a/src/components/mdBackdrop/index.js b/src/components/mdBackdrop/index.js new file mode 100644 index 0000000..f16326e --- /dev/null +++ b/src/components/mdBackdrop/index.js @@ -0,0 +1,5 @@ +import mdBackdrop from './mdBackdrop.vue'; + +export default function install(Vue) { + Vue.component('md-backdrop', Vue.extend(mdBackdrop)); +} diff --git a/src/components/mdBackdrop/mdBackdrop.scss b/src/components/mdBackdrop/mdBackdrop.scss new file mode 100644 index 0000000..bfafe5d --- /dev/null +++ b/src/components/mdBackdrop/mdBackdrop.scss @@ -0,0 +1,20 @@ +@import '../../core/stylesheets/variables.scss'; + +.md-backdrop { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 99; + pointer-events: none; + background-color: rgba(#000, .54); + transform: translate3d(0, 0, 0); + opacity: 0; + transition: $swift-ease-in-out; + + &.md-active { + opacity: 1; + pointer-events: auto; + } +} diff --git a/src/components/mdBackdrop/mdBackdrop.vue b/src/components/mdBackdrop/mdBackdrop.vue new file mode 100644 index 0000000..d72dcac --- /dev/null +++ b/src/components/mdBackdrop/mdBackdrop.vue @@ -0,0 +1,15 @@ + + + + + diff --git a/src/components/mdDialog/index.js b/src/components/mdDialog/index.js new file mode 100644 index 0000000..a38c107 --- /dev/null +++ b/src/components/mdDialog/index.js @@ -0,0 +1,8 @@ +import mdDialog from './mdDialog.vue'; +import mdDialogTheme from './mdDialog.theme'; + +export default function install(Vue) { + Vue.component('md-dialog', Vue.extend(mdDialog)); + + Vue.material.styles.push(mdDialogTheme); +} diff --git a/src/components/mdDialog/mdDialog.scss b/src/components/mdDialog/mdDialog.scss new file mode 100644 index 0000000..af73f0f --- /dev/null +++ b/src/components/mdDialog/mdDialog.scss @@ -0,0 +1,44 @@ +@import '../../core/stylesheets/variables.scss'; + +.md-dialog { + min-width: 240px; + max-width: 80%; + max-height: 80%; + overflow: hidden; + position: fixed; + top: 50%; + left: 50%; + z-index: 110; + outline: none; + border-radius: 2px; + opacity: 0; + filter: drop-shadow(0 7px 8px rgba(#000, $shadow-key-umbra-opacity)) + drop-shadow(0 12px 17px rgba(#000, $shadow-key-penumbra-opacity)) + drop-shadow(0 5px 22px rgba(#000, $shadow-ambient-shadow-opacity)); + clip-path: inset(0 7% 12% 7%); + transform: translate3D(-50%, -60%, 0) scale(.85); + transition: transform $swift-ease-out-duration $swift-ease-out-timing-function, + opacity .3s $swift-ease-out-timing-function, + clip-path .3s .1s $swift-ease-out-timing-function; + transition-delay: 0; + + &.md-active { + pointer-events: auto; + opacity: 1; + clip-path: inset(-22px -22px -22px -22px); + transition: transform $swift-ease-out-duration $swift-ease-out-timing-function, + opacity .5s $swift-ease-out-timing-function, + clip-path .4s .1s $swift-ease-out-timing-function; + transition-delay: 0; + transform: translate3D(-50%, -50%, 0) scale(1); + } +} + +.md-dialog-content { + padding: 24px; +} + +.md-dialog-backdrop { + position: fixed; + z-index: 109; +} diff --git a/src/components/mdDialog/mdDialog.theme b/src/components/mdDialog/mdDialog.theme new file mode 100644 index 0000000..a6f0547 --- /dev/null +++ b/src/components/mdDialog/mdDialog.theme @@ -0,0 +1,7 @@ +.THEME_NAME { + .md-dialog, + &.md-dialog { + background-color: #{'BACKGROUND-COLOR-A100'}; + color: #{'BACKGROUND-CONTRAST'}; + } +} diff --git a/src/components/mdDialog/mdDialog.vue b/src/components/mdDialog/mdDialog.vue new file mode 100644 index 0000000..53b2923 --- /dev/null +++ b/src/components/mdDialog/mdDialog.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/src/components/mdMenu/mdMenu.scss b/src/components/mdMenu/mdMenu.scss index a0a70c7..8cb98ab 100644 --- a/src/components/mdMenu/mdMenu.scss +++ b/src/components/mdMenu/mdMenu.scss @@ -18,7 +18,9 @@ $menu-base-width: 56px; z-index: 120; background-color: #fff; border-radius: 2px; - filter: drop-shadow(0 1px 1px rgba(#000, $shadow-key-umbra-opacity)) drop-shadow(0 2px 2px rgba(#000, $shadow-key-penumbra-opacity)) drop-shadow(0 1px 1px rgba(#000, $shadow-ambient-shadow-opacity)); + filter: drop-shadow(0 1px 1px rgba(#000, $shadow-key-umbra-opacity)) + drop-shadow(0 2px 2px rgba(#000, $shadow-key-penumbra-opacity)) + drop-shadow(0 1px 1px rgba(#000, $shadow-ambient-shadow-opacity)); opacity: 0; transition: width $swift-ease-out-duration $swift-ease-out-timing-function, opacity .25s $swift-ease-in-timing-function, diff --git a/src/components/mdSidenav/mdSidenav.scss b/src/components/mdSidenav/mdSidenav.scss index cee3c3d..393b4d2 100644 --- a/src/components/mdSidenav/mdSidenav.scss +++ b/src/components/mdSidenav/mdSidenav.scss @@ -13,7 +13,7 @@ &.md-fixed { .md-sidenav-content, - .md-backdrop { + .md-sidenav-backdrop { position: fixed; } } @@ -28,20 +28,6 @@ overflow: auto; transition: $swift-ease-out; } - - .md-backdrop { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 99; - pointer-events: none; - background-color: rgba(#000, .54); - transform: translate3d(0, 0, 0); - opacity: 0; - transition: $swift-ease-in-out; - } } .md-sidenav.md-active { @@ -51,7 +37,7 @@ transform: translate3d(0, 0, 0); } - .md-backdrop { + .md-sidenav-backdrop { opacity: 1; pointer-events: auto; } diff --git a/src/components/mdSidenav/mdSidenav.vue b/src/components/mdSidenav/mdSidenav.vue index 9784e9b..ab54b08 100644 --- a/src/components/mdSidenav/mdSidenav.vue +++ b/src/components/mdSidenav/mdSidenav.vue @@ -4,7 +4,7 @@ -
+ diff --git a/src/index.js b/src/index.js index 1a2bbb6..106149a 100644 --- a/src/index.js +++ b/src/index.js @@ -1,10 +1,12 @@ import mdCore from './core'; import mdAvatar from './components/mdAvatar'; +import mdBackdrop from './components/mdBackdrop'; import mdBottomBar from './components/mdBottomBar'; import mdButton from './components/mdButton'; import mdButtonToggle from './components/mdButtonToggle'; -import mdCheckbox from './components/mdCheckbox'; import mdCard from './components/mdCard'; +import mdCheckbox from './components/mdCheckbox'; +import mdDialog from './components/mdDialog'; import mdDivider from './components/mdDivider'; import mdIcon from './components/mdIcon'; import mdInputContainer from './components/mdInputContainer'; @@ -24,11 +26,13 @@ import mdWhiteframe from './components/mdWhiteframe'; let options = { mdCore, mdAvatar, + mdBackdrop, mdBottomBar, mdButton, mdButtonToggle, - mdCheckbox, mdCard, + mdCheckbox, + mdDialog, mdDivider, mdIcon, mdInputContainer,