123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- // Utilities
- import { inject, reactive, shallowRef, toRefs, watchEffect } from 'vue';
- import { mergeDeep } from "../util/index.mjs";
- import { IN_BROWSER, SUPPORTS_TOUCH } from "../util/globals.mjs"; // Types
- export const breakpoints = ['sm', 'md', 'lg', 'xl', 'xxl']; // no xs
- export const DisplaySymbol = Symbol.for('vuetify:display');
- const defaultDisplayOptions = {
- mobileBreakpoint: 'lg',
- thresholds: {
- xs: 0,
- sm: 600,
- md: 960,
- lg: 1280,
- xl: 1920,
- xxl: 2560
- }
- };
- const parseDisplayOptions = function () {
- let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultDisplayOptions;
- return mergeDeep(defaultDisplayOptions, options);
- };
- function getClientWidth(ssr) {
- return IN_BROWSER && !ssr ? window.innerWidth : typeof ssr === 'object' && ssr.clientWidth || 0;
- }
- function getClientHeight(ssr) {
- return IN_BROWSER && !ssr ? window.innerHeight : typeof ssr === 'object' && ssr.clientHeight || 0;
- }
- function getPlatform(ssr) {
- const userAgent = IN_BROWSER && !ssr ? window.navigator.userAgent : 'ssr';
- function match(regexp) {
- return Boolean(userAgent.match(regexp));
- }
- const android = match(/android/i);
- const ios = match(/iphone|ipad|ipod/i);
- const cordova = match(/cordova/i);
- const electron = match(/electron/i);
- const chrome = match(/chrome/i);
- const edge = match(/edge/i);
- const firefox = match(/firefox/i);
- const opera = match(/opera/i);
- const win = match(/win/i);
- const mac = match(/mac/i);
- const linux = match(/linux/i);
- return {
- android,
- ios,
- cordova,
- electron,
- chrome,
- edge,
- firefox,
- opera,
- win,
- mac,
- linux,
- touch: SUPPORTS_TOUCH,
- ssr: userAgent === 'ssr'
- };
- }
- export function createDisplay(options, ssr) {
- const {
- thresholds,
- mobileBreakpoint
- } = parseDisplayOptions(options);
- const height = shallowRef(getClientHeight(ssr));
- const platform = shallowRef(getPlatform(ssr));
- const state = reactive({});
- const width = shallowRef(getClientWidth(ssr));
- function updateSize() {
- height.value = getClientHeight();
- width.value = getClientWidth();
- }
- function update() {
- updateSize();
- platform.value = getPlatform();
- }
- // eslint-disable-next-line max-statements
- watchEffect(() => {
- const xs = width.value < thresholds.sm;
- const sm = width.value < thresholds.md && !xs;
- const md = width.value < thresholds.lg && !(sm || xs);
- const lg = width.value < thresholds.xl && !(md || sm || xs);
- const xl = width.value < thresholds.xxl && !(lg || md || sm || xs);
- const xxl = width.value >= thresholds.xxl;
- const name = xs ? 'xs' : sm ? 'sm' : md ? 'md' : lg ? 'lg' : xl ? 'xl' : 'xxl';
- const breakpointValue = typeof mobileBreakpoint === 'number' ? mobileBreakpoint : thresholds[mobileBreakpoint];
- const mobile = width.value < breakpointValue;
- state.xs = xs;
- state.sm = sm;
- state.md = md;
- state.lg = lg;
- state.xl = xl;
- state.xxl = xxl;
- state.smAndUp = !xs;
- state.mdAndUp = !(xs || sm);
- state.lgAndUp = !(xs || sm || md);
- state.xlAndUp = !(xs || sm || md || lg);
- state.smAndDown = !(md || lg || xl || xxl);
- state.mdAndDown = !(lg || xl || xxl);
- state.lgAndDown = !(xl || xxl);
- state.xlAndDown = !xxl;
- state.name = name;
- state.height = height.value;
- state.width = width.value;
- state.mobile = mobile;
- state.mobileBreakpoint = mobileBreakpoint;
- state.platform = platform.value;
- state.thresholds = thresholds;
- });
- if (IN_BROWSER) {
- window.addEventListener('resize', updateSize, {
- passive: true
- });
- }
- return {
- ...toRefs(state),
- update,
- ssr: !!ssr
- };
- }
- export function useDisplay() {
- const display = inject(DisplaySymbol);
- if (!display) throw new Error('Could not find Vuetify display injection');
- return display;
- }
- //# sourceMappingURL=display.mjs.map
|