UNPKG

vuetify

Version:

Vue.js 2 Semantic Component Framework

328 lines (276 loc) 9.12 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); require('../../../src/stylus/components/_navigation-drawer.styl'); var _applicationable = require('../../mixins/applicationable'); var _applicationable2 = _interopRequireDefault(_applicationable); var _overlayable = require('../../mixins/overlayable'); var _overlayable2 = _interopRequireDefault(_overlayable); var _ssrBootable = require('../../mixins/ssr-bootable'); var _ssrBootable2 = _interopRequireDefault(_ssrBootable); var _themeable = require('../../mixins/themeable'); var _themeable2 = _interopRequireDefault(_themeable); var _clickOutside = require('../../directives/click-outside'); var _clickOutside2 = _interopRequireDefault(_clickOutside); var _resize = require('../../directives/resize'); var _resize2 = _interopRequireDefault(_resize); var _touch = require('../../directives/touch'); var _touch2 = _interopRequireDefault(_touch); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } exports.default = { name: 'v-navigation-drawer', mixins: [(0, _applicationable2.default)(null, ['miniVariant', 'right', 'width']), _overlayable2.default, _ssrBootable2.default, _themeable2.default], directives: { ClickOutside: _clickOutside2.default, Resize: _resize2.default, Touch: _touch2.default }, data: function data() { return { isActive: false, touchArea: { left: 0, right: 0 } }; }, props: { clipped: Boolean, disableRouteWatcher: Boolean, disableResizeWatcher: Boolean, height: { type: [Number, String], default: '100%' }, floating: Boolean, miniVariant: Boolean, miniVariantWidth: { type: [Number, String], default: 80 }, mobileBreakPoint: { type: [Number, String], default: 1264 }, permanent: Boolean, right: Boolean, stateless: Boolean, temporary: Boolean, touchless: Boolean, width: { type: [Number, String], default: 300 }, value: { required: false } }, computed: { /** * Used for setting an app * value from a dynamic * property. Called from * applicationable.js * * @return {string} */ applicationProperty: function applicationProperty() { return this.right ? 'right' : 'left'; }, calculatedHeight: function calculatedHeight() { return isNaN(this.height) ? this.height : this.height + 'px'; }, calculatedTransform: function calculatedTransform() { if (this.isActive) return 0; return this.right ? this.calculatedWidth : -this.calculatedWidth; }, calculatedWidth: function calculatedWidth() { return this.miniVariant ? this.miniVariantWidth : this.width; }, classes: function classes() { return { 'navigation-drawer': true, 'navigation-drawer--absolute': this.absolute, 'navigation-drawer--clipped': this.clipped, 'navigation-drawer--close': !this.isActive, 'navigation-drawer--fixed': !this.absolute && (this.app || this.fixed), 'navigation-drawer--floating': this.floating, 'navigation-drawer--is-mobile': this.isMobile, 'navigation-drawer--mini-variant': this.miniVariant, 'navigation-drawer--open': this.isActive, 'navigation-drawer--right': this.right, 'navigation-drawer--temporary': this.temporary, 'theme--dark': this.dark, 'theme--light': this.light }; }, isMobile: function isMobile() { return !this.permanent && !this.temporary && this.$vuetify.breakpoint.width < parseInt(this.mobileBreakPoint, 10); }, marginTop: function marginTop() { if (!this.app) return 0; var marginTop = this.$vuetify.application.bar; marginTop += this.clipped ? this.$vuetify.application.top : 0; return marginTop; }, maxHeight: function maxHeight() { if (!this.app) return '100%'; return this.clipped ? this.$vuetify.application.top + this.$vuetify.application.bottom : this.$vuetify.application.bottom; }, reactsToClick: function reactsToClick() { return !this.stateless && !this.permanent && (this.isMobile || this.temporary); }, reactsToMobile: function reactsToMobile() { return !this.disableResizeWatcher && !this.stateless && !this.permanent && !this.temporary; }, reactsToRoute: function reactsToRoute() { return !this.disableRouteWatcher && !this.stateless && (this.temporary || this.isMobile); }, resizeIsDisabled: function resizeIsDisabled() { return this.disableResizeWatcher || this.stateless; }, showOverlay: function showOverlay() { return this.isActive && (this.isMobile || this.temporary); }, styles: function styles() { var styles = { height: this.calculatedHeight, marginTop: this.marginTop + 'px', maxHeight: 'calc(100% - ' + this.maxHeight + 'px)', transform: 'translateX(' + this.calculatedTransform + 'px)', width: this.calculatedWidth + 'px' }; return styles; } }, watch: { $route: function $route() { if (this.reactsToRoute && this.closeConditional()) { this.isActive = false; } }, isActive: function isActive(val) { this.$emit('input', val); this.callUpdate(); }, /** * When mobile changes, adjust * the active state only when * there has been a previous * value */ isMobile: function isMobile(val, prev) { !val && this.isActive && !this.temporary && this.removeOverlay(); if (prev == null || this.resizeIsDisabled || !this.reactsToMobile) return; this.isActive = !val; this.callUpdate(); }, permanent: function permanent(val) { // If enabling prop // enable the drawer if (val) { this.isActive = true; } this.callUpdate(); }, showOverlay: function showOverlay(val) { if (val) this.genOverlay();else this.removeOverlay(); }, temporary: function temporary() { this.callUpdate(); }, value: function value(val) { if (this.permanent) return; if (val == null) return this.init(); if (val !== this.isActive) this.isActive = val; } }, beforeMount: function beforeMount() { this.init(); }, methods: { calculateTouchArea: function calculateTouchArea() { if (!this.$el.parentNode) return; var parentRect = this.$el.parentNode.getBoundingClientRect(); this.touchArea = { left: parentRect.left + 50, right: parentRect.right - 50 }; }, closeConditional: function closeConditional() { return this.isActive && this.reactsToClick; }, genDirectives: function genDirectives() { var _this = this; var directives = [{ name: 'click-outside', value: function value() { return _this.isActive = false; }, args: { closeConditional: this.closeConditional } }]; !this.touchless && directives.push({ name: 'touch', value: { parent: true, left: this.swipeLeft, right: this.swipeRight } }); return directives; }, /** * Sets state before mount to avoid * entry transitions in SSR * * @return {void} */ init: function init() { if (this.permanent) { this.isActive = true; } else if (this.stateless || this.value != null) { this.isActive = this.value; } else if (!this.temporary) { this.isActive = !this.isMobile; } }, swipeRight: function swipeRight(e) { if (this.isActive && !this.right) return; this.calculateTouchArea(); if (Math.abs(e.touchendX - e.touchstartX) < 100) return; if (!this.right && e.touchstartX <= this.touchArea.left) this.isActive = true;else if (this.right && this.isActive) this.isActive = false; }, swipeLeft: function swipeLeft(e) { if (this.isActive && this.right) return; this.calculateTouchArea(); if (Math.abs(e.touchendX - e.touchstartX) < 100) return; if (this.right && e.touchstartX >= this.touchArea.right) this.isActive = true;else if (!this.right && this.isActive) this.isActive = false; }, /** * Update the application layout * * @return {number} */ updateApplication: function updateApplication() { return !this.isActive || this.temporary || this.isMobile ? 0 : this.calculatedWidth; } }, render: function render(h) { var _this2 = this; var data = { 'class': this.classes, style: this.styles, directives: this.genDirectives(), on: { click: function click() { if (!_this2.miniVariant) return; _this2.$emit('update:miniVariant', false); } } }; return h('aside', data, [this.$slots.default, h('div', { 'class': 'navigation-drawer__border' })]); } }; // Directives // Mixins