From 563e81279ff4ce9193b1f266807f5adfb3ed9b94 Mon Sep 17 00:00:00 2001 From: Marcos Moura Date: Wed, 10 Aug 2016 01:36:20 -0300 Subject: [PATCH] Start creation of selects --- TODO.md | 1 + index.html | 5 +- src/components/mdCheckbox/mdCheckbox.vue | 1 + .../mdInputContainer/mdInputContainer.scss | 198 +++++++++--------- .../mdInputContainer/mdInputContainer.vue | 23 +- src/components/mdSelect/index.js | 8 + src/components/mdSelect/mdSelect.scss | 31 +++ src/components/mdSelect/mdSelect.theme | 6 + src/components/mdSelect/mdSelect.vue | 46 ++++ src/docs/pages/Select.vue | 55 +++++ src/docs/routes.js | 11 +- src/vue-material.js | 26 +-- 12 files changed, 289 insertions(+), 122 deletions(-) create mode 100644 src/components/mdSelect/index.js create mode 100644 src/components/mdSelect/mdSelect.scss create mode 100644 src/components/mdSelect/mdSelect.theme create mode 100644 src/components/mdSelect/mdSelect.vue create mode 100644 src/docs/pages/Select.vue diff --git a/TODO.md b/TODO.md index 7e9bd37..b9a964b 100644 --- a/TODO.md +++ b/TODO.md @@ -10,6 +10,7 @@ Later this should become issues with milestones * Dialogs * Cards * Tabs +* Sticky subheader * Image loaders * Swipe to refresh * Autocomplete diff --git a/index.html b/index.html index 84a2427..8bfe75a 100644 --- a/index.html +++ b/index.html @@ -37,15 +37,16 @@ Button Button Toggle Checkbox - Radio - Switch Divider Icon Input List + Radio Ripple + Select Sidenav Subheader + Switch Theme Toolbar Tooltip diff --git a/src/components/mdCheckbox/mdCheckbox.vue b/src/components/mdCheckbox/mdCheckbox.vue index 3148038..44872f4 100644 --- a/src/components/mdCheckbox/mdCheckbox.vue +++ b/src/components/mdCheckbox/mdCheckbox.vue @@ -21,6 +21,7 @@ twoWay: true }, name: String, + value: String, id: String, disabled: Boolean }, diff --git a/src/components/mdInputContainer/mdInputContainer.scss b/src/components/mdInputContainer/mdInputContainer.scss index cbcd6bb..577aa18 100644 --- a/src/components/mdInputContainer/mdInputContainer.scss +++ b/src/components/mdInputContainer/mdInputContainer.scss @@ -84,109 +84,119 @@ $input-size: 32px; } } -.md-input-placeholder { - label { - pointer-events: auto; - top: 10px; - opacity: 0; - font-size: 12px; - } - - input, - textarea { - font-size: 16px; - } -} - -.md-input-focused, -.md-has-value { - label { - pointer-events: auto; - top: 0; - opacity: 1; - font-size: 12px; - } - - input, - textarea { - font-size: 16px; - } -} - -.md-has-value { - input, - textarea { - color: rgba(#000, .87); - } -} - -.md-input-inline { - label { - pointer-events: none; - } - - &.md-input-focused { +.md-input-container { + &.md-input-placeholder { label { - top: 23px; + pointer-events: auto; + top: 10px; + opacity: 0; + font-size: 12px; + } + + input, + textarea { + font-size: 16px; + } + } + + &.md-input-focused, + &.md-has-value { + label { + pointer-events: auto; + top: 0; + opacity: 1; + font-size: 12px; + } + + input, + textarea { font-size: 16px; } } &.md-has-value { - label { - opacity: 0; - } - } -} - -.md-input-disabled { - &:after { - background: bottom left repeat-x; - background-image: linear-gradient(to right, rgba(#000, .38) 0%, rgba(#000, .38) 33%, transparent 0%); - background-size: 4px 1px; - } - - label, - input, - textarea { - color: rgba(#000, .38); - } -} - -.md-has-password { - &.md-input-focused .md-toggle-password { - color: rgba(#000, .54); - } - - .md-toggle-password { - margin: 0; - position: absolute; - right: 0; - bottom: -2px; - color: rgba(#000, .38); - - .md-ink-ripple { + input, + textarea { color: rgba(#000, .87); } } -} -.md-input-invalid { - .md-error { - opacity: 1; - transform: translate3d(0, 0, 0); - } -} - -.md-input-required { - label:after { - position: absolute; - top: 2px; - right: 0; - transform: translateX(calc(100% + 2px)); - content: "*"; - font-size: 12px; - line-height: 1em; - vertical-align: top; + &.md-input-inline { + label { + pointer-events: none; + } + + &.md-input-focused { + label { + top: 23px; + font-size: 16px; + } + } + + &.md-has-value { + label { + opacity: 0; + } + } + } + + &.md-input-disabled { + &:after { + background: bottom left repeat-x; + background-image: linear-gradient(to right, rgba(#000, .38) 0%, rgba(#000, .38) 33%, transparent 0%); + background-size: 4px 1px; + } + + label, + input, + textarea { + color: rgba(#000, .38); + } + } + + &.md-has-password { + &.md-input-focused .md-toggle-password { + color: rgba(#000, .54); + } + + .md-toggle-password { + margin: 0; + position: absolute; + right: 0; + bottom: -2px; + color: rgba(#000, .38); + + .md-ink-ripple { + color: rgba(#000, .87); + } + } + } + + &.md-input-invalid { + .md-error { + opacity: 1; + transform: translate3d(0, 0, 0); + } + } + + &.md-input-required { + label:after { + position: absolute; + top: 2px; + right: 0; + transform: translateX(calc(100% + 2px)); + content: "*"; + font-size: 12px; + line-height: 1em; + vertical-align: top; + } + } + + &.md-has-select { + &:hover { + label { + color: rgba(#000, .87); + } + } } } diff --git a/src/components/mdInputContainer/mdInputContainer.vue b/src/components/mdInputContainer/mdInputContainer.vue index 8ea7cab..5d3aefd 100644 --- a/src/components/mdInputContainer/mdInputContainer.vue +++ b/src/components/mdInputContainer/mdInputContainer.vue @@ -13,9 +13,6 @@ diff --git a/src/components/mdSelect/index.js b/src/components/mdSelect/index.js new file mode 100644 index 0000000..63bc2c6 --- /dev/null +++ b/src/components/mdSelect/index.js @@ -0,0 +1,8 @@ +import mdSelect from './mdSelect.vue'; +import mdSelectTheme from './mdSelect.theme'; + +export default function install(Vue) { + Vue.component('md-select', Vue.extend(mdSelect)); + + window.VueMaterial.styles.push(mdSelectTheme); +} diff --git a/src/components/mdSelect/mdSelect.scss b/src/components/mdSelect/mdSelect.scss new file mode 100644 index 0000000..442bb4b --- /dev/null +++ b/src/components/mdSelect/mdSelect.scss @@ -0,0 +1,31 @@ +@import '../../core/variables.scss'; + +.md-select { + min-width: 128px; + + &:hover { + &:after { + color: rgba(#000, .87); + } + } + + &:after { + margin-top: 9px; + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%) scaleY(0.45) scaleX(0.85); + transition: $swift-linear; + color: rgba(#000, .54); + content: "\25BC"; + } + + select { + position: absolute; + left: -999em; + } + + .md-select-menu { + display: none; + } +} diff --git a/src/components/mdSelect/mdSelect.theme b/src/components/mdSelect/mdSelect.theme new file mode 100644 index 0000000..2fbf527 --- /dev/null +++ b/src/components/mdSelect/mdSelect.theme @@ -0,0 +1,6 @@ +.THEME_NAME { + .md-select, + &.md-select { + + } +} diff --git a/src/components/mdSelect/mdSelect.vue b/src/components/mdSelect/mdSelect.vue new file mode 100644 index 0000000..11222c4 --- /dev/null +++ b/src/components/mdSelect/mdSelect.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/src/docs/pages/Select.vue b/src/docs/pages/Select.vue new file mode 100644 index 0000000..f9676c6 --- /dev/null +++ b/src/docs/pages/Select.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/src/docs/routes.js b/src/docs/routes.js index 932bd99..50bb14c 100644 --- a/src/docs/routes.js +++ b/src/docs/routes.js @@ -4,15 +4,16 @@ import BottomBar from './pages/BottomBar'; import Buttons from './pages/Buttons'; import ButtonToggle from './pages/ButtonToggle'; import Checkbox from './pages/Checkbox'; -import Radio from './pages/Radio'; -import Switch from './pages/Switch'; import Divider from './pages/Divider'; import Icon from './pages/Icon'; import Input from './pages/Input'; -import Ripple from './pages/Ripple'; import List from './pages/List'; +import Radio from './pages/Radio'; +import Ripple from './pages/Ripple'; +import Select from './pages/Select'; import Sidenav from './pages/Sidenav'; import Subheader from './pages/Subheader'; +import Switch from './pages/Switch'; import Theme from './pages/Theme'; import Toolbar from './pages/Toolbar'; import Tooltip from './pages/Tooltip'; @@ -75,6 +76,10 @@ const routes = { name: 'sidenav', component: Sidenav }, + '/select': { + name: 'select', + component: Select + }, '/subheader': { name: 'subheader', component: Subheader diff --git a/src/vue-material.js b/src/vue-material.js index b1444ed..44f7db7 100644 --- a/src/vue-material.js +++ b/src/vue-material.js @@ -1,22 +1,23 @@ import './core/core'; -import MdTheme from './components/mdTheme'; -import MdInkRipple from './components/mdInkRipple'; +import MdAvatar from './components/mdAvatar'; +import MdBottomBar from './components/mdBottomBar'; import MdButton from './components/mdButton'; import MdButtonToggle from './components/mdButtonToggle'; import MdCheckbox from './components/mdCheckbox'; -import mdRadio from './components/mdRadio'; -import mdSwitch from './components/mdSwitch'; import MdDivider from './components/mdDivider'; import MdIcon from './components/mdIcon'; +import MdInkRipple from './components/mdInkRipple'; import MdInputContainer from './components/mdInputContainer'; -import MdBottomBar from './components/mdBottomBar'; -import MdToolbar from './components/mdToolbar'; -import MdTooltip from './components/mdTooltip'; +import MdList from './components/mdList'; +import mdRadio from './components/mdRadio'; +import MdSelect from './components/mdSelect'; import MdSidenav from './components/mdSidenav'; import MdSubheader from './components/mdSubheader'; -import MdAvatar from './components/mdAvatar'; -import MdList from './components/mdList'; +import mdSwitch from './components/mdSwitch'; +import MdToolbar from './components/mdToolbar'; +import MdTooltip from './components/mdTooltip'; import MdWhiteframe from './components/mdWhiteframe'; +import MdTheme from './components/mdTheme'; let options = { MdAvatar, @@ -24,15 +25,16 @@ let options = { MdButton, MdButtonToggle, MdCheckbox, - mdRadio, - mdSwitch, MdDivider, MdIcon, - MdInputContainer, MdInkRipple, + MdInputContainer, MdList, + mdRadio, + MdSelect, MdSidenav, MdSubheader, + mdSwitch, MdToolbar, MdTooltip, MdWhiteframe,