131 lines
5.0 KiB
JavaScript
Raw Normal View History

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; };
import Vue from 'vue';
var BREAKPOINTS_DEFAULTS = {
thresholds: {
xs: 600,
sm: 960,
md: 1280,
lg: 1920
},
scrollbarWidth: 16
};
/**
* Factory function for the breakpoint mixin.
*/
export default function breakpoint() {
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
if (!opts) {
opts = {};
}
return Vue.extend({
data: function data() {
return _extends({
clientHeight: getClientHeight(),
clientWidth: getClientWidth(),
resizeTimeout: undefined
}, BREAKPOINTS_DEFAULTS, opts);
},
computed: {
breakpoint: function breakpoint() {
var xs = this.clientWidth < this.thresholds.xs;
var sm = this.clientWidth < this.thresholds.sm && !xs;
var md = this.clientWidth < this.thresholds.md - this.scrollbarWidth && !(sm || xs);
var lg = this.clientWidth < this.thresholds.lg - this.scrollbarWidth && !(md || sm || xs);
var xl = this.clientWidth >= this.thresholds.lg - this.scrollbarWidth;
var xsOnly = xs;
var smOnly = sm;
var smAndDown = (xs || sm) && !(md || lg || xl);
var smAndUp = !xs && (sm || md || lg || xl);
var mdOnly = md;
var mdAndDown = (xs || sm || md) && !(lg || xl);
var mdAndUp = !(xs || sm) && (md || lg || xl);
var lgOnly = lg;
var lgAndDown = (xs || sm || md || lg) && !xl;
var lgAndUp = !(xs || sm || md) && (lg || xl);
var xlOnly = xl;
var name = void 0;
switch (true) {
case xs:
name = 'xs';
break;
case sm:
name = 'sm';
break;
case md:
name = 'md';
break;
case lg:
name = 'lg';
break;
default:
name = 'xl';
break;
}
return {
// Definite breakpoint.
xs: xs,
sm: sm,
md: md,
lg: lg,
xl: xl,
// Useful e.g. to construct CSS class names dynamically.
name: name,
// Breakpoint ranges.
xsOnly: xsOnly,
smOnly: smOnly,
smAndDown: smAndDown,
smAndUp: smAndUp,
mdOnly: mdOnly,
mdAndDown: mdAndDown,
mdAndUp: mdAndUp,
lgOnly: lgOnly,
lgAndDown: lgAndDown,
lgAndUp: lgAndUp,
xlOnly: xlOnly,
// For custom breakpoint logic.
width: this.clientWidth,
height: this.clientHeight,
thresholds: this.thresholds,
scrollbarWidth: this.scrollbarWidth
};
}
},
created: function created() {
if (typeof window === 'undefined') return;
window.addEventListener('resize', this.onResize, { passive: true });
},
beforeDestroy: function beforeDestroy() {
if (typeof window === 'undefined') return;
window.removeEventListener('resize', this.onResize);
},
methods: {
onResize: function onResize() {
clearTimeout(this.resizeTimeout);
// Added debounce to match what
// v-resize used to do but was
// removed due to a memory leak
// https://github.com/vuetifyjs/vuetify/pull/2997
this.resizeTimeout = window.setTimeout(this.setDimensions, 200);
},
setDimensions: function setDimensions() {
this.clientHeight = getClientHeight();
this.clientWidth = getClientWidth();
}
}
});
}
// Cross-browser support as described in:
// https://stackoverflow.com/questions/1248081
function getClientWidth() {
if (typeof document === 'undefined') return 0; // SSR
return Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
}
function getClientHeight() {
if (typeof document === 'undefined') return 0; // SSR
return Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
}
//# sourceMappingURL=breakpoint.js.map