208 lines
7.9 KiB
JavaScript
208 lines
7.9 KiB
JavaScript
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
|
|
|
// Styles
|
|
import '../../../src/stylus/components/_toolbar.styl';
|
|
// Mixins
|
|
import Applicationable from '../../mixins/applicationable';
|
|
import Colorable from '../../mixins/colorable';
|
|
import Themeable from '../../mixins/themeable';
|
|
import SSRBootable from '../../mixins/ssr-bootable';
|
|
// Directives
|
|
import Scroll from '../../directives/scroll';
|
|
import { deprecate } from '../../util/console';
|
|
// Types
|
|
import mixins from '../../util/mixins';
|
|
export default mixins(Applicationable('top', ['clippedLeft', 'clippedRight', 'computedHeight', 'invertedScroll', 'manualScroll']), Colorable, SSRBootable, Themeable
|
|
/* @vue/component */
|
|
).extend({
|
|
name: 'v-toolbar',
|
|
directives: { Scroll: Scroll },
|
|
props: {
|
|
card: Boolean,
|
|
clippedLeft: Boolean,
|
|
clippedRight: Boolean,
|
|
dense: Boolean,
|
|
extended: Boolean,
|
|
extensionHeight: {
|
|
type: [Number, String],
|
|
validator: function validator(v) {
|
|
return !isNaN(parseInt(v));
|
|
}
|
|
},
|
|
flat: Boolean,
|
|
floating: Boolean,
|
|
height: {
|
|
type: [Number, String],
|
|
validator: function validator(v) {
|
|
return !isNaN(parseInt(v));
|
|
}
|
|
},
|
|
invertedScroll: Boolean,
|
|
manualScroll: Boolean,
|
|
prominent: Boolean,
|
|
scrollOffScreen: Boolean,
|
|
/* @deprecated */
|
|
scrollToolbarOffScreen: Boolean,
|
|
scrollTarget: String,
|
|
scrollThreshold: {
|
|
type: Number,
|
|
default: 300
|
|
},
|
|
tabs: Boolean
|
|
},
|
|
data: function data() {
|
|
return {
|
|
activeTimeout: null,
|
|
currentScroll: 0,
|
|
heights: {
|
|
mobileLandscape: 48,
|
|
mobile: 56,
|
|
desktop: 64,
|
|
dense: 48
|
|
},
|
|
isActive: true,
|
|
isExtended: false,
|
|
isScrollingUp: false,
|
|
previousScroll: 0,
|
|
savedScroll: 0,
|
|
target: null
|
|
};
|
|
},
|
|
computed: {
|
|
canScroll: function canScroll() {
|
|
// TODO: remove
|
|
if (this.scrollToolbarOffScreen) {
|
|
deprecate('scrollToolbarOffScreen', 'scrollOffScreen', this);
|
|
return true;
|
|
}
|
|
return this.scrollOffScreen || this.invertedScroll;
|
|
},
|
|
computedContentHeight: function computedContentHeight() {
|
|
if (this.height) return parseInt(this.height);
|
|
if (this.dense) return this.heights.dense;
|
|
if (this.prominent || this.$vuetify.breakpoint.mdAndUp) return this.heights.desktop;
|
|
if (this.$vuetify.breakpoint.smAndDown && this.$vuetify.breakpoint.width > this.$vuetify.breakpoint.height) return this.heights.mobileLandscape;
|
|
return this.heights.mobile;
|
|
},
|
|
computedExtensionHeight: function computedExtensionHeight() {
|
|
if (this.tabs) return 48;
|
|
if (this.extensionHeight) return parseInt(this.extensionHeight);
|
|
return this.computedContentHeight;
|
|
},
|
|
computedHeight: function computedHeight() {
|
|
if (!this.isExtended) return this.computedContentHeight;
|
|
return this.computedContentHeight + this.computedExtensionHeight;
|
|
},
|
|
computedMarginTop: function computedMarginTop() {
|
|
if (!this.app) return 0;
|
|
return this.$vuetify.application.bar;
|
|
},
|
|
classes: function classes() {
|
|
return _extends({
|
|
'v-toolbar': true,
|
|
'elevation-0': this.flat || !this.isActive && !this.tabs && this.canScroll,
|
|
'v-toolbar--absolute': this.absolute,
|
|
'v-toolbar--card': this.card,
|
|
'v-toolbar--clipped': this.clippedLeft || this.clippedRight,
|
|
'v-toolbar--dense': this.dense,
|
|
'v-toolbar--extended': this.isExtended,
|
|
'v-toolbar--fixed': !this.absolute && (this.app || this.fixed),
|
|
'v-toolbar--floating': this.floating,
|
|
'v-toolbar--prominent': this.prominent
|
|
}, this.themeClasses);
|
|
},
|
|
computedPaddingLeft: function computedPaddingLeft() {
|
|
if (!this.app || this.clippedLeft) return 0;
|
|
return this.$vuetify.application.left;
|
|
},
|
|
computedPaddingRight: function computedPaddingRight() {
|
|
if (!this.app || this.clippedRight) return 0;
|
|
return this.$vuetify.application.right;
|
|
},
|
|
computedTransform: function computedTransform() {
|
|
return !this.isActive ? this.canScroll ? -this.computedContentHeight : -this.computedHeight : 0;
|
|
},
|
|
currentThreshold: function currentThreshold() {
|
|
return Math.abs(this.currentScroll - this.savedScroll);
|
|
},
|
|
styles: function styles() {
|
|
return {
|
|
marginTop: this.computedMarginTop + 'px',
|
|
paddingRight: this.computedPaddingRight + 'px',
|
|
paddingLeft: this.computedPaddingLeft + 'px',
|
|
transform: 'translateY(' + this.computedTransform + 'px)'
|
|
};
|
|
}
|
|
},
|
|
watch: {
|
|
currentThreshold: function currentThreshold(val) {
|
|
if (this.invertedScroll) {
|
|
this.isActive = this.currentScroll > this.scrollThreshold;
|
|
return;
|
|
}
|
|
if (val < this.scrollThreshold || !this.isBooted) return;
|
|
this.isActive = this.isScrollingUp;
|
|
this.savedScroll = this.currentScroll;
|
|
},
|
|
isActive: function isActive() {
|
|
this.savedScroll = 0;
|
|
},
|
|
invertedScroll: function invertedScroll(val) {
|
|
this.isActive = !val;
|
|
},
|
|
manualScroll: function manualScroll(val) {
|
|
this.isActive = !val;
|
|
},
|
|
isScrollingUp: function isScrollingUp() {
|
|
this.savedScroll = this.savedScroll || this.currentScroll;
|
|
}
|
|
},
|
|
created: function created() {
|
|
if (this.invertedScroll || this.manualScroll) this.isActive = false;
|
|
},
|
|
mounted: function mounted() {
|
|
if (this.scrollTarget) {
|
|
this.target = document.querySelector(this.scrollTarget);
|
|
}
|
|
},
|
|
|
|
methods: {
|
|
onScroll: function onScroll() {
|
|
if (!this.canScroll || this.manualScroll || typeof window === 'undefined') return;
|
|
this.currentScroll = this.target ? this.target.scrollTop : window.pageYOffset;
|
|
this.isScrollingUp = this.currentScroll < this.previousScroll;
|
|
this.previousScroll = this.currentScroll;
|
|
},
|
|
updateApplication: function updateApplication() {
|
|
return this.invertedScroll || this.manualScroll ? 0 : this.computedHeight;
|
|
}
|
|
},
|
|
render: function render(h) {
|
|
this.isExtended = this.extended || !!this.$slots.extension;
|
|
var children = [];
|
|
var data = this.setBackgroundColor(this.color, {
|
|
'class': this.classes,
|
|
style: this.styles,
|
|
on: this.$listeners
|
|
});
|
|
data.directives = [{
|
|
arg: this.scrollTarget,
|
|
name: 'scroll',
|
|
value: this.onScroll
|
|
}];
|
|
children.push(h('div', {
|
|
staticClass: 'v-toolbar__content',
|
|
style: { height: this.computedContentHeight + 'px' },
|
|
ref: 'content'
|
|
}, this.$slots.default));
|
|
if (this.isExtended) {
|
|
children.push(h('div', {
|
|
staticClass: 'v-toolbar__extension',
|
|
style: { height: this.computedExtensionHeight + 'px' }
|
|
}, this.$slots.extension));
|
|
}
|
|
return h('nav', data, children);
|
|
}
|
|
});
|
|
//# sourceMappingURL=VToolbar.js.map
|