diff options
Diffstat (limited to 'src/components/tab_switcher')
| -rw-r--r-- | src/components/tab_switcher/tab_switcher.jsx | 47 | ||||
| -rw-r--r-- | src/components/tab_switcher/tab_switcher.scss | 65 |
2 files changed, 112 insertions, 0 deletions
diff --git a/src/components/tab_switcher/tab_switcher.jsx b/src/components/tab_switcher/tab_switcher.jsx new file mode 100644 index 00000000..9e3dee04 --- /dev/null +++ b/src/components/tab_switcher/tab_switcher.jsx @@ -0,0 +1,47 @@ +import Vue from 'vue' + +import './tab_switcher.scss' + +export default Vue.component('tab-switcher', { + name: 'TabSwitcher', + data () { + return { + active: 0 + } + }, + methods: { + activateTab(index) { + return () => this.active = index; + } + }, + render(h) { + const tabs = this.$slots.default + .filter(slot => slot.data) + .map((slot, index) => { + const classes = ['tab'] + + if (index === this.active) { + classes.push('active') + } + return (<button onClick={this.activateTab(index)} class={ classes.join(' ') }>{slot.data.attrs.label}</button>) + }); + const contents = this.$slots.default.filter(_=>_.data).map(( slot, index ) => { + const active = index === this.active + return ( + <div class={active ? 'active' : 'hidden'}> + {slot} + </div> + ) + }); + return ( + <div class="tab-switcher"> + <div class="tabs"> + {tabs} + </div> + <div class="contents"> + {contents} + </div> + </div> + ) + } +}) diff --git a/src/components/tab_switcher/tab_switcher.scss b/src/components/tab_switcher/tab_switcher.scss new file mode 100644 index 00000000..fbd3321b --- /dev/null +++ b/src/components/tab_switcher/tab_switcher.scss @@ -0,0 +1,65 @@ +@import '../../_variables.scss'; + +.tab-switcher { + .contents { + .hidden { + display: none; + } + } + .tabs { + display: flex; + position: relative; + justify-content: center; + width: 100%; + overflow-y: hidden; + overflow-x: auto; + padding-top: 5px; + height: 32px; + box-sizing: border-box; + + &::after, &::before { + display: block; + content: ''; + flex: 1 1 auto; + } + + .tab, &::after, &::before { + border-bottom: 1px solid; + border-bottom-color: $fallback--border; + border-bottom-color: var(--border, $fallback--border); + } + + .tab { + position: relative; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + padding: 5px 1em 99px; + white-space: nowrap; + + &:not(.active) { + z-index: 4; + + &:hover { + z-index: 6; + } + + &::after { + content: ''; + position: absolute; + left: 0; + right: 0; + top: 26px; + border-bottom: 1px solid; + border-bottom-color: $fallback--border; + border-bottom-color: var(--border, $fallback--border); + } + } + + &.active { + background: transparent; + border-bottom: none; + z-index: 5; + } + } + } +} |
