UNPKG

vuetify

Version:

Vue Material Component Framework

1,631 lines (1,554 loc) 634 kB
/*! * Vuetify v3.3.3 * Forged by John Leider * Released under the MIT License. */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('vue')) : typeof define === 'function' && define.amd ? define(['exports', 'vue'], factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Vuetify = {}, global.Vue)); })(this, (function (exports, vue) { 'use strict'; // Types // eslint-disable-line vue/prefer-import-from-vue /** * Creates a factory function for props definitions. * This is used to define props in a composable then override * default values in an implementing component. * * @example Simplified signature * (props: Props) => (defaults?: Record<keyof props, any>) => Props * * @example Usage * const makeProps = propsFactory({ * foo: String, * }) * * defineComponent({ * props: { * ...makeProps({ * foo: 'a', * }), * }, * setup (props) { * // would be "string | undefined", now "string" because a default has been provided * props.foo * }, * } */ function propsFactory(props, source) { return defaults => { return Object.keys(props).reduce((obj, prop) => { const isObjectDefinition = typeof props[prop] === 'object' && props[prop] != null && !Array.isArray(props[prop]); const definition = isObjectDefinition ? props[prop] : { type: props[prop] }; if (defaults && prop in defaults) { obj[prop] = { ...definition, default: defaults[prop] }; } else { obj[prop] = definition; } if (source && !obj[prop].source) { obj[prop].source = source; } return obj; }, {}); }; } // Utilities // Types // Composables const makeComponentProps = propsFactory({ class: [String, Array], style: { type: [String, Array, Object], default: null } }, 'component'); function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); } function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } } function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; } function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } } function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); } function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); } function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } // Types function getNestedValue(obj, path, fallback) { const last = path.length - 1; if (last < 0) return obj === undefined ? fallback : obj; for (let i = 0; i < last; i++) { if (obj == null) { return fallback; } obj = obj[path[i]]; } if (obj == null) return fallback; return obj[path[last]] === undefined ? fallback : obj[path[last]]; } function deepEqual(a, b) { if (a === b) return true; if (a instanceof Date && b instanceof Date && a.getTime() !== b.getTime()) { // If the values are Date, compare them as timestamps return false; } if (a !== Object(a) || b !== Object(b)) { // If the values aren't objects, they were already checked for equality return false; } const props = Object.keys(a); if (props.length !== Object.keys(b).length) { // Different number of props, don't bother to check return false; } return props.every(p => deepEqual(a[p], b[p])); } function getObjectValueByPath(obj, path, fallback) { // credit: http://stackoverflow.com/questions/6491463/accessing-nested-javascript-objects-with-string-key#comment55278413_6491621 if (obj == null || !path || typeof path !== 'string') return fallback; if (obj[path] !== undefined) return obj[path]; path = path.replace(/\[(\w+)\]/g, '.$1'); // convert indexes to properties path = path.replace(/^\./, ''); // strip a leading dot return getNestedValue(obj, path.split('.'), fallback); } function getPropertyFromItem(item, property, fallback) { if (property == null) return item === undefined ? fallback : item; if (item !== Object(item)) { if (typeof property !== 'function') return fallback; const value = property(item, fallback); return typeof value === 'undefined' ? fallback : value; } if (typeof property === 'string') return getObjectValueByPath(item, property, fallback); if (Array.isArray(property)) return getNestedValue(item, property, fallback); if (typeof property !== 'function') return fallback; const value = property(item, fallback); return typeof value === 'undefined' ? fallback : value; } function createRange(length) { let start = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; return Array.from({ length }, (v, k) => start + k); } function convertToUnit(str) { let unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'px'; if (str == null || str === '') { return undefined; } else if (isNaN(+str)) { return String(str); } else if (!isFinite(+str)) { return undefined; } else { return `${Number(str)}${unit}`; } } function isObject(obj) { return obj !== null && typeof obj === 'object' && !Array.isArray(obj); } function refElement(obj) { return obj && '$el' in obj ? obj.$el : obj; } // KeyboardEvent.keyCode aliases const keyCodes = Object.freeze({ enter: 13, tab: 9, delete: 46, esc: 27, space: 32, up: 38, down: 40, left: 37, right: 39, end: 35, home: 36, del: 46, backspace: 8, insert: 45, pageup: 33, pagedown: 34, shift: 16 }); const keyValues = Object.freeze({ enter: 'Enter', tab: 'Tab', delete: 'Delete', esc: 'Escape', space: 'Space', up: 'ArrowUp', down: 'ArrowDown', left: 'ArrowLeft', right: 'ArrowRight', end: 'End', home: 'Home', del: 'Delete', backspace: 'Backspace', insert: 'Insert', pageup: 'PageUp', pagedown: 'PageDown', shift: 'Shift' }); function keys(o) { return Object.keys(o); } function has(obj, key) { return key.every(k => obj.hasOwnProperty(k)); } function pick(obj, paths, exclude) { const found = Object.create(null); const rest = Object.create(null); for (const key in obj) { if (paths.some(path => path instanceof RegExp ? path.test(key) : path === key) && !exclude?.some(path => path === key)) { found[key] = obj[key]; } else { rest[key] = obj[key]; } } return [found, rest]; } function omit(obj, exclude) { const clone = { ...obj }; exclude.forEach(prop => delete clone[prop]); return clone; } /** * Filter attributes that should be applied to * the root element of a an input component. Remaining * attributes should be passed to the <input> element inside. */ function filterInputAttrs(attrs) { return pick(attrs, ['class', 'style', 'id', /^data-/]); } function wrapInArray(v) { return v == null ? [] : Array.isArray(v) ? v : [v]; } function clamp(value) { let min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; let max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; return Math.max(min, Math.min(max, value)); } function getDecimals(value) { const trimmedStr = value.toString().trim(); return trimmedStr.includes('.') ? trimmedStr.length - trimmedStr.indexOf('.') - 1 : 0; } function padEnd(str, length) { let char = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '0'; return str + char.repeat(Math.max(0, length - str.length)); } function chunk(str) { let size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; const chunked = []; let index = 0; while (index < str.length) { chunked.push(str.substr(index, size)); index += size; } return chunked; } function humanReadableFileSize(bytes) { let base = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000; if (bytes < base) { return `${bytes} B`; } const prefix = base === 1024 ? ['Ki', 'Mi', 'Gi'] : ['k', 'M', 'G']; let unit = -1; while (Math.abs(bytes) >= base && unit < prefix.length - 1) { bytes /= base; ++unit; } return `${bytes.toFixed(1)} ${prefix[unit]}B`; } function mergeDeep() { let source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; let target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; let arrayFn = arguments.length > 2 ? arguments[2] : undefined; const out = {}; for (const key in source) { out[key] = source[key]; } for (const key in target) { const sourceProperty = source[key]; const targetProperty = target[key]; // Only continue deep merging if // both properties are objects if (isObject(sourceProperty) && isObject(targetProperty)) { out[key] = mergeDeep(sourceProperty, targetProperty, arrayFn); continue; } if (Array.isArray(sourceProperty) && Array.isArray(targetProperty) && arrayFn) { out[key] = arrayFn(sourceProperty, targetProperty); continue; } out[key] = targetProperty; } return out; } function flattenFragments(nodes) { return nodes.map(node => { if (node.type === vue.Fragment) { return flattenFragments(node.children); } else { return node; } }).flat(); } function toKebabCase() { let str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; if (toKebabCase.cache.has(str)) return toKebabCase.cache.get(str); const kebab = str.replace(/[^a-z]/gi, '-').replace(/\B([A-Z])/g, '-$1').toLowerCase(); toKebabCase.cache.set(str, kebab); return kebab; } toKebabCase.cache = new Map(); function findChildrenWithProvide(key, vnode) { if (!vnode || typeof vnode !== 'object') return []; if (Array.isArray(vnode)) { return vnode.map(child => findChildrenWithProvide(key, child)).flat(1); } else if (Array.isArray(vnode.children)) { return vnode.children.map(child => findChildrenWithProvide(key, child)).flat(1); } else if (vnode.component) { if (Object.getOwnPropertySymbols(vnode.component.provides).includes(key)) { return [vnode.component]; } else if (vnode.component.subTree) { return findChildrenWithProvide(key, vnode.component.subTree).flat(1); } } return []; } var _arr = /*#__PURE__*/new WeakMap(); var _pointer = /*#__PURE__*/new WeakMap(); class CircularBuffer { constructor(size) { _classPrivateFieldInitSpec(this, _arr, { writable: true, value: [] }); _classPrivateFieldInitSpec(this, _pointer, { writable: true, value: 0 }); this.size = size; } push(val) { _classPrivateFieldGet(this, _arr)[_classPrivateFieldGet(this, _pointer)] = val; _classPrivateFieldSet(this, _pointer, (_classPrivateFieldGet(this, _pointer) + 1) % this.size); } values() { return _classPrivateFieldGet(this, _arr).slice(_classPrivateFieldGet(this, _pointer)).concat(_classPrivateFieldGet(this, _arr).slice(0, _classPrivateFieldGet(this, _pointer))); } } function getEventCoordinates(e) { if ('touches' in e) { return { clientX: e.touches[0].clientX, clientY: e.touches[0].clientY }; } return { clientX: e.clientX, clientY: e.clientY }; } // Only allow a single return type function destructComputed(getter) { const refs = vue.reactive({}); const base = vue.computed(getter); vue.watchEffect(() => { for (const key in base.value) { refs[key] = base.value[key]; } }, { flush: 'sync' }); return vue.toRefs(refs); } /** Array.includes but value can be any type */ function includes(arr, val) { return arr.includes(val); } const onRE = /^on[^a-z]/; const isOn = key => onRE.test(key); function eventName(propName) { return propName[2].toLowerCase() + propName.slice(3); } const EventProp = () => [Function, Array]; function hasEvent(props, name) { name = 'on' + vue.capitalize(name); return !!(props[name] || props[`${name}Once`] || props[`${name}Capture`] || props[`${name}OnceCapture`] || props[`${name}CaptureOnce`]); } function callEvent(handler) { for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { args[_key2 - 1] = arguments[_key2]; } if (Array.isArray(handler)) { for (const h of handler) { h(...args); } } else if (typeof handler === 'function') { handler(...args); } } function focusableChildren(el) { const targets = ['button', '[href]', 'input:not([type="hidden"])', 'select', 'textarea', '[tabindex]'].map(s => `${s}:not([tabindex="-1"]):not([disabled])`).join(', '); return [...el.querySelectorAll(targets)]; } function focusChild(el, location) { const focusable = focusableChildren(el); const idx = focusable.indexOf(document.activeElement); if (!location) { if (el === document.activeElement || !el.contains(document.activeElement)) { focusable[0]?.focus(); } } else if (location === 'first') { focusable[0]?.focus(); } else if (location === 'last') { focusable.at(-1)?.focus(); } else { let _el; let idxx = idx; const inc = location === 'next' ? 1 : -1; do { idxx += inc; _el = focusable[idxx]; } while ((!_el || _el.offsetParent == null) && idxx < focusable.length && idxx >= 0); if (_el) _el.focus();else focusChild(el, location === 'next' ? 'first' : 'last'); } } function noop() {} // Utilities const block = ['top', 'bottom']; const inline = ['start', 'end', 'left', 'right']; /** Parse a raw anchor string into an object */ function parseAnchor(anchor, isRtl) { let [side, align] = anchor.split(' '); if (!align) { align = includes(block, side) ? 'start' : includes(inline, side) ? 'top' : 'center'; } return { side: toPhysical(side, isRtl), align: toPhysical(align, isRtl) }; } function toPhysical(str, isRtl) { if (str === 'start') return isRtl ? 'right' : 'left'; if (str === 'end') return isRtl ? 'left' : 'right'; return str; } function flipSide(anchor) { return { side: { center: 'center', top: 'bottom', bottom: 'top', left: 'right', right: 'left' }[anchor.side], align: anchor.align }; } function flipAlign(anchor) { return { side: anchor.side, align: { center: 'center', top: 'bottom', bottom: 'top', left: 'right', right: 'left' }[anchor.align] }; } function flipCorner(anchor) { return { side: anchor.align, align: anchor.side }; } function getAxis(anchor) { return includes(block, anchor.side) ? 'y' : 'x'; } class Box { constructor(_ref) { let { x, y, width, height } = _ref; this.x = x; this.y = y; this.width = width; this.height = height; } get top() { return this.y; } get bottom() { return this.y + this.height; } get left() { return this.x; } get right() { return this.x + this.width; } } function getOverflow(a, b) { return { x: { before: Math.max(0, b.left - a.left), after: Math.max(0, a.right - b.right) }, y: { before: Math.max(0, b.top - a.top), after: Math.max(0, a.bottom - b.bottom) } }; } // Utilities /** @see https://stackoverflow.com/a/57876601/2074736 */ function nullifyTransforms(el) { const rect = el.getBoundingClientRect(); const style = getComputedStyle(el); const tx = style.transform; if (tx) { let ta, sx, sy, dx, dy; if (tx.startsWith('matrix3d(')) { ta = tx.slice(9, -1).split(/, /); sx = +ta[0]; sy = +ta[5]; dx = +ta[12]; dy = +ta[13]; } else if (tx.startsWith('matrix(')) { ta = tx.slice(7, -1).split(/, /); sx = +ta[0]; sy = +ta[3]; dx = +ta[4]; dy = +ta[5]; } else { return new Box(rect); } const to = style.transformOrigin; const x = rect.x - dx - (1 - sx) * parseFloat(to); const y = rect.y - dy - (1 - sy) * parseFloat(to.slice(to.indexOf(' ') + 1)); const w = sx ? rect.width / sx : el.offsetWidth + 1; const h = sy ? rect.height / sy : el.offsetHeight + 1; return new Box({ x, y, width: w, height: h }); } else { return new Box(rect); } } function animate(el, keyframes, options) { if (typeof el.animate === 'undefined') return { finished: Promise.resolve() }; let animation; try { animation = el.animate(keyframes, options); } catch (err) { return { finished: Promise.resolve() }; } if (typeof animation.finished === 'undefined') { animation.finished = new Promise(resolve => { animation.onfinish = () => { resolve(animation); }; }); } return animation; } // Utilities const handlers = new WeakMap(); function bindProps(el, props) { Object.keys(props).forEach(k => { if (isOn(k)) { const name = eventName(k); const handler = handlers.get(el); if (props[k] == null) { handler?.forEach(v => { const [n, fn] = v; if (n === name) { el.removeEventListener(name, fn); handler.delete(v); } }); } else if (!handler || ![...handler]?.some(v => v[0] === name && v[1] === props[k])) { el.addEventListener(name, props[k]); const _handler = handler || new Set(); _handler.add([name, props[k]]); if (!handlers.has(el)) handlers.set(el, _handler); } } else { if (props[k] == null) { el.removeAttribute(k); } else { el.setAttribute(k, props[k]); } } }); } function unbindProps(el, props) { Object.keys(props).forEach(k => { if (isOn(k)) { const name = eventName(k); const handler = handlers.get(el); handler?.forEach(v => { const [n, fn] = v; if (n === name) { el.removeEventListener(name, fn); handler.delete(v); } }); } else { el.removeAttribute(k); } }); } /* eslint-disable no-console */ function consoleWarn(message) { vue.warn(`Vuetify: ${message}`); } function consoleError(message) { vue.warn(`Vuetify error: ${message}`); } function deprecate(original, replacement) { replacement = Array.isArray(replacement) ? replacement.slice(0, -1).map(s => `'${s}'`).join(', ') + ` or '${replacement.at(-1)}'` : `'${replacement}'`; vue.warn(`[Vuetify UPGRADE] '${original}' is deprecated, use ${replacement} instead.`); } // Types const delta = 0.20689655172413793; // 6÷29 const cielabForwardTransform = t => t > delta ** 3 ? Math.cbrt(t) : t / (3 * delta ** 2) + 4 / 29; const cielabReverseTransform = t => t > delta ? t ** 3 : 3 * delta ** 2 * (t - 4 / 29); function fromXYZ$1(xyz) { const transform = cielabForwardTransform; const transformedY = transform(xyz[1]); return [116 * transformedY - 16, 500 * (transform(xyz[0] / 0.95047) - transformedY), 200 * (transformedY - transform(xyz[2] / 1.08883))]; } function toXYZ$1(lab) { const transform = cielabReverseTransform; const Ln = (lab[0] + 16) / 116; return [transform(Ln + lab[1] / 500) * 0.95047, transform(Ln), transform(Ln - lab[2] / 200) * 1.08883]; } // Utilities // Types // For converting XYZ to sRGB const srgbForwardMatrix = [[3.2406, -1.5372, -0.4986], [-0.9689, 1.8758, 0.0415], [0.0557, -0.2040, 1.0570]]; // Forward gamma adjust const srgbForwardTransform = C => C <= 0.0031308 ? C * 12.92 : 1.055 * C ** (1 / 2.4) - 0.055; // For converting sRGB to XYZ const srgbReverseMatrix = [[0.4124, 0.3576, 0.1805], [0.2126, 0.7152, 0.0722], [0.0193, 0.1192, 0.9505]]; // Reverse gamma adjust const srgbReverseTransform = C => C <= 0.04045 ? C / 12.92 : ((C + 0.055) / 1.055) ** 2.4; function fromXYZ(xyz) { const rgb = Array(3); const transform = srgbForwardTransform; const matrix = srgbForwardMatrix; // Matrix transform, then gamma adjustment for (let i = 0; i < 3; ++i) { // Rescale back to [0, 255] rgb[i] = Math.round(clamp(transform(matrix[i][0] * xyz[0] + matrix[i][1] * xyz[1] + matrix[i][2] * xyz[2])) * 255); } return { r: rgb[0], g: rgb[1], b: rgb[2] }; } function toXYZ(_ref) { let { r, g, b } = _ref; const xyz = [0, 0, 0]; const transform = srgbReverseTransform; const matrix = srgbReverseMatrix; // Rescale from [0, 255] to [0, 1] then adjust sRGB gamma to linear RGB r = transform(r / 255); g = transform(g / 255); b = transform(b / 255); // Matrix color space transform for (let i = 0; i < 3; ++i) { xyz[i] = matrix[i][0] * r + matrix[i][1] * g + matrix[i][2] * b; } return xyz; } // Utilities // Types function isCssColor(color) { return !!color && /^(#|var\(--|(rgb|hsl)a?\()/.test(color); } const cssColorRe = /^(?<fn>(?:rgb|hsl)a?)\((?<values>.+)\)/; const mappers = { rgb: (r, g, b, a) => ({ r, g, b, a }), rgba: (r, g, b, a) => ({ r, g, b, a }), hsl: (h, s, l, a) => HSLtoRGB({ h, s, l, a }), hsla: (h, s, l, a) => HSLtoRGB({ h, s, l, a }), hsv: (h, s, v, a) => HSVtoRGB({ h, s, v, a }), hsva: (h, s, v, a) => HSVtoRGB({ h, s, v, a }) }; function parseColor(color) { if (typeof color === 'number') { if (isNaN(color) || color < 0 || color > 0xFFFFFF) { // int can't have opacity consoleWarn(`'${color}' is not a valid hex color`); } return { r: (color & 0xFF0000) >> 16, g: (color & 0xFF00) >> 8, b: color & 0xFF }; } else if (typeof color === 'string' && cssColorRe.test(color)) { const { groups } = color.match(cssColorRe); const { fn, values } = groups; const realValues = values.split(/,\s*/).map(v => { if (v.endsWith('%') && ['hsl', 'hsla', 'hsv', 'hsva'].includes(fn)) { return parseFloat(v) / 100; } else { return parseFloat(v); } }); return mappers[fn](...realValues); } else if (typeof color === 'string') { let hex = color.startsWith('#') ? color.slice(1) : color; if ([3, 4].includes(hex.length)) { hex = hex.split('').map(char => char + char).join(''); } else if (![6, 8].includes(hex.length)) { consoleWarn(`'${color}' is not a valid hex(a) color`); } const int = parseInt(hex, 16); if (isNaN(int) || int < 0 || int > 0xFFFFFFFF) { consoleWarn(`'${color}' is not a valid hex(a) color`); } return HexToRGB(hex); } else if (typeof color === 'object') { if (has(color, ['r', 'g', 'b'])) { return color; } else if (has(color, ['h', 's', 'l'])) { return HSVtoRGB(HSLtoHSV(color)); } else if (has(color, ['h', 's', 'v'])) { return HSVtoRGB(color); } } throw new TypeError(`Invalid color: ${color == null ? color : String(color) || color.constructor.name}\nExpected #hex, #hexa, rgb(), rgba(), hsl(), hsla(), object or number`); } /** Converts HSVA to RGBA. Based on formula from https://en.wikipedia.org/wiki/HSL_and_HSV */ function HSVtoRGB(hsva) { const { h, s, v, a } = hsva; const f = n => { const k = (n + h / 60) % 6; return v - v * s * Math.max(Math.min(k, 4 - k, 1), 0); }; const rgb = [f(5), f(3), f(1)].map(v => Math.round(v * 255)); return { r: rgb[0], g: rgb[1], b: rgb[2], a }; } function HSLtoRGB(hsla) { return HSVtoRGB(HSLtoHSV(hsla)); } /** Converts RGBA to HSVA. Based on formula from https://en.wikipedia.org/wiki/HSL_and_HSV */ function RGBtoHSV(rgba) { if (!rgba) return { h: 0, s: 1, v: 1, a: 1 }; const r = rgba.r / 255; const g = rgba.g / 255; const b = rgba.b / 255; const max = Math.max(r, g, b); const min = Math.min(r, g, b); let h = 0; if (max !== min) { if (max === r) { h = 60 * (0 + (g - b) / (max - min)); } else if (max === g) { h = 60 * (2 + (b - r) / (max - min)); } else if (max === b) { h = 60 * (4 + (r - g) / (max - min)); } } if (h < 0) h = h + 360; const s = max === 0 ? 0 : (max - min) / max; const hsv = [h, s, max]; return { h: hsv[0], s: hsv[1], v: hsv[2], a: rgba.a }; } function HSVtoHSL(hsva) { const { h, s, v, a } = hsva; const l = v - v * s / 2; const sprime = l === 1 || l === 0 ? 0 : (v - l) / Math.min(l, 1 - l); return { h, s: sprime, l, a }; } function HSLtoHSV(hsl) { const { h, s, l, a } = hsl; const v = l + s * Math.min(l, 1 - l); const sprime = v === 0 ? 0 : 2 - 2 * l / v; return { h, s: sprime, v, a }; } function RGBtoCSS(_ref) { let { r, g, b, a } = _ref; return a === undefined ? `rgb(${r}, ${g}, ${b})` : `rgba(${r}, ${g}, ${b}, ${a})`; } function HSVtoCSS(hsva) { return RGBtoCSS(HSVtoRGB(hsva)); } function toHex(v) { const h = Math.round(v).toString(16); return ('00'.substr(0, 2 - h.length) + h).toUpperCase(); } function RGBtoHex(_ref2) { let { r, g, b, a } = _ref2; return `#${[toHex(r), toHex(g), toHex(b), a !== undefined ? toHex(Math.round(a * 255)) : ''].join('')}`; } function HexToRGB(hex) { hex = parseHex(hex); let [r, g, b, a] = chunk(hex, 2).map(c => parseInt(c, 16)); a = a === undefined ? a : a / 255; return { r, g, b, a }; } function HexToHSV(hex) { const rgb = HexToRGB(hex); return RGBtoHSV(rgb); } function HSVtoHex(hsva) { return RGBtoHex(HSVtoRGB(hsva)); } function parseHex(hex) { if (hex.startsWith('#')) { hex = hex.slice(1); } hex = hex.replace(/([^0-9a-f])/gi, 'F'); if (hex.length === 3 || hex.length === 4) { hex = hex.split('').map(x => x + x).join(''); } if (hex.length !== 6) { hex = padEnd(padEnd(hex, 6), 8, 'F'); } return hex; } function lighten(value, amount) { const lab = fromXYZ$1(toXYZ(value)); lab[0] = lab[0] + amount * 10; return fromXYZ(toXYZ$1(lab)); } function darken(value, amount) { const lab = fromXYZ$1(toXYZ(value)); lab[0] = lab[0] - amount * 10; return fromXYZ(toXYZ$1(lab)); } /** * Calculate the relative luminance of a given color * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef */ function getLuma(color) { const rgb = parseColor(color); return toXYZ(rgb)[1]; } /** * Returns the contrast ratio (1-21) between two colors. * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef */ function getContrast(first, second) { const l1 = getLuma(first); const l2 = getLuma(second); const light = Math.max(l1, l2); const dark = Math.min(l1, l2); return (light + 0.05) / (dark + 0.05); } // Utilities // Types function useToggleScope(source, fn) { let scope; function start() { scope = vue.effectScope(); scope.run(() => fn.length ? fn(() => { scope?.stop(); start(); }) : fn()); } vue.watch(source, active => { if (active && !scope) { start(); } else if (!active) { scope?.stop(); scope = undefined; } }, { immediate: true }); vue.onScopeDispose(() => { scope?.stop(); }); } // Composables // Types const DefaultsSymbol = Symbol.for('vuetify:defaults'); function createDefaults(options) { return vue.ref(options); } function injectDefaults() { const defaults = vue.inject(DefaultsSymbol); if (!defaults) throw new Error('[Vuetify] Could not find defaults instance'); return defaults; } function provideDefaults(defaults, options) { const injectedDefaults = injectDefaults(); const providedDefaults = vue.ref(defaults); const newDefaults = vue.computed(() => { const disabled = vue.unref(options?.disabled); if (disabled) return injectedDefaults.value; const scoped = vue.unref(options?.scoped); const reset = vue.unref(options?.reset); const root = vue.unref(options?.root); let properties = mergeDeep(providedDefaults.value, { prev: injectedDefaults.value }); if (scoped) return properties; if (reset || root) { const len = Number(reset || Infinity); for (let i = 0; i <= len; i++) { if (!properties || !('prev' in properties)) { break; } properties = properties.prev; } if (properties && typeof root === 'string' && root in properties) { properties = mergeDeep(mergeDeep(properties, { prev: properties }), properties[root]); } return properties; } return properties.prev ? mergeDeep(properties.prev, properties) : properties; }); vue.provide(DefaultsSymbol, newDefaults); return newDefaults; } function propIsDefined(vnode, prop) { return typeof vnode.props?.[prop] !== 'undefined' || typeof vnode.props?.[toKebabCase(prop)] !== 'undefined'; } function internalUseDefaults() { let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; let name = arguments.length > 1 ? arguments[1] : undefined; let defaults = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : injectDefaults(); const vm = getCurrentInstance('useDefaults'); name = name ?? vm.type.name ?? vm.type.__name; if (!name) { throw new Error('[Vuetify] Could not determine component name'); } const componentDefaults = vue.computed(() => defaults.value?.[props._as ?? name]); const _props = new Proxy(props, { get(target, prop) { const propValue = Reflect.get(target, prop); if (prop === 'class' || prop === 'style') { return [componentDefaults.value?.[prop], propValue].filter(v => v != null); } else if (typeof prop === 'string' && !propIsDefined(vm.vnode, prop)) { return componentDefaults.value?.[prop] ?? defaults.value?.global?.[prop] ?? propValue; } return propValue; } }); const _subcomponentDefaults = vue.shallowRef(); vue.watchEffect(() => { if (componentDefaults.value) { const subComponents = Object.entries(componentDefaults.value).filter(_ref => { let [key] = _ref; return key.startsWith(key[0].toUpperCase()); }); if (subComponents.length) _subcomponentDefaults.value = Object.fromEntries(subComponents); } }); function provideSubDefaults() { // If subcomponent defaults are provided, override any // subcomponents provided by the component's setup function. // This uses injectSelf so must be done after the original setup to work. useToggleScope(_subcomponentDefaults, () => { provideDefaults(mergeDeep(injectSelf(DefaultsSymbol)?.value ?? {}, _subcomponentDefaults.value)); }); } return { props: _props, provideSubDefaults }; } function useDefaults() { let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; let name = arguments.length > 1 ? arguments[1] : undefined; const { props: _props, provideSubDefaults } = internalUseDefaults(props, name); provideSubDefaults(); return _props; } // Composables // Types // Implementation function defineComponent(options) { options._setup = options._setup ?? options.setup; if (!options.name) { consoleWarn('The component is missing an explicit name, unable to generate default prop value'); return options; } if (options._setup) { options.props = propsFactory(options.props ?? {}, options.name)(); const propKeys = Object.keys(options.props); options.filterProps = function filterProps(props) { return pick(props, propKeys, ['class', 'style']); }; options.props._as = String; options.setup = function setup(props, ctx) { const defaults = injectDefaults(); // Skip props proxy if defaults are not provided if (!defaults.value) return options._setup(props, ctx); const { props: _props, provideSubDefaults } = internalUseDefaults(props, props._as ?? options.name, defaults); const setupBindings = options._setup(_props, ctx); provideSubDefaults(); return setupBindings; }; } return options; } // Implementation function genericComponent() { let exposeDefaults = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; return options => (exposeDefaults ? defineComponent : vue.defineComponent)(options); } // Composables function createSimpleFunctional(klass) { let tag = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'div'; let name = arguments.length > 2 ? arguments[2] : undefined; return genericComponent()({ name: name ?? vue.capitalize(vue.camelize(klass.replace(/__/g, '-'))), props: { tag: { type: String, default: tag }, ...makeComponentProps() }, setup(props, _ref) { let { slots } = _ref; return () => { return vue.h(props.tag, { class: [klass, props.class], style: props.style }, slots.default?.()); }; } }); } /** * Returns: * - 'null' if the node is not attached to the DOM * - the root node (HTMLDocument | ShadowRoot) otherwise */ function attachedRoot(node) { /* istanbul ignore next */ if (typeof node.getRootNode !== 'function') { // Shadow DOM not supported (IE11), lets find the root of this node while (node.parentNode) node = node.parentNode; // The root parent is the document if the node is attached to the DOM if (node !== document) return null; return document; } const root = node.getRootNode(); // The composed root node is the document if the node is attached to the DOM if (root !== document && root.getRootNode({ composed: true }) !== document) return null; return root; } const standardEasing = 'cubic-bezier(0.4, 0, 0.2, 1)'; const deceleratedEasing = 'cubic-bezier(0.0, 0, 0.2, 1)'; // Entering const acceleratedEasing = 'cubic-bezier(0.4, 0, 1, 1)'; // Leaving // Utilities // Types function getCurrentInstance(name, message) { const vm = vue.getCurrentInstance(); if (!vm) { throw new Error(`[Vuetify] ${name} ${message || 'must be called from inside a setup function'}`); } return vm; } function getCurrentInstanceName() { let name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'composables'; const vm = getCurrentInstance(name).type; return toKebabCase(vm?.aliasName || vm?.name); } let _uid = 0; let _map = new WeakMap(); function getUid() { const vm = getCurrentInstance('getUid'); if (_map.has(vm)) return _map.get(vm);else { const uid = _uid++; _map.set(vm, uid); return uid; } } getUid.reset = () => { _uid = 0; _map = new WeakMap(); }; function getScrollParent(el) { while (el) { if (hasScrollbar(el)) return el; el = el.parentElement; } return document.scrollingElement; } function getScrollParents(el, stopAt) { const elements = []; if (stopAt && el && !stopAt.contains(el)) return elements; while (el) { if (hasScrollbar(el)) elements.push(el); if (el === stopAt) break; el = el.parentElement; } return elements; } function hasScrollbar(el) { if (!el || el.nodeType !== Node.ELEMENT_NODE) return false; const style = window.getComputedStyle(el); return style.overflowY === 'scroll' || style.overflowY === 'auto' && el.scrollHeight > el.clientHeight; } const IN_BROWSER = typeof window !== 'undefined'; const SUPPORTS_INTERSECTION = IN_BROWSER && 'IntersectionObserver' in window; const SUPPORTS_TOUCH = IN_BROWSER && ('ontouchstart' in window || window.navigator.maxTouchPoints > 0); const SUPPORTS_FOCUS_VISIBLE = IN_BROWSER && typeof CSS !== 'undefined' && typeof CSS.supports !== 'undefined' && CSS.supports('selector(:focus-visible)'); // Utilities // Types function injectSelf(key) { const { provides } = getCurrentInstance('injectSelf'); if (provides && key in provides) { // TS doesn't allow symbol as index type return provides[key]; } } function isFixedPosition(el) { while (el) { if (window.getComputedStyle(el).position === 'fixed') { return true; } el = el.offsetParent; } return false; } // Utilities // Types function useRender(render) { const vm = getCurrentInstance('useRender'); vm.render = render; } // Utilities // Types function useResizeObserver(callback) { const resizeRef = vue.ref(); const contentRect = vue.ref(); if (IN_BROWSER) { const observer = new ResizeObserver(entries => { callback?.(entries, observer); if (!entries.length) return; contentRect.value = entries[0].contentRect; }); vue.onBeforeUnmount(() => { observer.disconnect(); }); vue.watch(resizeRef, (newValue, oldValue) => { if (oldValue) { observer.unobserve(refElement(oldValue)); contentRect.value = undefined; } if (newValue) observer.observe(refElement(newValue)); }, { flush: 'post' }); } return { resizeRef, contentRect: vue.readonly(contentRect) }; } // Composables // Types const VuetifyLayoutKey = Symbol.for('vuetify:layout'); const VuetifyLayoutItemKey = Symbol.for('vuetify:layout-item'); const ROOT_ZINDEX = 1000; const makeLayoutProps = propsFactory({ overlaps: { type: Array, default: () => [] }, fullHeight: Boolean }, 'layout'); // Composables const makeLayoutItemProps = propsFactory({ name: { type: String }, order: { type: [Number, String], default: 0 }, absolute: Boolean }, 'layout-item'); function useLayout() { const layout = vue.inject(VuetifyLayoutKey); if (!layout) throw new Error('[Vuetify] Could not find injected layout'); return { getLayoutItem: layout.getLayoutItem, mainRect: layout.mainRect, mainStyles: layout.mainStyles }; } function useLayoutItem(options) { const layout = vue.inject(VuetifyLayoutKey); if (!layout) throw new Error('[Vuetify] Could not find injected layout'); const id = options.id ?? `layout-item-${getUid()}`; const vm = getCurrentInstance('useLayoutItem'); vue.provide(VuetifyLayoutItemKey, { id }); const isKeptAlive = vue.shallowRef(false); vue.onDeactivated(() => isKeptAlive.value = true); vue.onActivated(() => isKeptAlive.value = false); const { layoutItemStyles, layoutItemScrimStyles } = layout.register(vm, { ...options, active: vue.computed(() => isKeptAlive.value ? false : options.active.value), id }); vue.onBeforeUnmount(() => layout.unregister(id)); return { layoutItemStyles, layoutRect: layout.layoutRect, layoutItemScrimStyles }; } const generateLayers = (layout, positions, layoutSizes, activeItems) => { let previousLayer = { top: 0, left: 0, right: 0, bottom: 0 }; const layers = [{ id: '', layer: { ...previousLayer } }]; for (const id of layout) { const position = positions.get(id); const amount = layoutSizes.get(id); const active = activeItems.get(id); if (!position || !amount || !active) continue; const layer = { ...previousLayer, [position.value]: parseInt(previousLayer[position.value], 10) + (active.value ? parseInt(amount.value, 10) : 0) }; layers.push({ id, layer }); previousLayer = layer; } return layers; }; function createLayout(props) { const parentLayout = vue.inject(VuetifyLayoutKey, null); const rootZIndex = vue.computed(() => parentLayout ? parentLayout.rootZIndex.value - 100 : ROOT_ZINDEX); const registered = vue.ref([]); const positions = vue.reactive(new Map()); const layoutSizes = vue.reactive(new Map()); const priorities = vue.reactive(new Map()); const activeItems = vue.reactive(new Map()); const disabledTransitions = vue.reactive(new Map()); const { resizeRef, contentRect: layoutRect } = useResizeObserver(); const computedOverlaps = vue.computed(() => { const map = new Map(); const overlaps = props.overlaps ?? []; for (const overlap of overlaps.filter(item => item.includes(':'))) { const [top, bottom] = overlap.split(':'); if (!registered.value.includes(top) || !registered.value.includes(bottom)) continue; const topPosition = positions.get(top); const bottomPosition = positions.get(bottom); const topAmount = layoutSizes.get(top); const bottomAmount = layoutSizes.get(bottom); if (!topPosition || !bottomPosition || !topAmount || !bottomAmount) continue; map.set(bottom, { position: topPosition.value, amount: parseInt(topAmount.value, 10) }); map.set(top, { position: bottomPosition.value, amount: -parseInt(bottomAmount.value, 10) }); } return map; }); const layers = vue.computed(() => { const uniquePriorities = [...new Set([...priorities.values()].map(p => p.value))].sort((a, b) => a - b); const layout = []; for (const p of uniquePriorities) { const items = registered.value.filter(id => priorities.get(id)?.value === p); layout.push(...items); } return generateLayers(layout, positions, layoutSizes, activeItems); }); const transitionsEnabled = vue.computed(() => { return !Array.from(disabledTransitions.values()).some(ref => ref.value); }); const mainRect = vue.computed(() => { return layers.value[layers.value.length - 1].layer; }); const mainStyles = vue.computed(() => { return { '--v-layout-left': convertToUnit(mainRect.value.left), '--v-layout-right': convertToUnit(mainRect.value.right), '--v-layout-top': convertToUnit(mainRect.value.top), '--v-layout-bottom': convertToUnit(mainRect.value.bottom), ...(transitionsEnabled.value ? undefined : { transition: 'none' }) }; }); const items = vue.computed(() => { return layers.value.slice(1).map((_ref, index) => { let { id } = _ref; const { layer } = layers.value[index]; const size = layoutSizes.get(id); const position = positions.get(id); return { id, ...layer, size: Number(size.value), position: position.value }; }); }); const getLayoutItem = id => { return items.value.find(item => item.id === id); }; const rootVm = getCurrentInstance('createLayout'); const isMounted = vue.shallowRef(false); vue.onMounted(() => { isMounted.value = true; }); vue.provide(VuetifyLayoutKey, { register: (vm, _ref2) => { let { id, order, position, layoutSize, elementSize, active, disableTransitions, absolute } = _ref2; priorities.set(id, order); positions.set(id, position); layoutSizes.set(id, layoutSize); activeItems.set(id, active); disableTransitions && disabledTransitions.set(id, disableTransitions); const instances = findChildrenWithProvide(VuetifyLayoutItemKey, rootVm?.vnode); const instanceIndex = instances.indexOf(vm); if (instanceIndex > -1) registered.value.splice(instanceIndex, 0, id);else registered.value.push(id); const index = vue.computed(() => items.value.findIndex(i => i.id === id)); const zIndex = vue.computed(() => rootZIndex.value + layers.value.length * 2 - index.value * 2); const layoutItemStyles = vue.computed(() => { const isHorizontal = position.value === 'left' || position.value === 'right'; const isOppositeHorizontal = position.value === 'right'; const isOppositeVertical = position.value === 'bottom'; const styles = { [position.value]: 0, zIndex: zIndex.value, transform: `translate${isHorizontal ? 'X' : 'Y'}(${(active.value ? 0 : -110) * (isOppositeHorizontal || isOppositeVertical ? -1 : 1)}%)`, position: absolute.value || rootZIndex.value !== ROOT_ZINDEX ? 'absolute' : 'fixed', ...(transitionsEnabled.value ? undefined : { transition: 'none' }) }; if (!isMounted.value) return styles; const item = items.value[index.value]; if (!item) throw new Error(`[Vuetify] Could not find layout item "${id}"`); const overlap = computedOverlaps.value.get(id); if (overlap) { item[overlap.position] += overlap.amount; } return { ...styles, height: isHorizontal ? `calc(100% - ${item.top}px - ${item.bottom}px)` : elementSize.value ? `${elementSize.value}px` : undefined, left: isOppositeHorizontal ? undefined : `${item.left}px`, right: isOppositeHorizontal ? `${item.right}px` : undefined, top: position.value !== 'bottom' ? `${item.top}px` : undefined, bottom: position.value !== 'top' ? `${item.bottom}px` : undefined, width: !isHorizontal ? `calc(100% - ${item.left}px - ${item.right}px)` : elementSize.value ? `${elementSize.value}px` : undefined }; }); const layoutItemScrimStyles = vue.computed(() => ({ zIndex: zIndex.value - 1 })); return { layoutItemStyles, layoutItemScrimStyles, zIndex }; }, unregister: id => { priorities.delete(id); positions.delete(id); layoutSizes.delete(id); activeItems.delete(id); disabledTransitions.delete(id); registered.value = registered.value.filter(v => v !== id); }, mainRect, mainStyles, getLayoutItem, items, layoutRect, rootZIndex }); const layoutClasses = vue.computed(() => ['v-layout', { 'v-layout--full-height': props.fullHeight }]); const layoutStyles = vue.computed(() => ({ zIndex: rootZIndex.value, position: parentLayout ? 'relative' : undefined, overflow: parentLayout ? 'hidden' : undefined })); return { layoutClasses, layoutStyles, getLayoutItem, items, layoutRect, layoutRef: resizeRef }; } var en = { badge: 'Badge', close: 'Close', dataIterator: { noResultsText: 'No matching records found', loadingText: 'Loading items...' }, dataTable: { itemsPerPageText: 'Rows per page:', ariaLabel: { sortDescending: 'Sorted descending.', sortAscending: 'Sorted ascending.', sortNone: 'Not sorted.', activateNone: 'Activate t