diff --git a/package.json b/package.json index 3481e16..63e3040 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "dependencies": { "autosize": "^3.0.17", "element.scrollintoviewifneeded-polyfill": "^1.0.1", + "highlightjs": "^8.7.0", "scopedQuerySelectorShim": "github:lazd/scopedQuerySelectorShim" }, "devDependencies": { diff --git a/src/components/mdTabs/index.js b/src/components/mdTabs/index.js new file mode 100644 index 0000000..3269462 --- /dev/null +++ b/src/components/mdTabs/index.js @@ -0,0 +1,10 @@ +import mdTabs from './mdTabs.vue'; +import mdTab from './mdTab.vue'; +import mdTabsTheme from './mdTabs.theme'; + +export default function install(Vue) { + Vue.component('md-tabs', Vue.extend(mdTabs)); + Vue.component('md-tab', Vue.extend(mdTab)); + + window.VueMaterial.styles.push(mdTabsTheme); +} diff --git a/src/components/mdTabs/mdTab.vue b/src/components/mdTabs/mdTab.vue new file mode 100644 index 0000000..f5bbf0b --- /dev/null +++ b/src/components/mdTabs/mdTab.vue @@ -0,0 +1,29 @@ + + + diff --git a/src/components/mdTabs/mdTabs.scss b/src/components/mdTabs/mdTabs.scss new file mode 100644 index 0000000..4feac59 --- /dev/null +++ b/src/components/mdTabs/mdTabs.scss @@ -0,0 +1,112 @@ +@import '../../core/stylesheets/variables.scss'; + +$tab-width: 72px; +$tab-max-width: 264px; + +.md-tabs { + width: 100%; + position: relative; + + &.md-has-icon.md-has-label { + .md-tabs-navigation { + height: 72px; + + .md-icon { + margin-bottom: 10px; + } + } + } + + &.md-centered { + .md-tabs-navigation { + justify-content: center; + } + } + + &.md-fixed { + .md-tab-header { + flex: 1; + } + } + + .md-tabs-navigation { + height: 48px; + position: relative; + z-index: 1; + display: flex; + transition: $swift-ease-out; + } + + .md-tab-header { + min-width: $tab-width; + max-width: $tab-max-width; + margin: 0; + padding: 0 12px; + display: inline-block; + position: relative; + display: flex; + flex-flow: column; + justify-content: center; + align-items: center; + cursor: pointer; + border: 0; + background: none; + transition: $swift-ease-out; + color: rgba(#fff, .7); + font-size: inherit; + font-family: inherit; + font-weight: 500; + text-transform: uppercase; + + &.md-active, + &:hover { + color: #fff; + } + + .md-icon { + margin: 0; + } + } + + .md-tab-indicator { + height: 2px; + position: absolute; + bottom: 0; + left: 0; + transform: translate3D(0, 0, 0); + transition: left ($swift-ease-in-out-duration * .8) $swift-ease-out-timing-function, + right ($swift-ease-out-duration * .8) $swift-ease-out-timing-function; + } + + .md-tabs-content { + width: 100%; + height: 0; + position: relative; + overflow: hidden; + transition: height ($swift-ease-in-out-duration * .8) $swift-ease-out-timing-function; + } + + .md-tabs-wrapper { + width: 999em; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + transform: translate3d(0, 0, 0); + transition: left ($swift-ease-in-out-duration * .8) $swift-ease-out-timing-function; + } + + .md-tab { + padding: 16px; + position: absolute; + top: 0; + left: 0; + right: 0; + pointer-events: none; + + &.md-active { + pointer-events: auto; + } + } +} diff --git a/src/components/mdTabs/mdTabs.theme b/src/components/mdTabs/mdTabs.theme new file mode 100644 index 0000000..b2f2205 --- /dev/null +++ b/src/components/mdTabs/mdTabs.theme @@ -0,0 +1,42 @@ +.THEME_NAME { + .md-tabs, + &.md-tabs { + .md-tabs-navigation { + background-color: #{'PRIMARY-COLOR'}; + } + + .md-tab-indicator { + background-color: #{'ACCENT-COLOR'}; + } + + &.md-accent { + .md-tabs-navigation { + background-color: #{'ACCENT-COLOR'}; + } + + .md-tab-indicator { + background-color: #{'BACKGROUND-COLOR'}; + } + } + + &.md-warn { + .md-tabs-navigation { + background-color: #{'WARN-COLOR'}; + } + + .md-tab-indicator { + background-color: #{'BACKGROUND-COLOR'}; + } + } + + &.md-transparent { + .md-tabs-navigation { + background-color: transparent; + } + + .md-tab-indicator { + background-color: #{'BACKGROUND-COLOR'}; + } + } + } +} diff --git a/src/components/mdTabs/mdTabs.vue b/src/components/mdTabs/mdTabs.vue new file mode 100644 index 0000000..50bfaf4 --- /dev/null +++ b/src/components/mdTabs/mdTabs.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/src/docs/App.vue b/src/docs/App.vue index df0c65c..c48b8e9 100644 --- a/src/docs/App.vue +++ b/src/docs/App.vue @@ -66,6 +66,10 @@ Switch + + Tabs + + Theme diff --git a/src/docs/pages/Avatar.vue b/src/docs/pages/Avatar.vue index 9dc7111..e3440d5 100644 --- a/src/docs/pages/Avatar.vue +++ b/src/docs/pages/Avatar.vue @@ -68,6 +68,12 @@ + + diff --git a/src/docs/routes.js b/src/docs/routes.js index 6d76578..f3d5496 100644 --- a/src/docs/routes.js +++ b/src/docs/routes.js @@ -15,6 +15,7 @@ import Select from './pages/Select'; import Sidenav from './pages/Sidenav'; import Subheader from './pages/Subheader'; import Switch from './pages/Switch'; +import Tabs from './pages/Tabs'; import Theme from './pages/Theme'; import Toolbar from './pages/Toolbar'; import Tooltip from './pages/Tooltip'; @@ -101,6 +102,11 @@ const routes = [ name: 'subheader', component: Subheader }, + { + path: '/tabs', + name: 'tabs', + component: Tabs + }, { path: '/theme', name: 'theme', diff --git a/src/vue-material.js b/src/vue-material.js index 44f7db7..9648217 100644 --- a/src/vue-material.js +++ b/src/vue-material.js @@ -14,6 +14,7 @@ import MdSelect from './components/mdSelect'; import MdSidenav from './components/mdSidenav'; import MdSubheader from './components/mdSubheader'; import mdSwitch from './components/mdSwitch'; +import mdTabs from './components/mdTabs'; import MdToolbar from './components/mdToolbar'; import MdTooltip from './components/mdTooltip'; import MdWhiteframe from './components/mdWhiteframe'; @@ -35,6 +36,7 @@ let options = { MdSidenav, MdSubheader, mdSwitch, + mdTabs, MdToolbar, MdTooltip, MdWhiteframe,