From 492a8c63dc8d3d6b7c903644b596bded0e9eed4a Mon Sep 17 00:00:00 2001 From: jxxghp Date: Thu, 29 May 2025 19:50:30 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E5=8E=BB=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dist/assets/index-B8APBpoy.css | 458 - .../dist/assets/index-Bff29tuV.js | 24938 ---------------- 2 files changed, 25396 deletions(-) delete mode 100644 plugins.v2/clashruleprovider/dist/assets/index-B8APBpoy.css delete mode 100644 plugins.v2/clashruleprovider/dist/assets/index-Bff29tuV.js diff --git a/plugins.v2/clashruleprovider/dist/assets/index-B8APBpoy.css b/plugins.v2/clashruleprovider/dist/assets/index-B8APBpoy.css deleted file mode 100644 index 7397ecf..0000000 --- a/plugins.v2/clashruleprovider/dist/assets/index-B8APBpoy.css +++ /dev/null @@ -1,458 +0,0 @@ - -/* 为了使测试应用更美观 */ -.app-container[data-v-422baab7] { - block-size: 100vh; - inline-size: 100vw; -} -.component-preview[data-v-422baab7] { - overflow: hidden; - border: 1px solid #e0e0e0; - border-radius: 8px; -} -@supports not selector(:focus-visible) { -} -@supports not selector(:focus-visible) { -} -@supports selector(:focus-visible) { -}@supports not selector(:focus-visible) { -}@keyframes progress-circular-dash { - 0% { - stroke-dasharray: 1, 200; - stroke-dashoffset: 0px; - } - 50% { - stroke-dasharray: 100, 200; - stroke-dashoffset: -15px; - } - 100% { - stroke-dasharray: 100, 200; - stroke-dashoffset: -124px; - } -} -@keyframes progress-circular-rotate { - 100% { - transform: rotate(270deg); - } -}@media (forced-colors: active) { -} - -@media (forced-colors: active) { -} -@media (forced-colors: active) { -} - -@keyframes indeterminate-ltr { - 0% { - left: -90%; - right: 100%; - } - 60% { - left: -90%; - right: 100%; - } - 100% { - left: 100%; - right: -35%; - } -} -@keyframes indeterminate-rtl { - 0% { - left: 100%; - right: -90%; - } - 60% { - left: 100%; - right: -90%; - } - 100% { - left: -35%; - right: 100%; - } -} -@keyframes indeterminate-short-ltr { - 0% { - left: -200%; - right: 100%; - } - 60% { - left: 107%; - right: -8%; - } - 100% { - left: 107%; - right: -8%; - } -} -@keyframes indeterminate-short-rtl { - 0% { - left: 100%; - right: -200%; - } - 60% { - left: -8%; - right: 107%; - } - 100% { - left: -8%; - right: 107%; - } -} -@keyframes stream { - to { - transform: translateX(var(--v-progress-linear-stream-to)); - } -} -@keyframes progress-linear-stripes { - 0% { - background-position-x: var(--v-progress-linear-height); - } -}@supports not selector(:focus-visible) { -} -@supports not selector(:focus-visible) { -}@supports not selector(:focus-visible) { -} -@supports not selector(:focus-visible) { -} -@supports selector(:focus-visible) { -}/* region BLOCK */ - -/* endregion */ -/* region ELEMENTS */ - -/* endregion *//* region INPUT */ - -/* endregion */ -/* region MODIFIERS */ - -/* endregion */ -/* region ELEMENTS */ - -/* endregion */ -/* region AFFIXES */ -@media (hover: hover) { -} -@media (hover: none) { -} - -/* endregion */ -/* region LABEL */ - -/* endregion */ -/* region OUTLINE */ -@media (hover: hover) { -} - -/* endregion */ -/* region LOADER */ - -/* endregion */ -/* region OVERLAY */ -@media (hover: hover) { -} -@media (hover: hover) { -} -@media (hover: hover) { -} - -/* endregion */ -/* region MODIFIERS */ - -/* endregion */.bottom-sheet-transition-enter-from { - transform: translateY(100%); -} -.bottom-sheet-transition-leave-to { - transform: translateY(100%); -} -@media (min-width: 600px) { -}@supports not selector(:focus-visible) { -} -@supports not selector(:focus-visible) { -}@media (forced-colors: active) { -} - -@media (hover: hover) { -}@media (forced-colors: active) { -} -@media (forced-colors: active) { -} -@media (forced-colors: active) { -}@media (min-width: 960px) { -} -@media (min-width: 1280px) { -} -@media (min-width: 1920px) { -} -@media (min-width: 2560px) { -} - -.offset-1 { - margin-inline-start: 8.3333333333%; -} - -.offset-2 { - margin-inline-start: 16.6666666667%; -} - -.offset-3 { - margin-inline-start: 25%; -} - -.offset-4 { - margin-inline-start: 33.3333333333%; -} - -.offset-5 { - margin-inline-start: 41.6666666667%; -} - -.offset-6 { - margin-inline-start: 50%; -} - -.offset-7 { - margin-inline-start: 58.3333333333%; -} - -.offset-8 { - margin-inline-start: 66.6666666667%; -} - -.offset-9 { - margin-inline-start: 75%; -} - -.offset-10 { - margin-inline-start: 83.3333333333%; -} - -.offset-11 { - margin-inline-start: 91.6666666667%; -} - -@media (min-width: 600px) { - .offset-sm-0 { - margin-inline-start: 0; - } - .offset-sm-1 { - margin-inline-start: 8.3333333333%; - } - .offset-sm-2 { - margin-inline-start: 16.6666666667%; - } - .offset-sm-3 { - margin-inline-start: 25%; - } - .offset-sm-4 { - margin-inline-start: 33.3333333333%; - } - .offset-sm-5 { - margin-inline-start: 41.6666666667%; - } - .offset-sm-6 { - margin-inline-start: 50%; - } - .offset-sm-7 { - margin-inline-start: 58.3333333333%; - } - .offset-sm-8 { - margin-inline-start: 66.6666666667%; - } - .offset-sm-9 { - margin-inline-start: 75%; - } - .offset-sm-10 { - margin-inline-start: 83.3333333333%; - } - .offset-sm-11 { - margin-inline-start: 91.6666666667%; - } -} -@media (min-width: 960px) { - .offset-md-0 { - margin-inline-start: 0; - } - .offset-md-1 { - margin-inline-start: 8.3333333333%; - } - .offset-md-2 { - margin-inline-start: 16.6666666667%; - } - .offset-md-3 { - margin-inline-start: 25%; - } - .offset-md-4 { - margin-inline-start: 33.3333333333%; - } - .offset-md-5 { - margin-inline-start: 41.6666666667%; - } - .offset-md-6 { - margin-inline-start: 50%; - } - .offset-md-7 { - margin-inline-start: 58.3333333333%; - } - .offset-md-8 { - margin-inline-start: 66.6666666667%; - } - .offset-md-9 { - margin-inline-start: 75%; - } - .offset-md-10 { - margin-inline-start: 83.3333333333%; - } - .offset-md-11 { - margin-inline-start: 91.6666666667%; - } -} -@media (min-width: 1280px) { - .offset-lg-0 { - margin-inline-start: 0; - } - .offset-lg-1 { - margin-inline-start: 8.3333333333%; - } - .offset-lg-2 { - margin-inline-start: 16.6666666667%; - } - .offset-lg-3 { - margin-inline-start: 25%; - } - .offset-lg-4 { - margin-inline-start: 33.3333333333%; - } - .offset-lg-5 { - margin-inline-start: 41.6666666667%; - } - .offset-lg-6 { - margin-inline-start: 50%; - } - .offset-lg-7 { - margin-inline-start: 58.3333333333%; - } - .offset-lg-8 { - margin-inline-start: 66.6666666667%; - } - .offset-lg-9 { - margin-inline-start: 75%; - } - .offset-lg-10 { - margin-inline-start: 83.3333333333%; - } - .offset-lg-11 { - margin-inline-start: 91.6666666667%; - } -} -@media (min-width: 1920px) { - .offset-xl-0 { - margin-inline-start: 0; - } - .offset-xl-1 { - margin-inline-start: 8.3333333333%; - } - .offset-xl-2 { - margin-inline-start: 16.6666666667%; - } - .offset-xl-3 { - margin-inline-start: 25%; - } - .offset-xl-4 { - margin-inline-start: 33.3333333333%; - } - .offset-xl-5 { - margin-inline-start: 41.6666666667%; - } - .offset-xl-6 { - margin-inline-start: 50%; - } - .offset-xl-7 { - margin-inline-start: 58.3333333333%; - } - .offset-xl-8 { - margin-inline-start: 66.6666666667%; - } - .offset-xl-9 { - margin-inline-start: 75%; - } - .offset-xl-10 { - margin-inline-start: 83.3333333333%; - } - .offset-xl-11 { - margin-inline-start: 91.6666666667%; - } -} -@media (min-width: 2560px) { - .offset-xxl-0 { - margin-inline-start: 0; - } - .offset-xxl-1 { - margin-inline-start: 8.3333333333%; - } - .offset-xxl-2 { - margin-inline-start: 16.6666666667%; - } - .offset-xxl-3 { - margin-inline-start: 25%; - } - .offset-xxl-4 { - margin-inline-start: 33.3333333333%; - } - .offset-xxl-5 { - margin-inline-start: 41.6666666667%; - } - .offset-xxl-6 { - margin-inline-start: 50%; - } - .offset-xxl-7 { - margin-inline-start: 58.3333333333%; - } - .offset-xxl-8 { - margin-inline-start: 66.6666666667%; - } - .offset-xxl-9 { - margin-inline-start: 75%; - } - .offset-xxl-10 { - margin-inline-start: 83.3333333333%; - } - .offset-xxl-11 { - margin-inline-start: 91.6666666667%; - } -}.date-picker-header-transition-enter-active, -.date-picker-header-reverse-transition-enter-active { - transition-duration: 0.3s; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); -} -.date-picker-header-transition-leave-active, -.date-picker-header-reverse-transition-leave-active { - transition-duration: 0.3s; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); -} - -.date-picker-header-transition-enter-from { - transform: translate(0, 100%); -} -.date-picker-header-transition-leave-to { - opacity: 0; - transform: translate(0, -100%); -} - -.date-picker-header-reverse-transition-enter-from { - transform: translate(0, -100%); -} -.date-picker-header-reverse-transition-leave-to { - opacity: 0; - transform: translate(0, 100%); -}@supports not selector(:focus-visible) { -} -@supports not selector(:focus-visible) { -}@keyframes loading { - 100% { - transform: translateX(100%); - } -}@supports not selector(:focus-visible) { -} -@supports not selector(:focus-visible) { -}@media (forced-colors: active) { -}@media (max-width: 1279.98px) { -}/** Modifiers **/ \ No newline at end of file diff --git a/plugins.v2/clashruleprovider/dist/assets/index-Bff29tuV.js b/plugins.v2/clashruleprovider/dist/assets/index-Bff29tuV.js deleted file mode 100644 index 803a61b..0000000 --- a/plugins.v2/clashruleprovider/dist/assets/index-Bff29tuV.js +++ /dev/null @@ -1,24938 +0,0 @@ -import { importShared } from './__federation_fn_import-JrT3xvdd.js'; -import PageComponent from './__federation_expose_Page-DlQgf7u6.js'; -import ConfigComponent from './__federation_expose_Config-C3BpNVeC.js'; -import _sfc_main$1 from './__federation_expose_Dashboard-BkyO-3pr.js'; -import { _ as _export_sfc } from './_plugin-vue_export-helper-pcqpp-6-.js'; -import { p as propsFactory, i as includes, a as isOn, e as eventName, g as genericComponent, b as getCurrentInstance, c as provideTheme, d as createLayout, u as useRtl, m as makeThemeProps, f as makeLayoutProps, h as provideDefaults, j as convertToUnit, k as destructComputed, l as isCssColor, n as isParsableColor, o as parseColor, q as getForeground, r as getCurrentInstanceName, S as SUPPORTS_INTERSECTION, s as clamp, t as consoleWarn, v as useProxiedModel, w as useToggleScope, x as useLayoutItem, y as makeLayoutItemProps, z as getUid, A as deepEqual, B as wrapInArray, C as findChildrenWithProvide, D as useIcon, I as IconValue, E as flattenFragments, F as useResizeObserver, G as IN_BROWSER, H as hasEvent, J as isObject, K as keyCodes, L as useLocale, M as EventProp, N as filterInputAttrs, O as matchesSelector, P as omit, Q as only, R as useDisplay, T as useGoTo, U as makeDisplayProps, V as focusableChildren, W as consoleError, X as defineComponent, Y as deprecate, Z as getPropertyFromItem, _ as focusChild, $ as defer, a0 as templateRef, a1 as isClickInsideElement, a2 as getNextElement, a3 as pick, a4 as callEvent, a5 as debounce, a6 as ensureValidVNode, a7 as checkPrintable, a8 as noop, a9 as useTheme, aa as pickWithRest, ab as keys, ac as getEventCoordinates, ad as HexToHSV, ae as HSVtoHex, af as HSLtoHSV, ag as HSVtoHSL, ah as RGBtoHSV, ai as HSVtoRGB, aj as has, ak as getDecimals, al as createRange, am as keyValues, an as SUPPORTS_EYE_DROPPER, ao as HSVtoCSS, ap as RGBtoCSS, aq as getContrast, ar as isComposingIgnoreKey, as as getObjectValueByPath, at as isEmpty, au as defineFunctionalComponent, av as breakpoints, aw as useDate, ax as getWeek, ay as humanReadableFileSize, az as provideLocale, aA as useLayout, aB as CircularBuffer, aC as VuetifyLayoutKey, aD as refElement, aE as VClassIcon, aF as VComponentIcon, aG as VLigatureIcon, aH as VSvgIcon } from './date--mM7W7--.js'; - -true&&(function polyfill() { - const relList = document.createElement("link").relList; - if (relList && relList.supports && relList.supports("modulepreload")) { - return; - } - for (const link of document.querySelectorAll('link[rel="modulepreload"]')) { - processPreload(link); - } - new MutationObserver((mutations) => { - for (const mutation of mutations) { - if (mutation.type !== "childList") { - continue; - } - for (const node of mutation.addedNodes) { - if (node.tagName === "LINK" && node.rel === "modulepreload") - processPreload(node); - } - } - }).observe(document, { childList: true, subtree: true }); - function getFetchOpts(link) { - const fetchOpts = {}; - if (link.integrity) fetchOpts.integrity = link.integrity; - if (link.referrerPolicy) fetchOpts.referrerPolicy = link.referrerPolicy; - if (link.crossOrigin === "use-credentials") - fetchOpts.credentials = "include"; - else if (link.crossOrigin === "anonymous") fetchOpts.credentials = "omit"; - else fetchOpts.credentials = "same-origin"; - return fetchOpts; - } - function processPreload(link) { - if (link.ep) - return; - link.ep = true; - const fetchOpts = getFetchOpts(link); - fetch(link.href, fetchOpts); - } -}()); - -const {createTextVNode:_createTextVNode$7,resolveComponent:_resolveComponent,withCtx:_withCtx,createVNode:_createVNode$2h,createElementVNode:_createElementVNode,toDisplayString:_toDisplayString,openBlock:_openBlock,createElementBlock:_createElementBlock} = await importShared('vue'); - - -const _hoisted_1 = { class: "app-container" }; -const _hoisted_2 = { class: "component-preview" }; -const _hoisted_3 = { class: "component-preview" }; -const _hoisted_4 = { class: "component-preview" }; -const _hoisted_5 = { class: "text-white" }; - -const {ref: ref$Q,reactive: reactive$3} = await importShared('vue'); - -// 活动标签页 - -const _sfc_main = { - __name: 'App', - setup(__props) { - -const activeTab = ref$Q('page'); - -// 配置初始值 -const initialConfig = { - name: '测试插件', - description: '这是一个测试配置', - enable_notifications: true, - update_interval: 30, - api_url: 'https://api.example.com', - api_key: 'test_api_key_123', - concurrent_tasks: 2, - tags: ['电影', '测试'], -}; - -// 仪表板配置 -const dashboardConfig = reactive$3({ - id: 'test_plugin', - name: '测试插件', - attrs: { - title: '仪表板示例', - subtitle: '插件数据展示', - border: true, - }, -}); - -// 通知状态 -const snackbar = reactive$3({ - show: false, - text: '', - color: 'success', - timeout: 3000, -}); - -// 显示通知 -function showNotification(text, color = 'success') { - snackbar.text = text; - snackbar.color = color; - snackbar.show = true; -} - -// 处理详情页面操作 -function handleAction() { - showNotification('Page组件触发了action事件'); -} - -// 处理配置保存 -function handleConfigSave(config) { - console.log('配置已保存:', config); - showNotification('配置已保存'); -} - -return (_ctx, _cache) => { - const _component_v_app_bar_title = _resolveComponent("v-app-bar-title"); - const _component_v_app_bar = _resolveComponent("v-app-bar"); - const _component_v_tab = _resolveComponent("v-tab"); - const _component_v_tabs = _resolveComponent("v-tabs"); - const _component_v_window_item = _resolveComponent("v-window-item"); - const _component_v_switch = _resolveComponent("v-switch"); - const _component_v_window = _resolveComponent("v-window"); - const _component_v_container = _resolveComponent("v-container"); - const _component_v_main = _resolveComponent("v-main"); - const _component_v_footer = _resolveComponent("v-footer"); - const _component_v_app = _resolveComponent("v-app"); - const _component_v_btn = _resolveComponent("v-btn"); - const _component_v_snackbar = _resolveComponent("v-snackbar"); - - return (_openBlock(), _createElementBlock("div", _hoisted_1, [ - _createVNode$2h(_component_v_app, null, { - default: _withCtx(() => [ - _createVNode$2h(_component_v_app_bar, { - color: "primary", - app: "" - }, { - default: _withCtx(() => [ - _createVNode$2h(_component_v_app_bar_title, null, { - default: _withCtx(() => _cache[5] || (_cache[5] = [ - _createTextVNode$7("MoviePilot插件组件示例") - ])), - _: 1 - }) - ]), - _: 1 - }), - _createVNode$2h(_component_v_main, null, { - default: _withCtx(() => [ - _createVNode$2h(_component_v_container, null, { - default: _withCtx(() => [ - _createVNode$2h(_component_v_tabs, { - modelValue: activeTab.value, - "onUpdate:modelValue": _cache[0] || (_cache[0] = $event => ((activeTab).value = $event)), - "bg-color": "primary" - }, { - default: _withCtx(() => [ - _createVNode$2h(_component_v_tab, { value: "page" }, { - default: _withCtx(() => _cache[6] || (_cache[6] = [ - _createTextVNode$7("详情页面") - ])), - _: 1 - }), - _createVNode$2h(_component_v_tab, { value: "config" }, { - default: _withCtx(() => _cache[7] || (_cache[7] = [ - _createTextVNode$7("配置页面") - ])), - _: 1 - }), - _createVNode$2h(_component_v_tab, { value: "dashboard" }, { - default: _withCtx(() => _cache[8] || (_cache[8] = [ - _createTextVNode$7("仪表板") - ])), - _: 1 - }) - ]), - _: 1 - }, 8, ["modelValue"]), - _createVNode$2h(_component_v_window, { - modelValue: activeTab.value, - "onUpdate:modelValue": _cache[2] || (_cache[2] = $event => ((activeTab).value = $event)), - class: "mt-4" - }, { - default: _withCtx(() => [ - _createVNode$2h(_component_v_window_item, { value: "page" }, { - default: _withCtx(() => [ - _cache[9] || (_cache[9] = _createElementVNode("h2", { class: "text-h5 mb-4" }, "Page组件", -1)), - _createElementVNode("div", _hoisted_2, [ - _createVNode$2h(PageComponent, { onAction: handleAction }) - ]) - ]), - _: 1 - }), - _createVNode$2h(_component_v_window_item, { value: "config" }, { - default: _withCtx(() => [ - _cache[10] || (_cache[10] = _createElementVNode("h2", { class: "text-h5 mb-4" }, "Config组件", -1)), - _createElementVNode("div", _hoisted_3, [ - _createVNode$2h(ConfigComponent, { - "initial-config": initialConfig, - onSave: handleConfigSave - }) - ]) - ]), - _: 1 - }), - _createVNode$2h(_component_v_window_item, { value: "dashboard" }, { - default: _withCtx(() => [ - _cache[11] || (_cache[11] = _createElementVNode("h2", { class: "text-h5 mb-4" }, "Dashboard组件", -1)), - _createVNode$2h(_component_v_switch, { - modelValue: dashboardConfig.attrs.border, - "onUpdate:modelValue": _cache[1] || (_cache[1] = $event => ((dashboardConfig.attrs.border) = $event)), - label: "显示边框", - color: "primary", - class: "mb-4" - }, null, 8, ["modelValue"]), - _createElementVNode("div", _hoisted_4, [ - _createVNode$2h(_sfc_main$1, { - config: dashboardConfig, - "allow-refresh": true - }, null, 8, ["config"]) - ]) - ]), - _: 1 - }) - ]), - _: 1 - }, 8, ["modelValue"]) - ]), - _: 1 - }) - ]), - _: 1 - }), - _createVNode$2h(_component_v_footer, { - app: "", - color: "primary", - class: "text-center d-flex justify-center" - }, { - default: _withCtx(() => [ - _createElementVNode("span", _hoisted_5, "MoviePilot 模块联邦示例 ©" + _toDisplayString(new Date().getFullYear()), 1) - ]), - _: 1 - }) - ]), - _: 1 - }), - _createVNode$2h(_component_v_snackbar, { - modelValue: snackbar.show, - "onUpdate:modelValue": _cache[4] || (_cache[4] = $event => ((snackbar.show) = $event)), - color: snackbar.color, - timeout: snackbar.timeout - }, { - actions: _withCtx(() => [ - _createVNode$2h(_component_v_btn, { - variant: "text", - onClick: _cache[3] || (_cache[3] = $event => (snackbar.show = false)) - }, { - default: _withCtx(() => _cache[12] || (_cache[12] = [ - _createTextVNode$7(" 关闭 ") - ])), - _: 1 - }) - ]), - default: _withCtx(() => [ - _createTextVNode$7(_toDisplayString(snackbar.text) + " ", 1) - ]), - _: 1 - }, 8, ["modelValue", "color", "timeout"]) - ])) -} -} - -}; -const App = /*#__PURE__*/_export_sfc(_sfc_main, [['__scopeId',"data-v-422baab7"]]); - -// Utilities -// Composables -const makeComponentProps = propsFactory({ - class: [String, Array, Object], - style: { - type: [String, Array, Object], - default: null - } -}, 'component'); - -// 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) - } - }; -} -function getTargetBox(target) { - if (Array.isArray(target)) { - return new Box({ - x: target[0], - y: target[1], - width: 0, - height: 0 - }); - } else { - return target.getBoundingClientRect(); - } -} - -// 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); - } - }); -} - -const {camelize: camelize$1,capitalize: capitalize$3,h: h$5} = await importShared('vue'); -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 ?? capitalize$3(camelize$1(klass.replace(/__/g, '-'))), - props: { - tag: { - type: String, - default: tag - }, - ...makeComponentProps() - }, - setup(props, _ref) { - let { - slots - } = _ref; - return () => { - return h$5(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 -function getPrefixedEventHandlers(attrs, suffix, getData) { - return Object.keys(attrs).filter(key => isOn(key) && key.endsWith(suffix)).reduce((acc, key) => { - acc[key.slice(0, -suffix.length)] = event => attrs[key](event, getData(event)); - return acc; - }, {}); -} - -function getScrollParent(el) { - let includeHidden = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - while (el) { - if (includeHidden ? isPotentiallyScrollable(el) : 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; -} -function isPotentiallyScrollable(el) { - if (!el || el.nodeType !== Node.ELEMENT_NODE) return false; - const style = window.getComputedStyle(el); - return ['scroll', 'auto'].includes(style.overflowY); -} - -function isFixedPosition(el) { - while (el) { - if (window.getComputedStyle(el).position === 'fixed') { - return true; - } - el = el.offsetParent; - } - return false; -} - -// Utilities -function useRender(render) { - const vm = getCurrentInstance('useRender'); - vm.render = render; -} - -const {createVNode:_createVNode$2g} = await importShared('vue'); -const makeVAppProps = propsFactory({ - ...makeComponentProps(), - ...makeLayoutProps({ - fullHeight: true - }), - ...makeThemeProps() -}, 'VApp'); -const VApp = genericComponent()({ - name: 'VApp', - props: makeVAppProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const theme = provideTheme(props); - const { - layoutClasses, - getLayoutItem, - items, - layoutRef - } = createLayout(props); - const { - rtlClasses - } = useRtl(); - useRender(() => _createVNode$2g("div", { - "ref": layoutRef, - "class": ['v-application', theme.themeClasses.value, layoutClasses.value, rtlClasses.value, props.class], - "style": [props.style] - }, [_createVNode$2g("div", { - "class": "v-application__wrap" - }, [slots.default?.()])])); - return { - getLayoutItem, - items, - theme - }; - } -}); - -// Utilities -// Composables -const makeTagProps = propsFactory({ - tag: { - type: String, - default: 'div' - } -}, 'tag'); - -const {createVNode:_createVNode$2f} = await importShared('vue'); -const makeVToolbarTitleProps = propsFactory({ - text: String, - ...makeComponentProps(), - ...makeTagProps() -}, 'VToolbarTitle'); -const VToolbarTitle = genericComponent()({ - name: 'VToolbarTitle', - props: makeVToolbarTitleProps(), - setup(props, _ref) { - let { - slots - } = _ref; - useRender(() => { - const hasText = !!(slots.default || slots.text || props.text); - return _createVNode$2f(props.tag, { - "class": ['v-toolbar-title', props.class], - "style": props.style - }, { - default: () => [hasText && _createVNode$2f("div", { - "class": "v-toolbar-title__placeholder" - }, [slots.text ? slots.text() : props.text, slots.default?.()])] - }); - }); - return {}; - } -}); - -// Utilities -const {h: h$4,Transition: Transition$5,TransitionGroup: TransitionGroup$1} = await importShared('vue'); -const makeTransitionProps$1 = propsFactory({ - disabled: Boolean, - group: Boolean, - hideOnLeave: Boolean, - leaveAbsolute: Boolean, - mode: String, - origin: String -}, 'transition'); -function createCssTransition(name, origin, mode) { - return genericComponent()({ - name, - props: makeTransitionProps$1({ - mode, - origin - }), - setup(props, _ref) { - let { - slots - } = _ref; - const functions = { - onBeforeEnter(el) { - if (props.origin) { - el.style.transformOrigin = props.origin; - } - }, - onLeave(el) { - if (props.leaveAbsolute) { - const { - offsetTop, - offsetLeft, - offsetWidth, - offsetHeight - } = el; - el._transitionInitialStyles = { - position: el.style.position, - top: el.style.top, - left: el.style.left, - width: el.style.width, - height: el.style.height - }; - el.style.position = 'absolute'; - el.style.top = `${offsetTop}px`; - el.style.left = `${offsetLeft}px`; - el.style.width = `${offsetWidth}px`; - el.style.height = `${offsetHeight}px`; - } - if (props.hideOnLeave) { - el.style.setProperty('display', 'none', 'important'); - } - }, - onAfterLeave(el) { - if (props.leaveAbsolute && el?._transitionInitialStyles) { - const { - position, - top, - left, - width, - height - } = el._transitionInitialStyles; - delete el._transitionInitialStyles; - el.style.position = position || ''; - el.style.top = top || ''; - el.style.left = left || ''; - el.style.width = width || ''; - el.style.height = height || ''; - } - } - }; - return () => { - const tag = props.group ? TransitionGroup$1 : Transition$5; - return h$4(tag, { - name: props.disabled ? '' : name, - css: !props.disabled, - ...(props.group ? undefined : { - mode: props.mode - }), - ...(props.disabled ? {} : functions) - }, slots.default); - }; - } - }); -} -function createJavascriptTransition(name, functions) { - let mode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'in-out'; - return genericComponent()({ - name, - props: { - mode: { - type: String, - default: mode - }, - disabled: Boolean, - group: Boolean - }, - setup(props, _ref2) { - let { - slots - } = _ref2; - const tag = props.group ? TransitionGroup$1 : Transition$5; - return () => { - return h$4(tag, { - name: props.disabled ? '' : name, - css: !props.disabled, - // mode: props.mode, // TODO: vuejs/vue-next#3104 - ...(props.disabled ? {} : functions) - }, slots.default); - }; - } - }); -} - -// Utilities -const {camelize} = await importShared('vue'); - -function ExpandTransitionGenerator () { - let expandedParentClass = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; - let x = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - const sizeProperty = x ? 'width' : 'height'; - const offsetProperty = camelize(`offset-${sizeProperty}`); - return { - onBeforeEnter(el) { - el._parent = el.parentNode; - el._initialStyle = { - transition: el.style.transition, - overflow: el.style.overflow, - [sizeProperty]: el.style[sizeProperty] - }; - }, - onEnter(el) { - const initialStyle = el._initialStyle; - el.style.setProperty('transition', 'none', 'important'); - // Hide overflow to account for collapsed margins in the calculated height - el.style.overflow = 'hidden'; - const offset = `${el[offsetProperty]}px`; - el.style[sizeProperty] = '0'; - void el.offsetHeight; // force reflow - - el.style.transition = initialStyle.transition; - if (expandedParentClass && el._parent) { - el._parent.classList.add(expandedParentClass); - } - requestAnimationFrame(() => { - el.style[sizeProperty] = offset; - }); - }, - onAfterEnter: resetStyles, - onEnterCancelled: resetStyles, - onLeave(el) { - el._initialStyle = { - transition: '', - overflow: el.style.overflow, - [sizeProperty]: el.style[sizeProperty] - }; - el.style.overflow = 'hidden'; - el.style[sizeProperty] = `${el[offsetProperty]}px`; - void el.offsetHeight; // force reflow - - requestAnimationFrame(() => el.style[sizeProperty] = '0'); - }, - onAfterLeave, - onLeaveCancelled: onAfterLeave - }; - function onAfterLeave(el) { - if (expandedParentClass && el._parent) { - el._parent.classList.remove(expandedParentClass); - } - resetStyles(el); - } - function resetStyles(el) { - const size = el._initialStyle[sizeProperty]; - el.style.overflow = el._initialStyle.overflow; - if (size != null) el.style[sizeProperty] = size; - delete el._initialStyle; - } -} - -const {createVNode:_createVNode$2e,mergeProps:_mergeProps$12,resolveDirective:_resolveDirective$10} = await importShared('vue'); - -// Utilities -const {Transition: Transition$4} = await importShared('vue'); -const makeVDialogTransitionProps = propsFactory({ - target: [Object, Array] -}, 'v-dialog-transition'); -const VDialogTransition = genericComponent()({ - name: 'VDialogTransition', - props: makeVDialogTransitionProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const functions = { - onBeforeEnter(el) { - el.style.pointerEvents = 'none'; - el.style.visibility = 'hidden'; - }, - async onEnter(el, done) { - await new Promise(resolve => requestAnimationFrame(resolve)); - await new Promise(resolve => requestAnimationFrame(resolve)); - el.style.visibility = ''; - const { - x, - y, - sx, - sy, - speed - } = getDimensions(props.target, el); - const animation = animate(el, [{ - transform: `translate(${x}px, ${y}px) scale(${sx}, ${sy})`, - opacity: 0 - }, {}], { - duration: 225 * speed, - easing: deceleratedEasing - }); - getChildren(el)?.forEach(el => { - animate(el, [{ - opacity: 0 - }, { - opacity: 0, - offset: 0.33 - }, {}], { - duration: 225 * 2 * speed, - easing: standardEasing - }); - }); - animation.finished.then(() => done()); - }, - onAfterEnter(el) { - el.style.removeProperty('pointer-events'); - }, - onBeforeLeave(el) { - el.style.pointerEvents = 'none'; - }, - async onLeave(el, done) { - await new Promise(resolve => requestAnimationFrame(resolve)); - const { - x, - y, - sx, - sy, - speed - } = getDimensions(props.target, el); - const animation = animate(el, [{}, { - transform: `translate(${x}px, ${y}px) scale(${sx}, ${sy})`, - opacity: 0 - }], { - duration: 125 * speed, - easing: acceleratedEasing - }); - animation.finished.then(() => done()); - getChildren(el)?.forEach(el => { - animate(el, [{}, { - opacity: 0, - offset: 0.2 - }, { - opacity: 0 - }], { - duration: 125 * 2 * speed, - easing: standardEasing - }); - }); - }, - onAfterLeave(el) { - el.style.removeProperty('pointer-events'); - } - }; - return () => { - return props.target ? _createVNode$2e(Transition$4, _mergeProps$12({ - "name": "dialog-transition" - }, functions, { - "css": false - }), slots) : _createVNode$2e(Transition$4, { - "name": "dialog-transition" - }, slots); - }; - } -}); - -/** Animatable children (card, sheet, list) */ -function getChildren(el) { - const els = el.querySelector(':scope > .v-card, :scope > .v-sheet, :scope > .v-list')?.children; - return els && [...els]; -} -function getDimensions(target, el) { - const targetBox = getTargetBox(target); - const elBox = nullifyTransforms(el); - const [originX, originY] = getComputedStyle(el).transformOrigin.split(' ').map(v => parseFloat(v)); - const [anchorSide, anchorOffset] = getComputedStyle(el).getPropertyValue('--v-overlay-anchor-origin').split(' '); - let offsetX = targetBox.left + targetBox.width / 2; - if (anchorSide === 'left' || anchorOffset === 'left') { - offsetX -= targetBox.width / 2; - } else if (anchorSide === 'right' || anchorOffset === 'right') { - offsetX += targetBox.width / 2; - } - let offsetY = targetBox.top + targetBox.height / 2; - if (anchorSide === 'top' || anchorOffset === 'top') { - offsetY -= targetBox.height / 2; - } else if (anchorSide === 'bottom' || anchorOffset === 'bottom') { - offsetY += targetBox.height / 2; - } - const tsx = targetBox.width / elBox.width; - const tsy = targetBox.height / elBox.height; - const maxs = Math.max(1, tsx, tsy); - const sx = tsx / maxs || 0; - const sy = tsy / maxs || 0; - - // Animate elements larger than 12% of the screen area up to 1.5x slower - const asa = elBox.width * elBox.height / (window.innerWidth * window.innerHeight); - const speed = asa > 0.12 ? Math.min(1.5, (asa - 0.12) * 10 + 1) : 1; - return { - x: offsetX - (originX + elBox.left), - y: offsetY - (originY + elBox.top), - sx, - sy, - speed - }; -} - -const VFabTransition = createCssTransition('fab-transition', 'center center', 'out-in'); - -// Generic transitions -const VDialogBottomTransition = createCssTransition('dialog-bottom-transition'); -const VDialogTopTransition = createCssTransition('dialog-top-transition'); -const VFadeTransition = createCssTransition('fade-transition'); -const VScaleTransition = createCssTransition('scale-transition'); -const VScrollXTransition = createCssTransition('scroll-x-transition'); -const VScrollXReverseTransition = createCssTransition('scroll-x-reverse-transition'); -const VScrollYTransition = createCssTransition('scroll-y-transition'); -const VScrollYReverseTransition = createCssTransition('scroll-y-reverse-transition'); -const VSlideXTransition = createCssTransition('slide-x-transition'); -const VSlideXReverseTransition = createCssTransition('slide-x-reverse-transition'); -const VSlideYTransition = createCssTransition('slide-y-transition'); -const VSlideYReverseTransition = createCssTransition('slide-y-reverse-transition'); - -// Javascript transitions -const VExpandTransition = createJavascriptTransition('expand-transition', ExpandTransitionGenerator()); -const VExpandXTransition = createJavascriptTransition('expand-x-transition', ExpandTransitionGenerator('', true)); - -const {toRefs: toRefs$4} = await importShared('vue'); -const makeVDefaultsProviderProps = propsFactory({ - defaults: Object, - disabled: Boolean, - reset: [Number, String], - root: [Boolean, String], - scoped: Boolean -}, 'VDefaultsProvider'); -const VDefaultsProvider = genericComponent(false)({ - name: 'VDefaultsProvider', - props: makeVDefaultsProviderProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - defaults, - disabled, - reset, - root, - scoped - } = toRefs$4(props); - provideDefaults(defaults, { - reset, - root, - scoped, - disabled - }); - return () => slots.default?.(); - } -}); - -// Utilities -const {computed: computed$1Z} = await importShared('vue'); -// Composables -const makeDimensionProps = propsFactory({ - height: [Number, String], - maxHeight: [Number, String], - maxWidth: [Number, String], - minHeight: [Number, String], - minWidth: [Number, String], - width: [Number, String] -}, 'dimension'); -function useDimension(props) { - const dimensionStyles = computed$1Z(() => { - const styles = {}; - const height = convertToUnit(props.height); - const maxHeight = convertToUnit(props.maxHeight); - const maxWidth = convertToUnit(props.maxWidth); - const minHeight = convertToUnit(props.minHeight); - const minWidth = convertToUnit(props.minWidth); - const width = convertToUnit(props.width); - if (height != null) styles.height = height; - if (maxHeight != null) styles.maxHeight = maxHeight; - if (maxWidth != null) styles.maxWidth = maxWidth; - if (minHeight != null) styles.minHeight = minHeight; - if (minWidth != null) styles.minWidth = minWidth; - if (width != null) styles.width = width; - return styles; - }); - return { - dimensionStyles - }; -} - -const {createVNode:_createVNode$2d} = await importShared('vue'); -const {computed: computed$1Y} = await importShared('vue'); -function useAspectStyles(props) { - return { - aspectStyles: computed$1Y(() => { - const ratio = Number(props.aspectRatio); - return ratio ? { - paddingBottom: String(1 / ratio * 100) + '%' - } : undefined; - }) - }; -} -const makeVResponsiveProps = propsFactory({ - aspectRatio: [String, Number], - contentClass: null, - inline: Boolean, - ...makeComponentProps(), - ...makeDimensionProps() -}, 'VResponsive'); -const VResponsive = genericComponent()({ - name: 'VResponsive', - props: makeVResponsiveProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - aspectStyles - } = useAspectStyles(props); - const { - dimensionStyles - } = useDimension(props); - useRender(() => _createVNode$2d("div", { - "class": ['v-responsive', { - 'v-responsive--inline': props.inline - }, props.class], - "style": [dimensionStyles.value, props.style] - }, [_createVNode$2d("div", { - "class": "v-responsive__sizer", - "style": aspectStyles.value - }, null), slots.additional?.(), slots.default && _createVNode$2d("div", { - "class": ['v-responsive__content', props.contentClass] - }, [slots.default()])])); - return {}; - } -}); - -// Utilities -const {computed: computed$1X,isRef: isRef$3} = await importShared('vue'); -// Composables -function useColor(colors) { - return destructComputed(() => { - const classes = []; - const styles = {}; - if (colors.value.background) { - if (isCssColor(colors.value.background)) { - styles.backgroundColor = colors.value.background; - if (!colors.value.text && isParsableColor(colors.value.background)) { - const backgroundColor = parseColor(colors.value.background); - if (backgroundColor.a == null || backgroundColor.a === 1) { - const textColor = getForeground(backgroundColor); - styles.color = textColor; - styles.caretColor = textColor; - } - } - } else { - classes.push(`bg-${colors.value.background}`); - } - } - if (colors.value.text) { - if (isCssColor(colors.value.text)) { - styles.color = colors.value.text; - styles.caretColor = colors.value.text; - } else { - classes.push(`text-${colors.value.text}`); - } - } - return { - colorClasses: classes, - colorStyles: styles - }; - }); -} -function useTextColor(props, name) { - const colors = computed$1X(() => ({ - text: isRef$3(props) ? props.value : name ? props[name] : null - })); - const { - colorClasses: textColorClasses, - colorStyles: textColorStyles - } = useColor(colors); - return { - textColorClasses, - textColorStyles - }; -} -function useBackgroundColor(props, name) { - const colors = computed$1X(() => ({ - background: isRef$3(props) ? props.value : name ? props[name] : null - })); - const { - colorClasses: backgroundColorClasses, - colorStyles: backgroundColorStyles - } = useColor(colors); - return { - backgroundColorClasses, - backgroundColorStyles - }; -} - -// Utilities -const {computed: computed$1W,isRef: isRef$2} = await importShared('vue'); -// Composables -const makeRoundedProps = propsFactory({ - rounded: { - type: [Boolean, Number, String], - default: undefined - }, - tile: Boolean -}, 'rounded'); -function useRounded(props) { - let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName(); - const roundedClasses = computed$1W(() => { - const rounded = isRef$2(props) ? props.value : props.rounded; - const tile = isRef$2(props) ? props.value : props.tile; - const classes = []; - if (rounded === true || rounded === '') { - classes.push(`${name}--rounded`); - } else if (typeof rounded === 'string' || rounded === 0) { - for (const value of String(rounded).split(' ')) { - classes.push(`rounded-${value}`); - } - } else if (tile || rounded === false) { - classes.push('rounded-0'); - } - return classes; - }); - return { - roundedClasses - }; -} - -// Utilities -const {h: h$3,mergeProps: mergeProps$c,Transition: Transition$3,TransitionGroup} = await importShared('vue'); -const makeTransitionProps = propsFactory({ - transition: { - type: [Boolean, String, Object], - default: 'fade-transition', - validator: val => val !== true - } -}, 'transition'); -const MaybeTransition = (props, _ref) => { - let { - slots - } = _ref; - const { - transition, - disabled, - group, - ...rest - } = props; - const { - component = group ? TransitionGroup : Transition$3, - ...customProps - } = typeof transition === 'object' ? transition : {}; - return h$3(component, mergeProps$c(typeof transition === 'string' ? { - name: disabled ? '' : transition - } : customProps, typeof transition === 'string' ? {} : Object.fromEntries(Object.entries({ - disabled, - group - }).filter(_ref2 => { - let [_, v] = _ref2; - return v !== undefined; - })), rest), slots); -}; - -// Utilities -function mounted$5(el, binding) { - if (!SUPPORTS_INTERSECTION) return; - const modifiers = binding.modifiers || {}; - const value = binding.value; - const { - handler, - options - } = typeof value === 'object' ? value : { - handler: value, - options: {} - }; - const observer = new IntersectionObserver(function () { - let entries = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - let observer = arguments.length > 1 ? arguments[1] : undefined; - const _observe = el._observe?.[binding.instance.$.uid]; - if (!_observe) return; // Just in case, should never fire - - const isIntersecting = entries.some(entry => entry.isIntersecting); - - // If is not quiet or has already been - // initted, invoke the user callback - if (handler && (!modifiers.quiet || _observe.init) && (!modifiers.once || isIntersecting || _observe.init)) { - handler(isIntersecting, entries, observer); - } - if (isIntersecting && modifiers.once) unmounted$5(el, binding);else _observe.init = true; - }, options); - el._observe = Object(el._observe); - el._observe[binding.instance.$.uid] = { - init: false, - observer - }; - observer.observe(el); -} -function unmounted$5(el, binding) { - const observe = el._observe?.[binding.instance.$.uid]; - if (!observe) return; - observe.observer.unobserve(el); - delete el._observe[binding.instance.$.uid]; -} -const Intersect = { - mounted: mounted$5, - unmounted: unmounted$5 -}; - -const {withDirectives:_withDirectives$j,mergeProps:_mergeProps$11,resolveDirective:_resolveDirective$$,Fragment:_Fragment$A,createVNode:_createVNode$2c} = await importShared('vue'); -const {computed: computed$1V,nextTick: nextTick$n,onBeforeMount: onBeforeMount$2,onBeforeUnmount: onBeforeUnmount$b,ref: ref$P,shallowRef: shallowRef$E,toRef: toRef$K,vShow,watch: watch$D,withDirectives: withDirectives$1} = await importShared('vue'); -// not intended for public use, this is passed in by vuetify-loader -const makeVImgProps = propsFactory({ - absolute: Boolean, - alt: String, - cover: Boolean, - color: String, - draggable: { - type: [Boolean, String], - default: undefined - }, - eager: Boolean, - gradient: String, - lazySrc: String, - options: { - type: Object, - // For more information on types, navigate to: - // https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API - default: () => ({ - root: undefined, - rootMargin: undefined, - threshold: undefined - }) - }, - sizes: String, - src: { - type: [String, Object], - default: '' - }, - crossorigin: String, - referrerpolicy: String, - srcset: String, - position: String, - ...makeVResponsiveProps(), - ...makeComponentProps(), - ...makeRoundedProps(), - ...makeTransitionProps() -}, 'VImg'); -const VImg = genericComponent()({ - name: 'VImg', - directives: { - intersect: Intersect - }, - props: makeVImgProps(), - emits: { - loadstart: value => true, - load: value => true, - error: value => true - }, - setup(props, _ref) { - let { - emit, - slots - } = _ref; - const { - backgroundColorClasses, - backgroundColorStyles - } = useBackgroundColor(toRef$K(props, 'color')); - const { - roundedClasses - } = useRounded(props); - const vm = getCurrentInstance('VImg'); - const currentSrc = shallowRef$E(''); // Set from srcset - const image = ref$P(); - const state = shallowRef$E(props.eager ? 'loading' : 'idle'); - const naturalWidth = shallowRef$E(); - const naturalHeight = shallowRef$E(); - const normalisedSrc = computed$1V(() => { - return props.src && typeof props.src === 'object' ? { - src: props.src.src, - srcset: props.srcset || props.src.srcset, - lazySrc: props.lazySrc || props.src.lazySrc, - aspect: Number(props.aspectRatio || props.src.aspect || 0) - } : { - src: props.src, - srcset: props.srcset, - lazySrc: props.lazySrc, - aspect: Number(props.aspectRatio || 0) - }; - }); - const aspectRatio = computed$1V(() => { - return normalisedSrc.value.aspect || naturalWidth.value / naturalHeight.value || 0; - }); - watch$D(() => props.src, () => { - init(state.value !== 'idle'); - }); - watch$D(aspectRatio, (val, oldVal) => { - if (!val && oldVal && image.value) { - pollForSize(image.value); - } - }); - - // TODO: getSrc when window width changes - - onBeforeMount$2(() => init()); - function init(isIntersecting) { - if (props.eager && isIntersecting) return; - if (SUPPORTS_INTERSECTION && !isIntersecting && !props.eager) return; - state.value = 'loading'; - if (normalisedSrc.value.lazySrc) { - const lazyImg = new Image(); - lazyImg.src = normalisedSrc.value.lazySrc; - pollForSize(lazyImg, null); - } - if (!normalisedSrc.value.src) return; - nextTick$n(() => { - emit('loadstart', image.value?.currentSrc || normalisedSrc.value.src); - setTimeout(() => { - if (vm.isUnmounted) return; - if (image.value?.complete) { - if (!image.value.naturalWidth) { - onError(); - } - if (state.value === 'error') return; - if (!aspectRatio.value) pollForSize(image.value, null); - if (state.value === 'loading') onLoad(); - } else { - if (!aspectRatio.value) pollForSize(image.value); - getSrc(); - } - }); - }); - } - function onLoad() { - if (vm.isUnmounted) return; - getSrc(); - pollForSize(image.value); - state.value = 'loaded'; - emit('load', image.value?.currentSrc || normalisedSrc.value.src); - } - function onError() { - if (vm.isUnmounted) return; - state.value = 'error'; - emit('error', image.value?.currentSrc || normalisedSrc.value.src); - } - function getSrc() { - const img = image.value; - if (img) currentSrc.value = img.currentSrc || img.src; - } - let timer = -1; - onBeforeUnmount$b(() => { - clearTimeout(timer); - }); - function pollForSize(img) { - let timeout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100; - const poll = () => { - clearTimeout(timer); - if (vm.isUnmounted) return; - const { - naturalHeight: imgHeight, - naturalWidth: imgWidth - } = img; - if (imgHeight || imgWidth) { - naturalWidth.value = imgWidth; - naturalHeight.value = imgHeight; - } else if (!img.complete && state.value === 'loading' && timeout != null) { - timer = window.setTimeout(poll, timeout); - } else if (img.currentSrc.endsWith('.svg') || img.currentSrc.startsWith('data:image/svg+xml')) { - naturalWidth.value = 1; - naturalHeight.value = 1; - } - }; - poll(); - } - const containClasses = computed$1V(() => ({ - 'v-img__img--cover': props.cover, - 'v-img__img--contain': !props.cover - })); - const __image = () => { - if (!normalisedSrc.value.src || state.value === 'idle') return null; - const img = _createVNode$2c("img", { - "class": ['v-img__img', containClasses.value], - "style": { - objectPosition: props.position - }, - "src": normalisedSrc.value.src, - "srcset": normalisedSrc.value.srcset, - "alt": props.alt, - "crossorigin": props.crossorigin, - "referrerpolicy": props.referrerpolicy, - "draggable": props.draggable, - "sizes": props.sizes, - "ref": image, - "onLoad": onLoad, - "onError": onError - }, null); - const sources = slots.sources?.(); - return _createVNode$2c(MaybeTransition, { - "transition": props.transition, - "appear": true - }, { - default: () => [withDirectives$1(sources ? _createVNode$2c("picture", { - "class": "v-img__picture" - }, [sources, img]) : img, [[vShow, state.value === 'loaded']])] - }); - }; - const __preloadImage = () => _createVNode$2c(MaybeTransition, { - "transition": props.transition - }, { - default: () => [normalisedSrc.value.lazySrc && state.value !== 'loaded' && _createVNode$2c("img", { - "class": ['v-img__img', 'v-img__img--preload', containClasses.value], - "style": { - objectPosition: props.position - }, - "src": normalisedSrc.value.lazySrc, - "alt": props.alt, - "crossorigin": props.crossorigin, - "referrerpolicy": props.referrerpolicy, - "draggable": props.draggable - }, null)] - }); - const __placeholder = () => { - if (!slots.placeholder) return null; - return _createVNode$2c(MaybeTransition, { - "transition": props.transition, - "appear": true - }, { - default: () => [(state.value === 'loading' || state.value === 'error' && !slots.error) && _createVNode$2c("div", { - "class": "v-img__placeholder" - }, [slots.placeholder()])] - }); - }; - const __error = () => { - if (!slots.error) return null; - return _createVNode$2c(MaybeTransition, { - "transition": props.transition, - "appear": true - }, { - default: () => [state.value === 'error' && _createVNode$2c("div", { - "class": "v-img__error" - }, [slots.error()])] - }); - }; - const __gradient = () => { - if (!props.gradient) return null; - return _createVNode$2c("div", { - "class": "v-img__gradient", - "style": { - backgroundImage: `linear-gradient(${props.gradient})` - } - }, null); - }; - const isBooted = shallowRef$E(false); - { - const stop = watch$D(aspectRatio, val => { - if (val) { - // Doesn't work with nextTick, idk why - requestAnimationFrame(() => { - requestAnimationFrame(() => { - isBooted.value = true; - }); - }); - stop(); - } - }); - } - useRender(() => { - const responsiveProps = VResponsive.filterProps(props); - return _withDirectives$j(_createVNode$2c(VResponsive, _mergeProps$11({ - "class": ['v-img', { - 'v-img--absolute': props.absolute, - 'v-img--booting': !isBooted.value - }, backgroundColorClasses.value, roundedClasses.value, props.class], - "style": [{ - width: convertToUnit(props.width === 'auto' ? naturalWidth.value : props.width) - }, backgroundColorStyles.value, props.style] - }, responsiveProps, { - "aspectRatio": aspectRatio.value, - "aria-label": props.alt, - "role": props.alt ? 'img' : undefined - }), { - additional: () => _createVNode$2c(_Fragment$A, null, [_createVNode$2c(__image, null, null), _createVNode$2c(__preloadImage, null, null), _createVNode$2c(__gradient, null, null), _createVNode$2c(__placeholder, null, null), _createVNode$2c(__error, null, null)]), - default: slots.default - }), [[_resolveDirective$$("intersect"), { - handler: init, - options: props.options - }, null, { - once: true - }]]); - }); - return { - currentSrc, - image, - state, - naturalWidth, - naturalHeight - }; - } -}); - -// Utilities -const {computed: computed$1U,isRef: isRef$1} = await importShared('vue'); -// Composables -const makeBorderProps = propsFactory({ - border: [Boolean, Number, String] -}, 'border'); -function useBorder(props) { - let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName(); - const borderClasses = computed$1U(() => { - const border = isRef$1(props) ? props.value : props.border; - const classes = []; - if (border === true || border === '') { - classes.push(`${name}--border`); - } else if (typeof border === 'string' || border === 0) { - for (const value of String(border).split(' ')) { - classes.push(`border-${value}`); - } - } - return classes; - }); - return { - borderClasses - }; -} - -// Utilities -const {computed: computed$1T,isRef} = await importShared('vue'); -// Composables -const makeElevationProps = propsFactory({ - elevation: { - type: [Number, String], - validator(v) { - const value = parseInt(v); - return !isNaN(value) && value >= 0 && - // Material Design has a maximum elevation of 24 - // https://material.io/design/environment/elevation.html#default-elevations - value <= 24; - } - } -}, 'elevation'); -function useElevation(props) { - const elevationClasses = computed$1T(() => { - const elevation = isRef(props) ? props.value : props.elevation; - const classes = []; - if (elevation == null) return classes; - classes.push(`elevation-${elevation}`); - return classes; - }); - return { - elevationClasses - }; -} - -const {resolveDirective:_resolveDirective$_,createVNode:_createVNode$2b} = await importShared('vue'); -const {computed: computed$1S,shallowRef: shallowRef$D,toRef: toRef$J} = await importShared('vue'); -const allowedDensities$1 = [null, 'prominent', 'default', 'comfortable', 'compact']; -const makeVToolbarProps = propsFactory({ - absolute: Boolean, - collapse: Boolean, - color: String, - density: { - type: String, - default: 'default', - validator: v => allowedDensities$1.includes(v) - }, - extended: Boolean, - extensionHeight: { - type: [Number, String], - default: 48 - }, - flat: Boolean, - floating: Boolean, - height: { - type: [Number, String], - default: 64 - }, - image: String, - title: String, - ...makeBorderProps(), - ...makeComponentProps(), - ...makeElevationProps(), - ...makeRoundedProps(), - ...makeTagProps({ - tag: 'header' - }), - ...makeThemeProps() -}, 'VToolbar'); -const VToolbar = genericComponent()({ - name: 'VToolbar', - props: makeVToolbarProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - backgroundColorClasses, - backgroundColorStyles - } = useBackgroundColor(toRef$J(props, 'color')); - const { - borderClasses - } = useBorder(props); - const { - elevationClasses - } = useElevation(props); - const { - roundedClasses - } = useRounded(props); - const { - themeClasses - } = provideTheme(props); - const { - rtlClasses - } = useRtl(); - const isExtended = shallowRef$D(!!(props.extended || slots.extension?.())); - const contentHeight = computed$1S(() => parseInt(Number(props.height) + (props.density === 'prominent' ? Number(props.height) : 0) - (props.density === 'comfortable' ? 8 : 0) - (props.density === 'compact' ? 16 : 0), 10)); - const extensionHeight = computed$1S(() => isExtended.value ? parseInt(Number(props.extensionHeight) + (props.density === 'prominent' ? Number(props.extensionHeight) : 0) - (props.density === 'comfortable' ? 4 : 0) - (props.density === 'compact' ? 8 : 0), 10) : 0); - provideDefaults({ - VBtn: { - variant: 'text' - } - }); - useRender(() => { - const hasTitle = !!(props.title || slots.title); - const hasImage = !!(slots.image || props.image); - const extension = slots.extension?.(); - isExtended.value = !!(props.extended || extension); - return _createVNode$2b(props.tag, { - "class": ['v-toolbar', { - 'v-toolbar--absolute': props.absolute, - 'v-toolbar--collapse': props.collapse, - 'v-toolbar--flat': props.flat, - 'v-toolbar--floating': props.floating, - [`v-toolbar--density-${props.density}`]: true - }, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value, themeClasses.value, rtlClasses.value, props.class], - "style": [backgroundColorStyles.value, props.style] - }, { - default: () => [hasImage && _createVNode$2b("div", { - "key": "image", - "class": "v-toolbar__image" - }, [!slots.image ? _createVNode$2b(VImg, { - "key": "image-img", - "cover": true, - "src": props.image - }, null) : _createVNode$2b(VDefaultsProvider, { - "key": "image-defaults", - "disabled": !props.image, - "defaults": { - VImg: { - cover: true, - src: props.image - } - } - }, slots.image)]), _createVNode$2b(VDefaultsProvider, { - "defaults": { - VTabs: { - height: convertToUnit(contentHeight.value) - } - } - }, { - default: () => [_createVNode$2b("div", { - "class": "v-toolbar__content", - "style": { - height: convertToUnit(contentHeight.value) - } - }, [slots.prepend && _createVNode$2b("div", { - "class": "v-toolbar__prepend" - }, [slots.prepend?.()]), hasTitle && _createVNode$2b(VToolbarTitle, { - "key": "title", - "text": props.title - }, { - text: slots.title - }), slots.default?.(), slots.append && _createVNode$2b("div", { - "class": "v-toolbar__append" - }, [slots.append?.()])])] - }), _createVNode$2b(VDefaultsProvider, { - "defaults": { - VTabs: { - height: convertToUnit(extensionHeight.value) - } - } - }, { - default: () => [_createVNode$2b(VExpandTransition, null, { - default: () => [isExtended.value && _createVNode$2b("div", { - "class": "v-toolbar__extension", - "style": { - height: convertToUnit(extensionHeight.value) - } - }, [extension])] - })] - })] - }); - }); - return { - contentHeight, - extensionHeight - }; - } -}); - -// Utilities -const {computed: computed$1R,onBeforeUnmount: onBeforeUnmount$a,onMounted: onMounted$d,ref: ref$O,shallowRef: shallowRef$C,watch: watch$C} = await importShared('vue'); -// Composables -const makeScrollProps = propsFactory({ - scrollTarget: { - type: String - }, - scrollThreshold: { - type: [String, Number], - default: 300 - } -}, 'scroll'); -function useScroll(props) { - let args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - const { - canScroll - } = args; - let previousScroll = 0; - let previousScrollHeight = 0; - const target = ref$O(null); - const currentScroll = shallowRef$C(0); - const savedScroll = shallowRef$C(0); - const currentThreshold = shallowRef$C(0); - const isScrollActive = shallowRef$C(false); - const isScrollingUp = shallowRef$C(false); - const scrollThreshold = computed$1R(() => { - return Number(props.scrollThreshold); - }); - - /** - * 1: at top - * 0: at threshold - */ - const scrollRatio = computed$1R(() => { - return clamp((scrollThreshold.value - currentScroll.value) / scrollThreshold.value || 0); - }); - const onScroll = () => { - const targetEl = target.value; - if (!targetEl || canScroll && !canScroll.value) return; - previousScroll = currentScroll.value; - currentScroll.value = 'window' in targetEl ? targetEl.pageYOffset : targetEl.scrollTop; - const currentScrollHeight = targetEl instanceof Window ? document.documentElement.scrollHeight : targetEl.scrollHeight; - if (previousScrollHeight !== currentScrollHeight) { - previousScrollHeight = currentScrollHeight; - return; - } - isScrollingUp.value = currentScroll.value < previousScroll; - currentThreshold.value = Math.abs(currentScroll.value - scrollThreshold.value); - }; - watch$C(isScrollingUp, () => { - savedScroll.value = savedScroll.value || currentScroll.value; - }); - watch$C(isScrollActive, () => { - savedScroll.value = 0; - }); - onMounted$d(() => { - watch$C(() => props.scrollTarget, scrollTarget => { - const newTarget = scrollTarget ? document.querySelector(scrollTarget) : window; - if (!newTarget) { - consoleWarn(`Unable to locate element with identifier ${scrollTarget}`); - return; - } - if (newTarget === target.value) return; - target.value?.removeEventListener('scroll', onScroll); - target.value = newTarget; - target.value.addEventListener('scroll', onScroll, { - passive: true - }); - }, { - immediate: true - }); - }); - onBeforeUnmount$a(() => { - target.value?.removeEventListener('scroll', onScroll); - }); - - // Do we need this? If yes - seems that - // there's no need to expose onScroll - canScroll && watch$C(canScroll, onScroll, { - immediate: true - }); - return { - scrollThreshold, - currentScroll, - currentThreshold, - isScrollActive, - scrollRatio, - // required only for testing - // probably can be removed - // later (2 chars chlng) - isScrollingUp, - savedScroll - }; -} - -// Utilities -const {computed: computed$1Q,onMounted: onMounted$c,readonly: readonly$1,shallowRef: shallowRef$B} = await importShared('vue'); - - -// Composables -function useSsrBoot() { - const isBooted = shallowRef$B(false); - onMounted$c(() => { - window.requestAnimationFrame(() => { - isBooted.value = true; - }); - }); - const ssrBootStyles = computed$1Q(() => !isBooted.value ? { - transition: 'none !important' - } : undefined); - return { - ssrBootStyles, - isBooted: readonly$1(isBooted) - }; -} - -const {createVNode:_createVNode$2a,mergeProps:_mergeProps$10,resolveDirective:_resolveDirective$Z} = await importShared('vue'); -const {computed: computed$1P,ref: ref$N,shallowRef: shallowRef$A,toRef: toRef$I,watchEffect: watchEffect$g} = await importShared('vue'); -const makeVAppBarProps = propsFactory({ - scrollBehavior: String, - modelValue: { - type: Boolean, - default: true - }, - location: { - type: String, - default: 'top', - validator: value => ['top', 'bottom'].includes(value) - }, - ...makeVToolbarProps(), - ...makeLayoutItemProps(), - ...makeScrollProps(), - height: { - type: [Number, String], - default: 64 - } -}, 'VAppBar'); -const VAppBar = genericComponent()({ - name: 'VAppBar', - props: makeVAppBarProps(), - emits: { - 'update:modelValue': value => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const vToolbarRef = ref$N(); - const isActive = useProxiedModel(props, 'modelValue'); - const scrollBehavior = computed$1P(() => { - const behavior = new Set(props.scrollBehavior?.split(' ') ?? []); - return { - hide: behavior.has('hide'), - fullyHide: behavior.has('fully-hide'), - inverted: behavior.has('inverted'), - collapse: behavior.has('collapse'), - elevate: behavior.has('elevate'), - fadeImage: behavior.has('fade-image') - // shrink: behavior.has('shrink'), - }; - }); - const canScroll = computed$1P(() => { - const behavior = scrollBehavior.value; - return behavior.hide || behavior.fullyHide || behavior.inverted || behavior.collapse || behavior.elevate || behavior.fadeImage || - // behavior.shrink || - !isActive.value; - }); - const { - currentScroll, - scrollThreshold, - isScrollingUp, - scrollRatio - } = useScroll(props, { - canScroll - }); - const canHide = computed$1P(() => scrollBehavior.value.hide || scrollBehavior.value.fullyHide); - const isCollapsed = computed$1P(() => props.collapse || scrollBehavior.value.collapse && (scrollBehavior.value.inverted ? scrollRatio.value > 0 : scrollRatio.value === 0)); - const isFlat = computed$1P(() => props.flat || scrollBehavior.value.fullyHide && !isActive.value || scrollBehavior.value.elevate && (scrollBehavior.value.inverted ? currentScroll.value > 0 : currentScroll.value === 0)); - const opacity = computed$1P(() => scrollBehavior.value.fadeImage ? scrollBehavior.value.inverted ? 1 - scrollRatio.value : scrollRatio.value : undefined); - const height = computed$1P(() => { - if (scrollBehavior.value.hide && scrollBehavior.value.inverted) return 0; - const height = vToolbarRef.value?.contentHeight ?? 0; - const extensionHeight = vToolbarRef.value?.extensionHeight ?? 0; - if (!canHide.value) return height + extensionHeight; - return currentScroll.value < scrollThreshold.value || scrollBehavior.value.fullyHide ? height + extensionHeight : height; - }); - useToggleScope(computed$1P(() => !!props.scrollBehavior), () => { - watchEffect$g(() => { - if (canHide.value) { - if (scrollBehavior.value.inverted) { - isActive.value = currentScroll.value > scrollThreshold.value; - } else { - isActive.value = isScrollingUp.value || currentScroll.value < scrollThreshold.value; - } - } else { - isActive.value = true; - } - }); - }); - const { - ssrBootStyles - } = useSsrBoot(); - const { - layoutItemStyles - } = useLayoutItem({ - id: props.name, - order: computed$1P(() => parseInt(props.order, 10)), - position: toRef$I(props, 'location'), - layoutSize: height, - elementSize: shallowRef$A(undefined), - active: isActive, - absolute: toRef$I(props, 'absolute') - }); - useRender(() => { - const toolbarProps = VToolbar.filterProps(props); - return _createVNode$2a(VToolbar, _mergeProps$10({ - "ref": vToolbarRef, - "class": ['v-app-bar', { - 'v-app-bar--bottom': props.location === 'bottom' - }, props.class], - "style": [{ - ...layoutItemStyles.value, - '--v-toolbar-image-opacity': opacity.value, - height: undefined, - ...ssrBootStyles.value - }, props.style] - }, toolbarProps, { - "collapse": isCollapsed.value, - "flat": isFlat.value - }), slots); - }); - return {}; - } -}); - -// Utilities -const {computed: computed$1O} = await importShared('vue'); -const allowedDensities = [null, 'default', 'comfortable', 'compact']; - -// typeof allowedDensities[number] evalutes to any -// when generating api types for whatever reason. - -// Composables -const makeDensityProps = propsFactory({ - density: { - type: String, - default: 'default', - validator: v => allowedDensities.includes(v) - } -}, 'density'); -function useDensity(props) { - let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName(); - const densityClasses = computed$1O(() => { - return `${name}--density-${props.density}`; - }); - return { - densityClasses - }; -} - -const {createVNode:_createVNode$29,Fragment:_Fragment$z} = await importShared('vue'); -const {computed: computed$1N,unref: unref$3} = await importShared('vue'); -const allowedVariants$2 = ['elevated', 'flat', 'tonal', 'outlined', 'text', 'plain']; -function genOverlays(isClickable, name) { - return _createVNode$29(_Fragment$z, null, [isClickable && _createVNode$29("span", { - "key": "overlay", - "class": `${name}__overlay` - }, null), _createVNode$29("span", { - "key": "underlay", - "class": `${name}__underlay` - }, null)]); -} -const makeVariantProps = propsFactory({ - color: String, - variant: { - type: String, - default: 'elevated', - validator: v => allowedVariants$2.includes(v) - } -}, 'variant'); -function useVariant(props) { - let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName(); - const variantClasses = computed$1N(() => { - const { - variant - } = unref$3(props); - return `${name}--variant-${variant}`; - }); - const { - colorClasses, - colorStyles - } = useColor(computed$1N(() => { - const { - variant, - color - } = unref$3(props); - return { - [['elevated', 'flat'].includes(variant) ? 'background' : 'text']: color - }; - })); - return { - colorClasses, - colorStyles, - variantClasses - }; -} - -const {createVNode:_createVNode$28,resolveDirective:_resolveDirective$Y} = await importShared('vue'); -const {toRef: toRef$H} = await importShared('vue'); -const makeVBtnGroupProps = propsFactory({ - baseColor: String, - divided: Boolean, - ...makeBorderProps(), - ...makeComponentProps(), - ...makeDensityProps(), - ...makeElevationProps(), - ...makeRoundedProps(), - ...makeTagProps(), - ...makeThemeProps(), - ...makeVariantProps() -}, 'VBtnGroup'); -const VBtnGroup = genericComponent()({ - name: 'VBtnGroup', - props: makeVBtnGroupProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - themeClasses - } = provideTheme(props); - const { - densityClasses - } = useDensity(props); - const { - borderClasses - } = useBorder(props); - const { - elevationClasses - } = useElevation(props); - const { - roundedClasses - } = useRounded(props); - provideDefaults({ - VBtn: { - height: 'auto', - baseColor: toRef$H(props, 'baseColor'), - color: toRef$H(props, 'color'), - density: toRef$H(props, 'density'), - flat: true, - variant: toRef$H(props, 'variant') - } - }); - useRender(() => { - return _createVNode$28(props.tag, { - "class": ['v-btn-group', { - 'v-btn-group--divided': props.divided - }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class], - "style": props.style - }, slots); - }); - } -}); - -const {computed: computed$1M,inject: inject$l,onBeforeUnmount: onBeforeUnmount$9,onMounted: onMounted$b,onUpdated,provide: provide$g,reactive: reactive$2,toRef: toRef$G,unref: unref$2,watch: watch$B} = await importShared('vue'); -const makeGroupProps = propsFactory({ - modelValue: { - type: null, - default: undefined - }, - multiple: Boolean, - mandatory: [Boolean, String], - max: Number, - selectedClass: String, - disabled: Boolean -}, 'group'); -const makeGroupItemProps = propsFactory({ - value: null, - disabled: Boolean, - selectedClass: String -}, 'group-item'); - -// Composables - -function useGroupItem(props, injectKey) { - let required = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; - const vm = getCurrentInstance('useGroupItem'); - if (!vm) { - throw new Error('[Vuetify] useGroupItem composable must be used inside a component setup function'); - } - const id = getUid(); - provide$g(Symbol.for(`${injectKey.description}:id`), id); - const group = inject$l(injectKey, null); - if (!group) { - if (!required) return group; - throw new Error(`[Vuetify] Could not find useGroup injection with symbol ${injectKey.description}`); - } - const value = toRef$G(props, 'value'); - const disabled = computed$1M(() => !!(group.disabled.value || props.disabled)); - group.register({ - id, - value, - disabled - }, vm); - onBeforeUnmount$9(() => { - group.unregister(id); - }); - const isSelected = computed$1M(() => { - return group.isSelected(id); - }); - const isFirst = computed$1M(() => { - return group.items.value[0].id === id; - }); - const isLast = computed$1M(() => { - return group.items.value[group.items.value.length - 1].id === id; - }); - const selectedClass = computed$1M(() => isSelected.value && [group.selectedClass.value, props.selectedClass]); - watch$B(isSelected, value => { - vm.emit('group:selected', { - value - }); - }, { - flush: 'sync' - }); - return { - id, - isSelected, - isFirst, - isLast, - toggle: () => group.select(id, !isSelected.value), - select: value => group.select(id, value), - selectedClass, - value, - disabled, - group - }; -} -function useGroup(props, injectKey) { - let isUnmounted = false; - const items = reactive$2([]); - const selected = useProxiedModel(props, 'modelValue', [], v => { - if (v == null) return []; - return getIds(items, wrapInArray(v)); - }, v => { - const arr = getValues(items, v); - return props.multiple ? arr : arr[0]; - }); - const groupVm = getCurrentInstance('useGroup'); - function register(item, vm) { - // Is there a better way to fix this typing? - const unwrapped = item; - const key = Symbol.for(`${injectKey.description}:id`); - const children = findChildrenWithProvide(key, groupVm?.vnode); - const index = children.indexOf(vm); - if (unref$2(unwrapped.value) == null) { - unwrapped.value = index; - unwrapped.useIndexAsValue = true; - } - if (index > -1) { - items.splice(index, 0, unwrapped); - } else { - items.push(unwrapped); - } - } - function unregister(id) { - if (isUnmounted) return; - - // TODO: re-evaluate this line's importance in the future - // should we only modify the model if mandatory is set. - // selected.value = selected.value.filter(v => v !== id) - - forceMandatoryValue(); - const index = items.findIndex(item => item.id === id); - items.splice(index, 1); - } - - // If mandatory and nothing is selected, then select first non-disabled item - function forceMandatoryValue() { - const item = items.find(item => !item.disabled); - if (item && props.mandatory === 'force' && !selected.value.length) { - selected.value = [item.id]; - } - } - onMounted$b(() => { - forceMandatoryValue(); - }); - onBeforeUnmount$9(() => { - isUnmounted = true; - }); - onUpdated(() => { - // #19655 update the items that use the index as the value. - for (let i = 0; i < items.length; i++) { - if (items[i].useIndexAsValue) { - items[i].value = i; - } - } - }); - function select(id, value) { - const item = items.find(item => item.id === id); - if (value && item?.disabled) return; - if (props.multiple) { - const internalValue = selected.value.slice(); - const index = internalValue.findIndex(v => v === id); - const isSelected = ~index; - value = value ?? !isSelected; - - // We can't remove value if group is - // mandatory, value already exists, - // and it is the only value - if (isSelected && props.mandatory && internalValue.length <= 1) return; - - // We can't add value if it would - // cause max limit to be exceeded - if (!isSelected && props.max != null && internalValue.length + 1 > props.max) return; - if (index < 0 && value) internalValue.push(id);else if (index >= 0 && !value) internalValue.splice(index, 1); - selected.value = internalValue; - } else { - const isSelected = selected.value.includes(id); - if (props.mandatory && isSelected) return; - selected.value = value ?? !isSelected ? [id] : []; - } - } - function step(offset) { - // getting an offset from selected value obviously won't work with multiple values - if (props.multiple) consoleWarn('This method is not supported when using "multiple" prop'); - if (!selected.value.length) { - const item = items.find(item => !item.disabled); - item && (selected.value = [item.id]); - } else { - const currentId = selected.value[0]; - const currentIndex = items.findIndex(i => i.id === currentId); - let newIndex = (currentIndex + offset) % items.length; - let newItem = items[newIndex]; - while (newItem.disabled && newIndex !== currentIndex) { - newIndex = (newIndex + offset) % items.length; - newItem = items[newIndex]; - } - if (newItem.disabled) return; - selected.value = [items[newIndex].id]; - } - } - const state = { - register, - unregister, - selected, - select, - disabled: toRef$G(props, 'disabled'), - prev: () => step(items.length - 1), - next: () => step(1), - isSelected: id => selected.value.includes(id), - selectedClass: computed$1M(() => props.selectedClass), - items: computed$1M(() => items), - getItemIndex: value => getItemIndex(items, value) - }; - provide$g(injectKey, state); - return state; -} -function getItemIndex(items, value) { - const ids = getIds(items, [value]); - if (!ids.length) return -1; - return items.findIndex(item => item.id === ids[0]); -} -function getIds(items, modelValue) { - const ids = []; - modelValue.forEach(value => { - const item = items.find(item => deepEqual(value, item.value)); - const itemByIndex = items[value]; - if (item?.value != null) { - ids.push(item.id); - } else if (itemByIndex != null) { - ids.push(itemByIndex.id); - } - }); - return ids; -} -function getValues(items, ids) { - const values = []; - ids.forEach(id => { - const itemIndex = items.findIndex(item => item.id === id); - if (~itemIndex) { - const item = items[itemIndex]; - values.push(item.value != null ? item.value : itemIndex); - } - }); - return values; -} - -const {createVNode:_createVNode$27,mergeProps:_mergeProps$$} = await importShared('vue'); -const VBtnToggleSymbol = Symbol.for('vuetify:v-btn-toggle'); -const makeVBtnToggleProps = propsFactory({ - ...makeVBtnGroupProps(), - ...makeGroupProps() -}, 'VBtnToggle'); -const VBtnToggle = genericComponent()({ - name: 'VBtnToggle', - props: makeVBtnToggleProps(), - emits: { - 'update:modelValue': value => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const { - isSelected, - next, - prev, - select, - selected - } = useGroup(props, VBtnToggleSymbol); - useRender(() => { - const btnGroupProps = VBtnGroup.filterProps(props); - return _createVNode$27(VBtnGroup, _mergeProps$$({ - "class": ['v-btn-toggle', props.class] - }, btnGroupProps, { - "style": props.style - }), { - default: () => [slots.default?.({ - isSelected, - next, - prev, - select, - selected - })] - }); - }); - return { - next, - prev, - select - }; - } -}); - -// Utilities -const predefinedSizes = ['x-small', 'small', 'default', 'large', 'x-large']; -// Composables -const makeSizeProps = propsFactory({ - size: { - type: [String, Number], - default: 'default' - } -}, 'size'); -function useSize(props) { - let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName(); - return destructComputed(() => { - let sizeClasses; - let sizeStyles; - if (includes(predefinedSizes, props.size)) { - sizeClasses = `${name}--size-${props.size}`; - } else if (props.size) { - sizeStyles = { - width: convertToUnit(props.size), - height: convertToUnit(props.size) - }; - } - return { - sizeClasses, - sizeStyles - }; - }); -} - -const {createVNode:_createVNode$26} = await importShared('vue'); -const {computed: computed$1L,ref: ref$M,Text,toRef: toRef$F} = await importShared('vue'); -const makeVIconProps = propsFactory({ - color: String, - disabled: Boolean, - start: Boolean, - end: Boolean, - icon: IconValue, - ...makeComponentProps(), - ...makeSizeProps(), - ...makeTagProps({ - tag: 'i' - }), - ...makeThemeProps() -}, 'VIcon'); -const VIcon = genericComponent()({ - name: 'VIcon', - props: makeVIconProps(), - setup(props, _ref) { - let { - attrs, - slots - } = _ref; - const slotIcon = ref$M(); - const { - themeClasses - } = provideTheme(props); - const { - iconData - } = useIcon(computed$1L(() => slotIcon.value || props.icon)); - const { - sizeClasses - } = useSize(props); - const { - textColorClasses, - textColorStyles - } = useTextColor(toRef$F(props, 'color')); - useRender(() => { - const slotValue = slots.default?.(); - if (slotValue) { - slotIcon.value = flattenFragments(slotValue).filter(node => node.type === Text && node.children && typeof node.children === 'string')[0]?.children; - } - const hasClick = !!(attrs.onClick || attrs.onClickOnce); - return _createVNode$26(iconData.value.component, { - "tag": props.tag, - "icon": iconData.value.icon, - "class": ['v-icon', 'notranslate', themeClasses.value, sizeClasses.value, textColorClasses.value, { - 'v-icon--clickable': hasClick, - 'v-icon--disabled': props.disabled, - 'v-icon--start': props.start, - 'v-icon--end': props.end - }, props.class], - "style": [!sizeClasses.value ? { - fontSize: convertToUnit(props.size), - height: convertToUnit(props.size), - width: convertToUnit(props.size) - } : undefined, textColorStyles.value, props.style], - "role": hasClick ? 'button' : undefined, - "aria-hidden": !hasClick, - "tabindex": hasClick ? props.disabled ? -1 : 0 : undefined - }, { - default: () => [slotValue] - }); - }); - return {}; - } -}); - -// Utilities -const {onBeforeUnmount: onBeforeUnmount$8,ref: ref$L,shallowRef: shallowRef$z,watch: watch$A} = await importShared('vue'); -function useIntersectionObserver(callback, options) { - const intersectionRef = ref$L(); - const isIntersecting = shallowRef$z(false); - if (SUPPORTS_INTERSECTION) { - const observer = new IntersectionObserver(entries => { - isIntersecting.value = !!entries.find(entry => entry.isIntersecting); - }, options); - onBeforeUnmount$8(() => { - observer.disconnect(); - }); - watch$A(intersectionRef, (newValue, oldValue) => { - if (oldValue) { - observer.unobserve(oldValue); - isIntersecting.value = false; - } - if (newValue) observer.observe(newValue); - }, { - flush: 'post' - }); - } - return { - intersectionRef, - isIntersecting - }; -} - -const {createVNode:_createVNode$25} = await importShared('vue'); -const {computed: computed$1K,ref: ref$K,toRef: toRef$E,watchEffect: watchEffect$f} = await importShared('vue'); -const makeVProgressCircularProps = propsFactory({ - bgColor: String, - color: String, - indeterminate: [Boolean, String], - modelValue: { - type: [Number, String], - default: 0 - }, - rotate: { - type: [Number, String], - default: 0 - }, - width: { - type: [Number, String], - default: 4 - }, - ...makeComponentProps(), - ...makeSizeProps(), - ...makeTagProps({ - tag: 'div' - }), - ...makeThemeProps() -}, 'VProgressCircular'); -const VProgressCircular = genericComponent()({ - name: 'VProgressCircular', - props: makeVProgressCircularProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const MAGIC_RADIUS_CONSTANT = 20; - const CIRCUMFERENCE = 2 * Math.PI * MAGIC_RADIUS_CONSTANT; - const root = ref$K(); - const { - themeClasses - } = provideTheme(props); - const { - sizeClasses, - sizeStyles - } = useSize(props); - const { - textColorClasses, - textColorStyles - } = useTextColor(toRef$E(props, 'color')); - const { - textColorClasses: underlayColorClasses, - textColorStyles: underlayColorStyles - } = useTextColor(toRef$E(props, 'bgColor')); - const { - intersectionRef, - isIntersecting - } = useIntersectionObserver(); - const { - resizeRef, - contentRect - } = useResizeObserver(); - const normalizedValue = computed$1K(() => Math.max(0, Math.min(100, parseFloat(props.modelValue)))); - const width = computed$1K(() => Number(props.width)); - const size = computed$1K(() => { - // Get size from element if size prop value is small, large etc - return sizeStyles.value ? Number(props.size) : contentRect.value ? contentRect.value.width : Math.max(width.value, 32); - }); - const diameter = computed$1K(() => MAGIC_RADIUS_CONSTANT / (1 - width.value / size.value) * 2); - const strokeWidth = computed$1K(() => width.value / size.value * diameter.value); - const strokeDashOffset = computed$1K(() => convertToUnit((100 - normalizedValue.value) / 100 * CIRCUMFERENCE)); - watchEffect$f(() => { - intersectionRef.value = root.value; - resizeRef.value = root.value; - }); - useRender(() => _createVNode$25(props.tag, { - "ref": root, - "class": ['v-progress-circular', { - 'v-progress-circular--indeterminate': !!props.indeterminate, - 'v-progress-circular--visible': isIntersecting.value, - 'v-progress-circular--disable-shrink': props.indeterminate === 'disable-shrink' - }, themeClasses.value, sizeClasses.value, textColorClasses.value, props.class], - "style": [sizeStyles.value, textColorStyles.value, props.style], - "role": "progressbar", - "aria-valuemin": "0", - "aria-valuemax": "100", - "aria-valuenow": props.indeterminate ? undefined : normalizedValue.value - }, { - default: () => [_createVNode$25("svg", { - "style": { - transform: `rotate(calc(-90deg + ${Number(props.rotate)}deg))` - }, - "xmlns": "http://www.w3.org/2000/svg", - "viewBox": `0 0 ${diameter.value} ${diameter.value}` - }, [_createVNode$25("circle", { - "class": ['v-progress-circular__underlay', underlayColorClasses.value], - "style": underlayColorStyles.value, - "fill": "transparent", - "cx": "50%", - "cy": "50%", - "r": MAGIC_RADIUS_CONSTANT, - "stroke-width": strokeWidth.value, - "stroke-dasharray": CIRCUMFERENCE, - "stroke-dashoffset": 0 - }, null), _createVNode$25("circle", { - "class": "v-progress-circular__overlay", - "fill": "transparent", - "cx": "50%", - "cy": "50%", - "r": MAGIC_RADIUS_CONSTANT, - "stroke-width": strokeWidth.value, - "stroke-dasharray": CIRCUMFERENCE, - "stroke-dashoffset": strokeDashOffset.value - }, null)]), slots.default && _createVNode$25("div", { - "class": "v-progress-circular__content" - }, [slots.default({ - value: normalizedValue.value - })])] - })); - return {}; - } -}); - -const {computed: computed$1J} = await importShared('vue'); -const oppositeMap = { - center: 'center', - top: 'bottom', - bottom: 'top', - left: 'right', - right: 'left' -}; -const makeLocationProps = propsFactory({ - location: String -}, 'location'); -function useLocation(props) { - let opposite = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - let offset = arguments.length > 2 ? arguments[2] : undefined; - const { - isRtl - } = useRtl(); - const locationStyles = computed$1J(() => { - if (!props.location) return {}; - const { - side, - align - } = parseAnchor(props.location.split(' ').length > 1 ? props.location : `${props.location} center`, isRtl.value); - function getOffset(side) { - return offset ? offset(side) : 0; - } - const styles = {}; - if (side !== 'center') { - if (opposite) styles[oppositeMap[side]] = `calc(100% - ${getOffset(side)}px)`;else styles[side] = 0; - } - if (align !== 'center') { - if (opposite) styles[oppositeMap[align]] = `calc(100% - ${getOffset(align)}px)`;else styles[align] = 0; - } else { - if (side === 'center') styles.top = styles.left = '50%';else { - styles[{ - top: 'left', - bottom: 'left', - left: 'top', - right: 'top' - }[side]] = '50%'; - } - styles.transform = { - top: 'translateX(-50%)', - bottom: 'translateX(-50%)', - left: 'translateY(-50%)', - right: 'translateY(-50%)', - center: 'translate(-50%, -50%)' - }[side]; - } - return styles; - }); - return { - locationStyles - }; -} - -const {createVNode:_createVNode$24} = await importShared('vue'); -const {computed: computed$1I,Transition: Transition$2} = await importShared('vue'); -const makeVProgressLinearProps = propsFactory({ - absolute: Boolean, - active: { - type: Boolean, - default: true - }, - bgColor: String, - bgOpacity: [Number, String], - bufferValue: { - type: [Number, String], - default: 0 - }, - bufferColor: String, - bufferOpacity: [Number, String], - clickable: Boolean, - color: String, - height: { - type: [Number, String], - default: 4 - }, - indeterminate: Boolean, - max: { - type: [Number, String], - default: 100 - }, - modelValue: { - type: [Number, String], - default: 0 - }, - opacity: [Number, String], - reverse: Boolean, - stream: Boolean, - striped: Boolean, - roundedBar: Boolean, - ...makeComponentProps(), - ...makeLocationProps({ - location: 'top' - }), - ...makeRoundedProps(), - ...makeTagProps(), - ...makeThemeProps() -}, 'VProgressLinear'); -const VProgressLinear = genericComponent()({ - name: 'VProgressLinear', - props: makeVProgressLinearProps(), - emits: { - 'update:modelValue': value => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const progress = useProxiedModel(props, 'modelValue'); - const { - isRtl, - rtlClasses - } = useRtl(); - const { - themeClasses - } = provideTheme(props); - const { - locationStyles - } = useLocation(props); - const { - textColorClasses, - textColorStyles - } = useTextColor(props, 'color'); - const { - backgroundColorClasses, - backgroundColorStyles - } = useBackgroundColor(computed$1I(() => props.bgColor || props.color)); - const { - backgroundColorClasses: bufferColorClasses, - backgroundColorStyles: bufferColorStyles - } = useBackgroundColor(computed$1I(() => props.bufferColor || props.bgColor || props.color)); - const { - backgroundColorClasses: barColorClasses, - backgroundColorStyles: barColorStyles - } = useBackgroundColor(props, 'color'); - const { - roundedClasses - } = useRounded(props); - const { - intersectionRef, - isIntersecting - } = useIntersectionObserver(); - const max = computed$1I(() => parseFloat(props.max)); - const height = computed$1I(() => parseFloat(props.height)); - const normalizedBuffer = computed$1I(() => clamp(parseFloat(props.bufferValue) / max.value * 100, 0, 100)); - const normalizedValue = computed$1I(() => clamp(parseFloat(progress.value) / max.value * 100, 0, 100)); - const isReversed = computed$1I(() => isRtl.value !== props.reverse); - const transition = computed$1I(() => props.indeterminate ? 'fade-transition' : 'slide-x-transition'); - const isForcedColorsModeActive = IN_BROWSER && window.matchMedia?.('(forced-colors: active)').matches; - function handleClick(e) { - if (!intersectionRef.value) return; - const { - left, - right, - width - } = intersectionRef.value.getBoundingClientRect(); - const value = isReversed.value ? width - e.clientX + (right - width) : e.clientX - left; - progress.value = Math.round(value / width * max.value); - } - useRender(() => _createVNode$24(props.tag, { - "ref": intersectionRef, - "class": ['v-progress-linear', { - 'v-progress-linear--absolute': props.absolute, - 'v-progress-linear--active': props.active && isIntersecting.value, - 'v-progress-linear--reverse': isReversed.value, - 'v-progress-linear--rounded': props.rounded, - 'v-progress-linear--rounded-bar': props.roundedBar, - 'v-progress-linear--striped': props.striped - }, roundedClasses.value, themeClasses.value, rtlClasses.value, props.class], - "style": [{ - bottom: props.location === 'bottom' ? 0 : undefined, - top: props.location === 'top' ? 0 : undefined, - height: props.active ? convertToUnit(height.value) : 0, - '--v-progress-linear-height': convertToUnit(height.value), - ...(props.absolute ? locationStyles.value : {}) - }, props.style], - "role": "progressbar", - "aria-hidden": props.active ? 'false' : 'true', - "aria-valuemin": "0", - "aria-valuemax": props.max, - "aria-valuenow": props.indeterminate ? undefined : normalizedValue.value, - "onClick": props.clickable && handleClick - }, { - default: () => [props.stream && _createVNode$24("div", { - "key": "stream", - "class": ['v-progress-linear__stream', textColorClasses.value], - "style": { - ...textColorStyles.value, - [isReversed.value ? 'left' : 'right']: convertToUnit(-height.value), - borderTop: `${convertToUnit(height.value / 2)} dotted`, - opacity: parseFloat(props.bufferOpacity), - top: `calc(50% - ${convertToUnit(height.value / 4)})`, - width: convertToUnit(100 - normalizedBuffer.value, '%'), - '--v-progress-linear-stream-to': convertToUnit(height.value * (isReversed.value ? 1 : -1)) - } - }, null), _createVNode$24("div", { - "class": ['v-progress-linear__background', !isForcedColorsModeActive ? backgroundColorClasses.value : undefined], - "style": [backgroundColorStyles.value, { - opacity: parseFloat(props.bgOpacity), - width: props.stream ? 0 : undefined - }] - }, null), _createVNode$24("div", { - "class": ['v-progress-linear__buffer', !isForcedColorsModeActive ? bufferColorClasses.value : undefined], - "style": [bufferColorStyles.value, { - opacity: parseFloat(props.bufferOpacity), - width: convertToUnit(normalizedBuffer.value, '%') - }] - }, null), _createVNode$24(Transition$2, { - "name": transition.value - }, { - default: () => [!props.indeterminate ? _createVNode$24("div", { - "class": ['v-progress-linear__determinate', !isForcedColorsModeActive ? barColorClasses.value : undefined], - "style": [barColorStyles.value, { - width: convertToUnit(normalizedValue.value, '%') - }] - }, null) : _createVNode$24("div", { - "class": "v-progress-linear__indeterminate" - }, [['long', 'short'].map(bar => _createVNode$24("div", { - "key": bar, - "class": ['v-progress-linear__indeterminate', bar, !isForcedColorsModeActive ? barColorClasses.value : undefined], - "style": barColorStyles.value - }, null))])] - }), slots.default && _createVNode$24("div", { - "class": "v-progress-linear__content" - }, [slots.default({ - value: normalizedValue.value, - buffer: normalizedBuffer.value - })])] - })); - return {}; - } -}); - -const {createVNode:_createVNode$23} = await importShared('vue'); -const {computed: computed$1H} = await importShared('vue'); -// Composables -const makeLoaderProps = propsFactory({ - loading: [Boolean, String] -}, 'loader'); -function useLoader(props) { - let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName(); - const loaderClasses = computed$1H(() => ({ - [`${name}--loading`]: props.loading - })); - return { - loaderClasses - }; -} -function LoaderSlot(props, _ref) { - let { - slots - } = _ref; - return _createVNode$23("div", { - "class": `${props.name}__loader` - }, [slots.default?.({ - color: props.color, - isActive: props.active - }) || _createVNode$23(VProgressLinear, { - "absolute": props.absolute, - "active": props.active, - "color": props.color, - "height": "2", - "indeterminate": true - }, null)]); -} - -// Utilities -const {computed: computed$1G} = await importShared('vue'); -const positionValues = ['static', 'relative', 'fixed', 'absolute', 'sticky']; -// Composables -const makePositionProps = propsFactory({ - position: { - type: String, - validator: /* istanbul ignore next */v => positionValues.includes(v) - } -}, 'position'); -function usePosition(props) { - let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName(); - const positionClasses = computed$1G(() => { - return props.position ? `${name}--${props.position}` : undefined; - }); - return { - positionClasses - }; -} - -// Utilities -const {computed: computed$1F,nextTick: nextTick$m,onScopeDispose: onScopeDispose$9,reactive: reactive$1,resolveDynamicComponent,toRef: toRef$D} = await importShared('vue'); -function useRoute() { - const vm = getCurrentInstance('useRoute'); - return computed$1F(() => vm?.proxy?.$route); -} -function useRouter() { - return getCurrentInstance('useRouter')?.proxy?.$router; -} -function useLink(props, attrs) { - const RouterLink = resolveDynamicComponent('RouterLink'); - const isLink = computed$1F(() => !!(props.href || props.to)); - const isClickable = computed$1F(() => { - return isLink?.value || hasEvent(attrs, 'click') || hasEvent(props, 'click'); - }); - if (typeof RouterLink === 'string' || !('useLink' in RouterLink)) { - const href = toRef$D(props, 'href'); - return { - isLink, - isClickable, - href, - linkProps: reactive$1({ - href - }) - }; - } - // vue-router useLink `to` prop needs to be reactive and useLink will crash if undefined - const linkProps = computed$1F(() => ({ - ...props, - to: toRef$D(() => props.to || '') - })); - const routerLink = RouterLink.useLink(linkProps.value); - // Actual link needs to be undefined when to prop is not used - const link = computed$1F(() => props.to ? routerLink : undefined); - const route = useRoute(); - const isActive = computed$1F(() => { - if (!link.value) return false; - if (!props.exact) return link.value.isActive?.value ?? false; - if (!route.value) return link.value.isExactActive?.value ?? false; - return link.value.isExactActive?.value && deepEqual(link.value.route.value.query, route.value.query); - }); - const href = computed$1F(() => props.to ? link.value?.route.value.href : props.href); - return { - isLink, - isClickable, - isActive, - route: link.value?.route, - navigate: link.value?.navigate, - href, - linkProps: reactive$1({ - href, - 'aria-current': computed$1F(() => isActive.value ? 'page' : undefined) - }) - }; -} -const makeRouterProps = propsFactory({ - href: String, - replace: Boolean, - to: [String, Object], - exact: Boolean -}, 'router'); -let inTransition = false; -function useBackButton(router, cb) { - let popped = false; - let removeBefore; - let removeAfter; - if (IN_BROWSER) { - nextTick$m(() => { - window.addEventListener('popstate', onPopstate); - removeBefore = router?.beforeEach((to, from, next) => { - if (!inTransition) { - setTimeout(() => popped ? cb(next) : next()); - } else { - popped ? cb(next) : next(); - } - inTransition = true; - }); - removeAfter = router?.afterEach(() => { - inTransition = false; - }); - }); - onScopeDispose$9(() => { - window.removeEventListener('popstate', onPopstate); - removeBefore?.(); - removeAfter?.(); - }); - } - function onPopstate(e) { - if (e.state?.replaced) return; - popped = true; - setTimeout(() => popped = false); - } -} - -// Utilities -const {nextTick: nextTick$l,watch: watch$z} = await importShared('vue'); - - -// Types - -function useSelectLink(link, select) { - watch$z(() => link.isActive?.value, isActive => { - if (link.isLink.value && isActive && select) { - nextTick$l(() => { - select(true); - }); - } - }, { - immediate: true - }); -} - -// Styles -const stopSymbol = Symbol('rippleStop'); -const DELAY_RIPPLE = 80; -function transform(el, value) { - el.style.transform = value; - el.style.webkitTransform = value; -} -function isTouchEvent(e) { - return e.constructor.name === 'TouchEvent'; -} -function isKeyboardEvent(e) { - return e.constructor.name === 'KeyboardEvent'; -} -const calculate = function (e, el) { - let value = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - let localX = 0; - let localY = 0; - if (!isKeyboardEvent(e)) { - const offset = el.getBoundingClientRect(); - const target = isTouchEvent(e) ? e.touches[e.touches.length - 1] : e; - localX = target.clientX - offset.left; - localY = target.clientY - offset.top; - } - let radius = 0; - let scale = 0.3; - if (el._ripple?.circle) { - scale = 0.15; - radius = el.clientWidth / 2; - radius = value.center ? radius : radius + Math.sqrt((localX - radius) ** 2 + (localY - radius) ** 2) / 4; - } else { - radius = Math.sqrt(el.clientWidth ** 2 + el.clientHeight ** 2) / 2; - } - const centerX = `${(el.clientWidth - radius * 2) / 2}px`; - const centerY = `${(el.clientHeight - radius * 2) / 2}px`; - const x = value.center ? centerX : `${localX - radius}px`; - const y = value.center ? centerY : `${localY - radius}px`; - return { - radius, - scale, - x, - y, - centerX, - centerY - }; -}; -const ripples = { - /* eslint-disable max-statements */ - show(e, el) { - let value = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - if (!el?._ripple?.enabled) { - return; - } - const container = document.createElement('span'); - const animation = document.createElement('span'); - container.appendChild(animation); - container.className = 'v-ripple__container'; - if (value.class) { - container.className += ` ${value.class}`; - } - const { - radius, - scale, - x, - y, - centerX, - centerY - } = calculate(e, el, value); - const size = `${radius * 2}px`; - animation.className = 'v-ripple__animation'; - animation.style.width = size; - animation.style.height = size; - el.appendChild(container); - const computed = window.getComputedStyle(el); - if (computed && computed.position === 'static') { - el.style.position = 'relative'; - el.dataset.previousPosition = 'static'; - } - animation.classList.add('v-ripple__animation--enter'); - animation.classList.add('v-ripple__animation--visible'); - transform(animation, `translate(${x}, ${y}) scale3d(${scale},${scale},${scale})`); - animation.dataset.activated = String(performance.now()); - setTimeout(() => { - animation.classList.remove('v-ripple__animation--enter'); - animation.classList.add('v-ripple__animation--in'); - transform(animation, `translate(${centerX}, ${centerY}) scale3d(1,1,1)`); - }, 0); - }, - hide(el) { - if (!el?._ripple?.enabled) return; - const ripples = el.getElementsByClassName('v-ripple__animation'); - if (ripples.length === 0) return; - const animation = ripples[ripples.length - 1]; - if (animation.dataset.isHiding) return;else animation.dataset.isHiding = 'true'; - const diff = performance.now() - Number(animation.dataset.activated); - const delay = Math.max(250 - diff, 0); - setTimeout(() => { - animation.classList.remove('v-ripple__animation--in'); - animation.classList.add('v-ripple__animation--out'); - setTimeout(() => { - const ripples = el.getElementsByClassName('v-ripple__animation'); - if (ripples.length === 1 && el.dataset.previousPosition) { - el.style.position = el.dataset.previousPosition; - delete el.dataset.previousPosition; - } - if (animation.parentNode?.parentNode === el) el.removeChild(animation.parentNode); - }, 300); - }, delay); - } -}; -function isRippleEnabled(value) { - return typeof value === 'undefined' || !!value; -} -function rippleShow(e) { - const value = {}; - const element = e.currentTarget; - if (!element?._ripple || element._ripple.touched || e[stopSymbol]) return; - - // Don't allow the event to trigger ripples on any other elements - e[stopSymbol] = true; - if (isTouchEvent(e)) { - element._ripple.touched = true; - element._ripple.isTouch = true; - } else { - // It's possible for touch events to fire - // as mouse events on Android/iOS, this - // will skip the event call if it has - // already been registered as touch - if (element._ripple.isTouch) return; - } - value.center = element._ripple.centered || isKeyboardEvent(e); - if (element._ripple.class) { - value.class = element._ripple.class; - } - if (isTouchEvent(e)) { - // already queued that shows or hides the ripple - if (element._ripple.showTimerCommit) return; - element._ripple.showTimerCommit = () => { - ripples.show(e, element, value); - }; - element._ripple.showTimer = window.setTimeout(() => { - if (element?._ripple?.showTimerCommit) { - element._ripple.showTimerCommit(); - element._ripple.showTimerCommit = null; - } - }, DELAY_RIPPLE); - } else { - ripples.show(e, element, value); - } -} -function rippleStop(e) { - e[stopSymbol] = true; -} -function rippleHide(e) { - const element = e.currentTarget; - if (!element?._ripple) return; - window.clearTimeout(element._ripple.showTimer); - - // The touch interaction occurs before the show timer is triggered. - // We still want to show ripple effect. - if (e.type === 'touchend' && element._ripple.showTimerCommit) { - element._ripple.showTimerCommit(); - element._ripple.showTimerCommit = null; - - // re-queue ripple hiding - element._ripple.showTimer = window.setTimeout(() => { - rippleHide(e); - }); - return; - } - window.setTimeout(() => { - if (element._ripple) { - element._ripple.touched = false; - } - }); - ripples.hide(element); -} -function rippleCancelShow(e) { - const element = e.currentTarget; - if (!element?._ripple) return; - if (element._ripple.showTimerCommit) { - element._ripple.showTimerCommit = null; - } - window.clearTimeout(element._ripple.showTimer); -} -let keyboardRipple = false; -function keyboardRippleShow(e) { - if (!keyboardRipple && (e.keyCode === keyCodes.enter || e.keyCode === keyCodes.space)) { - keyboardRipple = true; - rippleShow(e); - } -} -function keyboardRippleHide(e) { - keyboardRipple = false; - rippleHide(e); -} -function focusRippleHide(e) { - if (keyboardRipple) { - keyboardRipple = false; - rippleHide(e); - } -} -function updateRipple(el, binding, wasEnabled) { - const { - value, - modifiers - } = binding; - const enabled = isRippleEnabled(value); - if (!enabled) { - ripples.hide(el); - } - el._ripple = el._ripple ?? {}; - el._ripple.enabled = enabled; - el._ripple.centered = modifiers.center; - el._ripple.circle = modifiers.circle; - if (isObject(value) && value.class) { - el._ripple.class = value.class; - } - if (enabled && !wasEnabled) { - if (modifiers.stop) { - el.addEventListener('touchstart', rippleStop, { - passive: true - }); - el.addEventListener('mousedown', rippleStop); - return; - } - el.addEventListener('touchstart', rippleShow, { - passive: true - }); - el.addEventListener('touchend', rippleHide, { - passive: true - }); - el.addEventListener('touchmove', rippleCancelShow, { - passive: true - }); - el.addEventListener('touchcancel', rippleHide); - el.addEventListener('mousedown', rippleShow); - el.addEventListener('mouseup', rippleHide); - el.addEventListener('mouseleave', rippleHide); - el.addEventListener('keydown', keyboardRippleShow); - el.addEventListener('keyup', keyboardRippleHide); - el.addEventListener('blur', focusRippleHide); - - // Anchor tags can be dragged, causes other hides to fail - #1537 - el.addEventListener('dragstart', rippleHide, { - passive: true - }); - } else if (!enabled && wasEnabled) { - removeListeners(el); - } -} -function removeListeners(el) { - el.removeEventListener('mousedown', rippleShow); - el.removeEventListener('touchstart', rippleShow); - el.removeEventListener('touchend', rippleHide); - el.removeEventListener('touchmove', rippleCancelShow); - el.removeEventListener('touchcancel', rippleHide); - el.removeEventListener('mouseup', rippleHide); - el.removeEventListener('mouseleave', rippleHide); - el.removeEventListener('keydown', keyboardRippleShow); - el.removeEventListener('keyup', keyboardRippleHide); - el.removeEventListener('dragstart', rippleHide); - el.removeEventListener('blur', focusRippleHide); -} -function mounted$4(el, binding) { - updateRipple(el, binding, false); -} -function unmounted$4(el) { - delete el._ripple; - removeListeners(el); -} -function updated$1(el, binding) { - if (binding.value === binding.oldValue) { - return; - } - const wasEnabled = isRippleEnabled(binding.oldValue); - updateRipple(el, binding, wasEnabled); -} -const Ripple = { - mounted: mounted$4, - unmounted: unmounted$4, - updated: updated$1 -}; - -const {mergeProps:_mergeProps$_,resolveDirective:_resolveDirective$X,createVNode:_createVNode$22} = await importShared('vue'); -const {computed: computed$1E,withDirectives} = await importShared('vue'); -const makeVBtnProps = propsFactory({ - active: { - type: Boolean, - default: undefined - }, - activeColor: String, - baseColor: String, - symbol: { - type: null, - default: VBtnToggleSymbol - }, - flat: Boolean, - icon: [Boolean, String, Function, Object], - prependIcon: IconValue, - appendIcon: IconValue, - block: Boolean, - readonly: Boolean, - slim: Boolean, - stacked: Boolean, - ripple: { - type: [Boolean, Object], - default: true - }, - text: String, - ...makeBorderProps(), - ...makeComponentProps(), - ...makeDensityProps(), - ...makeDimensionProps(), - ...makeElevationProps(), - ...makeGroupItemProps(), - ...makeLoaderProps(), - ...makeLocationProps(), - ...makePositionProps(), - ...makeRoundedProps(), - ...makeRouterProps(), - ...makeSizeProps(), - ...makeTagProps({ - tag: 'button' - }), - ...makeThemeProps(), - ...makeVariantProps({ - variant: 'elevated' - }) -}, 'VBtn'); -const VBtn = genericComponent()({ - name: 'VBtn', - props: makeVBtnProps(), - emits: { - 'group:selected': val => true - }, - setup(props, _ref) { - let { - attrs, - slots - } = _ref; - const { - themeClasses - } = provideTheme(props); - const { - borderClasses - } = useBorder(props); - const { - densityClasses - } = useDensity(props); - const { - dimensionStyles - } = useDimension(props); - const { - elevationClasses - } = useElevation(props); - const { - loaderClasses - } = useLoader(props); - const { - locationStyles - } = useLocation(props); - const { - positionClasses - } = usePosition(props); - const { - roundedClasses - } = useRounded(props); - const { - sizeClasses, - sizeStyles - } = useSize(props); - const group = useGroupItem(props, props.symbol, false); - const link = useLink(props, attrs); - const isActive = computed$1E(() => { - if (props.active !== undefined) { - return props.active; - } - if (link.isLink.value) { - return link.isActive?.value; - } - return group?.isSelected.value; - }); - const color = computed$1E(() => isActive.value ? props.activeColor ?? props.color : props.color); - const variantProps = computed$1E(() => { - const showColor = group?.isSelected.value && (!link.isLink.value || link.isActive?.value) || !group || link.isActive?.value; - return { - color: showColor ? color.value ?? props.baseColor : props.baseColor, - variant: props.variant - }; - }); - const { - colorClasses, - colorStyles, - variantClasses - } = useVariant(variantProps); - const isDisabled = computed$1E(() => group?.disabled.value || props.disabled); - const isElevated = computed$1E(() => { - return props.variant === 'elevated' && !(props.disabled || props.flat || props.border); - }); - const valueAttr = computed$1E(() => { - if (props.value === undefined || typeof props.value === 'symbol') return undefined; - return Object(props.value) === props.value ? JSON.stringify(props.value, null, 0) : props.value; - }); - function onClick(e) { - if (isDisabled.value || link.isLink.value && (e.metaKey || e.ctrlKey || e.shiftKey || e.button !== 0 || attrs.target === '_blank')) return; - link.navigate?.(e); - group?.toggle(); - } - useSelectLink(link, group?.select); - useRender(() => { - const Tag = link.isLink.value ? 'a' : props.tag; - const hasPrepend = !!(props.prependIcon || slots.prepend); - const hasAppend = !!(props.appendIcon || slots.append); - const hasIcon = !!(props.icon && props.icon !== true); - return withDirectives(_createVNode$22(Tag, _mergeProps$_({ - "type": Tag === 'a' ? undefined : 'button', - "class": ['v-btn', group?.selectedClass.value, { - 'v-btn--active': isActive.value, - 'v-btn--block': props.block, - 'v-btn--disabled': isDisabled.value, - 'v-btn--elevated': isElevated.value, - 'v-btn--flat': props.flat, - 'v-btn--icon': !!props.icon, - 'v-btn--loading': props.loading, - 'v-btn--readonly': props.readonly, - 'v-btn--slim': props.slim, - 'v-btn--stacked': props.stacked - }, themeClasses.value, borderClasses.value, colorClasses.value, densityClasses.value, elevationClasses.value, loaderClasses.value, positionClasses.value, roundedClasses.value, sizeClasses.value, variantClasses.value, props.class], - "style": [colorStyles.value, dimensionStyles.value, locationStyles.value, sizeStyles.value, props.style], - "aria-busy": props.loading ? true : undefined, - "disabled": isDisabled.value || undefined, - "tabindex": props.loading || props.readonly ? -1 : undefined, - "onClick": onClick, - "value": valueAttr.value - }, link.linkProps), { - default: () => [genOverlays(true, 'v-btn'), !props.icon && hasPrepend && _createVNode$22("span", { - "key": "prepend", - "class": "v-btn__prepend" - }, [!slots.prepend ? _createVNode$22(VIcon, { - "key": "prepend-icon", - "icon": props.prependIcon - }, null) : _createVNode$22(VDefaultsProvider, { - "key": "prepend-defaults", - "disabled": !props.prependIcon, - "defaults": { - VIcon: { - icon: props.prependIcon - } - } - }, slots.prepend)]), _createVNode$22("span", { - "class": "v-btn__content", - "data-no-activator": "" - }, [!slots.default && hasIcon ? _createVNode$22(VIcon, { - "key": "content-icon", - "icon": props.icon - }, null) : _createVNode$22(VDefaultsProvider, { - "key": "content-defaults", - "disabled": !hasIcon, - "defaults": { - VIcon: { - icon: props.icon - } - } - }, { - default: () => [slots.default?.() ?? props.text] - })]), !props.icon && hasAppend && _createVNode$22("span", { - "key": "append", - "class": "v-btn__append" - }, [!slots.append ? _createVNode$22(VIcon, { - "key": "append-icon", - "icon": props.appendIcon - }, null) : _createVNode$22(VDefaultsProvider, { - "key": "append-defaults", - "disabled": !props.appendIcon, - "defaults": { - VIcon: { - icon: props.appendIcon - } - } - }, slots.append)]), !!props.loading && _createVNode$22("span", { - "key": "loader", - "class": "v-btn__loader" - }, [slots.loader?.() ?? _createVNode$22(VProgressCircular, { - "color": typeof props.loading === 'boolean' ? undefined : props.loading, - "indeterminate": true, - "width": "2" - }, null)])] - }), [[Ripple, !isDisabled.value && props.ripple, '', { - center: !!props.icon - }]]); - }); - return { - group - }; - } -}); - -const {createVNode:_createVNode$21,mergeProps:_mergeProps$Z,resolveDirective:_resolveDirective$W} = await importShared('vue'); -const makeVAppBarNavIconProps = propsFactory({ - ...makeVBtnProps({ - icon: '$menu', - variant: 'text' - }) -}, 'VAppBarNavIcon'); -const VAppBarNavIcon = genericComponent()({ - name: 'VAppBarNavIcon', - props: makeVAppBarNavIconProps(), - setup(props, _ref) { - let { - slots - } = _ref; - useRender(() => _createVNode$21(VBtn, _mergeProps$Z(props, { - "class": ['v-app-bar-nav-icon'] - }), slots)); - return {}; - } -}); - -const {createVNode:_createVNode$20,mergeProps:_mergeProps$Y,resolveDirective:_resolveDirective$V} = await importShared('vue'); -const VAppBarTitle = genericComponent()({ - name: 'VAppBarTitle', - props: makeVToolbarTitleProps(), - setup(props, _ref) { - let { - slots - } = _ref; - useRender(() => _createVNode$20(VToolbarTitle, _mergeProps$Y(props, { - "class": "v-app-bar-title" - }), slots)); - return {}; - } -}); - -// Utilities -const VAlertTitle = createSimpleFunctional('v-alert-title'); - -const {mergeProps:_mergeProps$X,resolveDirective:_resolveDirective$U,createVNode:_createVNode$1$} = await importShared('vue'); -const {computed: computed$1D,toRef: toRef$C} = await importShared('vue'); -const allowedTypes = ['success', 'info', 'warning', 'error']; -const makeVAlertProps = propsFactory({ - border: { - type: [Boolean, String], - validator: val => { - return typeof val === 'boolean' || ['top', 'end', 'bottom', 'start'].includes(val); - } - }, - borderColor: String, - closable: Boolean, - closeIcon: { - type: IconValue, - default: '$close' - }, - closeLabel: { - type: String, - default: '$vuetify.close' - }, - icon: { - type: [Boolean, String, Function, Object], - default: null - }, - modelValue: { - type: Boolean, - default: true - }, - prominent: Boolean, - title: String, - text: String, - type: { - type: String, - validator: val => allowedTypes.includes(val) - }, - ...makeComponentProps(), - ...makeDensityProps(), - ...makeDimensionProps(), - ...makeElevationProps(), - ...makeLocationProps(), - ...makePositionProps(), - ...makeRoundedProps(), - ...makeTagProps(), - ...makeThemeProps(), - ...makeVariantProps({ - variant: 'flat' - }) -}, 'VAlert'); -const VAlert = genericComponent()({ - name: 'VAlert', - props: makeVAlertProps(), - emits: { - 'click:close': e => true, - 'update:modelValue': value => true - }, - setup(props, _ref) { - let { - emit, - slots - } = _ref; - const isActive = useProxiedModel(props, 'modelValue'); - const icon = computed$1D(() => { - if (props.icon === false) return undefined; - if (!props.type) return props.icon; - return props.icon ?? `$${props.type}`; - }); - const variantProps = computed$1D(() => ({ - color: props.color ?? props.type, - variant: props.variant - })); - const { - themeClasses - } = provideTheme(props); - const { - colorClasses, - colorStyles, - variantClasses - } = useVariant(variantProps); - const { - densityClasses - } = useDensity(props); - const { - dimensionStyles - } = useDimension(props); - const { - elevationClasses - } = useElevation(props); - const { - locationStyles - } = useLocation(props); - const { - positionClasses - } = usePosition(props); - const { - roundedClasses - } = useRounded(props); - const { - textColorClasses, - textColorStyles - } = useTextColor(toRef$C(props, 'borderColor')); - const { - t - } = useLocale(); - const closeProps = computed$1D(() => ({ - 'aria-label': t(props.closeLabel), - onClick(e) { - isActive.value = false; - emit('click:close', e); - } - })); - return () => { - const hasPrepend = !!(slots.prepend || icon.value); - const hasTitle = !!(slots.title || props.title); - const hasClose = !!(slots.close || props.closable); - return isActive.value && _createVNode$1$(props.tag, { - "class": ['v-alert', props.border && { - 'v-alert--border': !!props.border, - [`v-alert--border-${props.border === true ? 'start' : props.border}`]: true - }, { - 'v-alert--prominent': props.prominent - }, themeClasses.value, colorClasses.value, densityClasses.value, elevationClasses.value, positionClasses.value, roundedClasses.value, variantClasses.value, props.class], - "style": [colorStyles.value, dimensionStyles.value, locationStyles.value, props.style], - "role": "alert" - }, { - default: () => [genOverlays(false, 'v-alert'), props.border && _createVNode$1$("div", { - "key": "border", - "class": ['v-alert__border', textColorClasses.value], - "style": textColorStyles.value - }, null), hasPrepend && _createVNode$1$("div", { - "key": "prepend", - "class": "v-alert__prepend" - }, [!slots.prepend ? _createVNode$1$(VIcon, { - "key": "prepend-icon", - "density": props.density, - "icon": icon.value, - "size": props.prominent ? 44 : 28 - }, null) : _createVNode$1$(VDefaultsProvider, { - "key": "prepend-defaults", - "disabled": !icon.value, - "defaults": { - VIcon: { - density: props.density, - icon: icon.value, - size: props.prominent ? 44 : 28 - } - } - }, slots.prepend)]), _createVNode$1$("div", { - "class": "v-alert__content" - }, [hasTitle && _createVNode$1$(VAlertTitle, { - "key": "title" - }, { - default: () => [slots.title?.() ?? props.title] - }), slots.text?.() ?? props.text, slots.default?.()]), slots.append && _createVNode$1$("div", { - "key": "append", - "class": "v-alert__append" - }, [slots.append()]), hasClose && _createVNode$1$("div", { - "key": "close", - "class": "v-alert__close" - }, [!slots.close ? _createVNode$1$(VBtn, _mergeProps$X({ - "key": "close-btn", - "icon": props.closeIcon, - "size": "x-small", - "variant": "text" - }, closeProps.value), null) : _createVNode$1$(VDefaultsProvider, { - "key": "close-defaults", - "defaults": { - VBtn: { - icon: props.closeIcon, - size: 'x-small', - variant: 'text' - } - } - }, { - default: () => [slots.close?.({ - props: closeProps.value - })] - })])] - }); - }; - } -}); - -const {createVNode:_createVNode$1_} = await importShared('vue'); -const makeVAvatarProps = propsFactory({ - start: Boolean, - end: Boolean, - icon: IconValue, - image: String, - text: String, - ...makeBorderProps(), - ...makeComponentProps(), - ...makeDensityProps(), - ...makeRoundedProps(), - ...makeSizeProps(), - ...makeTagProps(), - ...makeThemeProps(), - ...makeVariantProps({ - variant: 'flat' - }) -}, 'VAvatar'); -const VAvatar = genericComponent()({ - name: 'VAvatar', - props: makeVAvatarProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - themeClasses - } = provideTheme(props); - const { - borderClasses - } = useBorder(props); - const { - colorClasses, - colorStyles, - variantClasses - } = useVariant(props); - const { - densityClasses - } = useDensity(props); - const { - roundedClasses - } = useRounded(props); - const { - sizeClasses, - sizeStyles - } = useSize(props); - useRender(() => _createVNode$1_(props.tag, { - "class": ['v-avatar', { - 'v-avatar--start': props.start, - 'v-avatar--end': props.end - }, themeClasses.value, borderClasses.value, colorClasses.value, densityClasses.value, roundedClasses.value, sizeClasses.value, variantClasses.value, props.class], - "style": [colorStyles.value, sizeStyles.value, props.style] - }, { - default: () => [!slots.default ? props.image ? _createVNode$1_(VImg, { - "key": "image", - "src": props.image, - "alt": "", - "cover": true - }, null) : props.icon ? _createVNode$1_(VIcon, { - "key": "icon", - "icon": props.icon - }, null) : props.text : _createVNode$1_(VDefaultsProvider, { - "key": "content-defaults", - "defaults": { - VImg: { - cover: true, - src: props.image - }, - VIcon: { - icon: props.icon - } - } - }, { - default: () => [slots.default()] - }), genOverlays(false, 'v-avatar')] - })); - return {}; - } -}); - -const {createVNode:_createVNode$1Z} = await importShared('vue'); -const makeVLabelProps = propsFactory({ - text: String, - onClick: EventProp(), - ...makeComponentProps(), - ...makeThemeProps() -}, 'VLabel'); -const VLabel = genericComponent()({ - name: 'VLabel', - props: makeVLabelProps(), - setup(props, _ref) { - let { - slots - } = _ref; - useRender(() => _createVNode$1Z("label", { - "class": ['v-label', { - 'v-label--clickable': !!props.onClick - }, props.class], - "style": props.style, - "onClick": props.onClick - }, [props.text, slots.default?.()])); - return {}; - } -}); - -const {createVNode:_createVNode$1Y} = await importShared('vue'); -const {computed: computed$1C,onScopeDispose: onScopeDispose$8,provide: provide$f,toRef: toRef$B} = await importShared('vue'); -const VSelectionControlGroupSymbol = Symbol.for('vuetify:selection-control-group'); -const makeSelectionControlGroupProps = propsFactory({ - color: String, - disabled: { - type: Boolean, - default: null - }, - defaultsTarget: String, - error: Boolean, - id: String, - inline: Boolean, - falseIcon: IconValue, - trueIcon: IconValue, - ripple: { - type: [Boolean, Object], - default: true - }, - multiple: { - type: Boolean, - default: null - }, - name: String, - readonly: { - type: Boolean, - default: null - }, - modelValue: null, - type: String, - valueComparator: { - type: Function, - default: deepEqual - }, - ...makeComponentProps(), - ...makeDensityProps(), - ...makeThemeProps() -}, 'SelectionControlGroup'); -const makeVSelectionControlGroupProps = propsFactory({ - ...makeSelectionControlGroupProps({ - defaultsTarget: 'VSelectionControl' - }) -}, 'VSelectionControlGroup'); -const VSelectionControlGroup = genericComponent()({ - name: 'VSelectionControlGroup', - props: makeVSelectionControlGroupProps(), - emits: { - 'update:modelValue': value => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const modelValue = useProxiedModel(props, 'modelValue'); - const uid = getUid(); - const id = computed$1C(() => props.id || `v-selection-control-group-${uid}`); - const name = computed$1C(() => props.name || id.value); - const updateHandlers = new Set(); - provide$f(VSelectionControlGroupSymbol, { - modelValue, - forceUpdate: () => { - updateHandlers.forEach(fn => fn()); - }, - onForceUpdate: cb => { - updateHandlers.add(cb); - onScopeDispose$8(() => { - updateHandlers.delete(cb); - }); - } - }); - provideDefaults({ - [props.defaultsTarget]: { - color: toRef$B(props, 'color'), - disabled: toRef$B(props, 'disabled'), - density: toRef$B(props, 'density'), - error: toRef$B(props, 'error'), - inline: toRef$B(props, 'inline'), - modelValue, - multiple: computed$1C(() => !!props.multiple || props.multiple == null && Array.isArray(modelValue.value)), - name, - falseIcon: toRef$B(props, 'falseIcon'), - trueIcon: toRef$B(props, 'trueIcon'), - readonly: toRef$B(props, 'readonly'), - ripple: toRef$B(props, 'ripple'), - type: toRef$B(props, 'type'), - valueComparator: toRef$B(props, 'valueComparator') - } - }); - useRender(() => _createVNode$1Y("div", { - "class": ['v-selection-control-group', { - 'v-selection-control-group--inline': props.inline - }, props.class], - "style": props.style, - "role": props.type === 'radio' ? 'radiogroup' : undefined - }, [slots.default?.()])); - return {}; - } -}); - -const {withDirectives:_withDirectives$i,resolveDirective:_resolveDirective$T,Fragment:_Fragment$y,createVNode:_createVNode$1X,mergeProps:_mergeProps$W} = await importShared('vue'); -const {computed: computed$1B,inject: inject$k,nextTick: nextTick$k,ref: ref$J,shallowRef: shallowRef$y} = await importShared('vue'); -const makeVSelectionControlProps = propsFactory({ - label: String, - baseColor: String, - trueValue: null, - falseValue: null, - value: null, - ...makeComponentProps(), - ...makeSelectionControlGroupProps() -}, 'VSelectionControl'); -function useSelectionControl(props) { - const group = inject$k(VSelectionControlGroupSymbol, undefined); - const { - densityClasses - } = useDensity(props); - const modelValue = useProxiedModel(props, 'modelValue'); - const trueValue = computed$1B(() => props.trueValue !== undefined ? props.trueValue : props.value !== undefined ? props.value : true); - const falseValue = computed$1B(() => props.falseValue !== undefined ? props.falseValue : false); - const isMultiple = computed$1B(() => !!props.multiple || props.multiple == null && Array.isArray(modelValue.value)); - const model = computed$1B({ - get() { - const val = group ? group.modelValue.value : modelValue.value; - return isMultiple.value ? wrapInArray(val).some(v => props.valueComparator(v, trueValue.value)) : props.valueComparator(val, trueValue.value); - }, - set(val) { - if (props.readonly) return; - const currentValue = val ? trueValue.value : falseValue.value; - let newVal = currentValue; - if (isMultiple.value) { - newVal = val ? [...wrapInArray(modelValue.value), currentValue] : wrapInArray(modelValue.value).filter(item => !props.valueComparator(item, trueValue.value)); - } - if (group) { - group.modelValue.value = newVal; - } else { - modelValue.value = newVal; - } - } - }); - const { - textColorClasses, - textColorStyles - } = useTextColor(computed$1B(() => { - if (props.error || props.disabled) return undefined; - return model.value ? props.color : props.baseColor; - })); - const { - backgroundColorClasses, - backgroundColorStyles - } = useBackgroundColor(computed$1B(() => { - return model.value && !props.error && !props.disabled ? props.color : props.baseColor; - })); - const icon = computed$1B(() => model.value ? props.trueIcon : props.falseIcon); - return { - group, - densityClasses, - trueValue, - falseValue, - model, - textColorClasses, - textColorStyles, - backgroundColorClasses, - backgroundColorStyles, - icon - }; -} -const VSelectionControl = genericComponent()({ - name: 'VSelectionControl', - directives: { - Ripple - }, - inheritAttrs: false, - props: makeVSelectionControlProps(), - emits: { - 'update:modelValue': value => true - }, - setup(props, _ref) { - let { - attrs, - slots - } = _ref; - const { - group, - densityClasses, - icon, - model, - textColorClasses, - textColorStyles, - backgroundColorClasses, - backgroundColorStyles, - trueValue - } = useSelectionControl(props); - const uid = getUid(); - const isFocused = shallowRef$y(false); - const isFocusVisible = shallowRef$y(false); - const input = ref$J(); - const id = computed$1B(() => props.id || `input-${uid}`); - const isInteractive = computed$1B(() => !props.disabled && !props.readonly); - group?.onForceUpdate(() => { - if (input.value) { - input.value.checked = model.value; - } - }); - function onFocus(e) { - if (!isInteractive.value) return; - isFocused.value = true; - if (matchesSelector(e.target, ':focus-visible') !== false) { - isFocusVisible.value = true; - } - } - function onBlur() { - isFocused.value = false; - isFocusVisible.value = false; - } - function onClickLabel(e) { - e.stopPropagation(); - } - function onInput(e) { - if (!isInteractive.value) { - if (input.value) { - // model value is not updated when input is not interactive - // but the internal checked state of the input is still updated, - // so here it's value is restored - input.value.checked = model.value; - } - return; - } - if (props.readonly && group) { - nextTick$k(() => group.forceUpdate()); - } - model.value = e.target.checked; - } - useRender(() => { - const label = slots.label ? slots.label({ - label: props.label, - props: { - for: id.value - } - }) : props.label; - const [rootAttrs, inputAttrs] = filterInputAttrs(attrs); - const inputNode = _createVNode$1X("input", _mergeProps$W({ - "ref": input, - "checked": model.value, - "disabled": !!props.disabled, - "id": id.value, - "onBlur": onBlur, - "onFocus": onFocus, - "onInput": onInput, - "aria-disabled": !!props.disabled, - "aria-label": props.label, - "type": props.type, - "value": trueValue.value, - "name": props.name, - "aria-checked": props.type === 'checkbox' ? model.value : undefined - }, inputAttrs), null); - return _createVNode$1X("div", _mergeProps$W({ - "class": ['v-selection-control', { - 'v-selection-control--dirty': model.value, - 'v-selection-control--disabled': props.disabled, - 'v-selection-control--error': props.error, - 'v-selection-control--focused': isFocused.value, - 'v-selection-control--focus-visible': isFocusVisible.value, - 'v-selection-control--inline': props.inline - }, densityClasses.value, props.class] - }, rootAttrs, { - "style": props.style - }), [_createVNode$1X("div", { - "class": ['v-selection-control__wrapper', textColorClasses.value], - "style": textColorStyles.value - }, [slots.default?.({ - backgroundColorClasses, - backgroundColorStyles - }), _withDirectives$i(_createVNode$1X("div", { - "class": ['v-selection-control__input'] - }, [slots.input?.({ - model, - textColorClasses, - textColorStyles, - backgroundColorClasses, - backgroundColorStyles, - inputNode, - icon: icon.value, - props: { - onFocus, - onBlur, - id: id.value - } - }) ?? _createVNode$1X(_Fragment$y, null, [icon.value && _createVNode$1X(VIcon, { - "key": "icon", - "icon": icon.value - }, null), inputNode])]), [[_resolveDirective$T("ripple"), props.ripple && [!props.disabled && !props.readonly, null, ['center', 'circle']]]])]), label && _createVNode$1X(VLabel, { - "for": id.value, - "onClick": onClickLabel - }, { - default: () => [label] - })]); - }); - return { - isFocused, - input - }; - } -}); - -const {createVNode:_createVNode$1W,mergeProps:_mergeProps$V,resolveDirective:_resolveDirective$S} = await importShared('vue'); -const {computed: computed$1A} = await importShared('vue'); -const makeVCheckboxBtnProps = propsFactory({ - indeterminate: Boolean, - indeterminateIcon: { - type: IconValue, - default: '$checkboxIndeterminate' - }, - ...makeVSelectionControlProps({ - falseIcon: '$checkboxOff', - trueIcon: '$checkboxOn' - }) -}, 'VCheckboxBtn'); -const VCheckboxBtn = genericComponent()({ - name: 'VCheckboxBtn', - props: makeVCheckboxBtnProps(), - emits: { - 'update:modelValue': value => true, - 'update:indeterminate': value => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const indeterminate = useProxiedModel(props, 'indeterminate'); - const model = useProxiedModel(props, 'modelValue'); - function onChange(v) { - if (indeterminate.value) { - indeterminate.value = false; - } - } - const falseIcon = computed$1A(() => { - return indeterminate.value ? props.indeterminateIcon : props.falseIcon; - }); - const trueIcon = computed$1A(() => { - return indeterminate.value ? props.indeterminateIcon : props.trueIcon; - }); - useRender(() => { - const controlProps = omit(VSelectionControl.filterProps(props), ['modelValue']); - return _createVNode$1W(VSelectionControl, _mergeProps$V(controlProps, { - "modelValue": model.value, - "onUpdate:modelValue": [$event => model.value = $event, onChange], - "class": ['v-checkbox-btn', props.class], - "style": props.style, - "type": "checkbox", - "falseIcon": falseIcon.value, - "trueIcon": trueIcon.value, - "aria-checked": indeterminate.value ? 'mixed' : undefined - }), slots); - }); - return {}; - } -}); - -const {createVNode:_createVNode$1V} = await importShared('vue'); -function useInputIcon(props) { - const { - t - } = useLocale(); - function InputIcon(_ref) { - let { - name - } = _ref; - const localeKey = { - prepend: 'prependAction', - prependInner: 'prependAction', - append: 'appendAction', - appendInner: 'appendAction', - clear: 'clear' - }[name]; - const listener = props[`onClick:${name}`]; - const label = listener && localeKey ? t(`$vuetify.input.${localeKey}`, props.label ?? '') : undefined; - return _createVNode$1V(VIcon, { - "icon": props[`${name}Icon`], - "aria-label": label, - "onClick": listener - }, null); - } - return { - InputIcon - }; -} - -const {createVNode:_createVNode$1U} = await importShared('vue'); -const {computed: computed$1z} = await importShared('vue'); -const makeVMessagesProps = propsFactory({ - active: Boolean, - color: String, - messages: { - type: [Array, String], - default: () => [] - }, - ...makeComponentProps(), - ...makeTransitionProps({ - transition: { - component: VSlideYTransition, - leaveAbsolute: true, - group: true - } - }) -}, 'VMessages'); -const VMessages = genericComponent()({ - name: 'VMessages', - props: makeVMessagesProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const messages = computed$1z(() => wrapInArray(props.messages)); - const { - textColorClasses, - textColorStyles - } = useTextColor(computed$1z(() => props.color)); - useRender(() => _createVNode$1U(MaybeTransition, { - "transition": props.transition, - "tag": "div", - "class": ['v-messages', textColorClasses.value, props.class], - "style": [textColorStyles.value, props.style], - "role": "alert", - "aria-live": "polite" - }, { - default: () => [props.active && messages.value.map((message, i) => _createVNode$1U("div", { - "class": "v-messages__message", - "key": `${i}-${messages.value}` - }, [slots.message ? slots.message({ - message - }) : message]))] - })); - return {}; - } -}); - -const {computed: computed$1y} = await importShared('vue'); -// Composables -const makeFocusProps = propsFactory({ - focused: Boolean, - 'onUpdate:focused': EventProp() -}, 'focus'); -function useFocus(props) { - let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName(); - const isFocused = useProxiedModel(props, 'focused'); - const focusClasses = computed$1y(() => { - return { - [`${name}--focused`]: isFocused.value - }; - }); - function focus() { - isFocused.value = true; - } - function blur() { - isFocused.value = false; - } - return { - focusClasses, - isFocused, - focus, - blur - }; -} - -const {computed: computed$1x,inject: inject$j,markRaw,provide: provide$e,ref: ref$I,shallowRef: shallowRef$x,toRef: toRef$A,watch: watch$y} = await importShared('vue'); -const FormKey = Symbol.for('vuetify:form'); -const makeFormProps = propsFactory({ - disabled: Boolean, - fastFail: Boolean, - readonly: Boolean, - modelValue: { - type: Boolean, - default: null - }, - validateOn: { - type: String, - default: 'input' - } -}, 'form'); -function createForm(props) { - const model = useProxiedModel(props, 'modelValue'); - const isDisabled = computed$1x(() => props.disabled); - const isReadonly = computed$1x(() => props.readonly); - const isValidating = shallowRef$x(false); - const items = ref$I([]); - const errors = ref$I([]); - async function validate() { - const results = []; - let valid = true; - errors.value = []; - isValidating.value = true; - for (const item of items.value) { - const itemErrorMessages = await item.validate(); - if (itemErrorMessages.length > 0) { - valid = false; - results.push({ - id: item.id, - errorMessages: itemErrorMessages - }); - } - if (!valid && props.fastFail) break; - } - errors.value = results; - isValidating.value = false; - return { - valid, - errors: errors.value - }; - } - function reset() { - items.value.forEach(item => item.reset()); - } - function resetValidation() { - items.value.forEach(item => item.resetValidation()); - } - watch$y(items, () => { - let valid = 0; - let invalid = 0; - const results = []; - for (const item of items.value) { - if (item.isValid === false) { - invalid++; - results.push({ - id: item.id, - errorMessages: item.errorMessages - }); - } else if (item.isValid === true) valid++; - } - errors.value = results; - model.value = invalid > 0 ? false : valid === items.value.length ? true : null; - }, { - deep: true, - flush: 'post' - }); - provide$e(FormKey, { - register: _ref => { - let { - id, - vm, - validate, - reset, - resetValidation - } = _ref; - if (items.value.some(item => item.id === id)) { - consoleWarn(`Duplicate input name "${id}"`); - } - items.value.push({ - id, - validate, - reset, - resetValidation, - vm: markRaw(vm), - isValid: null, - errorMessages: [] - }); - }, - unregister: id => { - items.value = items.value.filter(item => { - return item.id !== id; - }); - }, - update: (id, isValid, errorMessages) => { - const found = items.value.find(item => item.id === id); - if (!found) return; - found.isValid = isValid; - found.errorMessages = errorMessages; - }, - isDisabled, - isReadonly, - isValidating, - isValid: model, - items, - validateOn: toRef$A(props, 'validateOn') - }); - return { - errors, - isDisabled, - isReadonly, - isValidating, - isValid: model, - items, - validate, - reset, - resetValidation - }; -} -function useForm() { - return inject$j(FormKey, null); -} - -const {computed: computed$1w,nextTick: nextTick$j,onBeforeMount: onBeforeMount$1,onBeforeUnmount: onBeforeUnmount$7,onMounted: onMounted$a,ref: ref$H,shallowRef: shallowRef$w,unref: unref$1,watch: watch$x} = await importShared('vue'); -const makeValidationProps = propsFactory({ - disabled: { - type: Boolean, - default: null - }, - error: Boolean, - errorMessages: { - type: [Array, String], - default: () => [] - }, - maxErrors: { - type: [Number, String], - default: 1 - }, - name: String, - label: String, - readonly: { - type: Boolean, - default: null - }, - rules: { - type: Array, - default: () => [] - }, - modelValue: null, - validateOn: String, - validationValue: null, - ...makeFocusProps() -}, 'validation'); -function useValidation(props) { - let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName(); - let id = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : getUid(); - const model = useProxiedModel(props, 'modelValue'); - const validationModel = computed$1w(() => props.validationValue === undefined ? model.value : props.validationValue); - const form = useForm(); - const internalErrorMessages = ref$H([]); - const isPristine = shallowRef$w(true); - const isDirty = computed$1w(() => !!(wrapInArray(model.value === '' ? null : model.value).length || wrapInArray(validationModel.value === '' ? null : validationModel.value).length)); - const isDisabled = computed$1w(() => !!(props.disabled ?? form?.isDisabled.value)); - const isReadonly = computed$1w(() => !!(props.readonly ?? form?.isReadonly.value)); - const errorMessages = computed$1w(() => { - return props.errorMessages?.length ? wrapInArray(props.errorMessages).concat(internalErrorMessages.value).slice(0, Math.max(0, +props.maxErrors)) : internalErrorMessages.value; - }); - const validateOn = computed$1w(() => { - let value = (props.validateOn ?? form?.validateOn.value) || 'input'; - if (value === 'lazy') value = 'input lazy'; - if (value === 'eager') value = 'input eager'; - const set = new Set(value?.split(' ') ?? []); - return { - input: set.has('input'), - blur: set.has('blur') || set.has('input') || set.has('invalid-input'), - invalidInput: set.has('invalid-input'), - lazy: set.has('lazy'), - eager: set.has('eager') - }; - }); - const isValid = computed$1w(() => { - if (props.error || props.errorMessages?.length) return false; - if (!props.rules.length) return true; - if (isPristine.value) { - return internalErrorMessages.value.length || validateOn.value.lazy ? null : true; - } else { - return !internalErrorMessages.value.length; - } - }); - const isValidating = shallowRef$w(false); - const validationClasses = computed$1w(() => { - return { - [`${name}--error`]: isValid.value === false, - [`${name}--dirty`]: isDirty.value, - [`${name}--disabled`]: isDisabled.value, - [`${name}--readonly`]: isReadonly.value - }; - }); - const vm = getCurrentInstance('validation'); - const uid = computed$1w(() => props.name ?? unref$1(id)); - onBeforeMount$1(() => { - form?.register({ - id: uid.value, - vm, - validate, - reset, - resetValidation - }); - }); - onBeforeUnmount$7(() => { - form?.unregister(uid.value); - }); - onMounted$a(async () => { - if (!validateOn.value.lazy) { - await validate(!validateOn.value.eager); - } - form?.update(uid.value, isValid.value, errorMessages.value); - }); - useToggleScope(() => validateOn.value.input || validateOn.value.invalidInput && isValid.value === false, () => { - watch$x(validationModel, () => { - if (validationModel.value != null) { - validate(); - } else if (props.focused) { - const unwatch = watch$x(() => props.focused, val => { - if (!val) validate(); - unwatch(); - }); - } - }); - }); - useToggleScope(() => validateOn.value.blur, () => { - watch$x(() => props.focused, val => { - if (!val) validate(); - }); - }); - watch$x([isValid, errorMessages], () => { - form?.update(uid.value, isValid.value, errorMessages.value); - }); - async function reset() { - model.value = null; - await nextTick$j(); - await resetValidation(); - } - async function resetValidation() { - isPristine.value = true; - if (!validateOn.value.lazy) { - await validate(!validateOn.value.eager); - } else { - internalErrorMessages.value = []; - } - } - async function validate() { - let silent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - const results = []; - isValidating.value = true; - for (const rule of props.rules) { - if (results.length >= +(props.maxErrors ?? 1)) { - break; - } - const handler = typeof rule === 'function' ? rule : () => rule; - const result = await handler(validationModel.value); - if (result === true) continue; - if (result !== false && typeof result !== 'string') { - // eslint-disable-next-line no-console - console.warn(`${result} is not a valid value. Rule functions must return boolean true or a string.`); - continue; - } - results.push(result || ''); - } - internalErrorMessages.value = results; - isValidating.value = false; - isPristine.value = silent; - return internalErrorMessages.value; - } - return { - errorMessages, - isDirty, - isDisabled, - isReadonly, - isPristine, - isValid, - isValidating, - reset, - resetValidation, - validate, - validationClasses - }; -} - -const {resolveDirective:_resolveDirective$R,createVNode:_createVNode$1T} = await importShared('vue'); -const {computed: computed$1v} = await importShared('vue'); -const makeVInputProps = propsFactory({ - id: String, - appendIcon: IconValue, - centerAffix: { - type: Boolean, - default: true - }, - prependIcon: IconValue, - hideDetails: [Boolean, String], - hideSpinButtons: Boolean, - hint: String, - persistentHint: Boolean, - messages: { - type: [Array, String], - default: () => [] - }, - direction: { - type: String, - default: 'horizontal', - validator: v => ['horizontal', 'vertical'].includes(v) - }, - 'onClick:prepend': EventProp(), - 'onClick:append': EventProp(), - ...makeComponentProps(), - ...makeDensityProps(), - ...only(makeDimensionProps(), ['maxWidth', 'minWidth', 'width']), - ...makeThemeProps(), - ...makeValidationProps() -}, 'VInput'); -const VInput = genericComponent()({ - name: 'VInput', - props: { - ...makeVInputProps() - }, - emits: { - 'update:modelValue': value => true - }, - setup(props, _ref) { - let { - attrs, - slots, - emit - } = _ref; - const { - densityClasses - } = useDensity(props); - const { - dimensionStyles - } = useDimension(props); - const { - themeClasses - } = provideTheme(props); - const { - rtlClasses - } = useRtl(); - const { - InputIcon - } = useInputIcon(props); - const uid = getUid(); - const id = computed$1v(() => props.id || `input-${uid}`); - const messagesId = computed$1v(() => `${id.value}-messages`); - const { - errorMessages, - isDirty, - isDisabled, - isReadonly, - isPristine, - isValid, - isValidating, - reset, - resetValidation, - validate, - validationClasses - } = useValidation(props, 'v-input', id); - const slotProps = computed$1v(() => ({ - id, - messagesId, - isDirty, - isDisabled, - isReadonly, - isPristine, - isValid, - isValidating, - reset, - resetValidation, - validate - })); - const messages = computed$1v(() => { - if (props.errorMessages?.length || !isPristine.value && errorMessages.value.length) { - return errorMessages.value; - } else if (props.hint && (props.persistentHint || props.focused)) { - return props.hint; - } else { - return props.messages; - } - }); - useRender(() => { - const hasPrepend = !!(slots.prepend || props.prependIcon); - const hasAppend = !!(slots.append || props.appendIcon); - const hasMessages = messages.value.length > 0; - const hasDetails = !props.hideDetails || props.hideDetails === 'auto' && (hasMessages || !!slots.details); - return _createVNode$1T("div", { - "class": ['v-input', `v-input--${props.direction}`, { - 'v-input--center-affix': props.centerAffix, - 'v-input--hide-spin-buttons': props.hideSpinButtons - }, densityClasses.value, themeClasses.value, rtlClasses.value, validationClasses.value, props.class], - "style": [dimensionStyles.value, props.style] - }, [hasPrepend && _createVNode$1T("div", { - "key": "prepend", - "class": "v-input__prepend" - }, [slots.prepend?.(slotProps.value), props.prependIcon && _createVNode$1T(InputIcon, { - "key": "prepend-icon", - "name": "prepend" - }, null)]), slots.default && _createVNode$1T("div", { - "class": "v-input__control" - }, [slots.default?.(slotProps.value)]), hasAppend && _createVNode$1T("div", { - "key": "append", - "class": "v-input__append" - }, [props.appendIcon && _createVNode$1T(InputIcon, { - "key": "append-icon", - "name": "append" - }, null), slots.append?.(slotProps.value)]), hasDetails && _createVNode$1T("div", { - "class": "v-input__details" - }, [_createVNode$1T(VMessages, { - "id": messagesId.value, - "active": hasMessages, - "messages": messages.value - }, { - message: slots.message - }), slots.details?.(slotProps.value)])]); - }); - return { - reset, - resetValidation, - validate, - isValid, - errorMessages - }; - } -}); - -const {createVNode:_createVNode$1S,mergeProps:_mergeProps$U,resolveDirective:_resolveDirective$Q} = await importShared('vue'); -const {computed: computed$1u} = await importShared('vue'); -const makeVCheckboxProps = propsFactory({ - ...makeVInputProps(), - ...omit(makeVCheckboxBtnProps(), ['inline']) -}, 'VCheckbox'); -const VCheckbox = genericComponent()({ - name: 'VCheckbox', - inheritAttrs: false, - props: makeVCheckboxProps(), - emits: { - 'update:modelValue': value => true, - 'update:focused': focused => true - }, - setup(props, _ref) { - let { - attrs, - slots - } = _ref; - const model = useProxiedModel(props, 'modelValue'); - const { - isFocused, - focus, - blur - } = useFocus(props); - const uid = getUid(); - const id = computed$1u(() => props.id || `checkbox-${uid}`); - useRender(() => { - const [rootAttrs, controlAttrs] = filterInputAttrs(attrs); - const inputProps = VInput.filterProps(props); - const checkboxProps = VCheckboxBtn.filterProps(props); - return _createVNode$1S(VInput, _mergeProps$U({ - "class": ['v-checkbox', props.class] - }, rootAttrs, inputProps, { - "modelValue": model.value, - "onUpdate:modelValue": $event => model.value = $event, - "id": id.value, - "focused": isFocused.value, - "style": props.style - }), { - ...slots, - default: _ref2 => { - let { - id, - messagesId, - isDisabled, - isReadonly, - isValid - } = _ref2; - return _createVNode$1S(VCheckboxBtn, _mergeProps$U(checkboxProps, { - "id": id.value, - "aria-describedby": messagesId.value, - "disabled": isDisabled.value, - "readonly": isReadonly.value - }, controlAttrs, { - "error": isValid.value === false, - "modelValue": model.value, - "onUpdate:modelValue": $event => model.value = $event, - "onFocus": focus, - "onBlur": blur - }), slots); - } - }); - }); - return {}; - } -}); - -function calculateUpdatedTarget(_ref) { - let { - selectedElement, - containerElement, - isRtl, - isHorizontal - } = _ref; - const containerSize = getOffsetSize(isHorizontal, containerElement); - const scrollPosition = getScrollPosition(isHorizontal, isRtl, containerElement); - const childrenSize = getOffsetSize(isHorizontal, selectedElement); - const childrenStartPosition = getOffsetPosition(isHorizontal, selectedElement); - const additionalOffset = childrenSize * 0.4; - if (scrollPosition > childrenStartPosition) { - return childrenStartPosition - additionalOffset; - } else if (scrollPosition + containerSize < childrenStartPosition + childrenSize) { - return childrenStartPosition - containerSize + childrenSize + additionalOffset; - } - return scrollPosition; -} -function calculateCenteredTarget(_ref2) { - let { - selectedElement, - containerElement, - isHorizontal - } = _ref2; - const containerOffsetSize = getOffsetSize(isHorizontal, containerElement); - const childrenOffsetPosition = getOffsetPosition(isHorizontal, selectedElement); - const childrenOffsetSize = getOffsetSize(isHorizontal, selectedElement); - return childrenOffsetPosition - containerOffsetSize / 2 + childrenOffsetSize / 2; -} -function getScrollSize(isHorizontal, element) { - const key = isHorizontal ? 'scrollWidth' : 'scrollHeight'; - return element?.[key] || 0; -} -function getClientSize(isHorizontal, element) { - const key = isHorizontal ? 'clientWidth' : 'clientHeight'; - return element?.[key] || 0; -} -function getScrollPosition(isHorizontal, rtl, element) { - if (!element) { - return 0; - } - const { - scrollLeft, - offsetWidth, - scrollWidth - } = element; - if (isHorizontal) { - return rtl ? scrollWidth - offsetWidth + scrollLeft : scrollLeft; - } - return element.scrollTop; -} -function getOffsetSize(isHorizontal, element) { - const key = isHorizontal ? 'offsetWidth' : 'offsetHeight'; - return element?.[key] || 0; -} -function getOffsetPosition(isHorizontal, element) { - const key = isHorizontal ? 'offsetLeft' : 'offsetTop'; - return element?.[key] || 0; -} - -const {createVNode:_createVNode$1R} = await importShared('vue'); -const {computed: computed$1t,shallowRef: shallowRef$v,watch: watch$w} = await importShared('vue'); -const VSlideGroupSymbol = Symbol.for('vuetify:v-slide-group'); -const makeVSlideGroupProps = propsFactory({ - centerActive: Boolean, - direction: { - type: String, - default: 'horizontal' - }, - symbol: { - type: null, - default: VSlideGroupSymbol - }, - nextIcon: { - type: IconValue, - default: '$next' - }, - prevIcon: { - type: IconValue, - default: '$prev' - }, - showArrows: { - type: [Boolean, String], - validator: v => typeof v === 'boolean' || ['always', 'desktop', 'mobile'].includes(v) - }, - ...makeComponentProps(), - ...makeDisplayProps({ - mobile: null - }), - ...makeTagProps(), - ...makeGroupProps({ - selectedClass: 'v-slide-group-item--active' - }) -}, 'VSlideGroup'); -const VSlideGroup = genericComponent()({ - name: 'VSlideGroup', - props: makeVSlideGroupProps(), - emits: { - 'update:modelValue': value => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const { - isRtl - } = useRtl(); - const { - displayClasses, - mobile - } = useDisplay(props); - const group = useGroup(props, props.symbol); - const isOverflowing = shallowRef$v(false); - const scrollOffset = shallowRef$v(0); - const containerSize = shallowRef$v(0); - const contentSize = shallowRef$v(0); - const isHorizontal = computed$1t(() => props.direction === 'horizontal'); - const { - resizeRef: containerRef, - contentRect: containerRect - } = useResizeObserver(); - const { - resizeRef: contentRef, - contentRect - } = useResizeObserver(); - const goTo = useGoTo(); - const goToOptions = computed$1t(() => { - return { - container: containerRef.el, - duration: 200, - easing: 'easeOutQuart' - }; - }); - const firstSelectedIndex = computed$1t(() => { - if (!group.selected.value.length) return -1; - return group.items.value.findIndex(item => item.id === group.selected.value[0]); - }); - const lastSelectedIndex = computed$1t(() => { - if (!group.selected.value.length) return -1; - return group.items.value.findIndex(item => item.id === group.selected.value[group.selected.value.length - 1]); - }); - if (IN_BROWSER) { - let frame = -1; - watch$w(() => [group.selected.value, containerRect.value, contentRect.value, isHorizontal.value], () => { - cancelAnimationFrame(frame); - frame = requestAnimationFrame(() => { - if (containerRect.value && contentRect.value) { - const sizeProperty = isHorizontal.value ? 'width' : 'height'; - containerSize.value = containerRect.value[sizeProperty]; - contentSize.value = contentRect.value[sizeProperty]; - isOverflowing.value = containerSize.value + 1 < contentSize.value; - } - if (firstSelectedIndex.value >= 0 && contentRef.el) { - // TODO: Is this too naive? Should we store element references in group composable? - const selectedElement = contentRef.el.children[lastSelectedIndex.value]; - scrollToChildren(selectedElement, props.centerActive); - } - }); - }); - } - const isFocused = shallowRef$v(false); - function scrollToChildren(children, center) { - let target = 0; - if (center) { - target = calculateCenteredTarget({ - containerElement: containerRef.el, - isHorizontal: isHorizontal.value, - selectedElement: children - }); - } else { - target = calculateUpdatedTarget({ - containerElement: containerRef.el, - isHorizontal: isHorizontal.value, - isRtl: isRtl.value, - selectedElement: children - }); - } - scrollToPosition(target); - } - function scrollToPosition(newPosition) { - if (!IN_BROWSER || !containerRef.el) return; - const offsetSize = getOffsetSize(isHorizontal.value, containerRef.el); - const scrollPosition = getScrollPosition(isHorizontal.value, isRtl.value, containerRef.el); - const scrollSize = getScrollSize(isHorizontal.value, containerRef.el); - if (scrollSize <= offsetSize || - // Prevent scrolling by only a couple of pixels, which doesn't look smooth - Math.abs(newPosition - scrollPosition) < 16) return; - if (isHorizontal.value && isRtl.value && containerRef.el) { - const { - scrollWidth, - offsetWidth: containerWidth - } = containerRef.el; - newPosition = scrollWidth - containerWidth - newPosition; - } - if (isHorizontal.value) { - goTo.horizontal(newPosition, goToOptions.value); - } else { - goTo(newPosition, goToOptions.value); - } - } - function onScroll(e) { - const { - scrollTop, - scrollLeft - } = e.target; - scrollOffset.value = isHorizontal.value ? scrollLeft : scrollTop; - } - function onFocusin(e) { - isFocused.value = true; - if (!isOverflowing.value || !contentRef.el) return; - - // Focused element is likely to be the root of an item, so a - // breadth-first search will probably find it in the first iteration - for (const el of e.composedPath()) { - for (const item of contentRef.el.children) { - if (item === el) { - scrollToChildren(item); - return; - } - } - } - } - function onFocusout(e) { - isFocused.value = false; - } - - // Affix clicks produce onFocus that we have to ignore to avoid extra scrollToChildren - let ignoreFocusEvent = false; - function onFocus(e) { - if (!ignoreFocusEvent && !isFocused.value && !(e.relatedTarget && contentRef.el?.contains(e.relatedTarget))) focus(); - ignoreFocusEvent = false; - } - function onFocusAffixes() { - ignoreFocusEvent = true; - } - function onKeydown(e) { - if (!contentRef.el) return; - function toFocus(location) { - e.preventDefault(); - focus(location); - } - if (isHorizontal.value) { - if (e.key === 'ArrowRight') { - toFocus(isRtl.value ? 'prev' : 'next'); - } else if (e.key === 'ArrowLeft') { - toFocus(isRtl.value ? 'next' : 'prev'); - } - } else { - if (e.key === 'ArrowDown') { - toFocus('next'); - } else if (e.key === 'ArrowUp') { - toFocus('prev'); - } - } - if (e.key === 'Home') { - toFocus('first'); - } else if (e.key === 'End') { - toFocus('last'); - } - } - function focus(location) { - if (!contentRef.el) return; - let el; - if (!location) { - const focusable = focusableChildren(contentRef.el); - el = focusable[0]; - } else if (location === 'next') { - el = contentRef.el.querySelector(':focus')?.nextElementSibling; - if (!el) return focus('first'); - } else if (location === 'prev') { - el = contentRef.el.querySelector(':focus')?.previousElementSibling; - if (!el) return focus('last'); - } else if (location === 'first') { - el = contentRef.el.firstElementChild; - } else if (location === 'last') { - el = contentRef.el.lastElementChild; - } - if (el) { - el.focus({ - preventScroll: true - }); - } - } - function scrollTo(location) { - const direction = isHorizontal.value && isRtl.value ? -1 : 1; - const offsetStep = (location === 'prev' ? -direction : direction) * containerSize.value; - let newPosition = scrollOffset.value + offsetStep; - - // TODO: improve it - if (isHorizontal.value && isRtl.value && containerRef.el) { - const { - scrollWidth, - offsetWidth: containerWidth - } = containerRef.el; - newPosition += scrollWidth - containerWidth; - } - scrollToPosition(newPosition); - } - const slotProps = computed$1t(() => ({ - next: group.next, - prev: group.prev, - select: group.select, - isSelected: group.isSelected - })); - const hasAffixes = computed$1t(() => { - switch (props.showArrows) { - // Always show arrows on desktop & mobile - case 'always': - return true; - - // Always show arrows on desktop - case 'desktop': - return !mobile.value; - - // Show arrows on mobile when overflowing. - // This matches the default 2.2 behavior - case true: - return isOverflowing.value || Math.abs(scrollOffset.value) > 0; - - // Always show on mobile - case 'mobile': - return mobile.value || isOverflowing.value || Math.abs(scrollOffset.value) > 0; - - // https://material.io/components/tabs#scrollable-tabs - // Always show arrows when - // overflowed on desktop - default: - return !mobile.value && (isOverflowing.value || Math.abs(scrollOffset.value) > 0); - } - }); - const hasPrev = computed$1t(() => { - // 1 pixel in reserve, may be lost after rounding - return Math.abs(scrollOffset.value) > 1; - }); - const hasNext = computed$1t(() => { - if (!containerRef.value) return false; - const scrollSize = getScrollSize(isHorizontal.value, containerRef.el); - const clientSize = getClientSize(isHorizontal.value, containerRef.el); - const scrollSizeMax = scrollSize - clientSize; - - // 1 pixel in reserve, may be lost after rounding - return scrollSizeMax - Math.abs(scrollOffset.value) > 1; - }); - useRender(() => _createVNode$1R(props.tag, { - "class": ['v-slide-group', { - 'v-slide-group--vertical': !isHorizontal.value, - 'v-slide-group--has-affixes': hasAffixes.value, - 'v-slide-group--is-overflowing': isOverflowing.value - }, displayClasses.value, props.class], - "style": props.style, - "tabindex": isFocused.value || group.selected.value.length ? -1 : 0, - "onFocus": onFocus - }, { - default: () => [hasAffixes.value && _createVNode$1R("div", { - "key": "prev", - "class": ['v-slide-group__prev', { - 'v-slide-group__prev--disabled': !hasPrev.value - }], - "onMousedown": onFocusAffixes, - "onClick": () => hasPrev.value && scrollTo('prev') - }, [slots.prev?.(slotProps.value) ?? _createVNode$1R(VFadeTransition, null, { - default: () => [_createVNode$1R(VIcon, { - "icon": isRtl.value ? props.nextIcon : props.prevIcon - }, null)] - })]), _createVNode$1R("div", { - "key": "container", - "ref": containerRef, - "class": "v-slide-group__container", - "onScroll": onScroll - }, [_createVNode$1R("div", { - "ref": contentRef, - "class": "v-slide-group__content", - "onFocusin": onFocusin, - "onFocusout": onFocusout, - "onKeydown": onKeydown - }, [slots.default?.(slotProps.value)])]), hasAffixes.value && _createVNode$1R("div", { - "key": "next", - "class": ['v-slide-group__next', { - 'v-slide-group__next--disabled': !hasNext.value - }], - "onMousedown": onFocusAffixes, - "onClick": () => hasNext.value && scrollTo('next') - }, [slots.next?.(slotProps.value) ?? _createVNode$1R(VFadeTransition, null, { - default: () => [_createVNode$1R(VIcon, { - "icon": isRtl.value ? props.prevIcon : props.nextIcon - }, null)] - })])] - })); - return { - selected: group.selected, - scrollTo, - scrollOffset, - focus, - hasPrev, - hasNext - }; - } -}); - -const {createVNode:_createVNode$1Q,mergeProps:_mergeProps$T} = await importShared('vue'); -const {toRef: toRef$z} = await importShared('vue'); -const VChipGroupSymbol = Symbol.for('vuetify:v-chip-group'); -const makeVChipGroupProps = propsFactory({ - column: Boolean, - filter: Boolean, - valueComparator: { - type: Function, - default: deepEqual - }, - ...makeVSlideGroupProps(), - ...makeComponentProps(), - ...makeGroupProps({ - selectedClass: 'v-chip--selected' - }), - ...makeTagProps(), - ...makeThemeProps(), - ...makeVariantProps({ - variant: 'tonal' - }) -}, 'VChipGroup'); -const VChipGroup = genericComponent()({ - name: 'VChipGroup', - props: makeVChipGroupProps(), - emits: { - 'update:modelValue': value => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const { - themeClasses - } = provideTheme(props); - const { - isSelected, - select, - next, - prev, - selected - } = useGroup(props, VChipGroupSymbol); - provideDefaults({ - VChip: { - color: toRef$z(props, 'color'), - disabled: toRef$z(props, 'disabled'), - filter: toRef$z(props, 'filter'), - variant: toRef$z(props, 'variant') - } - }); - useRender(() => { - const slideGroupProps = VSlideGroup.filterProps(props); - return _createVNode$1Q(VSlideGroup, _mergeProps$T(slideGroupProps, { - "class": ['v-chip-group', { - 'v-chip-group--column': props.column - }, themeClasses.value, props.class], - "style": props.style - }), { - default: () => [slots.default?.({ - isSelected, - select, - next, - prev, - selected: selected.value - })] - }); - }); - return {}; - } -}); - -const {mergeProps:_mergeProps$S,Fragment:_Fragment$x,withDirectives:_withDirectives$h,vShow:_vShow$9,resolveDirective:_resolveDirective$P,createVNode:_createVNode$1P} = await importShared('vue'); -const {computed: computed$1s} = await importShared('vue'); -const makeVChipProps = propsFactory({ - activeClass: String, - appendAvatar: String, - appendIcon: IconValue, - closable: Boolean, - closeIcon: { - type: IconValue, - default: '$delete' - }, - closeLabel: { - type: String, - default: '$vuetify.close' - }, - draggable: Boolean, - filter: Boolean, - filterIcon: { - type: String, - default: '$complete' - }, - label: Boolean, - link: { - type: Boolean, - default: undefined - }, - pill: Boolean, - prependAvatar: String, - prependIcon: IconValue, - ripple: { - type: [Boolean, Object], - default: true - }, - text: String, - modelValue: { - type: Boolean, - default: true - }, - onClick: EventProp(), - onClickOnce: EventProp(), - ...makeBorderProps(), - ...makeComponentProps(), - ...makeDensityProps(), - ...makeElevationProps(), - ...makeGroupItemProps(), - ...makeRoundedProps(), - ...makeRouterProps(), - ...makeSizeProps(), - ...makeTagProps({ - tag: 'span' - }), - ...makeThemeProps(), - ...makeVariantProps({ - variant: 'tonal' - }) -}, 'VChip'); -const VChip = genericComponent()({ - name: 'VChip', - directives: { - Ripple - }, - props: makeVChipProps(), - emits: { - 'click:close': e => true, - 'update:modelValue': value => true, - 'group:selected': val => true, - click: e => true - }, - setup(props, _ref) { - let { - attrs, - emit, - slots - } = _ref; - const { - t - } = useLocale(); - const { - borderClasses - } = useBorder(props); - const { - colorClasses, - colorStyles, - variantClasses - } = useVariant(props); - const { - densityClasses - } = useDensity(props); - const { - elevationClasses - } = useElevation(props); - const { - roundedClasses - } = useRounded(props); - const { - sizeClasses - } = useSize(props); - const { - themeClasses - } = provideTheme(props); - const isActive = useProxiedModel(props, 'modelValue'); - const group = useGroupItem(props, VChipGroupSymbol, false); - const link = useLink(props, attrs); - const isLink = computed$1s(() => props.link !== false && link.isLink.value); - const isClickable = computed$1s(() => !props.disabled && props.link !== false && (!!group || props.link || link.isClickable.value)); - const closeProps = computed$1s(() => ({ - 'aria-label': t(props.closeLabel), - onClick(e) { - e.preventDefault(); - e.stopPropagation(); - isActive.value = false; - emit('click:close', e); - } - })); - function onClick(e) { - emit('click', e); - if (!isClickable.value) return; - link.navigate?.(e); - group?.toggle(); - } - function onKeyDown(e) { - if (e.key === 'Enter' || e.key === ' ') { - e.preventDefault(); - onClick(e); - } - } - return () => { - const Tag = link.isLink.value ? 'a' : props.tag; - const hasAppendMedia = !!(props.appendIcon || props.appendAvatar); - const hasAppend = !!(hasAppendMedia || slots.append); - const hasClose = !!(slots.close || props.closable); - const hasFilter = !!(slots.filter || props.filter) && group; - const hasPrependMedia = !!(props.prependIcon || props.prependAvatar); - const hasPrepend = !!(hasPrependMedia || slots.prepend); - const hasColor = !group || group.isSelected.value; - return isActive.value && _withDirectives$h(_createVNode$1P(Tag, _mergeProps$S({ - "class": ['v-chip', { - 'v-chip--disabled': props.disabled, - 'v-chip--label': props.label, - 'v-chip--link': isClickable.value, - 'v-chip--filter': hasFilter, - 'v-chip--pill': props.pill - }, themeClasses.value, borderClasses.value, hasColor ? colorClasses.value : undefined, densityClasses.value, elevationClasses.value, roundedClasses.value, sizeClasses.value, variantClasses.value, group?.selectedClass.value, props.class], - "style": [hasColor ? colorStyles.value : undefined, props.style], - "disabled": props.disabled || undefined, - "draggable": props.draggable, - "tabindex": isClickable.value ? 0 : undefined, - "onClick": onClick, - "onKeydown": isClickable.value && !isLink.value && onKeyDown - }, link.linkProps), { - default: () => [genOverlays(isClickable.value, 'v-chip'), hasFilter && _createVNode$1P(VExpandXTransition, { - "key": "filter" - }, { - default: () => [_withDirectives$h(_createVNode$1P("div", { - "class": "v-chip__filter" - }, [!slots.filter ? _createVNode$1P(VIcon, { - "key": "filter-icon", - "icon": props.filterIcon - }, null) : _createVNode$1P(VDefaultsProvider, { - "key": "filter-defaults", - "disabled": !props.filterIcon, - "defaults": { - VIcon: { - icon: props.filterIcon - } - } - }, slots.filter)]), [[_vShow$9, group.isSelected.value]])] - }), hasPrepend && _createVNode$1P("div", { - "key": "prepend", - "class": "v-chip__prepend" - }, [!slots.prepend ? _createVNode$1P(_Fragment$x, null, [props.prependIcon && _createVNode$1P(VIcon, { - "key": "prepend-icon", - "icon": props.prependIcon, - "start": true - }, null), props.prependAvatar && _createVNode$1P(VAvatar, { - "key": "prepend-avatar", - "image": props.prependAvatar, - "start": true - }, null)]) : _createVNode$1P(VDefaultsProvider, { - "key": "prepend-defaults", - "disabled": !hasPrependMedia, - "defaults": { - VAvatar: { - image: props.prependAvatar, - start: true - }, - VIcon: { - icon: props.prependIcon, - start: true - } - } - }, slots.prepend)]), _createVNode$1P("div", { - "class": "v-chip__content", - "data-no-activator": "" - }, [slots.default?.({ - isSelected: group?.isSelected.value, - selectedClass: group?.selectedClass.value, - select: group?.select, - toggle: group?.toggle, - value: group?.value.value, - disabled: props.disabled - }) ?? props.text]), hasAppend && _createVNode$1P("div", { - "key": "append", - "class": "v-chip__append" - }, [!slots.append ? _createVNode$1P(_Fragment$x, null, [props.appendIcon && _createVNode$1P(VIcon, { - "key": "append-icon", - "end": true, - "icon": props.appendIcon - }, null), props.appendAvatar && _createVNode$1P(VAvatar, { - "key": "append-avatar", - "end": true, - "image": props.appendAvatar - }, null)]) : _createVNode$1P(VDefaultsProvider, { - "key": "append-defaults", - "disabled": !hasAppendMedia, - "defaults": { - VAvatar: { - end: true, - image: props.appendAvatar - }, - VIcon: { - end: true, - icon: props.appendIcon - } - } - }, slots.append)]), hasClose && _createVNode$1P("button", _mergeProps$S({ - "key": "close", - "class": "v-chip__close", - "type": "button", - "data-testid": "close-chip" - }, closeProps.value), [!slots.close ? _createVNode$1P(VIcon, { - "key": "close-icon", - "icon": props.closeIcon, - "size": "x-small" - }, null) : _createVNode$1P(VDefaultsProvider, { - "key": "close-defaults", - "defaults": { - VIcon: { - icon: props.closeIcon, - size: 'x-small' - } - } - }, slots.close)])] - }), [[_resolveDirective$P("ripple"), isClickable.value && props.ripple, null]]); - }; - } -}); - -// Utilities -const {computed: computed$1r,inject: inject$i,provide: provide$d,shallowRef: shallowRef$u} = await importShared('vue'); - -// List -const ListKey = Symbol.for('vuetify:list'); -function createList() { - const parent = inject$i(ListKey, { - hasPrepend: shallowRef$u(false), - updateHasPrepend: () => null - }); - const data = { - hasPrepend: shallowRef$u(false), - updateHasPrepend: value => { - if (value) data.hasPrepend.value = value; - } - }; - provide$d(ListKey, data); - return parent; -} -function useList() { - return inject$i(ListKey, null); -} - -/* eslint-disable sonarjs/no-identical-functions */ -// Utilities -const {toRaw: toRaw$4} = await importShared('vue'); -const independentActiveStrategy = mandatory => { - const strategy = { - activate: _ref => { - let { - id, - value, - activated - } = _ref; - id = toRaw$4(id); - - // When mandatory and we're trying to deselect when id - // is the only currently selected item then do nothing - if (mandatory && !value && activated.size === 1 && activated.has(id)) return activated; - if (value) { - activated.add(id); - } else { - activated.delete(id); - } - return activated; - }, - in: (v, children, parents) => { - let set = new Set(); - if (v != null) { - for (const id of wrapInArray(v)) { - set = strategy.activate({ - id, - value: true, - activated: new Set(set), - children, - parents - }); - } - } - return set; - }, - out: v => { - return Array.from(v); - } - }; - return strategy; -}; -const independentSingleActiveStrategy = mandatory => { - const parentStrategy = independentActiveStrategy(mandatory); - const strategy = { - activate: _ref2 => { - let { - activated, - id, - ...rest - } = _ref2; - id = toRaw$4(id); - const singleSelected = activated.has(id) ? new Set([id]) : new Set(); - return parentStrategy.activate({ - ...rest, - id, - activated: singleSelected - }); - }, - in: (v, children, parents) => { - let set = new Set(); - if (v != null) { - const arr = wrapInArray(v); - if (arr.length) { - set = parentStrategy.in(arr.slice(0, 1), children, parents); - } - } - return set; - }, - out: (v, children, parents) => { - return parentStrategy.out(v, children, parents); - } - }; - return strategy; -}; -const leafActiveStrategy = mandatory => { - const parentStrategy = independentActiveStrategy(mandatory); - const strategy = { - activate: _ref3 => { - let { - id, - activated, - children, - ...rest - } = _ref3; - id = toRaw$4(id); - if (children.has(id)) return activated; - return parentStrategy.activate({ - id, - activated, - children, - ...rest - }); - }, - in: parentStrategy.in, - out: parentStrategy.out - }; - return strategy; -}; -const leafSingleActiveStrategy = mandatory => { - const parentStrategy = independentSingleActiveStrategy(mandatory); - const strategy = { - activate: _ref4 => { - let { - id, - activated, - children, - ...rest - } = _ref4; - id = toRaw$4(id); - if (children.has(id)) return activated; - return parentStrategy.activate({ - id, - activated, - children, - ...rest - }); - }, - in: parentStrategy.in, - out: parentStrategy.out - }; - return strategy; -}; - -const singleOpenStrategy = { - open: _ref => { - let { - id, - value, - opened, - parents - } = _ref; - if (value) { - const newOpened = new Set(); - newOpened.add(id); - let parent = parents.get(id); - while (parent != null) { - newOpened.add(parent); - parent = parents.get(parent); - } - return newOpened; - } else { - opened.delete(id); - return opened; - } - }, - select: () => null -}; -const multipleOpenStrategy = { - open: _ref2 => { - let { - id, - value, - opened, - parents - } = _ref2; - if (value) { - let parent = parents.get(id); - opened.add(id); - while (parent != null && parent !== id) { - opened.add(parent); - parent = parents.get(parent); - } - return opened; - } else { - opened.delete(id); - } - return opened; - }, - select: () => null -}; -const listOpenStrategy = { - open: multipleOpenStrategy.open, - select: _ref3 => { - let { - id, - value, - opened, - parents - } = _ref3; - if (!value) return opened; - const path = []; - let parent = parents.get(id); - while (parent != null) { - path.push(parent); - parent = parents.get(parent); - } - return new Set(path); - } -}; - -/* eslint-disable sonarjs/no-identical-functions */ -// Utilities -const {toRaw: toRaw$3} = await importShared('vue'); - -const independentSelectStrategy = mandatory => { - const strategy = { - select: _ref => { - let { - id, - value, - selected - } = _ref; - id = toRaw$3(id); - - // When mandatory and we're trying to deselect when id - // is the only currently selected item then do nothing - if (mandatory && !value) { - const on = Array.from(selected.entries()).reduce((arr, _ref2) => { - let [key, value] = _ref2; - if (value === 'on') arr.push(key); - return arr; - }, []); - if (on.length === 1 && on[0] === id) return selected; - } - selected.set(id, value ? 'on' : 'off'); - return selected; - }, - in: (v, children, parents) => { - let map = new Map(); - for (const id of v || []) { - map = strategy.select({ - id, - value: true, - selected: new Map(map), - children, - parents - }); - } - return map; - }, - out: v => { - const arr = []; - for (const [key, value] of v.entries()) { - if (value === 'on') arr.push(key); - } - return arr; - } - }; - return strategy; -}; -const independentSingleSelectStrategy = mandatory => { - const parentStrategy = independentSelectStrategy(mandatory); - const strategy = { - select: _ref3 => { - let { - selected, - id, - ...rest - } = _ref3; - id = toRaw$3(id); - const singleSelected = selected.has(id) ? new Map([[id, selected.get(id)]]) : new Map(); - return parentStrategy.select({ - ...rest, - id, - selected: singleSelected - }); - }, - in: (v, children, parents) => { - let map = new Map(); - if (v?.length) { - map = parentStrategy.in(v.slice(0, 1), children, parents); - } - return map; - }, - out: (v, children, parents) => { - return parentStrategy.out(v, children, parents); - } - }; - return strategy; -}; -const leafSelectStrategy = mandatory => { - const parentStrategy = independentSelectStrategy(mandatory); - const strategy = { - select: _ref4 => { - let { - id, - selected, - children, - ...rest - } = _ref4; - id = toRaw$3(id); - if (children.has(id)) return selected; - return parentStrategy.select({ - id, - selected, - children, - ...rest - }); - }, - in: parentStrategy.in, - out: parentStrategy.out - }; - return strategy; -}; -const leafSingleSelectStrategy = mandatory => { - const parentStrategy = independentSingleSelectStrategy(mandatory); - const strategy = { - select: _ref5 => { - let { - id, - selected, - children, - ...rest - } = _ref5; - id = toRaw$3(id); - if (children.has(id)) return selected; - return parentStrategy.select({ - id, - selected, - children, - ...rest - }); - }, - in: parentStrategy.in, - out: parentStrategy.out - }; - return strategy; -}; -const classicSelectStrategy = mandatory => { - const strategy = { - select: _ref6 => { - let { - id, - value, - selected, - children, - parents - } = _ref6; - id = toRaw$3(id); - const original = new Map(selected); - const items = [id]; - while (items.length) { - const item = items.shift(); - selected.set(toRaw$3(item), value ? 'on' : 'off'); - if (children.has(item)) { - items.push(...children.get(item)); - } - } - let parent = toRaw$3(parents.get(id)); - while (parent) { - const childrenIds = children.get(parent); - const everySelected = childrenIds.every(cid => selected.get(toRaw$3(cid)) === 'on'); - const noneSelected = childrenIds.every(cid => !selected.has(toRaw$3(cid)) || selected.get(toRaw$3(cid)) === 'off'); - selected.set(parent, everySelected ? 'on' : noneSelected ? 'off' : 'indeterminate'); - parent = toRaw$3(parents.get(parent)); - } - - // If mandatory and planned deselect results in no selected - // items then we can't do it, so return original state - if (mandatory && !value) { - const on = Array.from(selected.entries()).reduce((arr, _ref7) => { - let [key, value] = _ref7; - if (value === 'on') arr.push(key); - return arr; - }, []); - if (on.length === 0) return original; - } - return selected; - }, - in: (v, children, parents) => { - let map = new Map(); - for (const id of v || []) { - map = strategy.select({ - id, - value: true, - selected: new Map(map), - children, - parents - }); - } - return map; - }, - out: (v, children) => { - const arr = []; - for (const [key, value] of v.entries()) { - if (value === 'on' && !children.has(key)) arr.push(key); - } - return arr; - } - }; - return strategy; -}; - -const {computed: computed$1q,inject: inject$h,onBeforeUnmount: onBeforeUnmount$6,provide: provide$c,ref: ref$G,shallowRef: shallowRef$t,toRaw: toRaw$2,toRef: toRef$y} = await importShared('vue'); -const VNestedSymbol = Symbol.for('vuetify:nested'); -const emptyNested = { - id: shallowRef$t(), - root: { - register: () => null, - unregister: () => null, - parents: ref$G(new Map()), - children: ref$G(new Map()), - open: () => null, - openOnSelect: () => null, - activate: () => null, - select: () => null, - activatable: ref$G(false), - selectable: ref$G(false), - opened: ref$G(new Set()), - activated: ref$G(new Set()), - selected: ref$G(new Map()), - selectedValues: ref$G([]), - getPath: () => [] - } -}; -const makeNestedProps = propsFactory({ - activatable: Boolean, - selectable: Boolean, - activeStrategy: [String, Function, Object], - selectStrategy: [String, Function, Object], - openStrategy: [String, Object], - opened: null, - activated: null, - selected: null, - mandatory: Boolean -}, 'nested'); -const useNested = props => { - let isUnmounted = false; - const children = ref$G(new Map()); - const parents = ref$G(new Map()); - const opened = useProxiedModel(props, 'opened', props.opened, v => new Set(v), v => [...v.values()]); - const activeStrategy = computed$1q(() => { - if (typeof props.activeStrategy === 'object') return props.activeStrategy; - if (typeof props.activeStrategy === 'function') return props.activeStrategy(props.mandatory); - switch (props.activeStrategy) { - case 'leaf': - return leafActiveStrategy(props.mandatory); - case 'single-leaf': - return leafSingleActiveStrategy(props.mandatory); - case 'independent': - return independentActiveStrategy(props.mandatory); - case 'single-independent': - default: - return independentSingleActiveStrategy(props.mandatory); - } - }); - const selectStrategy = computed$1q(() => { - if (typeof props.selectStrategy === 'object') return props.selectStrategy; - if (typeof props.selectStrategy === 'function') return props.selectStrategy(props.mandatory); - switch (props.selectStrategy) { - case 'single-leaf': - return leafSingleSelectStrategy(props.mandatory); - case 'leaf': - return leafSelectStrategy(props.mandatory); - case 'independent': - return independentSelectStrategy(props.mandatory); - case 'single-independent': - return independentSingleSelectStrategy(props.mandatory); - case 'classic': - default: - return classicSelectStrategy(props.mandatory); - } - }); - const openStrategy = computed$1q(() => { - if (typeof props.openStrategy === 'object') return props.openStrategy; - switch (props.openStrategy) { - case 'list': - return listOpenStrategy; - case 'single': - return singleOpenStrategy; - case 'multiple': - default: - return multipleOpenStrategy; - } - }); - const activated = useProxiedModel(props, 'activated', props.activated, v => activeStrategy.value.in(v, children.value, parents.value), v => activeStrategy.value.out(v, children.value, parents.value)); - const selected = useProxiedModel(props, 'selected', props.selected, v => selectStrategy.value.in(v, children.value, parents.value), v => selectStrategy.value.out(v, children.value, parents.value)); - onBeforeUnmount$6(() => { - isUnmounted = true; - }); - function getPath(id) { - const path = []; - let parent = id; - while (parent != null) { - path.unshift(parent); - parent = parents.value.get(parent); - } - return path; - } - const vm = getCurrentInstance('nested'); - const nodeIds = new Set(); - const nested = { - id: shallowRef$t(), - root: { - opened, - activatable: toRef$y(props, 'activatable'), - selectable: toRef$y(props, 'selectable'), - activated, - selected, - selectedValues: computed$1q(() => { - const arr = []; - for (const [key, value] of selected.value.entries()) { - if (value === 'on') arr.push(key); - } - return arr; - }), - register: (id, parentId, isGroup) => { - if (nodeIds.has(id)) { - const path = getPath(id).map(String).join(' -> '); - const newPath = getPath(parentId).concat(id).map(String).join(' -> '); - consoleError(`Multiple nodes with the same ID\n\t${path}\n\t${newPath}`); - return; - } else { - nodeIds.add(id); - } - parentId && id !== parentId && parents.value.set(id, parentId); - isGroup && children.value.set(id, []); - if (parentId != null) { - children.value.set(parentId, [...(children.value.get(parentId) || []), id]); - } - }, - unregister: id => { - if (isUnmounted) return; - nodeIds.delete(id); - children.value.delete(id); - const parent = parents.value.get(id); - if (parent) { - const list = children.value.get(parent) ?? []; - children.value.set(parent, list.filter(child => child !== id)); - } - parents.value.delete(id); - }, - open: (id, value, event) => { - vm.emit('click:open', { - id, - value, - path: getPath(id), - event - }); - const newOpened = openStrategy.value.open({ - id, - value, - opened: new Set(opened.value), - children: children.value, - parents: parents.value, - event - }); - newOpened && (opened.value = newOpened); - }, - openOnSelect: (id, value, event) => { - const newOpened = openStrategy.value.select({ - id, - value, - selected: new Map(selected.value), - opened: new Set(opened.value), - children: children.value, - parents: parents.value, - event - }); - newOpened && (opened.value = newOpened); - }, - select: (id, value, event) => { - vm.emit('click:select', { - id, - value, - path: getPath(id), - event - }); - const newSelected = selectStrategy.value.select({ - id, - value, - selected: new Map(selected.value), - children: children.value, - parents: parents.value, - event - }); - newSelected && (selected.value = newSelected); - nested.root.openOnSelect(id, value, event); - }, - activate: (id, value, event) => { - if (!props.activatable) { - return nested.root.select(id, true, event); - } - vm.emit('click:activate', { - id, - value, - path: getPath(id), - event - }); - const newActivated = activeStrategy.value.activate({ - id, - value, - activated: new Set(activated.value), - children: children.value, - parents: parents.value, - event - }); - newActivated && (activated.value = newActivated); - }, - children, - parents, - getPath - } - }; - provide$c(VNestedSymbol, nested); - return nested.root; -}; -const useNestedItem = (id, isGroup) => { - const parent = inject$h(VNestedSymbol, emptyNested); - const uidSymbol = Symbol(getUid()); - const computedId = computed$1q(() => id.value !== undefined ? id.value : uidSymbol); - const item = { - ...parent, - id: computedId, - open: (open, e) => parent.root.open(computedId.value, open, e), - openOnSelect: (open, e) => parent.root.openOnSelect(computedId.value, open, e), - isOpen: computed$1q(() => parent.root.opened.value.has(computedId.value)), - parent: computed$1q(() => parent.root.parents.value.get(computedId.value)), - activate: (activated, e) => parent.root.activate(computedId.value, activated, e), - isActivated: computed$1q(() => parent.root.activated.value.has(toRaw$2(computedId.value))), - select: (selected, e) => parent.root.select(computedId.value, selected, e), - isSelected: computed$1q(() => parent.root.selected.value.get(toRaw$2(computedId.value)) === 'on'), - isIndeterminate: computed$1q(() => parent.root.selected.value.get(computedId.value) === 'indeterminate'), - isLeaf: computed$1q(() => !parent.root.children.value.get(computedId.value)), - isGroupActivator: parent.isGroupActivator - }; - !parent.isGroupActivator && parent.root.register(computedId.value, parent.id.value, isGroup); - onBeforeUnmount$6(() => { - !parent.isGroupActivator && parent.root.unregister(computedId.value); - }); - isGroup && provide$c(VNestedSymbol, item); - return item; -}; -const useNestedGroupActivator = () => { - const parent = inject$h(VNestedSymbol, emptyNested); - provide$c(VNestedSymbol, { - ...parent, - isGroupActivator: true - }); -}; - -const {withDirectives:_withDirectives$g,vShow:_vShow$8,createVNode:_createVNode$1O} = await importShared('vue'); -const {computed: computed$1p,toRef: toRef$x} = await importShared('vue'); -const VListGroupActivator = defineComponent({ - name: 'VListGroupActivator', - setup(_, _ref) { - let { - slots - } = _ref; - useNestedGroupActivator(); - return () => slots.default?.(); - } -}); -const makeVListGroupProps = propsFactory({ - /* @deprecated */ - activeColor: String, - baseColor: String, - color: String, - collapseIcon: { - type: IconValue, - default: '$collapse' - }, - expandIcon: { - type: IconValue, - default: '$expand' - }, - prependIcon: IconValue, - appendIcon: IconValue, - fluid: Boolean, - subgroup: Boolean, - title: String, - value: null, - ...makeComponentProps(), - ...makeTagProps() -}, 'VListGroup'); -const VListGroup = genericComponent()({ - name: 'VListGroup', - props: makeVListGroupProps(), - setup(props, _ref2) { - let { - slots - } = _ref2; - const { - isOpen, - open, - id: _id - } = useNestedItem(toRef$x(props, 'value'), true); - const id = computed$1p(() => `v-list-group--id-${String(_id.value)}`); - const list = useList(); - const { - isBooted - } = useSsrBoot(); - function onClick(e) { - e.stopPropagation(); - open(!isOpen.value, e); - } - const activatorProps = computed$1p(() => ({ - onClick, - class: 'v-list-group__header', - id: id.value - })); - const toggleIcon = computed$1p(() => isOpen.value ? props.collapseIcon : props.expandIcon); - const activatorDefaults = computed$1p(() => ({ - VListItem: { - active: isOpen.value, - activeColor: props.activeColor, - baseColor: props.baseColor, - color: props.color, - prependIcon: props.prependIcon || props.subgroup && toggleIcon.value, - appendIcon: props.appendIcon || !props.subgroup && toggleIcon.value, - title: props.title, - value: props.value - } - })); - useRender(() => _createVNode$1O(props.tag, { - "class": ['v-list-group', { - 'v-list-group--prepend': list?.hasPrepend.value, - 'v-list-group--fluid': props.fluid, - 'v-list-group--subgroup': props.subgroup, - 'v-list-group--open': isOpen.value - }, props.class], - "style": props.style - }, { - default: () => [slots.activator && _createVNode$1O(VDefaultsProvider, { - "defaults": activatorDefaults.value - }, { - default: () => [_createVNode$1O(VListGroupActivator, null, { - default: () => [slots.activator({ - props: activatorProps.value, - isOpen: isOpen.value - })] - })] - }), _createVNode$1O(MaybeTransition, { - "transition": { - component: VExpandTransition - }, - "disabled": !isBooted.value - }, { - default: () => [_withDirectives$g(_createVNode$1O("div", { - "class": "v-list-group__items", - "role": "group", - "aria-labelledby": id.value - }, [slots.default?.()]), [[_vShow$8, isOpen.value]])] - })] - })); - return { - isOpen - }; - } -}); - -const {createVNode:_createVNode$1N,resolveDirective:_resolveDirective$O} = await importShared('vue'); -const makeVListItemSubtitleProps = propsFactory({ - opacity: [Number, String], - ...makeComponentProps(), - ...makeTagProps() -}, 'VListItemSubtitle'); -const VListItemSubtitle = genericComponent()({ - name: 'VListItemSubtitle', - props: makeVListItemSubtitleProps(), - setup(props, _ref) { - let { - slots - } = _ref; - useRender(() => _createVNode$1N(props.tag, { - "class": ['v-list-item-subtitle', props.class], - "style": [{ - '--v-list-item-subtitle-opacity': props.opacity - }, props.style] - }, slots)); - return {}; - } -}); - -// Utilities -const VListItemTitle = createSimpleFunctional('v-list-item-title'); - -const {withDirectives:_withDirectives$f,mergeProps:_mergeProps$R,resolveDirective:_resolveDirective$N,createVNode:_createVNode$1M,Fragment:_Fragment$w} = await importShared('vue'); -const {computed: computed$1o,watch: watch$v} = await importShared('vue'); -const makeVListItemProps = propsFactory({ - active: { - type: Boolean, - default: undefined - }, - activeClass: String, - /* @deprecated */ - activeColor: String, - appendAvatar: String, - appendIcon: IconValue, - baseColor: String, - disabled: Boolean, - lines: [Boolean, String], - link: { - type: Boolean, - default: undefined - }, - nav: Boolean, - prependAvatar: String, - prependIcon: IconValue, - ripple: { - type: [Boolean, Object], - default: true - }, - slim: Boolean, - subtitle: [String, Number], - title: [String, Number], - value: null, - onClick: EventProp(), - onClickOnce: EventProp(), - ...makeBorderProps(), - ...makeComponentProps(), - ...makeDensityProps(), - ...makeDimensionProps(), - ...makeElevationProps(), - ...makeRoundedProps(), - ...makeRouterProps(), - ...makeTagProps(), - ...makeThemeProps(), - ...makeVariantProps({ - variant: 'text' - }) -}, 'VListItem'); -const VListItem = genericComponent()({ - name: 'VListItem', - directives: { - Ripple - }, - props: makeVListItemProps(), - emits: { - click: e => true - }, - setup(props, _ref) { - let { - attrs, - slots, - emit - } = _ref; - const link = useLink(props, attrs); - const id = computed$1o(() => props.value === undefined ? link.href.value : props.value); - const { - activate, - isActivated, - select, - isOpen, - isSelected, - isIndeterminate, - isGroupActivator, - root, - parent, - openOnSelect, - id: uid - } = useNestedItem(id, false); - const list = useList(); - const isActive = computed$1o(() => props.active !== false && (props.active || link.isActive?.value || (root.activatable.value ? isActivated.value : isSelected.value))); - const isLink = computed$1o(() => props.link !== false && link.isLink.value); - const isClickable = computed$1o(() => !props.disabled && props.link !== false && (props.link || link.isClickable.value || !!list && (root.selectable.value || root.activatable.value || props.value != null))); - const roundedProps = computed$1o(() => props.rounded || props.nav); - const color = computed$1o(() => props.color ?? props.activeColor); - const variantProps = computed$1o(() => ({ - color: isActive.value ? color.value ?? props.baseColor : props.baseColor, - variant: props.variant - })); - watch$v(() => link.isActive?.value, val => { - if (val && parent.value != null) { - root.open(parent.value, true); - } - if (val) { - openOnSelect(val); - } - }, { - immediate: true - }); - const { - themeClasses - } = provideTheme(props); - const { - borderClasses - } = useBorder(props); - const { - colorClasses, - colorStyles, - variantClasses - } = useVariant(variantProps); - const { - densityClasses - } = useDensity(props); - const { - dimensionStyles - } = useDimension(props); - const { - elevationClasses - } = useElevation(props); - const { - roundedClasses - } = useRounded(roundedProps); - const lineClasses = computed$1o(() => props.lines ? `v-list-item--${props.lines}-line` : undefined); - const slotProps = computed$1o(() => ({ - isActive: isActive.value, - select, - isOpen: isOpen.value, - isSelected: isSelected.value, - isIndeterminate: isIndeterminate.value - })); - function onClick(e) { - emit('click', e); - if (!isClickable.value) return; - link.navigate?.(e); - if (isGroupActivator) return; - if (root.activatable.value) { - activate(!isActivated.value, e); - } else if (root.selectable.value) { - select(!isSelected.value, e); - } else if (props.value != null) { - select(!isSelected.value, e); - } - } - function onKeyDown(e) { - if (e.key === 'Enter' || e.key === ' ') { - e.preventDefault(); - e.target.dispatchEvent(new MouseEvent('click', e)); - } - } - useRender(() => { - const Tag = isLink.value ? 'a' : props.tag; - const hasTitle = slots.title || props.title != null; - const hasSubtitle = slots.subtitle || props.subtitle != null; - const hasAppendMedia = !!(props.appendAvatar || props.appendIcon); - const hasAppend = !!(hasAppendMedia || slots.append); - const hasPrependMedia = !!(props.prependAvatar || props.prependIcon); - const hasPrepend = !!(hasPrependMedia || slots.prepend); - list?.updateHasPrepend(hasPrepend); - if (props.activeColor) { - deprecate('active-color', ['color', 'base-color']); - } - return _withDirectives$f(_createVNode$1M(Tag, _mergeProps$R({ - "class": ['v-list-item', { - 'v-list-item--active': isActive.value, - 'v-list-item--disabled': props.disabled, - 'v-list-item--link': isClickable.value, - 'v-list-item--nav': props.nav, - 'v-list-item--prepend': !hasPrepend && list?.hasPrepend.value, - 'v-list-item--slim': props.slim, - [`${props.activeClass}`]: props.activeClass && isActive.value - }, themeClasses.value, borderClasses.value, colorClasses.value, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value, variantClasses.value, props.class], - "style": [colorStyles.value, dimensionStyles.value, props.style], - "tabindex": isClickable.value ? list ? -2 : 0 : undefined, - "aria-selected": root.activatable.value ? isActivated.value : isSelected.value, - "onClick": onClick, - "onKeydown": isClickable.value && !isLink.value && onKeyDown - }, link.linkProps), { - default: () => [genOverlays(isClickable.value || isActive.value, 'v-list-item'), hasPrepend && _createVNode$1M("div", { - "key": "prepend", - "class": "v-list-item__prepend" - }, [!slots.prepend ? _createVNode$1M(_Fragment$w, null, [props.prependAvatar && _createVNode$1M(VAvatar, { - "key": "prepend-avatar", - "density": props.density, - "image": props.prependAvatar - }, null), props.prependIcon && _createVNode$1M(VIcon, { - "key": "prepend-icon", - "density": props.density, - "icon": props.prependIcon - }, null)]) : _createVNode$1M(VDefaultsProvider, { - "key": "prepend-defaults", - "disabled": !hasPrependMedia, - "defaults": { - VAvatar: { - density: props.density, - image: props.prependAvatar - }, - VIcon: { - density: props.density, - icon: props.prependIcon - }, - VListItemAction: { - start: true - } - } - }, { - default: () => [slots.prepend?.(slotProps.value)] - }), _createVNode$1M("div", { - "class": "v-list-item__spacer" - }, null)]), _createVNode$1M("div", { - "class": "v-list-item__content", - "data-no-activator": "" - }, [hasTitle && _createVNode$1M(VListItemTitle, { - "key": "title" - }, { - default: () => [slots.title?.({ - title: props.title - }) ?? props.title] - }), hasSubtitle && _createVNode$1M(VListItemSubtitle, { - "key": "subtitle" - }, { - default: () => [slots.subtitle?.({ - subtitle: props.subtitle - }) ?? props.subtitle] - }), slots.default?.(slotProps.value)]), hasAppend && _createVNode$1M("div", { - "key": "append", - "class": "v-list-item__append" - }, [!slots.append ? _createVNode$1M(_Fragment$w, null, [props.appendIcon && _createVNode$1M(VIcon, { - "key": "append-icon", - "density": props.density, - "icon": props.appendIcon - }, null), props.appendAvatar && _createVNode$1M(VAvatar, { - "key": "append-avatar", - "density": props.density, - "image": props.appendAvatar - }, null)]) : _createVNode$1M(VDefaultsProvider, { - "key": "append-defaults", - "disabled": !hasAppendMedia, - "defaults": { - VAvatar: { - density: props.density, - image: props.appendAvatar - }, - VIcon: { - density: props.density, - icon: props.appendIcon - }, - VListItemAction: { - end: true - } - } - }, { - default: () => [slots.append?.(slotProps.value)] - }), _createVNode$1M("div", { - "class": "v-list-item__spacer" - }, null)])] - }), [[_resolveDirective$N("ripple"), isClickable.value && props.ripple]]); - }); - return { - activate, - isActivated, - isGroupActivator, - isSelected, - list, - select, - root, - id: uid - }; - } -}); - -const {createVNode:_createVNode$1L} = await importShared('vue'); -const {toRef: toRef$w} = await importShared('vue'); -const makeVListSubheaderProps = propsFactory({ - color: String, - inset: Boolean, - sticky: Boolean, - title: String, - ...makeComponentProps(), - ...makeTagProps() -}, 'VListSubheader'); -const VListSubheader = genericComponent()({ - name: 'VListSubheader', - props: makeVListSubheaderProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - textColorClasses, - textColorStyles - } = useTextColor(toRef$w(props, 'color')); - useRender(() => { - const hasText = !!(slots.default || props.title); - return _createVNode$1L(props.tag, { - "class": ['v-list-subheader', { - 'v-list-subheader--inset': props.inset, - 'v-list-subheader--sticky': props.sticky - }, textColorClasses.value, props.class], - "style": [{ - textColorStyles - }, props.style] - }, { - default: () => [hasText && _createVNode$1L("div", { - "class": "v-list-subheader__text" - }, [slots.default?.() ?? props.title])] - }); - }); - return {}; - } -}); - -const {createVNode:_createVNode$1K} = await importShared('vue'); -const {computed: computed$1n,toRef: toRef$v} = await importShared('vue'); -const makeVDividerProps = propsFactory({ - color: String, - inset: Boolean, - length: [Number, String], - opacity: [Number, String], - thickness: [Number, String], - vertical: Boolean, - ...makeComponentProps(), - ...makeThemeProps() -}, 'VDivider'); -const VDivider = genericComponent()({ - name: 'VDivider', - props: makeVDividerProps(), - setup(props, _ref) { - let { - attrs, - slots - } = _ref; - const { - themeClasses - } = provideTheme(props); - const { - textColorClasses, - textColorStyles - } = useTextColor(toRef$v(props, 'color')); - const dividerStyles = computed$1n(() => { - const styles = {}; - if (props.length) { - styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length); - } - if (props.thickness) { - styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness); - } - return styles; - }); - useRender(() => { - const divider = _createVNode$1K("hr", { - "class": [{ - 'v-divider': true, - 'v-divider--inset': props.inset, - 'v-divider--vertical': props.vertical - }, themeClasses.value, textColorClasses.value, props.class], - "style": [dividerStyles.value, textColorStyles.value, { - '--v-border-opacity': props.opacity - }, props.style], - "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined, - "role": `${attrs.role || 'separator'}` - }, null); - if (!slots.default) return divider; - return _createVNode$1K("div", { - "class": ['v-divider__wrapper', { - 'v-divider__wrapper--vertical': props.vertical, - 'v-divider__wrapper--inset': props.inset - }] - }, [divider, _createVNode$1K("div", { - "class": "v-divider__content" - }, [slots.default()]), divider]); - }); - return {}; - } -}); - -const {mergeProps:_mergeProps$Q,resolveDirective:_resolveDirective$M,createVNode:_createVNode$1J} = await importShared('vue'); -const makeVListChildrenProps = propsFactory({ - items: Array, - returnObject: Boolean -}, 'VListChildren'); -const VListChildren = genericComponent()({ - name: 'VListChildren', - props: makeVListChildrenProps(), - setup(props, _ref) { - let { - slots - } = _ref; - createList(); - return () => slots.default?.() ?? props.items?.map(_ref2 => { - let { - children, - props: itemProps, - type, - raw: item - } = _ref2; - if (type === 'divider') { - return slots.divider?.({ - props: itemProps - }) ?? _createVNode$1J(VDivider, itemProps, null); - } - if (type === 'subheader') { - return slots.subheader?.({ - props: itemProps - }) ?? _createVNode$1J(VListSubheader, itemProps, null); - } - const slotsWithItem = { - subtitle: slots.subtitle ? slotProps => slots.subtitle?.({ - ...slotProps, - item - }) : undefined, - prepend: slots.prepend ? slotProps => slots.prepend?.({ - ...slotProps, - item - }) : undefined, - append: slots.append ? slotProps => slots.append?.({ - ...slotProps, - item - }) : undefined, - title: slots.title ? slotProps => slots.title?.({ - ...slotProps, - item - }) : undefined - }; - const listGroupProps = VListGroup.filterProps(itemProps); - return children ? _createVNode$1J(VListGroup, _mergeProps$Q({ - "value": itemProps?.value - }, listGroupProps), { - activator: _ref3 => { - let { - props: activatorProps - } = _ref3; - const listItemProps = { - ...itemProps, - ...activatorProps, - value: props.returnObject ? item : itemProps.value - }; - return slots.header ? slots.header({ - props: listItemProps - }) : _createVNode$1J(VListItem, listItemProps, slotsWithItem); - }, - default: () => _createVNode$1J(VListChildren, { - "items": children, - "returnObject": props.returnObject - }, slots) - }) : slots.item ? slots.item({ - props: itemProps - }) : _createVNode$1J(VListItem, _mergeProps$Q(itemProps, { - "value": props.returnObject ? item : itemProps.value - }), slotsWithItem); - }); - } -}); - -// Utilities -const {computed: computed$1m} = await importShared('vue'); -// Composables -const makeItemsProps = propsFactory({ - items: { - type: Array, - default: () => [] - }, - itemTitle: { - type: [String, Array, Function], - default: 'title' - }, - itemValue: { - type: [String, Array, Function], - default: 'value' - }, - itemChildren: { - type: [Boolean, String, Array, Function], - default: 'children' - }, - itemProps: { - type: [Boolean, String, Array, Function], - default: 'props' - }, - returnObject: Boolean, - valueComparator: { - type: Function, - default: deepEqual - } -}, 'list-items'); -function transformItem$3(props, item) { - const title = getPropertyFromItem(item, props.itemTitle, item); - const value = getPropertyFromItem(item, props.itemValue, title); - const children = getPropertyFromItem(item, props.itemChildren); - const itemProps = props.itemProps === true ? typeof item === 'object' && item != null && !Array.isArray(item) ? 'children' in item ? omit(item, ['children']) : item : undefined : getPropertyFromItem(item, props.itemProps); - const _props = { - title, - value, - ...itemProps - }; - return { - title: String(_props.title ?? ''), - value: _props.value, - props: _props, - children: Array.isArray(children) ? transformItems$3(props, children) : undefined, - raw: item - }; -} -function transformItems$3(props, items) { - const array = []; - for (const item of items) { - array.push(transformItem$3(props, item)); - } - return array; -} -function useItems(props) { - const items = computed$1m(() => transformItems$3(props, props.items)); - const hasNullItem = computed$1m(() => items.value.some(item => item.value === null)); - function transformIn(value) { - if (!hasNullItem.value) { - // When the model value is null, return an InternalItem - // based on null only if null is one of the items - value = value.filter(v => v !== null); - } - return value.map(v => { - if (props.returnObject && typeof v === 'string') { - // String model value means value is a custom input value from combobox - // Don't look up existing items if the model value is a string - return transformItem$3(props, v); - } - return items.value.find(item => props.valueComparator(v, item.value)) || transformItem$3(props, v); - }); - } - function transformOut(value) { - return props.returnObject ? value.map(_ref => { - let { - raw - } = _ref; - return raw; - }) : value.map(_ref2 => { - let { - value - } = _ref2; - return value; - }); - } - return { - items, - transformIn, - transformOut - }; -} - -const {createVNode:_createVNode$1I,resolveDirective:_resolveDirective$L} = await importShared('vue'); -const {computed: computed$1l,ref: ref$F,shallowRef: shallowRef$s,toRef: toRef$u} = await importShared('vue'); -function isPrimitive(value) { - return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean'; -} -function transformItem$2(props, item) { - const type = getPropertyFromItem(item, props.itemType, 'item'); - const title = isPrimitive(item) ? item : getPropertyFromItem(item, props.itemTitle); - const value = getPropertyFromItem(item, props.itemValue, undefined); - const children = getPropertyFromItem(item, props.itemChildren); - const itemProps = props.itemProps === true ? omit(item, ['children']) : getPropertyFromItem(item, props.itemProps); - const _props = { - title, - value, - ...itemProps - }; - return { - type, - title: _props.title, - value: _props.value, - props: _props, - children: type === 'item' && children ? transformItems$2(props, children) : undefined, - raw: item - }; -} -function transformItems$2(props, items) { - const array = []; - for (const item of items) { - array.push(transformItem$2(props, item)); - } - return array; -} -function useListItems(props) { - const items = computed$1l(() => transformItems$2(props, props.items)); - return { - items - }; -} -const makeVListProps = propsFactory({ - baseColor: String, - /* @deprecated */ - activeColor: String, - activeClass: String, - bgColor: String, - disabled: Boolean, - expandIcon: String, - collapseIcon: String, - lines: { - type: [Boolean, String], - default: 'one' - }, - slim: Boolean, - nav: Boolean, - 'onClick:open': EventProp(), - 'onClick:select': EventProp(), - 'onUpdate:opened': EventProp(), - ...makeNestedProps({ - selectStrategy: 'single-leaf', - openStrategy: 'list' - }), - ...makeBorderProps(), - ...makeComponentProps(), - ...makeDensityProps(), - ...makeDimensionProps(), - ...makeElevationProps(), - itemType: { - type: String, - default: 'type' - }, - ...makeItemsProps(), - ...makeRoundedProps(), - ...makeTagProps(), - ...makeThemeProps(), - ...makeVariantProps({ - variant: 'text' - }) -}, 'VList'); -const VList = genericComponent()({ - name: 'VList', - props: makeVListProps(), - emits: { - 'update:selected': value => true, - 'update:activated': value => true, - 'update:opened': value => true, - 'click:open': value => true, - 'click:activate': value => true, - 'click:select': value => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const { - items - } = useListItems(props); - const { - themeClasses - } = provideTheme(props); - const { - backgroundColorClasses, - backgroundColorStyles - } = useBackgroundColor(toRef$u(props, 'bgColor')); - const { - borderClasses - } = useBorder(props); - const { - densityClasses - } = useDensity(props); - const { - dimensionStyles - } = useDimension(props); - const { - elevationClasses - } = useElevation(props); - const { - roundedClasses - } = useRounded(props); - const { - children, - open, - parents, - select, - getPath - } = useNested(props); - const lineClasses = computed$1l(() => props.lines ? `v-list--${props.lines}-line` : undefined); - const activeColor = toRef$u(props, 'activeColor'); - const baseColor = toRef$u(props, 'baseColor'); - const color = toRef$u(props, 'color'); - createList(); - provideDefaults({ - VListGroup: { - activeColor, - baseColor, - color, - expandIcon: toRef$u(props, 'expandIcon'), - collapseIcon: toRef$u(props, 'collapseIcon') - }, - VListItem: { - activeClass: toRef$u(props, 'activeClass'), - activeColor, - baseColor, - color, - density: toRef$u(props, 'density'), - disabled: toRef$u(props, 'disabled'), - lines: toRef$u(props, 'lines'), - nav: toRef$u(props, 'nav'), - slim: toRef$u(props, 'slim'), - variant: toRef$u(props, 'variant') - } - }); - const isFocused = shallowRef$s(false); - const contentRef = ref$F(); - function onFocusin(e) { - isFocused.value = true; - } - function onFocusout(e) { - isFocused.value = false; - } - function onFocus(e) { - if (!isFocused.value && !(e.relatedTarget && contentRef.value?.contains(e.relatedTarget))) focus(); - } - function onKeydown(e) { - const target = e.target; - if (!contentRef.value || ['INPUT', 'TEXTAREA'].includes(target.tagName)) return; - if (e.key === 'ArrowDown') { - focus('next'); - } else if (e.key === 'ArrowUp') { - focus('prev'); - } else if (e.key === 'Home') { - focus('first'); - } else if (e.key === 'End') { - focus('last'); - } else { - return; - } - e.preventDefault(); - } - function onMousedown(e) { - isFocused.value = true; - } - function focus(location) { - if (contentRef.value) { - return focusChild(contentRef.value, location); - } - } - useRender(() => { - return _createVNode$1I(props.tag, { - "ref": contentRef, - "class": ['v-list', { - 'v-list--disabled': props.disabled, - 'v-list--nav': props.nav, - 'v-list--slim': props.slim - }, themeClasses.value, backgroundColorClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value, props.class], - "style": [backgroundColorStyles.value, dimensionStyles.value, props.style], - "tabindex": props.disabled || isFocused.value ? -1 : 0, - "role": "listbox", - "aria-activedescendant": undefined, - "onFocusin": onFocusin, - "onFocusout": onFocusout, - "onFocus": onFocus, - "onKeydown": onKeydown, - "onMousedown": onMousedown - }, { - default: () => [_createVNode$1I(VListChildren, { - "items": items.value, - "returnObject": props.returnObject - }, slots)] - }); - }); - return { - open, - select, - focus, - children, - parents, - getPath - }; - } -}); - -// Utilities -const VListImg = createSimpleFunctional('v-list-img'); - -const {createVNode:_createVNode$1H,resolveDirective:_resolveDirective$K} = await importShared('vue'); -const makeVListItemActionProps = propsFactory({ - start: Boolean, - end: Boolean, - ...makeComponentProps(), - ...makeTagProps() -}, 'VListItemAction'); -const VListItemAction = genericComponent()({ - name: 'VListItemAction', - props: makeVListItemActionProps(), - setup(props, _ref) { - let { - slots - } = _ref; - useRender(() => _createVNode$1H(props.tag, { - "class": ['v-list-item-action', { - 'v-list-item-action--start': props.start, - 'v-list-item-action--end': props.end - }, props.class], - "style": props.style - }, slots)); - return {}; - } -}); - -const {createVNode:_createVNode$1G,resolveDirective:_resolveDirective$J} = await importShared('vue'); -const makeVListItemMediaProps = propsFactory({ - start: Boolean, - end: Boolean, - ...makeComponentProps(), - ...makeTagProps() -}, 'VListItemMedia'); -const VListItemMedia = genericComponent()({ - name: 'VListItemMedia', - props: makeVListItemMediaProps(), - setup(props, _ref) { - let { - slots - } = _ref; - useRender(() => { - return _createVNode$1G(props.tag, { - "class": ['v-list-item-media', { - 'v-list-item-media--start': props.start, - 'v-list-item-media--end': props.end - }, props.class], - "style": props.style - }, slots); - }); - return {}; - } -}); - -// Types - -/** Convert a point in local space to viewport space */ -function elementToViewport(point, offset) { - return { - x: point.x + offset.x, - y: point.y + offset.y - }; -} - -/** Get the difference between two points */ -function getOffset$1(a, b) { - return { - x: a.x - b.x, - y: a.y - b.y - }; -} - -/** Convert an anchor object to a point in local space */ -function anchorToPoint(anchor, box) { - if (anchor.side === 'top' || anchor.side === 'bottom') { - const { - side, - align - } = anchor; - const x = align === 'left' ? 0 : align === 'center' ? box.width / 2 : align === 'right' ? box.width : align; - const y = side === 'top' ? 0 : side === 'bottom' ? box.height : side; - return elementToViewport({ - x, - y - }, box); - } else if (anchor.side === 'left' || anchor.side === 'right') { - const { - side, - align - } = anchor; - const x = side === 'left' ? 0 : side === 'right' ? box.width : side; - const y = align === 'top' ? 0 : align === 'center' ? box.height / 2 : align === 'bottom' ? box.height : align; - return elementToViewport({ - x, - y - }, box); - } - return elementToViewport({ - x: box.width / 2, - y: box.height / 2 - }, box); -} - -const {computed: computed$1k,nextTick: nextTick$i,onScopeDispose: onScopeDispose$7,ref: ref$E,watch: watch$u} = await importShared('vue'); -const locationStrategies = { - static: staticLocationStrategy, - // specific viewport position, usually centered - connected: connectedLocationStrategy // connected to a certain element -}; -const makeLocationStrategyProps = propsFactory({ - locationStrategy: { - type: [String, Function], - default: 'static', - validator: val => typeof val === 'function' || val in locationStrategies - }, - location: { - type: String, - default: 'bottom' - }, - origin: { - type: String, - default: 'auto' - }, - offset: [Number, String, Array] -}, 'VOverlay-location-strategies'); -function useLocationStrategies(props, data) { - const contentStyles = ref$E({}); - const updateLocation = ref$E(); - if (IN_BROWSER) { - useToggleScope(() => !!(data.isActive.value && props.locationStrategy), reset => { - watch$u(() => props.locationStrategy, reset); - onScopeDispose$7(() => { - window.removeEventListener('resize', onResize); - updateLocation.value = undefined; - }); - window.addEventListener('resize', onResize, { - passive: true - }); - if (typeof props.locationStrategy === 'function') { - updateLocation.value = props.locationStrategy(data, props, contentStyles)?.updateLocation; - } else { - updateLocation.value = locationStrategies[props.locationStrategy](data, props, contentStyles)?.updateLocation; - } - }); - } - function onResize(e) { - updateLocation.value?.(e); - } - return { - contentStyles, - updateLocation - }; -} -function staticLocationStrategy() { - // TODO -} - -/** Get size of element ignoring max-width/max-height */ -function getIntrinsicSize(el, isRtl) { - // const scrollables = new Map() - // el.querySelectorAll('*').forEach(el => { - // const x = el.scrollLeft - // const y = el.scrollTop - // if (x || y) { - // scrollables.set(el, [x, y]) - // } - // }) - - // const initialMaxWidth = el.style.maxWidth - // const initialMaxHeight = el.style.maxHeight - // el.style.removeProperty('max-width') - // el.style.removeProperty('max-height') - - /* eslint-disable-next-line sonarjs/prefer-immediate-return */ - const contentBox = nullifyTransforms(el); - if (isRtl) { - contentBox.x += parseFloat(el.style.right || 0); - } else { - contentBox.x -= parseFloat(el.style.left || 0); - } - contentBox.y -= parseFloat(el.style.top || 0); - - // el.style.maxWidth = initialMaxWidth - // el.style.maxHeight = initialMaxHeight - // scrollables.forEach((position, el) => { - // el.scrollTo(...position) - // }) - - return contentBox; -} -function connectedLocationStrategy(data, props, contentStyles) { - const activatorFixed = Array.isArray(data.target.value) || isFixedPosition(data.target.value); - if (activatorFixed) { - Object.assign(contentStyles.value, { - position: 'fixed', - top: 0, - [data.isRtl.value ? 'right' : 'left']: 0 - }); - } - const { - preferredAnchor, - preferredOrigin - } = destructComputed(() => { - const parsedAnchor = parseAnchor(props.location, data.isRtl.value); - const parsedOrigin = props.origin === 'overlap' ? parsedAnchor : props.origin === 'auto' ? flipSide(parsedAnchor) : parseAnchor(props.origin, data.isRtl.value); - - // Some combinations of props may produce an invalid origin - if (parsedAnchor.side === parsedOrigin.side && parsedAnchor.align === flipAlign(parsedOrigin).align) { - return { - preferredAnchor: flipCorner(parsedAnchor), - preferredOrigin: flipCorner(parsedOrigin) - }; - } else { - return { - preferredAnchor: parsedAnchor, - preferredOrigin: parsedOrigin - }; - } - }); - const [minWidth, minHeight, maxWidth, maxHeight] = ['minWidth', 'minHeight', 'maxWidth', 'maxHeight'].map(key => { - return computed$1k(() => { - const val = parseFloat(props[key]); - return isNaN(val) ? Infinity : val; - }); - }); - const offset = computed$1k(() => { - if (Array.isArray(props.offset)) { - return props.offset; - } - if (typeof props.offset === 'string') { - const offset = props.offset.split(' ').map(parseFloat); - if (offset.length < 2) offset.push(0); - return offset; - } - return typeof props.offset === 'number' ? [props.offset, 0] : [0, 0]; - }); - let observe = false; - const observer = new ResizeObserver(() => { - if (observe) updateLocation(); - }); - watch$u([data.target, data.contentEl], (_ref, _ref2) => { - let [newTarget, newContentEl] = _ref; - let [oldTarget, oldContentEl] = _ref2; - if (oldTarget && !Array.isArray(oldTarget)) observer.unobserve(oldTarget); - if (newTarget && !Array.isArray(newTarget)) observer.observe(newTarget); - if (oldContentEl) observer.unobserve(oldContentEl); - if (newContentEl) observer.observe(newContentEl); - }, { - immediate: true - }); - onScopeDispose$7(() => { - observer.disconnect(); - }); - - // eslint-disable-next-line max-statements - function updateLocation() { - observe = false; - requestAnimationFrame(() => observe = true); - if (!data.target.value || !data.contentEl.value) return; - const targetBox = getTargetBox(data.target.value); - const contentBox = getIntrinsicSize(data.contentEl.value, data.isRtl.value); - const scrollParents = getScrollParents(data.contentEl.value); - const viewportMargin = 12; - if (!scrollParents.length) { - scrollParents.push(document.documentElement); - if (!(data.contentEl.value.style.top && data.contentEl.value.style.left)) { - contentBox.x -= parseFloat(document.documentElement.style.getPropertyValue('--v-body-scroll-x') || 0); - contentBox.y -= parseFloat(document.documentElement.style.getPropertyValue('--v-body-scroll-y') || 0); - } - } - const viewport = scrollParents.reduce((box, el) => { - const rect = el.getBoundingClientRect(); - const scrollBox = new Box({ - x: el === document.documentElement ? 0 : rect.x, - y: el === document.documentElement ? 0 : rect.y, - width: el.clientWidth, - height: el.clientHeight - }); - if (box) { - return new Box({ - x: Math.max(box.left, scrollBox.left), - y: Math.max(box.top, scrollBox.top), - width: Math.min(box.right, scrollBox.right) - Math.max(box.left, scrollBox.left), - height: Math.min(box.bottom, scrollBox.bottom) - Math.max(box.top, scrollBox.top) - }); - } - return scrollBox; - }, undefined); - viewport.x += viewportMargin; - viewport.y += viewportMargin; - viewport.width -= viewportMargin * 2; - viewport.height -= viewportMargin * 2; - let placement = { - anchor: preferredAnchor.value, - origin: preferredOrigin.value - }; - function checkOverflow(_placement) { - const box = new Box(contentBox); - const targetPoint = anchorToPoint(_placement.anchor, targetBox); - const contentPoint = anchorToPoint(_placement.origin, box); - let { - x, - y - } = getOffset$1(targetPoint, contentPoint); - switch (_placement.anchor.side) { - case 'top': - y -= offset.value[0]; - break; - case 'bottom': - y += offset.value[0]; - break; - case 'left': - x -= offset.value[0]; - break; - case 'right': - x += offset.value[0]; - break; - } - switch (_placement.anchor.align) { - case 'top': - y -= offset.value[1]; - break; - case 'bottom': - y += offset.value[1]; - break; - case 'left': - x -= offset.value[1]; - break; - case 'right': - x += offset.value[1]; - break; - } - box.x += x; - box.y += y; - box.width = Math.min(box.width, maxWidth.value); - box.height = Math.min(box.height, maxHeight.value); - const overflows = getOverflow(box, viewport); - return { - overflows, - x, - y - }; - } - let x = 0; - let y = 0; - const available = { - x: 0, - y: 0 - }; - const flipped = { - x: false, - y: false - }; - let resets = -1; - while (true) { - if (resets++ > 10) { - consoleError('Infinite loop detected in connectedLocationStrategy'); - break; - } - const { - x: _x, - y: _y, - overflows - } = checkOverflow(placement); - x += _x; - y += _y; - contentBox.x += _x; - contentBox.y += _y; - - // flip - { - const axis = getAxis(placement.anchor); - const hasOverflowX = overflows.x.before || overflows.x.after; - const hasOverflowY = overflows.y.before || overflows.y.after; - let reset = false; - ['x', 'y'].forEach(key => { - if (key === 'x' && hasOverflowX && !flipped.x || key === 'y' && hasOverflowY && !flipped.y) { - const newPlacement = { - anchor: { - ...placement.anchor - }, - origin: { - ...placement.origin - } - }; - const flip = key === 'x' ? axis === 'y' ? flipAlign : flipSide : axis === 'y' ? flipSide : flipAlign; - newPlacement.anchor = flip(newPlacement.anchor); - newPlacement.origin = flip(newPlacement.origin); - const { - overflows: newOverflows - } = checkOverflow(newPlacement); - if (newOverflows[key].before <= overflows[key].before && newOverflows[key].after <= overflows[key].after || newOverflows[key].before + newOverflows[key].after < (overflows[key].before + overflows[key].after) / 2) { - placement = newPlacement; - reset = flipped[key] = true; - } - } - }); - if (reset) continue; - } - - // shift - if (overflows.x.before) { - x += overflows.x.before; - contentBox.x += overflows.x.before; - } - if (overflows.x.after) { - x -= overflows.x.after; - contentBox.x -= overflows.x.after; - } - if (overflows.y.before) { - y += overflows.y.before; - contentBox.y += overflows.y.before; - } - if (overflows.y.after) { - y -= overflows.y.after; - contentBox.y -= overflows.y.after; - } - - // size - { - const overflows = getOverflow(contentBox, viewport); - available.x = viewport.width - overflows.x.before - overflows.x.after; - available.y = viewport.height - overflows.y.before - overflows.y.after; - x += overflows.x.before; - contentBox.x += overflows.x.before; - y += overflows.y.before; - contentBox.y += overflows.y.before; - } - break; - } - const axis = getAxis(placement.anchor); - Object.assign(contentStyles.value, { - '--v-overlay-anchor-origin': `${placement.anchor.side} ${placement.anchor.align}`, - transformOrigin: `${placement.origin.side} ${placement.origin.align}`, - // transform: `translate(${pixelRound(x)}px, ${pixelRound(y)}px)`, - top: convertToUnit(pixelRound(y)), - left: data.isRtl.value ? undefined : convertToUnit(pixelRound(x)), - right: data.isRtl.value ? convertToUnit(pixelRound(-x)) : undefined, - minWidth: convertToUnit(axis === 'y' ? Math.min(minWidth.value, targetBox.width) : minWidth.value), - maxWidth: convertToUnit(pixelCeil(clamp(available.x, minWidth.value === Infinity ? 0 : minWidth.value, maxWidth.value))), - maxHeight: convertToUnit(pixelCeil(clamp(available.y, minHeight.value === Infinity ? 0 : minHeight.value, maxHeight.value))) - }); - return { - available, - contentBox - }; - } - watch$u(() => [preferredAnchor.value, preferredOrigin.value, props.offset, props.minWidth, props.minHeight, props.maxWidth, props.maxHeight], () => updateLocation()); - nextTick$i(() => { - const result = updateLocation(); - - // TODO: overflowing content should only require a single updateLocation call - // Icky hack to make sure the content is positioned consistently - if (!result) return; - const { - available, - contentBox - } = result; - if (contentBox.height > available.y) { - requestAnimationFrame(() => { - updateLocation(); - requestAnimationFrame(() => { - updateLocation(); - }); - }); - } - }); - return { - updateLocation - }; -} -function pixelRound(val) { - return Math.round(val * devicePixelRatio) / devicePixelRatio; -} -function pixelCeil(val) { - return Math.ceil(val * devicePixelRatio) / devicePixelRatio; -} - -let clean = true; -const frames = []; - -/** - * Schedule a task to run in an animation frame on its own - * This is useful for heavy tasks that may cause jank if all ran together - */ -function requestNewFrame(cb) { - if (!clean || frames.length) { - frames.push(cb); - run(); - } else { - clean = false; - cb(); - run(); - } -} -let raf = -1; -function run() { - cancelAnimationFrame(raf); - raf = requestAnimationFrame(() => { - const frame = frames.shift(); - if (frame) frame(); - if (frames.length) run();else clean = true; - }); -} - -// Utilities -const {effectScope: effectScope$1,onScopeDispose: onScopeDispose$6,watchEffect: watchEffect$e} = await importShared('vue'); -const scrollStrategies = { - none: null, - close: closeScrollStrategy, - block: blockScrollStrategy, - reposition: repositionScrollStrategy -}; -const makeScrollStrategyProps = propsFactory({ - scrollStrategy: { - type: [String, Function], - default: 'block', - validator: val => typeof val === 'function' || val in scrollStrategies - } -}, 'VOverlay-scroll-strategies'); -function useScrollStrategies(props, data) { - if (!IN_BROWSER) return; - let scope; - watchEffect$e(async () => { - scope?.stop(); - if (!(data.isActive.value && props.scrollStrategy)) return; - scope = effectScope$1(); - await new Promise(resolve => setTimeout(resolve)); - scope.active && scope.run(() => { - if (typeof props.scrollStrategy === 'function') { - props.scrollStrategy(data, props, scope); - } else { - scrollStrategies[props.scrollStrategy]?.(data, props, scope); - } - }); - }); - onScopeDispose$6(() => { - scope?.stop(); - }); -} -function closeScrollStrategy(data) { - function onScroll(e) { - data.isActive.value = false; - } - bindScroll(data.targetEl.value ?? data.contentEl.value, onScroll); -} -function blockScrollStrategy(data, props) { - const offsetParent = data.root.value?.offsetParent; - const scrollElements = [...new Set([...getScrollParents(data.targetEl.value, props.contained ? offsetParent : undefined), ...getScrollParents(data.contentEl.value, props.contained ? offsetParent : undefined)])].filter(el => !el.classList.contains('v-overlay-scroll-blocked')); - const scrollbarWidth = window.innerWidth - document.documentElement.offsetWidth; - const scrollableParent = (el => hasScrollbar(el) && el)(offsetParent || document.documentElement); - if (scrollableParent) { - data.root.value.classList.add('v-overlay--scroll-blocked'); - } - scrollElements.forEach((el, i) => { - el.style.setProperty('--v-body-scroll-x', convertToUnit(-el.scrollLeft)); - el.style.setProperty('--v-body-scroll-y', convertToUnit(-el.scrollTop)); - if (el !== document.documentElement) { - el.style.setProperty('--v-scrollbar-offset', convertToUnit(scrollbarWidth)); - } - el.classList.add('v-overlay-scroll-blocked'); - }); - onScopeDispose$6(() => { - scrollElements.forEach((el, i) => { - const x = parseFloat(el.style.getPropertyValue('--v-body-scroll-x')); - const y = parseFloat(el.style.getPropertyValue('--v-body-scroll-y')); - const scrollBehavior = el.style.scrollBehavior; - el.style.scrollBehavior = 'auto'; - el.style.removeProperty('--v-body-scroll-x'); - el.style.removeProperty('--v-body-scroll-y'); - el.style.removeProperty('--v-scrollbar-offset'); - el.classList.remove('v-overlay-scroll-blocked'); - el.scrollLeft = -x; - el.scrollTop = -y; - el.style.scrollBehavior = scrollBehavior; - }); - if (scrollableParent) { - data.root.value.classList.remove('v-overlay--scroll-blocked'); - } - }); -} -function repositionScrollStrategy(data, props, scope) { - let slow = false; - let raf = -1; - let ric = -1; - function update(e) { - requestNewFrame(() => { - const start = performance.now(); - data.updateLocation.value?.(e); - const time = performance.now() - start; - slow = time / (1000 / 60) > 2; - }); - } - ric = (typeof requestIdleCallback === 'undefined' ? cb => cb() : requestIdleCallback)(() => { - scope.run(() => { - bindScroll(data.targetEl.value ?? data.contentEl.value, e => { - if (slow) { - // If the position calculation is slow, - // defer updates until scrolling is finished. - // Browsers usually fire one scroll event per frame so - // we just wait until we've got two frames without an event - cancelAnimationFrame(raf); - raf = requestAnimationFrame(() => { - raf = requestAnimationFrame(() => { - update(e); - }); - }); - } else { - update(e); - } - }); - }); - }); - onScopeDispose$6(() => { - typeof cancelIdleCallback !== 'undefined' && cancelIdleCallback(ric); - cancelAnimationFrame(raf); - }); -} - -/** @private */ -function bindScroll(el, onScroll) { - const scrollElements = [document, ...getScrollParents(el)]; - scrollElements.forEach(el => { - el.addEventListener('scroll', onScroll, { - passive: true - }); - }); - onScopeDispose$6(() => { - scrollElements.forEach(el => { - el.removeEventListener('scroll', onScroll); - }); - }); -} - -// Types - -const VMenuSymbol = Symbol.for('vuetify:v-menu'); - -// Utilities -// Composables -const makeDelayProps = propsFactory({ - closeDelay: [Number, String], - openDelay: [Number, String] -}, 'delay'); -function useDelay(props, cb) { - let clearDelay = () => {}; - function runDelay(isOpening) { - clearDelay?.(); - const delay = Number(isOpening ? props.openDelay : props.closeDelay); - return new Promise(resolve => { - clearDelay = defer(delay, () => { - cb?.(isOpening); - resolve(isOpening); - }); - }); - } - function runOpenDelay() { - return runDelay(true); - } - function runCloseDelay() { - return runDelay(false); - } - return { - clearDelay, - runOpenDelay, - runCloseDelay - }; -} - -const {computed: computed$1j,effectScope,inject: inject$g,mergeProps: mergeProps$b,nextTick: nextTick$h,onScopeDispose: onScopeDispose$5,ref: ref$D,watch: watch$t,watchEffect: watchEffect$d} = await importShared('vue'); -const makeActivatorProps = propsFactory({ - target: [String, Object], - activator: [String, Object], - activatorProps: { - type: Object, - default: () => ({}) - }, - openOnClick: { - type: Boolean, - default: undefined - }, - openOnHover: Boolean, - openOnFocus: { - type: Boolean, - default: undefined - }, - closeOnContentClick: Boolean, - ...makeDelayProps() -}, 'VOverlay-activator'); -function useActivator(props, _ref) { - let { - isActive, - isTop, - contentEl - } = _ref; - const vm = getCurrentInstance('useActivator'); - const activatorEl = ref$D(); - let isHovered = false; - let isFocused = false; - let firstEnter = true; - const openOnFocus = computed$1j(() => props.openOnFocus || props.openOnFocus == null && props.openOnHover); - const openOnClick = computed$1j(() => props.openOnClick || props.openOnClick == null && !props.openOnHover && !openOnFocus.value); - const { - runOpenDelay, - runCloseDelay - } = useDelay(props, value => { - if (value === (props.openOnHover && isHovered || openOnFocus.value && isFocused) && !(props.openOnHover && isActive.value && !isTop.value)) { - if (isActive.value !== value) { - firstEnter = true; - } - isActive.value = value; - } - }); - const cursorTarget = ref$D(); - const availableEvents = { - onClick: e => { - e.stopPropagation(); - activatorEl.value = e.currentTarget || e.target; - if (!isActive.value) { - cursorTarget.value = [e.clientX, e.clientY]; - } - isActive.value = !isActive.value; - }, - onMouseenter: e => { - if (e.sourceCapabilities?.firesTouchEvents) return; - isHovered = true; - activatorEl.value = e.currentTarget || e.target; - runOpenDelay(); - }, - onMouseleave: e => { - isHovered = false; - runCloseDelay(); - }, - onFocus: e => { - if (matchesSelector(e.target, ':focus-visible') === false) return; - isFocused = true; - e.stopPropagation(); - activatorEl.value = e.currentTarget || e.target; - runOpenDelay(); - }, - onBlur: e => { - isFocused = false; - e.stopPropagation(); - runCloseDelay(); - } - }; - const activatorEvents = computed$1j(() => { - const events = {}; - if (openOnClick.value) { - events.onClick = availableEvents.onClick; - } - if (props.openOnHover) { - events.onMouseenter = availableEvents.onMouseenter; - events.onMouseleave = availableEvents.onMouseleave; - } - if (openOnFocus.value) { - events.onFocus = availableEvents.onFocus; - events.onBlur = availableEvents.onBlur; - } - return events; - }); - const contentEvents = computed$1j(() => { - const events = {}; - if (props.openOnHover) { - events.onMouseenter = () => { - isHovered = true; - runOpenDelay(); - }; - events.onMouseleave = () => { - isHovered = false; - runCloseDelay(); - }; - } - if (openOnFocus.value) { - events.onFocusin = () => { - isFocused = true; - runOpenDelay(); - }; - events.onFocusout = () => { - isFocused = false; - runCloseDelay(); - }; - } - if (props.closeOnContentClick) { - const menu = inject$g(VMenuSymbol, null); - events.onClick = () => { - isActive.value = false; - menu?.closeParents(); - }; - } - return events; - }); - const scrimEvents = computed$1j(() => { - const events = {}; - if (props.openOnHover) { - events.onMouseenter = () => { - if (firstEnter) { - isHovered = true; - firstEnter = false; - runOpenDelay(); - } - }; - events.onMouseleave = () => { - isHovered = false; - runCloseDelay(); - }; - } - return events; - }); - watch$t(isTop, val => { - if (val && (props.openOnHover && !isHovered && (!openOnFocus.value || !isFocused) || openOnFocus.value && !isFocused && (!props.openOnHover || !isHovered)) && !contentEl.value?.contains(document.activeElement)) { - isActive.value = false; - } - }); - watch$t(isActive, val => { - if (!val) { - setTimeout(() => { - cursorTarget.value = undefined; - }); - } - }, { - flush: 'post' - }); - const activatorRef = templateRef(); - watchEffect$d(() => { - if (!activatorRef.value) return; - nextTick$h(() => { - activatorEl.value = activatorRef.el; - }); - }); - const targetRef = templateRef(); - const target = computed$1j(() => { - if (props.target === 'cursor' && cursorTarget.value) return cursorTarget.value; - if (targetRef.value) return targetRef.el; - return getTarget(props.target, vm) || activatorEl.value; - }); - const targetEl = computed$1j(() => { - return Array.isArray(target.value) ? undefined : target.value; - }); - let scope; - watch$t(() => !!props.activator, val => { - if (val && IN_BROWSER) { - scope = effectScope(); - scope.run(() => { - _useActivator(props, vm, { - activatorEl, - activatorEvents - }); - }); - } else if (scope) { - scope.stop(); - } - }, { - flush: 'post', - immediate: true - }); - onScopeDispose$5(() => { - scope?.stop(); - }); - return { - activatorEl, - activatorRef, - target, - targetEl, - targetRef, - activatorEvents, - contentEvents, - scrimEvents - }; -} -function _useActivator(props, vm, _ref2) { - let { - activatorEl, - activatorEvents - } = _ref2; - watch$t(() => props.activator, (val, oldVal) => { - if (oldVal && val !== oldVal) { - const activator = getActivator(oldVal); - activator && unbindActivatorProps(activator); - } - if (val) { - nextTick$h(() => bindActivatorProps()); - } - }, { - immediate: true - }); - watch$t(() => props.activatorProps, () => { - bindActivatorProps(); - }); - onScopeDispose$5(() => { - unbindActivatorProps(); - }); - function bindActivatorProps() { - let el = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getActivator(); - let _props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.activatorProps; - if (!el) return; - bindProps(el, mergeProps$b(activatorEvents.value, _props)); - } - function unbindActivatorProps() { - let el = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getActivator(); - let _props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.activatorProps; - if (!el) return; - unbindProps(el, mergeProps$b(activatorEvents.value, _props)); - } - function getActivator() { - let selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : props.activator; - const activator = getTarget(selector, vm); - - // The activator should only be a valid element (Ignore comments and text nodes) - activatorEl.value = activator?.nodeType === Node.ELEMENT_NODE ? activator : undefined; - return activatorEl.value; - } -} -function getTarget(selector, vm) { - if (!selector) return; - let target; - if (selector === 'parent') { - let el = vm?.proxy?.$el?.parentNode; - while (el?.hasAttribute('data-no-activator')) { - el = el.parentNode; - } - target = el; - } else if (typeof selector === 'string') { - // Selector - target = document.querySelector(selector); - } else if ('$el' in selector) { - // Component (ref) - target = selector.$el; - } else { - // HTMLElement | Element | [x, y] - target = selector; - } - return target; -} - -const {onMounted: onMounted$9,shallowRef: shallowRef$r} = await importShared('vue'); -function useHydration() { - if (!IN_BROWSER) return shallowRef$r(false); - const { - ssr - } = useDisplay(); - if (ssr) { - const isMounted = shallowRef$r(false); - onMounted$9(() => { - isMounted.value = true; - }); - return isMounted; - } else { - return shallowRef$r(true); - } -} - -// Utilities -const {computed: computed$1i,shallowRef: shallowRef$q,watch: watch$s} = await importShared('vue'); -const makeLazyProps = propsFactory({ - eager: Boolean -}, 'lazy'); -function useLazy(props, active) { - const isBooted = shallowRef$q(false); - const hasContent = computed$1i(() => isBooted.value || props.eager || active.value); - watch$s(active, () => isBooted.value = true); - function onAfterLeave() { - if (!props.eager) isBooted.value = false; - } - return { - isBooted, - hasContent, - onAfterLeave - }; -} - -// Utilities -function useScopeId() { - const vm = getCurrentInstance('useScopeId'); - const scopeId = vm.vnode.scopeId; - return { - scopeId: scopeId ? { - [scopeId]: '' - } : undefined - }; -} - -const {computed: computed$1h,inject: inject$f,onScopeDispose: onScopeDispose$4,provide: provide$b,reactive,readonly,shallowRef: shallowRef$p,toRaw: toRaw$1,watchEffect: watchEffect$c} = await importShared('vue'); -const StackSymbol = Symbol.for('vuetify:stack'); -const globalStack = reactive([]); -function useStack(isActive, zIndex, disableGlobalStack) { - const vm = getCurrentInstance('useStack'); - const createStackEntry = !disableGlobalStack; - const parent = inject$f(StackSymbol, undefined); - const stack = reactive({ - activeChildren: new Set() - }); - provide$b(StackSymbol, stack); - const _zIndex = shallowRef$p(+zIndex.value); - useToggleScope(isActive, () => { - const lastZIndex = globalStack.at(-1)?.[1]; - _zIndex.value = lastZIndex ? lastZIndex + 10 : +zIndex.value; - if (createStackEntry) { - globalStack.push([vm.uid, _zIndex.value]); - } - parent?.activeChildren.add(vm.uid); - onScopeDispose$4(() => { - if (createStackEntry) { - const idx = toRaw$1(globalStack).findIndex(v => v[0] === vm.uid); - globalStack.splice(idx, 1); - } - parent?.activeChildren.delete(vm.uid); - }); - }); - const globalTop = shallowRef$p(true); - if (createStackEntry) { - watchEffect$c(() => { - const _isTop = globalStack.at(-1)?.[0] === vm.uid; - setTimeout(() => globalTop.value = _isTop); - }); - } - const localTop = computed$1h(() => !stack.activeChildren.size); - return { - globalTop: readonly(globalTop), - localTop, - stackStyles: computed$1h(() => ({ - zIndex: _zIndex.value - })) - }; -} - -// Utilities -const {computed: computed$1g,warn} = await importShared('vue'); -function useTeleport(target) { - const teleportTarget = computed$1g(() => { - const _target = target(); - if (_target === true || !IN_BROWSER) return undefined; - const targetElement = _target === false ? document.body : typeof _target === 'string' ? document.querySelector(_target) : _target; - if (targetElement == null) { - warn(`Unable to locate target ${_target}`); - return undefined; - } - let container = [...targetElement.children].find(el => el.matches('.v-overlay-container')); - if (!container) { - container = document.createElement('div'); - container.className = 'v-overlay-container'; - targetElement.appendChild(container); - } - return container; - }); - return { - teleportTarget - }; -} - -// Utilities -function defaultConditional() { - return true; -} -function checkEvent(e, el, binding) { - // The include element callbacks below can be expensive - // so we should avoid calling them when we're not active. - // Explicitly check for false to allow fallback compatibility - // with non-toggleable components - if (!e || checkIsActive(e, binding) === false) return false; - - // If we're clicking inside the shadowroot, then the app root doesn't get the same - // level of introspection as to _what_ we're clicking. We want to check to see if - // our target is the shadowroot parent container, and if it is, ignore. - const root = attachedRoot(el); - if (typeof ShadowRoot !== 'undefined' && root instanceof ShadowRoot && root.host === e.target) return false; - - // Check if additional elements were passed to be included in check - // (click must be outside all included elements, if any) - const elements = (typeof binding.value === 'object' && binding.value.include || (() => []))(); - // Add the root element for the component this directive was defined on - elements.push(el); - - // Check if it's a click outside our elements, and then if our callback returns true. - // Non-toggleable components should take action in their callback and return falsy. - // Toggleable can return true if it wants to deactivate. - // Note that, because we're in the capture phase, this callback will occur before - // the bubbling click event on any outside elements. - return !elements.some(el => el?.contains(e.target)); -} -function checkIsActive(e, binding) { - const isActive = typeof binding.value === 'object' && binding.value.closeConditional || defaultConditional; - return isActive(e); -} -function directive(e, el, binding) { - const handler = typeof binding.value === 'function' ? binding.value : binding.value.handler; - - // Clicks in the Shadow DOM change their target while using setTimeout, so the original target is saved here - e.shadowTarget = e.target; - el._clickOutside.lastMousedownWasOutside && checkEvent(e, el, binding) && setTimeout(() => { - checkIsActive(e, binding) && handler && handler(e); - }, 0); -} -function handleShadow(el, callback) { - const root = attachedRoot(el); - callback(document); - if (typeof ShadowRoot !== 'undefined' && root instanceof ShadowRoot) { - callback(root); - } -} -const ClickOutside = { - // [data-app] may not be found - // if using bind, inserted makes - // sure that the root element is - // available, iOS does not support - // clicks on body - mounted(el, binding) { - const onClick = e => directive(e, el, binding); - const onMousedown = e => { - el._clickOutside.lastMousedownWasOutside = checkEvent(e, el, binding); - }; - handleShadow(el, app => { - app.addEventListener('click', onClick, true); - app.addEventListener('mousedown', onMousedown, true); - }); - if (!el._clickOutside) { - el._clickOutside = { - lastMousedownWasOutside: false - }; - } - el._clickOutside[binding.instance.$.uid] = { - onClick, - onMousedown - }; - }, - beforeUnmount(el, binding) { - if (!el._clickOutside) return; - handleShadow(el, app => { - if (!app || !el._clickOutside?.[binding.instance.$.uid]) return; - const { - onClick, - onMousedown - } = el._clickOutside[binding.instance.$.uid]; - app.removeEventListener('click', onClick, true); - app.removeEventListener('mousedown', onMousedown, true); - }); - delete el._clickOutside[binding.instance.$.uid]; - } -}; - -const {withDirectives:_withDirectives$e,resolveDirective:_resolveDirective$I,vShow:_vShow$7,Fragment:_Fragment$v,createVNode:_createVNode$1F,mergeProps:_mergeProps$P} = await importShared('vue'); -const {computed: computed$1f,mergeProps: mergeProps$a,onBeforeUnmount: onBeforeUnmount$5,ref: ref$C,Teleport,toRef: toRef$t,Transition: Transition$1,watch: watch$r} = await importShared('vue'); -function Scrim(props) { - const { - modelValue, - color, - ...rest - } = props; - return _createVNode$1F(Transition$1, { - "name": "fade-transition", - "appear": true - }, { - default: () => [props.modelValue && _createVNode$1F("div", _mergeProps$P({ - "class": ['v-overlay__scrim', props.color.backgroundColorClasses.value], - "style": props.color.backgroundColorStyles.value - }, rest), null)] - }); -} -const makeVOverlayProps = propsFactory({ - absolute: Boolean, - attach: [Boolean, String, Object], - closeOnBack: { - type: Boolean, - default: true - }, - contained: Boolean, - contentClass: null, - contentProps: null, - disabled: Boolean, - opacity: [Number, String], - noClickAnimation: Boolean, - modelValue: Boolean, - persistent: Boolean, - scrim: { - type: [Boolean, String], - default: true - }, - zIndex: { - type: [Number, String], - default: 2000 - }, - ...makeActivatorProps(), - ...makeComponentProps(), - ...makeDimensionProps(), - ...makeLazyProps(), - ...makeLocationStrategyProps(), - ...makeScrollStrategyProps(), - ...makeThemeProps(), - ...makeTransitionProps() -}, 'VOverlay'); -const VOverlay = genericComponent()({ - name: 'VOverlay', - directives: { - ClickOutside - }, - inheritAttrs: false, - props: { - _disableGlobalStack: Boolean, - ...makeVOverlayProps() - }, - emits: { - 'click:outside': e => true, - 'update:modelValue': value => true, - afterEnter: () => true, - afterLeave: () => true - }, - setup(props, _ref) { - let { - slots, - attrs, - emit - } = _ref; - const vm = getCurrentInstance('VOverlay'); - const root = ref$C(); - const scrimEl = ref$C(); - const contentEl = ref$C(); - const model = useProxiedModel(props, 'modelValue'); - const isActive = computed$1f({ - get: () => model.value, - set: v => { - if (!(v && props.disabled)) model.value = v; - } - }); - const { - themeClasses - } = provideTheme(props); - const { - rtlClasses, - isRtl - } = useRtl(); - const { - hasContent, - onAfterLeave: _onAfterLeave - } = useLazy(props, isActive); - const scrimColor = useBackgroundColor(computed$1f(() => { - return typeof props.scrim === 'string' ? props.scrim : null; - })); - const { - globalTop, - localTop, - stackStyles - } = useStack(isActive, toRef$t(props, 'zIndex'), props._disableGlobalStack); - const { - activatorEl, - activatorRef, - target, - targetEl, - targetRef, - activatorEvents, - contentEvents, - scrimEvents - } = useActivator(props, { - isActive, - isTop: localTop, - contentEl - }); - const { - teleportTarget - } = useTeleport(() => { - const target = props.attach || props.contained; - if (target) return target; - const rootNode = activatorEl?.value?.getRootNode() || vm.proxy?.$el?.getRootNode(); - if (rootNode instanceof ShadowRoot) return rootNode; - return false; - }); - const { - dimensionStyles - } = useDimension(props); - const isMounted = useHydration(); - const { - scopeId - } = useScopeId(); - watch$r(() => props.disabled, v => { - if (v) isActive.value = false; - }); - const { - contentStyles, - updateLocation - } = useLocationStrategies(props, { - isRtl, - contentEl, - target, - isActive - }); - useScrollStrategies(props, { - root, - contentEl, - targetEl, - isActive, - updateLocation - }); - function onClickOutside(e) { - emit('click:outside', e); - if (!props.persistent) isActive.value = false;else animateClick(); - } - function closeConditional(e) { - return isActive.value && globalTop.value && ( - // If using scrim, only close if clicking on it rather than anything opened on top - !props.scrim || e.target === scrimEl.value || e instanceof MouseEvent && e.shadowTarget === scrimEl.value); - } - IN_BROWSER && watch$r(isActive, val => { - if (val) { - window.addEventListener('keydown', onKeydown); - } else { - window.removeEventListener('keydown', onKeydown); - } - }, { - immediate: true - }); - onBeforeUnmount$5(() => { - if (!IN_BROWSER) return; - window.removeEventListener('keydown', onKeydown); - }); - function onKeydown(e) { - if (e.key === 'Escape' && globalTop.value) { - if (!props.persistent) { - isActive.value = false; - if (contentEl.value?.contains(document.activeElement)) { - activatorEl.value?.focus(); - } - } else animateClick(); - } - } - const router = useRouter(); - useToggleScope(() => props.closeOnBack, () => { - useBackButton(router, next => { - if (globalTop.value && isActive.value) { - next(false); - if (!props.persistent) isActive.value = false;else animateClick(); - } else { - next(); - } - }); - }); - const top = ref$C(); - watch$r(() => isActive.value && (props.absolute || props.contained) && teleportTarget.value == null, val => { - if (val) { - const scrollParent = getScrollParent(root.value); - if (scrollParent && scrollParent !== document.scrollingElement) { - top.value = scrollParent.scrollTop; - } - } - }); - - // Add a quick "bounce" animation to the content - function animateClick() { - if (props.noClickAnimation) return; - contentEl.value && animate(contentEl.value, [{ - transformOrigin: 'center' - }, { - transform: 'scale(1.03)' - }, { - transformOrigin: 'center' - }], { - duration: 150, - easing: standardEasing - }); - } - function onAfterEnter() { - emit('afterEnter'); - } - function onAfterLeave() { - _onAfterLeave(); - emit('afterLeave'); - } - useRender(() => _createVNode$1F(_Fragment$v, null, [slots.activator?.({ - isActive: isActive.value, - targetRef, - props: mergeProps$a({ - ref: activatorRef - }, activatorEvents.value, props.activatorProps) - }), isMounted.value && hasContent.value && _createVNode$1F(Teleport, { - "disabled": !teleportTarget.value, - "to": teleportTarget.value - }, { - default: () => [_createVNode$1F("div", _mergeProps$P({ - "class": ['v-overlay', { - 'v-overlay--absolute': props.absolute || props.contained, - 'v-overlay--active': isActive.value, - 'v-overlay--contained': props.contained - }, themeClasses.value, rtlClasses.value, props.class], - "style": [stackStyles.value, { - '--v-overlay-opacity': props.opacity, - top: convertToUnit(top.value) - }, props.style], - "ref": root - }, scopeId, attrs), [_createVNode$1F(Scrim, _mergeProps$P({ - "color": scrimColor, - "modelValue": isActive.value && !!props.scrim, - "ref": scrimEl - }, scrimEvents.value), null), _createVNode$1F(MaybeTransition, { - "appear": true, - "persisted": true, - "transition": props.transition, - "target": target.value, - "onAfterEnter": onAfterEnter, - "onAfterLeave": onAfterLeave - }, { - default: () => [_withDirectives$e(_createVNode$1F("div", _mergeProps$P({ - "ref": contentEl, - "class": ['v-overlay__content', props.contentClass], - "style": [dimensionStyles.value, contentStyles.value] - }, contentEvents.value, props.contentProps), [slots.default?.({ - isActive - })]), [[_vShow$7, isActive.value], [_resolveDirective$I("click-outside"), { - handler: onClickOutside, - closeConditional, - include: () => [activatorEl.value] - }]])] - })])] - })])); - return { - activatorEl, - scrimEl, - target, - animateClick, - contentEl, - globalTop, - localTop, - updateLocation - }; - } -}); - -// Types - -const Refs = Symbol('Forwarded refs'); - -/** Omit properties starting with P */ - -/** Omit keyof $props from T */ - -function getDescriptor(obj, key) { - let currentObj = obj; - while (currentObj) { - const descriptor = Reflect.getOwnPropertyDescriptor(currentObj, key); - if (descriptor) return descriptor; - currentObj = Object.getPrototypeOf(currentObj); - } - return undefined; -} -function forwardRefs(target) { - for (var _len = arguments.length, refs = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - refs[_key - 1] = arguments[_key]; - } - target[Refs] = refs; - return new Proxy(target, { - get(target, key) { - if (Reflect.has(target, key)) { - return Reflect.get(target, key); - } - - // Skip internal properties - if (typeof key === 'symbol' || key.startsWith('$') || key.startsWith('__')) return; - for (const ref of refs) { - if (ref.value && Reflect.has(ref.value, key)) { - const val = Reflect.get(ref.value, key); - return typeof val === 'function' ? val.bind(ref.value) : val; - } - } - }, - has(target, key) { - if (Reflect.has(target, key)) { - return true; - } - - // Skip internal properties - if (typeof key === 'symbol' || key.startsWith('$') || key.startsWith('__')) return false; - for (const ref of refs) { - if (ref.value && Reflect.has(ref.value, key)) { - return true; - } - } - return false; - }, - set(target, key, value) { - if (Reflect.has(target, key)) { - return Reflect.set(target, key, value); - } - - // Skip internal properties - if (typeof key === 'symbol' || key.startsWith('$') || key.startsWith('__')) return false; - for (const ref of refs) { - if (ref.value && Reflect.has(ref.value, key)) { - return Reflect.set(ref.value, key, value); - } - } - return false; - }, - getOwnPropertyDescriptor(target, key) { - const descriptor = Reflect.getOwnPropertyDescriptor(target, key); - if (descriptor) return descriptor; - - // Skip internal properties - if (typeof key === 'symbol' || key.startsWith('$') || key.startsWith('__')) return; - - // Check each ref's own properties - for (const ref of refs) { - if (!ref.value) continue; - const descriptor = getDescriptor(ref.value, key) ?? ('_' in ref.value ? getDescriptor(ref.value._?.setupState, key) : undefined); - if (descriptor) return descriptor; - } - - // Recursive search up each ref's prototype - for (const ref of refs) { - const childRefs = ref.value && ref.value[Refs]; - if (!childRefs) continue; - const queue = childRefs.slice(); - while (queue.length) { - const ref = queue.shift(); - const descriptor = getDescriptor(ref.value, key); - if (descriptor) return descriptor; - const childRefs = ref.value && ref.value[Refs]; - if (childRefs) queue.push(...childRefs); - } - } - return undefined; - } - }); -} - -const {mergeProps:_mergeProps$O,createVNode:_createVNode$1E} = await importShared('vue'); -const {computed: computed$1e,inject: inject$e,mergeProps: mergeProps$9,nextTick: nextTick$g,onBeforeUnmount: onBeforeUnmount$4,onDeactivated,provide: provide$a,ref: ref$B,shallowRef: shallowRef$o,watch: watch$q} = await importShared('vue'); -const makeVMenuProps = propsFactory({ - // TODO - // disableKeys: Boolean, - id: String, - submenu: Boolean, - ...omit(makeVOverlayProps({ - closeDelay: 250, - closeOnContentClick: true, - locationStrategy: 'connected', - location: undefined, - openDelay: 300, - scrim: false, - scrollStrategy: 'reposition', - transition: { - component: VDialogTransition - } - }), ['absolute']) -}, 'VMenu'); -const VMenu = genericComponent()({ - name: 'VMenu', - props: makeVMenuProps(), - emits: { - 'update:modelValue': value => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const isActive = useProxiedModel(props, 'modelValue'); - const { - scopeId - } = useScopeId(); - const { - isRtl - } = useRtl(); - const uid = getUid(); - const id = computed$1e(() => props.id || `v-menu-${uid}`); - const overlay = ref$B(); - const parent = inject$e(VMenuSymbol, null); - const openChildren = shallowRef$o(new Set()); - provide$a(VMenuSymbol, { - register() { - openChildren.value.add(uid); - }, - unregister() { - openChildren.value.delete(uid); - }, - closeParents(e) { - setTimeout(() => { - if (!openChildren.value.size && !props.persistent && (e == null || overlay.value?.contentEl && !isClickInsideElement(e, overlay.value.contentEl))) { - isActive.value = false; - parent?.closeParents(); - } - }, 40); - } - }); - onBeforeUnmount$4(() => parent?.unregister()); - onDeactivated(() => isActive.value = false); - async function onFocusIn(e) { - const before = e.relatedTarget; - const after = e.target; - await nextTick$g(); - if (isActive.value && before !== after && overlay.value?.contentEl && - // We're the topmost menu - overlay.value?.globalTop && - // It isn't the document or the menu body - ![document, overlay.value.contentEl].includes(after) && - // It isn't inside the menu body - !overlay.value.contentEl.contains(after)) { - const focusable = focusableChildren(overlay.value.contentEl); - focusable[0]?.focus(); - } - } - watch$q(isActive, val => { - if (val) { - parent?.register(); - document.addEventListener('focusin', onFocusIn, { - once: true - }); - } else { - parent?.unregister(); - document.removeEventListener('focusin', onFocusIn); - } - }); - function onClickOutside(e) { - parent?.closeParents(e); - } - function onKeydown(e) { - if (props.disabled) return; - if (e.key === 'Tab' || e.key === 'Enter' && !props.closeOnContentClick) { - if (e.key === 'Enter' && (e.target instanceof HTMLTextAreaElement || e.target instanceof HTMLInputElement && !!e.target.closest('form'))) return; - if (e.key === 'Enter') e.preventDefault(); - const nextElement = getNextElement(focusableChildren(overlay.value?.contentEl, false), e.shiftKey ? 'prev' : 'next', el => el.tabIndex >= 0); - if (!nextElement) { - isActive.value = false; - overlay.value?.activatorEl?.focus(); - } - } else if (props.submenu && e.key === (isRtl.value ? 'ArrowRight' : 'ArrowLeft')) { - isActive.value = false; - overlay.value?.activatorEl?.focus(); - } - } - function onActivatorKeydown(e) { - if (props.disabled) return; - const el = overlay.value?.contentEl; - if (el && isActive.value) { - if (e.key === 'ArrowDown') { - e.preventDefault(); - e.stopImmediatePropagation(); - focusChild(el, 'next'); - } else if (e.key === 'ArrowUp') { - e.preventDefault(); - e.stopImmediatePropagation(); - focusChild(el, 'prev'); - } else if (props.submenu) { - if (e.key === (isRtl.value ? 'ArrowRight' : 'ArrowLeft')) { - isActive.value = false; - } else if (e.key === (isRtl.value ? 'ArrowLeft' : 'ArrowRight')) { - e.preventDefault(); - focusChild(el, 'first'); - } - } - } else if (props.submenu ? e.key === (isRtl.value ? 'ArrowLeft' : 'ArrowRight') : ['ArrowDown', 'ArrowUp'].includes(e.key)) { - isActive.value = true; - e.preventDefault(); - setTimeout(() => setTimeout(() => onActivatorKeydown(e))); - } - } - const activatorProps = computed$1e(() => mergeProps$9({ - 'aria-haspopup': 'menu', - 'aria-expanded': String(isActive.value), - 'aria-owns': id.value, - onKeydown: onActivatorKeydown - }, props.activatorProps)); - useRender(() => { - const overlayProps = VOverlay.filterProps(props); - return _createVNode$1E(VOverlay, _mergeProps$O({ - "ref": overlay, - "id": id.value, - "class": ['v-menu', props.class], - "style": props.style - }, overlayProps, { - "modelValue": isActive.value, - "onUpdate:modelValue": $event => isActive.value = $event, - "absolute": true, - "activatorProps": activatorProps.value, - "location": props.location ?? (props.submenu ? 'end' : 'bottom'), - "onClick:outside": onClickOutside, - "onKeydown": onKeydown - }, scopeId), { - activator: slots.activator, - default: function () { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - return _createVNode$1E(VDefaultsProvider, { - "root": "VMenu" - }, { - default: () => [slots.default?.(...args)] - }); - } - }); - }); - return forwardRefs({ - id, - ΨopenChildren: openChildren - }, overlay); - } -}); - -const {withDirectives:_withDirectives$d,createVNode:_createVNode$1D,vShow:_vShow$6} = await importShared('vue'); -const {computed: computed$1d} = await importShared('vue'); -const makeVCounterProps = propsFactory({ - active: Boolean, - disabled: Boolean, - max: [Number, String], - value: { - type: [Number, String], - default: 0 - }, - ...makeComponentProps(), - ...makeTransitionProps({ - transition: { - component: VSlideYTransition - } - }) -}, 'VCounter'); -const VCounter = genericComponent()({ - name: 'VCounter', - functional: true, - props: makeVCounterProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const counter = computed$1d(() => { - return props.max ? `${props.value} / ${props.max}` : String(props.value); - }); - useRender(() => _createVNode$1D(MaybeTransition, { - "transition": props.transition - }, { - default: () => [_withDirectives$d(_createVNode$1D("div", { - "class": ['v-counter', { - 'text-error': props.max && !props.disabled && parseFloat(props.value) > parseFloat(props.max) - }, props.class], - "style": props.style - }, [slots.default ? slots.default({ - counter: counter.value, - max: props.max, - value: props.value - }) : counter.value]), [[_vShow$6, props.active]])] - })); - return {}; - } -}); - -const {createVNode:_createVNode$1C,resolveDirective:_resolveDirective$H} = await importShared('vue'); -const makeVFieldLabelProps = propsFactory({ - floating: Boolean, - ...makeComponentProps() -}, 'VFieldLabel'); -const VFieldLabel = genericComponent()({ - name: 'VFieldLabel', - props: makeVFieldLabelProps(), - setup(props, _ref) { - let { - slots - } = _ref; - useRender(() => _createVNode$1C(VLabel, { - "class": ['v-field-label', { - 'v-field-label--floating': props.floating - }, props.class], - "style": props.style, - "aria-hidden": props.floating || undefined - }, slots)); - return {}; - } -}); - -const {mergeProps:_mergeProps$N,Fragment:_Fragment$u,withDirectives:_withDirectives$c,vShow:_vShow$5,resolveDirective:_resolveDirective$G,createVNode:_createVNode$1B} = await importShared('vue'); -const {computed: computed$1c,ref: ref$A,toRef: toRef$s,watch: watch$p} = await importShared('vue'); -const allowedVariants$1 = ['underlined', 'outlined', 'filled', 'solo', 'solo-inverted', 'solo-filled', 'plain']; -const makeVFieldProps = propsFactory({ - appendInnerIcon: IconValue, - bgColor: String, - clearable: Boolean, - clearIcon: { - type: IconValue, - default: '$clear' - }, - active: Boolean, - centerAffix: { - type: Boolean, - default: undefined - }, - color: String, - baseColor: String, - dirty: Boolean, - disabled: { - type: Boolean, - default: null - }, - error: Boolean, - flat: Boolean, - label: String, - persistentClear: Boolean, - prependInnerIcon: IconValue, - reverse: Boolean, - singleLine: Boolean, - variant: { - type: String, - default: 'filled', - validator: v => allowedVariants$1.includes(v) - }, - 'onClick:clear': EventProp(), - 'onClick:appendInner': EventProp(), - 'onClick:prependInner': EventProp(), - ...makeComponentProps(), - ...makeLoaderProps(), - ...makeRoundedProps(), - ...makeThemeProps() -}, 'VField'); -const VField = genericComponent()({ - name: 'VField', - inheritAttrs: false, - props: { - id: String, - ...makeFocusProps(), - ...makeVFieldProps() - }, - emits: { - 'update:focused': focused => true, - 'update:modelValue': value => true - }, - setup(props, _ref) { - let { - attrs, - emit, - slots - } = _ref; - const { - themeClasses - } = provideTheme(props); - const { - loaderClasses - } = useLoader(props); - const { - focusClasses, - isFocused, - focus, - blur - } = useFocus(props); - const { - InputIcon - } = useInputIcon(props); - const { - roundedClasses - } = useRounded(props); - const { - rtlClasses - } = useRtl(); - const isActive = computed$1c(() => props.dirty || props.active); - const hasLabel = computed$1c(() => !props.singleLine && !!(props.label || slots.label)); - const uid = getUid(); - const id = computed$1c(() => props.id || `input-${uid}`); - const messagesId = computed$1c(() => `${id.value}-messages`); - const labelRef = ref$A(); - const floatingLabelRef = ref$A(); - const controlRef = ref$A(); - const isPlainOrUnderlined = computed$1c(() => ['plain', 'underlined'].includes(props.variant)); - const { - backgroundColorClasses, - backgroundColorStyles - } = useBackgroundColor(toRef$s(props, 'bgColor')); - const { - textColorClasses, - textColorStyles - } = useTextColor(computed$1c(() => { - return props.error || props.disabled ? undefined : isActive.value && isFocused.value ? props.color : props.baseColor; - })); - watch$p(isActive, val => { - if (hasLabel.value) { - const el = labelRef.value.$el; - const targetEl = floatingLabelRef.value.$el; - requestAnimationFrame(() => { - const rect = nullifyTransforms(el); - const targetRect = targetEl.getBoundingClientRect(); - const x = targetRect.x - rect.x; - const y = targetRect.y - rect.y - (rect.height / 2 - targetRect.height / 2); - const targetWidth = targetRect.width / 0.75; - const width = Math.abs(targetWidth - rect.width) > 1 ? { - maxWidth: convertToUnit(targetWidth) - } : undefined; - const style = getComputedStyle(el); - const targetStyle = getComputedStyle(targetEl); - const duration = parseFloat(style.transitionDuration) * 1000 || 150; - const scale = parseFloat(targetStyle.getPropertyValue('--v-field-label-scale')); - const color = targetStyle.getPropertyValue('color'); - el.style.visibility = 'visible'; - targetEl.style.visibility = 'hidden'; - animate(el, { - transform: `translate(${x}px, ${y}px) scale(${scale})`, - color, - ...width - }, { - duration, - easing: standardEasing, - direction: val ? 'normal' : 'reverse' - }).finished.then(() => { - el.style.removeProperty('visibility'); - targetEl.style.removeProperty('visibility'); - }); - }); - } - }, { - flush: 'post' - }); - const slotProps = computed$1c(() => ({ - isActive, - isFocused, - controlRef, - blur, - focus - })); - function onClick(e) { - if (e.target !== document.activeElement) { - e.preventDefault(); - } - } - function onKeydownClear(e) { - if (e.key !== 'Enter' && e.key !== ' ') return; - e.preventDefault(); - e.stopPropagation(); - props['onClick:clear']?.(new MouseEvent('click')); - } - useRender(() => { - const isOutlined = props.variant === 'outlined'; - const hasPrepend = !!(slots['prepend-inner'] || props.prependInnerIcon); - const hasClear = !!(props.clearable || slots.clear); - const hasAppend = !!(slots['append-inner'] || props.appendInnerIcon || hasClear); - const label = () => slots.label ? slots.label({ - ...slotProps.value, - label: props.label, - props: { - for: id.value - } - }) : props.label; - return _createVNode$1B("div", _mergeProps$N({ - "class": ['v-field', { - 'v-field--active': isActive.value, - 'v-field--appended': hasAppend, - 'v-field--center-affix': props.centerAffix ?? !isPlainOrUnderlined.value, - 'v-field--disabled': props.disabled, - 'v-field--dirty': props.dirty, - 'v-field--error': props.error, - 'v-field--flat': props.flat, - 'v-field--has-background': !!props.bgColor, - 'v-field--persistent-clear': props.persistentClear, - 'v-field--prepended': hasPrepend, - 'v-field--reverse': props.reverse, - 'v-field--single-line': props.singleLine, - 'v-field--no-label': !label(), - [`v-field--variant-${props.variant}`]: true - }, themeClasses.value, backgroundColorClasses.value, focusClasses.value, loaderClasses.value, roundedClasses.value, rtlClasses.value, props.class], - "style": [backgroundColorStyles.value, props.style], - "onClick": onClick - }, attrs), [_createVNode$1B("div", { - "class": "v-field__overlay" - }, null), _createVNode$1B(LoaderSlot, { - "name": "v-field", - "active": !!props.loading, - "color": props.error ? 'error' : typeof props.loading === 'string' ? props.loading : props.color - }, { - default: slots.loader - }), hasPrepend && _createVNode$1B("div", { - "key": "prepend", - "class": "v-field__prepend-inner" - }, [props.prependInnerIcon && _createVNode$1B(InputIcon, { - "key": "prepend-icon", - "name": "prependInner" - }, null), slots['prepend-inner']?.(slotProps.value)]), _createVNode$1B("div", { - "class": "v-field__field", - "data-no-activator": "" - }, [['filled', 'solo', 'solo-inverted', 'solo-filled'].includes(props.variant) && hasLabel.value && _createVNode$1B(VFieldLabel, { - "key": "floating-label", - "ref": floatingLabelRef, - "class": [textColorClasses.value], - "floating": true, - "for": id.value, - "style": textColorStyles.value - }, { - default: () => [label()] - }), _createVNode$1B(VFieldLabel, { - "ref": labelRef, - "for": id.value - }, { - default: () => [label()] - }), slots.default?.({ - ...slotProps.value, - props: { - id: id.value, - class: 'v-field__input', - 'aria-describedby': messagesId.value - }, - focus, - blur - })]), hasClear && _createVNode$1B(VExpandXTransition, { - "key": "clear" - }, { - default: () => [_withDirectives$c(_createVNode$1B("div", { - "class": "v-field__clearable", - "onMousedown": e => { - e.preventDefault(); - e.stopPropagation(); - } - }, [_createVNode$1B(VDefaultsProvider, { - "defaults": { - VIcon: { - icon: props.clearIcon - } - } - }, { - default: () => [slots.clear ? slots.clear({ - ...slotProps.value, - props: { - onKeydown: onKeydownClear, - onFocus: focus, - onBlur: blur, - onClick: props['onClick:clear'] - } - }) : _createVNode$1B(InputIcon, { - "name": "clear", - "onKeydown": onKeydownClear, - "onFocus": focus, - "onBlur": blur - }, null)] - })]), [[_vShow$5, props.dirty]])] - }), hasAppend && _createVNode$1B("div", { - "key": "append", - "class": "v-field__append-inner" - }, [slots['append-inner']?.(slotProps.value), props.appendInnerIcon && _createVNode$1B(InputIcon, { - "key": "append-icon", - "name": "appendInner" - }, null)]), _createVNode$1B("div", { - "class": ['v-field__outline', textColorClasses.value], - "style": textColorStyles.value - }, [isOutlined && _createVNode$1B(_Fragment$u, null, [_createVNode$1B("div", { - "class": "v-field__outline__start" - }, null), hasLabel.value && _createVNode$1B("div", { - "class": "v-field__outline__notch" - }, [_createVNode$1B(VFieldLabel, { - "ref": floatingLabelRef, - "floating": true, - "for": id.value - }, { - default: () => [label()] - })]), _createVNode$1B("div", { - "class": "v-field__outline__end" - }, null)]), isPlainOrUnderlined.value && hasLabel.value && _createVNode$1B(VFieldLabel, { - "ref": floatingLabelRef, - "floating": true, - "for": id.value - }, { - default: () => [label()] - })])]); - }); - return { - controlRef - }; - } -}); -// TODO: this is kinda slow, might be better to implicitly inherit props instead -function filterFieldProps(attrs) { - const keys = Object.keys(VField.props).filter(k => !isOn(k) && k !== 'class' && k !== 'style'); - return pick(attrs, keys); -} - -const {Fragment:_Fragment$t,withDirectives:_withDirectives$b,createVNode:_createVNode$1A,mergeProps:_mergeProps$M,resolveDirective:_resolveDirective$F} = await importShared('vue'); -const {cloneVNode,computed: computed$1b,nextTick: nextTick$f,ref: ref$z} = await importShared('vue'); -const activeTypes = ['color', 'file', 'time', 'date', 'datetime-local', 'week', 'month']; -const makeVTextFieldProps = propsFactory({ - autofocus: Boolean, - counter: [Boolean, Number, String], - counterValue: [Number, Function], - prefix: String, - placeholder: String, - persistentPlaceholder: Boolean, - persistentCounter: Boolean, - suffix: String, - role: String, - type: { - type: String, - default: 'text' - }, - modelModifiers: Object, - ...makeVInputProps(), - ...makeVFieldProps() -}, 'VTextField'); -const VTextField = genericComponent()({ - name: 'VTextField', - directives: { - Intersect - }, - inheritAttrs: false, - props: makeVTextFieldProps(), - emits: { - 'click:control': e => true, - 'mousedown:control': e => true, - 'update:focused': focused => true, - 'update:modelValue': val => true - }, - setup(props, _ref) { - let { - attrs, - emit, - slots - } = _ref; - const model = useProxiedModel(props, 'modelValue'); - const { - isFocused, - focus, - blur - } = useFocus(props); - const counterValue = computed$1b(() => { - return typeof props.counterValue === 'function' ? props.counterValue(model.value) : typeof props.counterValue === 'number' ? props.counterValue : (model.value ?? '').toString().length; - }); - const max = computed$1b(() => { - if (attrs.maxlength) return attrs.maxlength; - if (!props.counter || typeof props.counter !== 'number' && typeof props.counter !== 'string') return undefined; - return props.counter; - }); - const isPlainOrUnderlined = computed$1b(() => ['plain', 'underlined'].includes(props.variant)); - function onIntersect(isIntersecting, entries) { - if (!props.autofocus || !isIntersecting) return; - entries[0].target?.focus?.(); - } - const vInputRef = ref$z(); - const vFieldRef = ref$z(); - const inputRef = ref$z(); - const isActive = computed$1b(() => activeTypes.includes(props.type) || props.persistentPlaceholder || isFocused.value || props.active); - function onFocus() { - if (inputRef.value !== document.activeElement) { - inputRef.value?.focus(); - } - if (!isFocused.value) focus(); - } - function onControlMousedown(e) { - emit('mousedown:control', e); - if (e.target === inputRef.value) return; - onFocus(); - e.preventDefault(); - } - function onControlClick(e) { - onFocus(); - emit('click:control', e); - } - function onClear(e) { - e.stopPropagation(); - onFocus(); - nextTick$f(() => { - model.value = null; - callEvent(props['onClick:clear'], e); - }); - } - function onInput(e) { - const el = e.target; - model.value = el.value; - if (props.modelModifiers?.trim && ['text', 'search', 'password', 'tel', 'url'].includes(props.type)) { - const caretPosition = [el.selectionStart, el.selectionEnd]; - nextTick$f(() => { - el.selectionStart = caretPosition[0]; - el.selectionEnd = caretPosition[1]; - }); - } - } - useRender(() => { - const hasCounter = !!(slots.counter || props.counter !== false && props.counter != null); - const hasDetails = !!(hasCounter || slots.details); - const [rootAttrs, inputAttrs] = filterInputAttrs(attrs); - const { - modelValue: _, - ...inputProps - } = VInput.filterProps(props); - const fieldProps = filterFieldProps(props); - return _createVNode$1A(VInput, _mergeProps$M({ - "ref": vInputRef, - "modelValue": model.value, - "onUpdate:modelValue": $event => model.value = $event, - "class": ['v-text-field', { - 'v-text-field--prefixed': props.prefix, - 'v-text-field--suffixed': props.suffix, - 'v-input--plain-underlined': isPlainOrUnderlined.value - }, props.class], - "style": props.style - }, rootAttrs, inputProps, { - "centerAffix": !isPlainOrUnderlined.value, - "focused": isFocused.value - }), { - ...slots, - default: _ref2 => { - let { - id, - isDisabled, - isDirty, - isReadonly, - isValid - } = _ref2; - return _createVNode$1A(VField, _mergeProps$M({ - "ref": vFieldRef, - "onMousedown": onControlMousedown, - "onClick": onControlClick, - "onClick:clear": onClear, - "onClick:prependInner": props['onClick:prependInner'], - "onClick:appendInner": props['onClick:appendInner'], - "role": props.role - }, fieldProps, { - "id": id.value, - "active": isActive.value || isDirty.value, - "dirty": isDirty.value || props.dirty, - "disabled": isDisabled.value, - "focused": isFocused.value, - "error": isValid.value === false - }), { - ...slots, - default: _ref3 => { - let { - props: { - class: fieldClass, - ...slotProps - } - } = _ref3; - const inputNode = _withDirectives$b(_createVNode$1A("input", _mergeProps$M({ - "ref": inputRef, - "value": model.value, - "onInput": onInput, - "autofocus": props.autofocus, - "readonly": isReadonly.value, - "disabled": isDisabled.value, - "name": props.name, - "placeholder": props.placeholder, - "size": 1, - "type": props.type, - "onFocus": onFocus, - "onBlur": blur - }, slotProps, inputAttrs), null), [[_resolveDirective$F("intersect"), { - handler: onIntersect - }, null, { - once: true - }]]); - return _createVNode$1A(_Fragment$t, null, [props.prefix && _createVNode$1A("span", { - "class": "v-text-field__prefix" - }, [_createVNode$1A("span", { - "class": "v-text-field__prefix__text" - }, [props.prefix])]), slots.default ? _createVNode$1A("div", { - "class": fieldClass, - "data-no-activator": "" - }, [slots.default(), inputNode]) : cloneVNode(inputNode, { - class: fieldClass - }), props.suffix && _createVNode$1A("span", { - "class": "v-text-field__suffix" - }, [_createVNode$1A("span", { - "class": "v-text-field__suffix__text" - }, [props.suffix])])]); - } - }); - }, - details: hasDetails ? slotProps => _createVNode$1A(_Fragment$t, null, [slots.details?.(slotProps), hasCounter && _createVNode$1A(_Fragment$t, null, [_createVNode$1A("span", null, null), _createVNode$1A(VCounter, { - "active": props.persistentCounter || isFocused.value, - "value": counterValue.value, - "max": max.value, - "disabled": props.disabled - }, slots.counter)])]) : undefined - }); - }); - return forwardRefs({}, vInputRef, vFieldRef, inputRef); - } -}); - -const {mergeProps:_mergeProps$L,createVNode:_createVNode$1z,Fragment:_Fragment$s} = await importShared('vue'); -const {watch: watch$o} = await importShared('vue'); -const makeVVirtualScrollItemProps = propsFactory({ - renderless: Boolean, - ...makeComponentProps() -}, 'VVirtualScrollItem'); -const VVirtualScrollItem = genericComponent()({ - name: 'VVirtualScrollItem', - inheritAttrs: false, - props: makeVVirtualScrollItemProps(), - emits: { - 'update:height': height => true - }, - setup(props, _ref) { - let { - attrs, - emit, - slots - } = _ref; - const { - resizeRef, - contentRect - } = useResizeObserver(undefined, 'border'); - watch$o(() => contentRect.value?.height, height => { - if (height != null) emit('update:height', height); - }); - useRender(() => props.renderless ? _createVNode$1z(_Fragment$s, null, [slots.default?.({ - itemRef: resizeRef - })]) : _createVNode$1z("div", _mergeProps$L({ - "ref": resizeRef, - "class": ['v-virtual-scroll__item', props.class], - "style": props.style - }, attrs), [slots.default?.()])); - } -}); - -const {computed: computed$1a,nextTick: nextTick$e,onScopeDispose: onScopeDispose$3,ref: ref$y,shallowRef: shallowRef$n,watch: watch$n,watchEffect: watchEffect$b} = await importShared('vue'); -const UP = -1; -const DOWN = 1; - -/** Determines how large each batch of items should be */ -const BUFFER_PX = 100; -const makeVirtualProps = propsFactory({ - itemHeight: { - type: [Number, String], - default: null - }, - height: [Number, String] -}, 'virtual'); -function useVirtual(props, items) { - const display = useDisplay(); - const itemHeight = shallowRef$n(0); - watchEffect$b(() => { - itemHeight.value = parseFloat(props.itemHeight || 0); - }); - const first = shallowRef$n(0); - const last = shallowRef$n(Math.ceil( - // Assume 16px items filling the entire screen height if - // not provided. This is probably incorrect but it minimises - // the chance of ending up with empty space at the bottom. - // The default value is set here to avoid poisoning getSize() - (parseInt(props.height) || display.height.value) / (itemHeight.value || 16)) || 1); - const paddingTop = shallowRef$n(0); - const paddingBottom = shallowRef$n(0); - - /** The scrollable element */ - const containerRef = ref$y(); - /** An element marking the top of the scrollable area, - * used to add an offset if there's padding or other elements above the virtual list */ - const markerRef = ref$y(); - /** markerRef's offsetTop, lazily evaluated */ - let markerOffset = 0; - const { - resizeRef, - contentRect - } = useResizeObserver(); - watchEffect$b(() => { - resizeRef.value = containerRef.value; - }); - const viewportHeight = computed$1a(() => { - return containerRef.value === document.documentElement ? display.height.value : contentRect.value?.height || parseInt(props.height) || 0; - }); - /** All static elements have been rendered and we have an assumed item height */ - const hasInitialRender = computed$1a(() => { - return !!(containerRef.value && markerRef.value && viewportHeight.value && itemHeight.value); - }); - let sizes = Array.from({ - length: items.value.length - }); - let offsets = Array.from({ - length: items.value.length - }); - const updateTime = shallowRef$n(0); - let targetScrollIndex = -1; - function getSize(index) { - return sizes[index] || itemHeight.value; - } - const updateOffsets = debounce(() => { - const start = performance.now(); - offsets[0] = 0; - const length = items.value.length; - for (let i = 1; i <= length - 1; i++) { - offsets[i] = (offsets[i - 1] || 0) + getSize(i - 1); - } - updateTime.value = Math.max(updateTime.value, performance.now() - start); - }, updateTime); - const unwatch = watch$n(hasInitialRender, v => { - if (!v) return; - // First render is complete, update offsets and visible - // items in case our assumed item height was incorrect - - unwatch(); - markerOffset = markerRef.value.offsetTop; - updateOffsets.immediate(); - calculateVisibleItems(); - if (!~targetScrollIndex) return; - nextTick$e(() => { - IN_BROWSER && window.requestAnimationFrame(() => { - scrollToIndex(targetScrollIndex); - targetScrollIndex = -1; - }); - }); - }); - onScopeDispose$3(() => { - updateOffsets.clear(); - }); - function handleItemResize(index, height) { - const prevHeight = sizes[index]; - const prevMinHeight = itemHeight.value; - itemHeight.value = prevMinHeight ? Math.min(itemHeight.value, height) : height; - if (prevHeight !== height || prevMinHeight !== itemHeight.value) { - sizes[index] = height; - updateOffsets(); - } - } - function calculateOffset(index) { - index = clamp(index, 0, items.value.length - 1); - return offsets[index] || 0; - } - function calculateIndex(scrollTop) { - return binaryClosest(offsets, scrollTop); - } - let lastScrollTop = 0; - let scrollVelocity = 0; - let lastScrollTime = 0; - watch$n(viewportHeight, (val, oldVal) => { - if (oldVal) { - calculateVisibleItems(); - if (val < oldVal) { - requestAnimationFrame(() => { - scrollVelocity = 0; - calculateVisibleItems(); - }); - } - } - }); - function handleScroll() { - if (!containerRef.value || !markerRef.value) return; - const scrollTop = containerRef.value.scrollTop; - const scrollTime = performance.now(); - const scrollDeltaT = scrollTime - lastScrollTime; - if (scrollDeltaT > 500) { - scrollVelocity = Math.sign(scrollTop - lastScrollTop); - - // Not super important, only update at the - // start of a scroll sequence to avoid reflows - markerOffset = markerRef.value.offsetTop; - } else { - scrollVelocity = scrollTop - lastScrollTop; - } - lastScrollTop = scrollTop; - lastScrollTime = scrollTime; - calculateVisibleItems(); - } - function handleScrollend() { - if (!containerRef.value || !markerRef.value) return; - scrollVelocity = 0; - lastScrollTime = 0; - calculateVisibleItems(); - } - let raf = -1; - function calculateVisibleItems() { - cancelAnimationFrame(raf); - raf = requestAnimationFrame(_calculateVisibleItems); - } - function _calculateVisibleItems() { - if (!containerRef.value || !viewportHeight.value) return; - const scrollTop = lastScrollTop - markerOffset; - const direction = Math.sign(scrollVelocity); - const startPx = Math.max(0, scrollTop - BUFFER_PX); - const start = clamp(calculateIndex(startPx), 0, items.value.length); - const endPx = scrollTop + viewportHeight.value + BUFFER_PX; - const end = clamp(calculateIndex(endPx) + 1, start + 1, items.value.length); - if ( - // Only update the side we're scrolling towards, - // the other side will be updated incidentally - (direction !== UP || start < first.value) && (direction !== DOWN || end > last.value)) { - const topOverflow = calculateOffset(first.value) - calculateOffset(start); - const bottomOverflow = calculateOffset(end) - calculateOffset(last.value); - const bufferOverflow = Math.max(topOverflow, bottomOverflow); - if (bufferOverflow > BUFFER_PX) { - first.value = start; - last.value = end; - } else { - // Only update the side that's reached its limit if there's still buffer left - if (start <= 0) first.value = start; - if (end >= items.value.length) last.value = end; - } - } - paddingTop.value = calculateOffset(first.value); - paddingBottom.value = calculateOffset(items.value.length) - calculateOffset(last.value); - } - function scrollToIndex(index) { - const offset = calculateOffset(index); - if (!containerRef.value || index && !offset) { - targetScrollIndex = index; - } else { - containerRef.value.scrollTop = offset; - } - } - const computedItems = computed$1a(() => { - return items.value.slice(first.value, last.value).map((item, index) => ({ - raw: item, - index: index + first.value - })); - }); - watch$n(items, () => { - sizes = Array.from({ - length: items.value.length - }); - offsets = Array.from({ - length: items.value.length - }); - updateOffsets.immediate(); - calculateVisibleItems(); - }, { - deep: true - }); - return { - calculateVisibleItems, - containerRef, - markerRef, - computedItems, - paddingTop, - paddingBottom, - scrollToIndex, - handleScroll, - handleScrollend, - handleItemResize - }; -} - -// https://gist.github.com/robertleeplummerjr/1cc657191d34ecd0a324 -function binaryClosest(arr, val) { - let high = arr.length - 1; - let low = 0; - let mid = 0; - let item = null; - let target = -1; - if (arr[high] < val) { - return high; - } - while (low <= high) { - mid = low + high >> 1; - item = arr[mid]; - if (item > val) { - high = mid - 1; - } else if (item < val) { - target = mid; - low = mid + 1; - } else if (item === val) { - return mid; - } else { - return low; - } - } - return target; -} - -const {Fragment:_Fragment$r,createVNode:_createVNode$1y} = await importShared('vue'); -const {onMounted: onMounted$8,onScopeDispose: onScopeDispose$2,toRef: toRef$r} = await importShared('vue'); -const makeVVirtualScrollProps = propsFactory({ - items: { - type: Array, - default: () => [] - }, - renderless: Boolean, - ...makeVirtualProps(), - ...makeComponentProps(), - ...makeDimensionProps() -}, 'VVirtualScroll'); -const VVirtualScroll = genericComponent()({ - name: 'VVirtualScroll', - props: makeVVirtualScrollProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const vm = getCurrentInstance('VVirtualScroll'); - const { - dimensionStyles - } = useDimension(props); - const { - calculateVisibleItems, - containerRef, - markerRef, - handleScroll, - handleScrollend, - handleItemResize, - scrollToIndex, - paddingTop, - paddingBottom, - computedItems - } = useVirtual(props, toRef$r(props, 'items')); - useToggleScope(() => props.renderless, () => { - function handleListeners() { - let add = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - const method = add ? 'addEventListener' : 'removeEventListener'; - if (containerRef.value === document.documentElement) { - document[method]('scroll', handleScroll, { - passive: true - }); - document[method]('scrollend', handleScrollend); - } else { - containerRef.value?.[method]('scroll', handleScroll, { - passive: true - }); - containerRef.value?.[method]('scrollend', handleScrollend); - } - } - onMounted$8(() => { - containerRef.value = getScrollParent(vm.vnode.el, true); - handleListeners(true); - }); - onScopeDispose$2(handleListeners); - }); - useRender(() => { - const children = computedItems.value.map(item => _createVNode$1y(VVirtualScrollItem, { - "key": item.index, - "renderless": props.renderless, - "onUpdate:height": height => handleItemResize(item.index, height) - }, { - default: slotProps => slots.default?.({ - item: item.raw, - index: item.index, - ...slotProps - }) - })); - return props.renderless ? _createVNode$1y(_Fragment$r, null, [_createVNode$1y("div", { - "ref": markerRef, - "class": "v-virtual-scroll__spacer", - "style": { - paddingTop: convertToUnit(paddingTop.value) - } - }, null), children, _createVNode$1y("div", { - "class": "v-virtual-scroll__spacer", - "style": { - paddingBottom: convertToUnit(paddingBottom.value) - } - }, null)]) : _createVNode$1y("div", { - "ref": containerRef, - "class": ['v-virtual-scroll', props.class], - "onScrollPassive": handleScroll, - "onScrollend": handleScrollend, - "style": [dimensionStyles.value, props.style] - }, [_createVNode$1y("div", { - "ref": markerRef, - "class": "v-virtual-scroll__container", - "style": { - paddingTop: convertToUnit(paddingTop.value), - paddingBottom: convertToUnit(paddingBottom.value) - } - }, [children])]); - }); - return { - calculateVisibleItems, - scrollToIndex - }; - } -}); - -// Utilities -const {shallowRef: shallowRef$m,watch: watch$m} = await importShared('vue'); - - -// Types - -function useScrolling(listRef, textFieldRef) { - const isScrolling = shallowRef$m(false); - let scrollTimeout; - function onListScroll(e) { - cancelAnimationFrame(scrollTimeout); - isScrolling.value = true; - scrollTimeout = requestAnimationFrame(() => { - scrollTimeout = requestAnimationFrame(() => { - isScrolling.value = false; - }); - }); - } - async function finishScrolling() { - await new Promise(resolve => requestAnimationFrame(resolve)); - await new Promise(resolve => requestAnimationFrame(resolve)); - await new Promise(resolve => requestAnimationFrame(resolve)); - await new Promise(resolve => { - if (isScrolling.value) { - const stop = watch$m(isScrolling, () => { - stop(); - resolve(); - }); - } else resolve(); - }); - } - async function onListKeydown(e) { - if (e.key === 'Tab') { - textFieldRef.value?.focus(); - } - if (!['PageDown', 'PageUp', 'Home', 'End'].includes(e.key)) return; - const el = listRef.value?.$el; - if (!el) return; - if (e.key === 'Home' || e.key === 'End') { - el.scrollTo({ - top: e.key === 'Home' ? 0 : el.scrollHeight, - behavior: 'smooth' - }); - } - await finishScrolling(); - const children = el.querySelectorAll(':scope > :not(.v-virtual-scroll__spacer)'); - if (e.key === 'PageDown' || e.key === 'Home') { - const top = el.getBoundingClientRect().top; - for (const child of children) { - if (child.getBoundingClientRect().top >= top) { - child.focus(); - break; - } - } - } else { - const bottom = el.getBoundingClientRect().bottom; - for (const child of [...children].reverse()) { - if (child.getBoundingClientRect().bottom <= bottom) { - child.focus(); - break; - } - } - } - } - return { - onScrollPassive: onListScroll, - onKeydown: onListKeydown - }; // typescript doesn't know about vue's event merging -} - -const {createTextVNode:_createTextVNode$6,mergeProps:_mergeProps$K,createVNode:_createVNode$1x,Fragment:_Fragment$q} = await importShared('vue'); -const {computed: computed$19,mergeProps: mergeProps$8,nextTick: nextTick$d,ref: ref$x,shallowRef: shallowRef$l,watch: watch$l} = await importShared('vue'); -const makeSelectProps = propsFactory({ - chips: Boolean, - closableChips: Boolean, - closeText: { - type: String, - default: '$vuetify.close' - }, - openText: { - type: String, - default: '$vuetify.open' - }, - eager: Boolean, - hideNoData: Boolean, - hideSelected: Boolean, - listProps: { - type: Object - }, - menu: Boolean, - menuIcon: { - type: IconValue, - default: '$dropdown' - }, - menuProps: { - type: Object - }, - multiple: Boolean, - noDataText: { - type: String, - default: '$vuetify.noDataText' - }, - openOnClear: Boolean, - itemColor: String, - ...makeItemsProps({ - itemChildren: false - }) -}, 'Select'); -const makeVSelectProps = propsFactory({ - ...makeSelectProps(), - ...omit(makeVTextFieldProps({ - modelValue: null, - role: 'combobox' - }), ['validationValue', 'dirty', 'appendInnerIcon']), - ...makeTransitionProps({ - transition: { - component: VDialogTransition - } - }) -}, 'VSelect'); -const VSelect = genericComponent()({ - name: 'VSelect', - props: makeVSelectProps(), - emits: { - 'update:focused': focused => true, - 'update:modelValue': value => true, - 'update:menu': ue => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const { - t - } = useLocale(); - const vTextFieldRef = ref$x(); - const vMenuRef = ref$x(); - const vVirtualScrollRef = ref$x(); - const _menu = useProxiedModel(props, 'menu'); - const menu = computed$19({ - get: () => _menu.value, - set: v => { - if (_menu.value && !v && vMenuRef.value?.ΨopenChildren.size) return; - _menu.value = v; - } - }); - const { - items, - transformIn, - transformOut - } = useItems(props); - const model = useProxiedModel(props, 'modelValue', [], v => transformIn(v === null ? [null] : wrapInArray(v)), v => { - const transformed = transformOut(v); - return props.multiple ? transformed : transformed[0] ?? null; - }); - const counterValue = computed$19(() => { - return typeof props.counterValue === 'function' ? props.counterValue(model.value) : typeof props.counterValue === 'number' ? props.counterValue : model.value.length; - }); - const form = useForm(); - const selectedValues = computed$19(() => model.value.map(selection => selection.value)); - const isFocused = shallowRef$l(false); - const label = computed$19(() => menu.value ? props.closeText : props.openText); - let keyboardLookupPrefix = ''; - let keyboardLookupLastTime; - const displayItems = computed$19(() => { - if (props.hideSelected) { - return items.value.filter(item => !model.value.some(s => props.valueComparator(s, item))); - } - return items.value; - }); - const menuDisabled = computed$19(() => props.hideNoData && !displayItems.value.length || props.readonly || form?.isReadonly.value); - const computedMenuProps = computed$19(() => { - return { - ...props.menuProps, - activatorProps: { - ...(props.menuProps?.activatorProps || {}), - 'aria-haspopup': 'listbox' // Set aria-haspopup to 'listbox' - } - }; - }); - const listRef = ref$x(); - const listEvents = useScrolling(listRef, vTextFieldRef); - function onClear(e) { - if (props.openOnClear) { - menu.value = true; - } - } - function onMousedownControl() { - if (menuDisabled.value) return; - menu.value = !menu.value; - } - function onListKeydown(e) { - if (checkPrintable(e)) { - onKeydown(e); - } - } - function onKeydown(e) { - if (!e.key || props.readonly || form?.isReadonly.value) return; - if (['Enter', ' ', 'ArrowDown', 'ArrowUp', 'Home', 'End'].includes(e.key)) { - e.preventDefault(); - } - if (['Enter', 'ArrowDown', ' '].includes(e.key)) { - menu.value = true; - } - if (['Escape', 'Tab'].includes(e.key)) { - menu.value = false; - } - if (e.key === 'Home') { - listRef.value?.focus('first'); - } else if (e.key === 'End') { - listRef.value?.focus('last'); - } - - // html select hotkeys - const KEYBOARD_LOOKUP_THRESHOLD = 1000; // milliseconds - - if (props.multiple || !checkPrintable(e)) return; - const now = performance.now(); - if (now - keyboardLookupLastTime > KEYBOARD_LOOKUP_THRESHOLD) { - keyboardLookupPrefix = ''; - } - keyboardLookupPrefix += e.key.toLowerCase(); - keyboardLookupLastTime = now; - const item = items.value.find(item => item.title.toLowerCase().startsWith(keyboardLookupPrefix)); - if (item !== undefined) { - model.value = [item]; - const index = displayItems.value.indexOf(item); - IN_BROWSER && window.requestAnimationFrame(() => { - index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index); - }); - } - } - - /** @param set - null means toggle */ - function select(item) { - let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - if (item.props.disabled) return; - if (props.multiple) { - const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value)); - const add = set == null ? !~index : set; - if (~index) { - const value = add ? [...model.value, item] : [...model.value]; - value.splice(index, 1); - model.value = value; - } else if (add) { - model.value = [...model.value, item]; - } - } else { - const add = set !== false; - model.value = add ? [item] : []; - nextTick$d(() => { - menu.value = false; - }); - } - } - function onBlur(e) { - if (!listRef.value?.$el.contains(e.relatedTarget)) { - menu.value = false; - } - } - function onAfterEnter() { - if (props.eager) { - vVirtualScrollRef.value?.calculateVisibleItems(); - } - } - function onAfterLeave() { - if (isFocused.value) { - vTextFieldRef.value?.focus(); - } - } - function onFocusin(e) { - isFocused.value = true; - } - function onModelUpdate(v) { - if (v == null) model.value = [];else if (matchesSelector(vTextFieldRef.value, ':autofill') || matchesSelector(vTextFieldRef.value, ':-webkit-autofill')) { - const item = items.value.find(item => item.title === v); - if (item) { - select(item); - } - } else if (vTextFieldRef.value) { - vTextFieldRef.value.value = ''; - } - } - watch$l(menu, () => { - if (!props.hideSelected && menu.value && model.value.length) { - const index = displayItems.value.findIndex(item => model.value.some(s => props.valueComparator(s.value, item.value))); - IN_BROWSER && window.requestAnimationFrame(() => { - index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index); - }); - } - }); - watch$l(() => props.items, (newVal, oldVal) => { - if (menu.value) return; - if (isFocused.value && !oldVal.length && newVal.length) { - menu.value = true; - } - }); - useRender(() => { - const hasChips = !!(props.chips || slots.chip); - const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']); - const isDirty = model.value.length > 0; - const textFieldProps = VTextField.filterProps(props); - const placeholder = isDirty || !isFocused.value && props.label && !props.persistentPlaceholder ? undefined : props.placeholder; - return _createVNode$1x(VTextField, _mergeProps$K({ - "ref": vTextFieldRef - }, textFieldProps, { - "modelValue": model.value.map(v => v.props.value).join(', '), - "onUpdate:modelValue": onModelUpdate, - "focused": isFocused.value, - "onUpdate:focused": $event => isFocused.value = $event, - "validationValue": model.externalValue, - "counterValue": counterValue.value, - "dirty": isDirty, - "class": ['v-select', { - 'v-select--active-menu': menu.value, - 'v-select--chips': !!props.chips, - [`v-select--${props.multiple ? 'multiple' : 'single'}`]: true, - 'v-select--selected': model.value.length, - 'v-select--selection-slot': !!slots.selection - }, props.class], - "style": props.style, - "inputmode": "none", - "placeholder": placeholder, - "onClick:clear": onClear, - "onMousedown:control": onMousedownControl, - "onBlur": onBlur, - "onKeydown": onKeydown, - "aria-label": t(label.value), - "title": t(label.value) - }), { - ...slots, - default: () => _createVNode$1x(_Fragment$q, null, [_createVNode$1x(VMenu, _mergeProps$K({ - "ref": vMenuRef, - "modelValue": menu.value, - "onUpdate:modelValue": $event => menu.value = $event, - "activator": "parent", - "contentClass": "v-select__content", - "disabled": menuDisabled.value, - "eager": props.eager, - "maxHeight": 310, - "openOnClick": false, - "closeOnContentClick": false, - "transition": props.transition, - "onAfterEnter": onAfterEnter, - "onAfterLeave": onAfterLeave - }, computedMenuProps.value), { - default: () => [hasList && _createVNode$1x(VList, _mergeProps$K({ - "ref": listRef, - "selected": selectedValues.value, - "selectStrategy": props.multiple ? 'independent' : 'single-independent', - "onMousedown": e => e.preventDefault(), - "onKeydown": onListKeydown, - "onFocusin": onFocusin, - "tabindex": "-1", - "aria-live": "polite", - "color": props.itemColor ?? props.color - }, listEvents, props.listProps), { - default: () => [slots['prepend-item']?.(), !displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? _createVNode$1x(VListItem, { - "title": t(props.noDataText) - }, null)), _createVNode$1x(VVirtualScroll, { - "ref": vVirtualScrollRef, - "renderless": true, - "items": displayItems.value - }, { - default: _ref2 => { - let { - item, - index, - itemRef - } = _ref2; - const itemProps = mergeProps$8(item.props, { - ref: itemRef, - key: index, - onClick: () => select(item, null) - }); - return slots.item?.({ - item, - index, - props: itemProps - }) ?? _createVNode$1x(VListItem, _mergeProps$K(itemProps, { - "role": "option" - }), { - prepend: _ref3 => { - let { - isSelected - } = _ref3; - return _createVNode$1x(_Fragment$q, null, [props.multiple && !props.hideSelected ? _createVNode$1x(VCheckboxBtn, { - "key": item.value, - "modelValue": isSelected, - "ripple": false, - "tabindex": "-1" - }, null) : undefined, item.props.prependAvatar && _createVNode$1x(VAvatar, { - "image": item.props.prependAvatar - }, null), item.props.prependIcon && _createVNode$1x(VIcon, { - "icon": item.props.prependIcon - }, null)]); - } - }); - } - }), slots['append-item']?.()] - })] - }), model.value.map((item, index) => { - function onChipClose(e) { - e.stopPropagation(); - e.preventDefault(); - select(item, false); - } - const slotProps = { - 'onClick:close': onChipClose, - onKeydown(e) { - if (e.key !== 'Enter' && e.key !== ' ') return; - e.preventDefault(); - e.stopPropagation(); - onChipClose(e); - }, - onMousedown(e) { - e.preventDefault(); - e.stopPropagation(); - }, - modelValue: true, - 'onUpdate:modelValue': undefined - }; - const hasSlot = hasChips ? !!slots.chip : !!slots.selection; - const slotContent = hasSlot ? ensureValidVNode(hasChips ? slots.chip({ - item, - index, - props: slotProps - }) : slots.selection({ - item, - index - })) : undefined; - if (hasSlot && !slotContent) return undefined; - return _createVNode$1x("div", { - "key": item.value, - "class": "v-select__selection" - }, [hasChips ? !slots.chip ? _createVNode$1x(VChip, _mergeProps$K({ - "key": "chip", - "closable": props.closableChips, - "size": "small", - "text": item.title, - "disabled": item.props.disabled - }, slotProps), null) : _createVNode$1x(VDefaultsProvider, { - "key": "chip-defaults", - "defaults": { - VChip: { - closable: props.closableChips, - size: 'small', - text: item.title - } - } - }, { - default: () => [slotContent] - }) : slotContent ?? _createVNode$1x("span", { - "class": "v-select__selection-text" - }, [item.title, props.multiple && index < model.value.length - 1 && _createVNode$1x("span", { - "class": "v-select__selection-comma" - }, [_createTextVNode$6(",")])])]); - })]), - 'append-inner': function () { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - return _createVNode$1x(_Fragment$q, null, [slots['append-inner']?.(...args), props.menuIcon ? _createVNode$1x(VIcon, { - "class": "v-select__menu-icon", - "icon": props.menuIcon - }, null) : undefined]); - } - }); - }); - return forwardRefs({ - isFocused, - menu, - select - }, vTextFieldRef); - } -}); - -/* eslint-disable max-statements */ -/* eslint-disable no-labels */ - -// Utilities -const {computed: computed$18,ref: ref$w,unref,watchEffect: watchEffect$a} = await importShared('vue'); -/** - * - match without highlight - * - single match (index), length already known - * - single match (start, end) - * - multiple matches (start, end), probably shouldn't overlap - */ -// Composables -const defaultFilter = (value, query, item) => { - if (value == null || query == null) return -1; - return value.toString().toLocaleLowerCase().indexOf(query.toString().toLocaleLowerCase()); -}; -const makeFilterProps = propsFactory({ - customFilter: Function, - customKeyFilter: Object, - filterKeys: [Array, String], - filterMode: { - type: String, - default: 'intersection' - }, - noFilter: Boolean -}, 'filter'); -function filterItems(items, query, options) { - const array = []; - // always ensure we fall back to a functioning filter - const filter = options?.default ?? defaultFilter; - const keys = options?.filterKeys ? wrapInArray(options.filterKeys) : false; - const customFiltersLength = Object.keys(options?.customKeyFilter ?? {}).length; - if (!items?.length) return array; - loop: for (let i = 0; i < items.length; i++) { - const [item, transformed = item] = wrapInArray(items[i]); - const customMatches = {}; - const defaultMatches = {}; - let match = -1; - if ((query || customFiltersLength > 0) && !options?.noFilter) { - if (typeof item === 'object') { - const filterKeys = keys || Object.keys(transformed); - for (const key of filterKeys) { - const value = getPropertyFromItem(transformed, key); - const keyFilter = options?.customKeyFilter?.[key]; - match = keyFilter ? keyFilter(value, query, item) : filter(value, query, item); - if (match !== -1 && match !== false) { - if (keyFilter) customMatches[key] = match;else defaultMatches[key] = match; - } else if (options?.filterMode === 'every') { - continue loop; - } - } - } else { - match = filter(item, query, item); - if (match !== -1 && match !== false) { - defaultMatches.title = match; - } - } - const defaultMatchesLength = Object.keys(defaultMatches).length; - const customMatchesLength = Object.keys(customMatches).length; - if (!defaultMatchesLength && !customMatchesLength) continue; - if (options?.filterMode === 'union' && customMatchesLength !== customFiltersLength && !defaultMatchesLength) continue; - if (options?.filterMode === 'intersection' && (customMatchesLength !== customFiltersLength || !defaultMatchesLength)) continue; - } - array.push({ - index: i, - matches: { - ...defaultMatches, - ...customMatches - } - }); - } - return array; -} -function useFilter(props, items, query, options) { - const filteredItems = ref$w([]); - const filteredMatches = ref$w(new Map()); - const transformedItems = computed$18(() => options?.transform ? unref(items).map(item => [item, options.transform(item)]) : unref(items)); - watchEffect$a(() => { - const _query = typeof query === 'function' ? query() : unref(query); - const strQuery = typeof _query !== 'string' && typeof _query !== 'number' ? '' : String(_query); - const results = filterItems(transformedItems.value, strQuery, { - customKeyFilter: { - ...props.customKeyFilter, - ...unref(options?.customKeyFilter) - }, - default: props.customFilter, - filterKeys: props.filterKeys, - filterMode: props.filterMode, - noFilter: props.noFilter - }); - const originalItems = unref(items); - const _filteredItems = []; - const _filteredMatches = new Map(); - results.forEach(_ref => { - let { - index, - matches - } = _ref; - const item = originalItems[index]; - _filteredItems.push(item); - _filteredMatches.set(item.value, matches); - }); - filteredItems.value = _filteredItems; - filteredMatches.value = _filteredMatches; - }); - function getMatches(item) { - return filteredMatches.value.get(item.value); - } - return { - filteredItems, - filteredMatches, - getMatches - }; -} - -const {createTextVNode:_createTextVNode$5,mergeProps:_mergeProps$J,createVNode:_createVNode$1w,Fragment:_Fragment$p} = await importShared('vue'); -const {computed: computed$17,mergeProps: mergeProps$7,nextTick: nextTick$c,ref: ref$v,shallowRef: shallowRef$k,watch: watch$k} = await importShared('vue'); -function highlightResult$1(text, matches, length) { - if (matches == null) return text; - if (Array.isArray(matches)) throw new Error('Multiple matches is not implemented'); - return typeof matches === 'number' && ~matches ? _createVNode$1w(_Fragment$p, null, [_createVNode$1w("span", { - "class": "v-autocomplete__unmask" - }, [text.substr(0, matches)]), _createVNode$1w("span", { - "class": "v-autocomplete__mask" - }, [text.substr(matches, length)]), _createVNode$1w("span", { - "class": "v-autocomplete__unmask" - }, [text.substr(matches + length)])]) : text; -} -const makeVAutocompleteProps = propsFactory({ - autoSelectFirst: { - type: [Boolean, String] - }, - clearOnSelect: Boolean, - search: String, - ...makeFilterProps({ - filterKeys: ['title'] - }), - ...makeSelectProps(), - ...omit(makeVTextFieldProps({ - modelValue: null, - role: 'combobox' - }), ['validationValue', 'dirty', 'appendInnerIcon']), - ...makeTransitionProps({ - transition: false - }) -}, 'VAutocomplete'); -const VAutocomplete = genericComponent()({ - name: 'VAutocomplete', - props: makeVAutocompleteProps(), - emits: { - 'update:focused': focused => true, - 'update:search': value => true, - 'update:modelValue': value => true, - 'update:menu': value => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const { - t - } = useLocale(); - const vTextFieldRef = ref$v(); - const isFocused = shallowRef$k(false); - const isPristine = shallowRef$k(true); - const listHasFocus = shallowRef$k(false); - const vMenuRef = ref$v(); - const vVirtualScrollRef = ref$v(); - const _menu = useProxiedModel(props, 'menu'); - const menu = computed$17({ - get: () => _menu.value, - set: v => { - if (_menu.value && !v && vMenuRef.value?.ΨopenChildren.size) return; - _menu.value = v; - } - }); - const selectionIndex = shallowRef$k(-1); - const color = computed$17(() => vTextFieldRef.value?.color); - const label = computed$17(() => menu.value ? props.closeText : props.openText); - const { - items, - transformIn, - transformOut - } = useItems(props); - const { - textColorClasses, - textColorStyles - } = useTextColor(color); - const search = useProxiedModel(props, 'search', ''); - const model = useProxiedModel(props, 'modelValue', [], v => transformIn(v === null ? [null] : wrapInArray(v)), v => { - const transformed = transformOut(v); - return props.multiple ? transformed : transformed[0] ?? null; - }); - const counterValue = computed$17(() => { - return typeof props.counterValue === 'function' ? props.counterValue(model.value) : typeof props.counterValue === 'number' ? props.counterValue : model.value.length; - }); - const form = useForm(); - const { - filteredItems, - getMatches - } = useFilter(props, items, () => isPristine.value ? '' : search.value); - const displayItems = computed$17(() => { - if (props.hideSelected) { - return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value)); - } - return filteredItems.value; - }); - const hasChips = computed$17(() => !!(props.chips || slots.chip)); - const hasSelectionSlot = computed$17(() => hasChips.value || !!slots.selection); - const selectedValues = computed$17(() => model.value.map(selection => selection.props.value)); - const highlightFirst = computed$17(() => { - const selectFirst = props.autoSelectFirst === true || props.autoSelectFirst === 'exact' && search.value === displayItems.value[0]?.title; - return selectFirst && displayItems.value.length > 0 && !isPristine.value && !listHasFocus.value; - }); - const menuDisabled = computed$17(() => props.hideNoData && !displayItems.value.length || props.readonly || form?.isReadonly.value); - const listRef = ref$v(); - const listEvents = useScrolling(listRef, vTextFieldRef); - function onClear(e) { - if (props.openOnClear) { - menu.value = true; - } - search.value = ''; - } - function onMousedownControl() { - if (menuDisabled.value) return; - menu.value = true; - } - function onMousedownMenuIcon(e) { - if (menuDisabled.value) return; - if (isFocused.value) { - e.preventDefault(); - e.stopPropagation(); - } - menu.value = !menu.value; - } - function onListKeydown(e) { - if (checkPrintable(e)) { - vTextFieldRef.value?.focus(); - } - } - function onKeydown(e) { - if (props.readonly || form?.isReadonly.value) return; - const selectionStart = vTextFieldRef.value.selectionStart; - const length = model.value.length; - if (selectionIndex.value > -1 || ['Enter', 'ArrowDown', 'ArrowUp'].includes(e.key)) { - e.preventDefault(); - } - if (['Enter', 'ArrowDown'].includes(e.key)) { - menu.value = true; - } - if (['Escape'].includes(e.key)) { - menu.value = false; - } - if (highlightFirst.value && ['Enter', 'Tab'].includes(e.key) && !model.value.some(_ref2 => { - let { - value - } = _ref2; - return value === displayItems.value[0].value; - })) { - select(displayItems.value[0]); - } - if (e.key === 'ArrowDown' && highlightFirst.value) { - listRef.value?.focus('next'); - } - if (['Backspace', 'Delete'].includes(e.key)) { - if (!props.multiple && hasSelectionSlot.value && model.value.length > 0 && !search.value) return select(model.value[0], false); - if (~selectionIndex.value) { - const originalSelectionIndex = selectionIndex.value; - select(model.value[selectionIndex.value], false); - selectionIndex.value = originalSelectionIndex >= length - 1 ? length - 2 : originalSelectionIndex; - } else if (e.key === 'Backspace' && !search.value) { - selectionIndex.value = length - 1; - } - } - if (!props.multiple) return; - if (e.key === 'ArrowLeft') { - if (selectionIndex.value < 0 && selectionStart > 0) return; - const prev = selectionIndex.value > -1 ? selectionIndex.value - 1 : length - 1; - if (model.value[prev]) { - selectionIndex.value = prev; - } else { - selectionIndex.value = -1; - vTextFieldRef.value.setSelectionRange(search.value?.length, search.value?.length); - } - } - if (e.key === 'ArrowRight') { - if (selectionIndex.value < 0) return; - const next = selectionIndex.value + 1; - if (model.value[next]) { - selectionIndex.value = next; - } else { - selectionIndex.value = -1; - vTextFieldRef.value.setSelectionRange(0, 0); - } - } - } - function onChange(e) { - if (matchesSelector(vTextFieldRef.value, ':autofill') || matchesSelector(vTextFieldRef.value, ':-webkit-autofill')) { - const item = items.value.find(item => item.title === e.target.value); - if (item) { - select(item); - } - } - } - function onAfterEnter() { - if (props.eager) { - vVirtualScrollRef.value?.calculateVisibleItems(); - } - } - function onAfterLeave() { - if (isFocused.value) { - isPristine.value = true; - vTextFieldRef.value?.focus(); - } - } - function onFocusin(e) { - isFocused.value = true; - setTimeout(() => { - listHasFocus.value = true; - }); - } - function onFocusout(e) { - listHasFocus.value = false; - } - function onUpdateModelValue(v) { - if (v == null || v === '' && !props.multiple && !hasSelectionSlot.value) model.value = []; - } - const isSelecting = shallowRef$k(false); - - /** @param set - null means toggle */ - function select(item) { - let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - if (!item || item.props.disabled) return; - if (props.multiple) { - const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value)); - const add = set == null ? !~index : set; - if (~index) { - const value = add ? [...model.value, item] : [...model.value]; - value.splice(index, 1); - model.value = value; - } else if (add) { - model.value = [...model.value, item]; - } - if (props.clearOnSelect) { - search.value = ''; - } - } else { - const add = set !== false; - model.value = add ? [item] : []; - search.value = add && !hasSelectionSlot.value ? item.title : ''; - - // watch for search watcher to trigger - nextTick$c(() => { - menu.value = false; - isPristine.value = true; - }); - } - } - watch$k(isFocused, (val, oldVal) => { - if (val === oldVal) return; - if (val) { - isSelecting.value = true; - search.value = props.multiple || hasSelectionSlot.value ? '' : String(model.value.at(-1)?.props.title ?? ''); - isPristine.value = true; - nextTick$c(() => isSelecting.value = false); - } else { - if (!props.multiple && search.value == null) model.value = []; - menu.value = false; - if (!model.value.some(_ref3 => { - let { - title - } = _ref3; - return title === search.value; - })) search.value = ''; - selectionIndex.value = -1; - } - }); - watch$k(search, val => { - if (!isFocused.value || isSelecting.value) return; - if (val) menu.value = true; - isPristine.value = !val; - }); - watch$k(menu, () => { - if (!props.hideSelected && menu.value && model.value.length) { - const index = displayItems.value.findIndex(item => model.value.some(s => item.value === s.value)); - IN_BROWSER && window.requestAnimationFrame(() => { - index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index); - }); - } - }); - watch$k(() => props.items, (newVal, oldVal) => { - if (menu.value) return; - if (isFocused.value && !oldVal.length && newVal.length) { - menu.value = true; - } - }); - useRender(() => { - const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']); - const isDirty = model.value.length > 0; - const textFieldProps = VTextField.filterProps(props); - return _createVNode$1w(VTextField, _mergeProps$J({ - "ref": vTextFieldRef - }, textFieldProps, { - "modelValue": search.value, - "onUpdate:modelValue": [$event => search.value = $event, onUpdateModelValue], - "focused": isFocused.value, - "onUpdate:focused": $event => isFocused.value = $event, - "validationValue": model.externalValue, - "counterValue": counterValue.value, - "dirty": isDirty, - "onChange": onChange, - "class": ['v-autocomplete', `v-autocomplete--${props.multiple ? 'multiple' : 'single'}`, { - 'v-autocomplete--active-menu': menu.value, - 'v-autocomplete--chips': !!props.chips, - 'v-autocomplete--selection-slot': !!hasSelectionSlot.value, - 'v-autocomplete--selecting-index': selectionIndex.value > -1 - }, props.class], - "style": props.style, - "readonly": props.readonly, - "placeholder": isDirty ? undefined : props.placeholder, - "onClick:clear": onClear, - "onMousedown:control": onMousedownControl, - "onKeydown": onKeydown - }), { - ...slots, - default: () => _createVNode$1w(_Fragment$p, null, [_createVNode$1w(VMenu, _mergeProps$J({ - "ref": vMenuRef, - "modelValue": menu.value, - "onUpdate:modelValue": $event => menu.value = $event, - "activator": "parent", - "contentClass": "v-autocomplete__content", - "disabled": menuDisabled.value, - "eager": props.eager, - "maxHeight": 310, - "openOnClick": false, - "closeOnContentClick": false, - "transition": props.transition, - "onAfterEnter": onAfterEnter, - "onAfterLeave": onAfterLeave - }, props.menuProps), { - default: () => [hasList && _createVNode$1w(VList, _mergeProps$J({ - "ref": listRef, - "selected": selectedValues.value, - "selectStrategy": props.multiple ? 'independent' : 'single-independent', - "onMousedown": e => e.preventDefault(), - "onKeydown": onListKeydown, - "onFocusin": onFocusin, - "onFocusout": onFocusout, - "tabindex": "-1", - "aria-live": "polite", - "color": props.itemColor ?? props.color - }, listEvents, props.listProps), { - default: () => [slots['prepend-item']?.(), !displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? _createVNode$1w(VListItem, { - "title": t(props.noDataText) - }, null)), _createVNode$1w(VVirtualScroll, { - "ref": vVirtualScrollRef, - "renderless": true, - "items": displayItems.value - }, { - default: _ref4 => { - let { - item, - index, - itemRef - } = _ref4; - const itemProps = mergeProps$7(item.props, { - ref: itemRef, - key: index, - active: highlightFirst.value && index === 0 ? true : undefined, - onClick: () => select(item, null) - }); - return slots.item?.({ - item, - index, - props: itemProps - }) ?? _createVNode$1w(VListItem, _mergeProps$J(itemProps, { - "role": "option" - }), { - prepend: _ref5 => { - let { - isSelected - } = _ref5; - return _createVNode$1w(_Fragment$p, null, [props.multiple && !props.hideSelected ? _createVNode$1w(VCheckboxBtn, { - "key": item.value, - "modelValue": isSelected, - "ripple": false, - "tabindex": "-1" - }, null) : undefined, item.props.prependAvatar && _createVNode$1w(VAvatar, { - "image": item.props.prependAvatar - }, null), item.props.prependIcon && _createVNode$1w(VIcon, { - "icon": item.props.prependIcon - }, null)]); - }, - title: () => { - return isPristine.value ? item.title : highlightResult$1(item.title, getMatches(item)?.title, search.value?.length ?? 0); - } - }); - } - }), slots['append-item']?.()] - })] - }), model.value.map((item, index) => { - function onChipClose(e) { - e.stopPropagation(); - e.preventDefault(); - select(item, false); - } - const slotProps = { - 'onClick:close': onChipClose, - onKeydown(e) { - if (e.key !== 'Enter' && e.key !== ' ') return; - e.preventDefault(); - e.stopPropagation(); - onChipClose(e); - }, - onMousedown(e) { - e.preventDefault(); - e.stopPropagation(); - }, - modelValue: true, - 'onUpdate:modelValue': undefined - }; - const hasSlot = hasChips.value ? !!slots.chip : !!slots.selection; - const slotContent = hasSlot ? ensureValidVNode(hasChips.value ? slots.chip({ - item, - index, - props: slotProps - }) : slots.selection({ - item, - index - })) : undefined; - if (hasSlot && !slotContent) return undefined; - return _createVNode$1w("div", { - "key": item.value, - "class": ['v-autocomplete__selection', index === selectionIndex.value && ['v-autocomplete__selection--selected', textColorClasses.value]], - "style": index === selectionIndex.value ? textColorStyles.value : {} - }, [hasChips.value ? !slots.chip ? _createVNode$1w(VChip, _mergeProps$J({ - "key": "chip", - "closable": props.closableChips, - "size": "small", - "text": item.title, - "disabled": item.props.disabled - }, slotProps), null) : _createVNode$1w(VDefaultsProvider, { - "key": "chip-defaults", - "defaults": { - VChip: { - closable: props.closableChips, - size: 'small', - text: item.title - } - } - }, { - default: () => [slotContent] - }) : slotContent ?? _createVNode$1w("span", { - "class": "v-autocomplete__selection-text" - }, [item.title, props.multiple && index < model.value.length - 1 && _createVNode$1w("span", { - "class": "v-autocomplete__selection-comma" - }, [_createTextVNode$5(",")])])]); - })]), - 'append-inner': function () { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - return _createVNode$1w(_Fragment$p, null, [slots['append-inner']?.(...args), props.menuIcon ? _createVNode$1w(VIcon, { - "class": "v-autocomplete__menu-icon", - "icon": props.menuIcon, - "onMousedown": onMousedownMenuIcon, - "onClick": noop, - "aria-label": t(label.value), - "title": t(label.value), - "tabindex": "-1" - }, null) : undefined]); - } - }); - }); - return forwardRefs({ - isFocused, - isPristine, - menu, - search, - filteredItems, - select - }, vTextFieldRef); - } -}); - -const {withDirectives:_withDirectives$a,mergeProps:_mergeProps$I,vShow:_vShow$4,createVNode:_createVNode$1v} = await importShared('vue'); -const {toRef: toRef$q} = await importShared('vue'); -const makeVBadgeProps = propsFactory({ - bordered: Boolean, - color: String, - content: [Number, String], - dot: Boolean, - floating: Boolean, - icon: IconValue, - inline: Boolean, - label: { - type: String, - default: '$vuetify.badge' - }, - max: [Number, String], - modelValue: { - type: Boolean, - default: true - }, - offsetX: [Number, String], - offsetY: [Number, String], - textColor: String, - ...makeComponentProps(), - ...makeLocationProps({ - location: 'top end' - }), - ...makeRoundedProps(), - ...makeTagProps(), - ...makeThemeProps(), - ...makeTransitionProps({ - transition: 'scale-rotate-transition' - }) -}, 'VBadge'); -const VBadge = genericComponent()({ - name: 'VBadge', - inheritAttrs: false, - props: makeVBadgeProps(), - setup(props, ctx) { - const { - backgroundColorClasses, - backgroundColorStyles - } = useBackgroundColor(toRef$q(props, 'color')); - const { - roundedClasses - } = useRounded(props); - const { - t - } = useLocale(); - const { - textColorClasses, - textColorStyles - } = useTextColor(toRef$q(props, 'textColor')); - const { - themeClasses - } = useTheme(); - const { - locationStyles - } = useLocation(props, true, side => { - const base = props.floating ? props.dot ? 2 : 4 : props.dot ? 8 : 12; - return base + (['top', 'bottom'].includes(side) ? +(props.offsetY ?? 0) : ['left', 'right'].includes(side) ? +(props.offsetX ?? 0) : 0); - }); - useRender(() => { - const value = Number(props.content); - const content = !props.max || isNaN(value) ? props.content : value <= +props.max ? value : `${props.max}+`; - const [badgeAttrs, attrs] = pickWithRest(ctx.attrs, ['aria-atomic', 'aria-label', 'aria-live', 'role', 'title']); - return _createVNode$1v(props.tag, _mergeProps$I({ - "class": ['v-badge', { - 'v-badge--bordered': props.bordered, - 'v-badge--dot': props.dot, - 'v-badge--floating': props.floating, - 'v-badge--inline': props.inline - }, props.class] - }, attrs, { - "style": props.style - }), { - default: () => [_createVNode$1v("div", { - "class": "v-badge__wrapper" - }, [ctx.slots.default?.(), _createVNode$1v(MaybeTransition, { - "transition": props.transition - }, { - default: () => [_withDirectives$a(_createVNode$1v("span", _mergeProps$I({ - "class": ['v-badge__badge', themeClasses.value, backgroundColorClasses.value, roundedClasses.value, textColorClasses.value], - "style": [backgroundColorStyles.value, textColorStyles.value, props.inline ? {} : locationStyles.value], - "aria-atomic": "true", - "aria-label": t(props.label, value), - "aria-live": "polite", - "role": "status" - }, badgeAttrs), [props.dot ? undefined : ctx.slots.badge ? ctx.slots.badge?.() : props.icon ? _createVNode$1v(VIcon, { - "icon": props.icon - }, null) : content]), [[_vShow$4, props.modelValue]])] - })])] - }); - }); - return {}; - } -}); - -const {createVNode:_createVNode$1u} = await importShared('vue'); -const makeVBannerActionsProps = propsFactory({ - color: String, - density: String, - ...makeComponentProps() -}, 'VBannerActions'); -const VBannerActions = genericComponent()({ - name: 'VBannerActions', - props: makeVBannerActionsProps(), - setup(props, _ref) { - let { - slots - } = _ref; - provideDefaults({ - VBtn: { - color: props.color, - density: props.density, - slim: true, - variant: 'text' - } - }); - useRender(() => _createVNode$1u("div", { - "class": ['v-banner-actions', props.class], - "style": props.style - }, [slots.default?.()])); - return {}; - } -}); - -// Utilities -const VBannerText = createSimpleFunctional('v-banner-text'); - -const {resolveDirective:_resolveDirective$E,createVNode:_createVNode$1t} = await importShared('vue'); -const {toRef: toRef$p} = await importShared('vue'); -const makeVBannerProps = propsFactory({ - avatar: String, - bgColor: String, - color: String, - icon: IconValue, - lines: String, - stacked: Boolean, - sticky: Boolean, - text: String, - ...makeBorderProps(), - ...makeComponentProps(), - ...makeDensityProps(), - ...makeDimensionProps(), - ...makeDisplayProps({ - mobile: null - }), - ...makeElevationProps(), - ...makeLocationProps(), - ...makePositionProps(), - ...makeRoundedProps(), - ...makeTagProps(), - ...makeThemeProps() -}, 'VBanner'); -const VBanner = genericComponent()({ - name: 'VBanner', - props: makeVBannerProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - backgroundColorClasses, - backgroundColorStyles - } = useBackgroundColor(props, 'bgColor'); - const { - borderClasses - } = useBorder(props); - const { - densityClasses - } = useDensity(props); - const { - displayClasses, - mobile - } = useDisplay(props); - const { - dimensionStyles - } = useDimension(props); - const { - elevationClasses - } = useElevation(props); - const { - locationStyles - } = useLocation(props); - const { - positionClasses - } = usePosition(props); - const { - roundedClasses - } = useRounded(props); - const { - themeClasses - } = provideTheme(props); - const color = toRef$p(props, 'color'); - const density = toRef$p(props, 'density'); - provideDefaults({ - VBannerActions: { - color, - density - } - }); - useRender(() => { - const hasText = !!(props.text || slots.text); - const hasPrependMedia = !!(props.avatar || props.icon); - const hasPrepend = !!(hasPrependMedia || slots.prepend); - return _createVNode$1t(props.tag, { - "class": ['v-banner', { - 'v-banner--stacked': props.stacked || mobile.value, - 'v-banner--sticky': props.sticky, - [`v-banner--${props.lines}-line`]: !!props.lines - }, themeClasses.value, backgroundColorClasses.value, borderClasses.value, densityClasses.value, displayClasses.value, elevationClasses.value, positionClasses.value, roundedClasses.value, props.class], - "style": [backgroundColorStyles.value, dimensionStyles.value, locationStyles.value, props.style], - "role": "banner" - }, { - default: () => [hasPrepend && _createVNode$1t("div", { - "key": "prepend", - "class": "v-banner__prepend" - }, [!slots.prepend ? _createVNode$1t(VAvatar, { - "key": "prepend-avatar", - "color": color.value, - "density": density.value, - "icon": props.icon, - "image": props.avatar - }, null) : _createVNode$1t(VDefaultsProvider, { - "key": "prepend-defaults", - "disabled": !hasPrependMedia, - "defaults": { - VAvatar: { - color: color.value, - density: density.value, - icon: props.icon, - image: props.avatar - } - } - }, slots.prepend)]), _createVNode$1t("div", { - "class": "v-banner__content" - }, [hasText && _createVNode$1t(VBannerText, { - "key": "text" - }, { - default: () => [slots.text?.() ?? props.text] - }), slots.default?.()]), slots.actions && _createVNode$1t(VBannerActions, { - "key": "actions" - }, slots.actions)] - }); - }); - } -}); - -const {createVNode:_createVNode$1s} = await importShared('vue'); -const {computed: computed$16,toRef: toRef$o} = await importShared('vue'); -const makeVBottomNavigationProps = propsFactory({ - baseColor: String, - bgColor: String, - color: String, - grow: Boolean, - mode: { - type: String, - validator: v => !v || ['horizontal', 'shift'].includes(v) - }, - height: { - type: [Number, String], - default: 56 - }, - active: { - type: Boolean, - default: true - }, - ...makeBorderProps(), - ...makeComponentProps(), - ...makeDensityProps(), - ...makeElevationProps(), - ...makeRoundedProps(), - ...makeLayoutItemProps({ - name: 'bottom-navigation' - }), - ...makeTagProps({ - tag: 'header' - }), - ...makeGroupProps({ - selectedClass: 'v-btn--selected' - }), - ...makeThemeProps() -}, 'VBottomNavigation'); -const VBottomNavigation = genericComponent()({ - name: 'VBottomNavigation', - props: makeVBottomNavigationProps(), - emits: { - 'update:active': value => true, - 'update:modelValue': value => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const { - themeClasses - } = useTheme(); - const { - borderClasses - } = useBorder(props); - const { - backgroundColorClasses, - backgroundColorStyles - } = useBackgroundColor(toRef$o(props, 'bgColor')); - const { - densityClasses - } = useDensity(props); - const { - elevationClasses - } = useElevation(props); - const { - roundedClasses - } = useRounded(props); - const { - ssrBootStyles - } = useSsrBoot(); - const height = computed$16(() => Number(props.height) - (props.density === 'comfortable' ? 8 : 0) - (props.density === 'compact' ? 16 : 0)); - const isActive = useProxiedModel(props, 'active', props.active); - const { - layoutItemStyles - } = useLayoutItem({ - id: props.name, - order: computed$16(() => parseInt(props.order, 10)), - position: computed$16(() => 'bottom'), - layoutSize: computed$16(() => isActive.value ? height.value : 0), - elementSize: height, - active: isActive, - absolute: toRef$o(props, 'absolute') - }); - useGroup(props, VBtnToggleSymbol); - provideDefaults({ - VBtn: { - baseColor: toRef$o(props, 'baseColor'), - color: toRef$o(props, 'color'), - density: toRef$o(props, 'density'), - stacked: computed$16(() => props.mode !== 'horizontal'), - variant: 'text' - } - }, { - scoped: true - }); - useRender(() => { - return _createVNode$1s(props.tag, { - "class": ['v-bottom-navigation', { - 'v-bottom-navigation--active': isActive.value, - 'v-bottom-navigation--grow': props.grow, - 'v-bottom-navigation--shift': props.mode === 'shift' - }, themeClasses.value, backgroundColorClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class], - "style": [backgroundColorStyles.value, layoutItemStyles.value, { - height: convertToUnit(height.value) - }, ssrBootStyles.value, props.style] - }, { - default: () => [slots.default && _createVNode$1s("div", { - "class": "v-bottom-navigation__content" - }, [slots.default()])] - }); - }); - return {}; - } -}); - -const {mergeProps:_mergeProps$H,createVNode:_createVNode$1r} = await importShared('vue'); -const {mergeProps: mergeProps$6,nextTick: nextTick$b,ref: ref$u,watch: watch$j} = await importShared('vue'); -const makeVDialogProps = propsFactory({ - fullscreen: Boolean, - retainFocus: { - type: Boolean, - default: true - }, - scrollable: Boolean, - ...makeVOverlayProps({ - origin: 'center center', - scrollStrategy: 'block', - transition: { - component: VDialogTransition - }, - zIndex: 2400 - }) -}, 'VDialog'); -const VDialog = genericComponent()({ - name: 'VDialog', - props: makeVDialogProps(), - emits: { - 'update:modelValue': value => true, - afterEnter: () => true, - afterLeave: () => true - }, - setup(props, _ref) { - let { - emit, - slots - } = _ref; - const isActive = useProxiedModel(props, 'modelValue'); - const { - scopeId - } = useScopeId(); - const overlay = ref$u(); - function onFocusin(e) { - const before = e.relatedTarget; - const after = e.target; - if (before !== after && overlay.value?.contentEl && - // We're the topmost dialog - overlay.value?.globalTop && - // It isn't the document or the dialog body - ![document, overlay.value.contentEl].includes(after) && - // It isn't inside the dialog body - !overlay.value.contentEl.contains(after)) { - const focusable = focusableChildren(overlay.value.contentEl); - if (!focusable.length) return; - const firstElement = focusable[0]; - const lastElement = focusable[focusable.length - 1]; - if (before === firstElement) { - lastElement.focus(); - } else { - firstElement.focus(); - } - } - } - if (IN_BROWSER) { - watch$j(() => isActive.value && props.retainFocus, val => { - val ? document.addEventListener('focusin', onFocusin) : document.removeEventListener('focusin', onFocusin); - }, { - immediate: true - }); - } - function onAfterEnter() { - emit('afterEnter'); - if (overlay.value?.contentEl && !overlay.value.contentEl.contains(document.activeElement)) { - overlay.value.contentEl.focus({ - preventScroll: true - }); - } - } - function onAfterLeave() { - emit('afterLeave'); - } - watch$j(isActive, async val => { - if (!val) { - await nextTick$b(); - overlay.value.activatorEl?.focus({ - preventScroll: true - }); - } - }); - useRender(() => { - const overlayProps = VOverlay.filterProps(props); - const activatorProps = mergeProps$6({ - 'aria-haspopup': 'dialog' - }, props.activatorProps); - const contentProps = mergeProps$6({ - tabindex: -1 - }, props.contentProps); - return _createVNode$1r(VOverlay, _mergeProps$H({ - "ref": overlay, - "class": ['v-dialog', { - 'v-dialog--fullscreen': props.fullscreen, - 'v-dialog--scrollable': props.scrollable - }, props.class], - "style": props.style - }, overlayProps, { - "modelValue": isActive.value, - "onUpdate:modelValue": $event => isActive.value = $event, - "aria-modal": "true", - "activatorProps": activatorProps, - "contentProps": contentProps, - "role": "dialog", - "onAfterEnter": onAfterEnter, - "onAfterLeave": onAfterLeave - }, scopeId), { - activator: slots.activator, - default: function () { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - return _createVNode$1r(VDefaultsProvider, { - "root": "VDialog" - }, { - default: () => [slots.default?.(...args)] - }); - } - }); - }); - return forwardRefs({}, overlay); - } -}); - -const {createVNode:_createVNode$1q,mergeProps:_mergeProps$G,resolveDirective:_resolveDirective$D} = await importShared('vue'); -const makeVBottomSheetProps = propsFactory({ - inset: Boolean, - ...makeVDialogProps({ - transition: 'bottom-sheet-transition' - }) -}, 'VBottomSheet'); -const VBottomSheet = genericComponent()({ - name: 'VBottomSheet', - props: makeVBottomSheetProps(), - emits: { - 'update:modelValue': value => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const isActive = useProxiedModel(props, 'modelValue'); - useRender(() => { - const dialogProps = VDialog.filterProps(props); - return _createVNode$1q(VDialog, _mergeProps$G(dialogProps, { - "contentClass": ['v-bottom-sheet__content', props.contentClass], - "modelValue": isActive.value, - "onUpdate:modelValue": $event => isActive.value = $event, - "class": ['v-bottom-sheet', { - 'v-bottom-sheet--inset': props.inset - }, props.class], - "style": props.style - }), slots); - }); - return {}; - } -}); - -const {createVNode:_createVNode$1p} = await importShared('vue'); -const makeVBreadcrumbsDividerProps = propsFactory({ - divider: [Number, String], - ...makeComponentProps() -}, 'VBreadcrumbsDivider'); -const VBreadcrumbsDivider = genericComponent()({ - name: 'VBreadcrumbsDivider', - props: makeVBreadcrumbsDividerProps(), - setup(props, _ref) { - let { - slots - } = _ref; - useRender(() => _createVNode$1p("li", { - "class": ['v-breadcrumbs-divider', props.class], - "style": props.style - }, [slots?.default?.() ?? props.divider])); - return {}; - } -}); - -const {createVNode:_createVNode$1o,mergeProps:_mergeProps$F} = await importShared('vue'); -const {computed: computed$15} = await importShared('vue'); -const makeVBreadcrumbsItemProps = propsFactory({ - active: Boolean, - activeClass: String, - activeColor: String, - color: String, - disabled: Boolean, - title: String, - ...makeComponentProps(), - ...makeRouterProps(), - ...makeTagProps({ - tag: 'li' - }) -}, 'VBreadcrumbsItem'); -const VBreadcrumbsItem = genericComponent()({ - name: 'VBreadcrumbsItem', - props: makeVBreadcrumbsItemProps(), - setup(props, _ref) { - let { - slots, - attrs - } = _ref; - const link = useLink(props, attrs); - const isActive = computed$15(() => props.active || link.isActive?.value); - const color = computed$15(() => isActive.value ? props.activeColor : props.color); - const { - textColorClasses, - textColorStyles - } = useTextColor(color); - useRender(() => { - return _createVNode$1o(props.tag, { - "class": ['v-breadcrumbs-item', { - 'v-breadcrumbs-item--active': isActive.value, - 'v-breadcrumbs-item--disabled': props.disabled, - [`${props.activeClass}`]: isActive.value && props.activeClass - }, textColorClasses.value, props.class], - "style": [textColorStyles.value, props.style], - "aria-current": isActive.value ? 'page' : undefined - }, { - default: () => [!link.isLink.value ? slots.default?.() ?? props.title : _createVNode$1o("a", _mergeProps$F({ - "class": "v-breadcrumbs-item--link", - "onClick": link.navigate - }, link.linkProps), [slots.default?.() ?? props.title])] - }); - }); - return {}; - } -}); - -const {mergeProps:_mergeProps$E,Fragment:_Fragment$o,resolveDirective:_resolveDirective$C,createVNode:_createVNode$1n} = await importShared('vue'); -const {computed: computed$14,toRef: toRef$n} = await importShared('vue'); -const makeVBreadcrumbsProps = propsFactory({ - activeClass: String, - activeColor: String, - bgColor: String, - color: String, - disabled: Boolean, - divider: { - type: String, - default: '/' - }, - icon: IconValue, - items: { - type: Array, - default: () => [] - }, - ...makeComponentProps(), - ...makeDensityProps(), - ...makeRoundedProps(), - ...makeTagProps({ - tag: 'ul' - }) -}, 'VBreadcrumbs'); -const VBreadcrumbs = genericComponent()({ - name: 'VBreadcrumbs', - props: makeVBreadcrumbsProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - backgroundColorClasses, - backgroundColorStyles - } = useBackgroundColor(toRef$n(props, 'bgColor')); - const { - densityClasses - } = useDensity(props); - const { - roundedClasses - } = useRounded(props); - provideDefaults({ - VBreadcrumbsDivider: { - divider: toRef$n(props, 'divider') - }, - VBreadcrumbsItem: { - activeClass: toRef$n(props, 'activeClass'), - activeColor: toRef$n(props, 'activeColor'), - color: toRef$n(props, 'color'), - disabled: toRef$n(props, 'disabled') - } - }); - const items = computed$14(() => props.items.map(item => { - return typeof item === 'string' ? { - item: { - title: item - }, - raw: item - } : { - item, - raw: item - }; - })); - useRender(() => { - const hasPrepend = !!(slots.prepend || props.icon); - return _createVNode$1n(props.tag, { - "class": ['v-breadcrumbs', backgroundColorClasses.value, densityClasses.value, roundedClasses.value, props.class], - "style": [backgroundColorStyles.value, props.style] - }, { - default: () => [hasPrepend && _createVNode$1n("li", { - "key": "prepend", - "class": "v-breadcrumbs__prepend" - }, [!slots.prepend ? _createVNode$1n(VIcon, { - "key": "prepend-icon", - "start": true, - "icon": props.icon - }, null) : _createVNode$1n(VDefaultsProvider, { - "key": "prepend-defaults", - "disabled": !props.icon, - "defaults": { - VIcon: { - icon: props.icon, - start: true - } - } - }, slots.prepend)]), items.value.map((_ref2, index, array) => { - let { - item, - raw - } = _ref2; - return _createVNode$1n(_Fragment$o, null, [slots.item?.({ - item, - index - }) ?? _createVNode$1n(VBreadcrumbsItem, _mergeProps$E({ - "key": index, - "disabled": index >= array.length - 1 - }, typeof item === 'string' ? { - title: item - } : item), { - default: slots.title ? () => slots.title?.({ - item, - index - }) : undefined - }), index < array.length - 1 && _createVNode$1n(VBreadcrumbsDivider, null, { - default: slots.divider ? () => slots.divider?.({ - item: raw, - index - }) : undefined - })]); - }), slots.default?.()] - }); - }); - return {}; - } -}); - -const {createVNode:_createVNode$1m} = await importShared('vue'); -const VCardActions = genericComponent()({ - name: 'VCardActions', - props: makeComponentProps(), - setup(props, _ref) { - let { - slots - } = _ref; - provideDefaults({ - VBtn: { - slim: true, - variant: 'text' - } - }); - useRender(() => _createVNode$1m("div", { - "class": ['v-card-actions', props.class], - "style": props.style - }, [slots.default?.()])); - return {}; - } -}); - -const {createVNode:_createVNode$1l,resolveDirective:_resolveDirective$B} = await importShared('vue'); -const makeVCardSubtitleProps = propsFactory({ - opacity: [Number, String], - ...makeComponentProps(), - ...makeTagProps() -}, 'VCardSubtitle'); -const VCardSubtitle = genericComponent()({ - name: 'VCardSubtitle', - props: makeVCardSubtitleProps(), - setup(props, _ref) { - let { - slots - } = _ref; - useRender(() => _createVNode$1l(props.tag, { - "class": ['v-card-subtitle', props.class], - "style": [{ - '--v-card-subtitle-opacity': props.opacity - }, props.style] - }, slots)); - return {}; - } -}); - -// Utilities -const VCardTitle = createSimpleFunctional('v-card-title'); - -const {resolveDirective:_resolveDirective$A,createVNode:_createVNode$1k,Fragment:_Fragment$n} = await importShared('vue'); -const makeCardItemProps = propsFactory({ - appendAvatar: String, - appendIcon: IconValue, - prependAvatar: String, - prependIcon: IconValue, - subtitle: [String, Number], - title: [String, Number], - ...makeComponentProps(), - ...makeDensityProps() -}, 'VCardItem'); -const VCardItem = genericComponent()({ - name: 'VCardItem', - props: makeCardItemProps(), - setup(props, _ref) { - let { - slots - } = _ref; - useRender(() => { - const hasPrependMedia = !!(props.prependAvatar || props.prependIcon); - const hasPrepend = !!(hasPrependMedia || slots.prepend); - const hasAppendMedia = !!(props.appendAvatar || props.appendIcon); - const hasAppend = !!(hasAppendMedia || slots.append); - const hasTitle = !!(props.title != null || slots.title); - const hasSubtitle = !!(props.subtitle != null || slots.subtitle); - return _createVNode$1k("div", { - "class": ['v-card-item', props.class], - "style": props.style - }, [hasPrepend && _createVNode$1k("div", { - "key": "prepend", - "class": "v-card-item__prepend" - }, [!slots.prepend ? _createVNode$1k(_Fragment$n, null, [props.prependAvatar && _createVNode$1k(VAvatar, { - "key": "prepend-avatar", - "density": props.density, - "image": props.prependAvatar - }, null), props.prependIcon && _createVNode$1k(VIcon, { - "key": "prepend-icon", - "density": props.density, - "icon": props.prependIcon - }, null)]) : _createVNode$1k(VDefaultsProvider, { - "key": "prepend-defaults", - "disabled": !hasPrependMedia, - "defaults": { - VAvatar: { - density: props.density, - image: props.prependAvatar - }, - VIcon: { - density: props.density, - icon: props.prependIcon - } - } - }, slots.prepend)]), _createVNode$1k("div", { - "class": "v-card-item__content" - }, [hasTitle && _createVNode$1k(VCardTitle, { - "key": "title" - }, { - default: () => [slots.title?.() ?? props.title] - }), hasSubtitle && _createVNode$1k(VCardSubtitle, { - "key": "subtitle" - }, { - default: () => [slots.subtitle?.() ?? props.subtitle] - }), slots.default?.()]), hasAppend && _createVNode$1k("div", { - "key": "append", - "class": "v-card-item__append" - }, [!slots.append ? _createVNode$1k(_Fragment$n, null, [props.appendIcon && _createVNode$1k(VIcon, { - "key": "append-icon", - "density": props.density, - "icon": props.appendIcon - }, null), props.appendAvatar && _createVNode$1k(VAvatar, { - "key": "append-avatar", - "density": props.density, - "image": props.appendAvatar - }, null)]) : _createVNode$1k(VDefaultsProvider, { - "key": "append-defaults", - "disabled": !hasAppendMedia, - "defaults": { - VAvatar: { - density: props.density, - image: props.appendAvatar - }, - VIcon: { - density: props.density, - icon: props.appendIcon - } - } - }, slots.append)])]); - }); - return {}; - } -}); - -const {createVNode:_createVNode$1j,resolveDirective:_resolveDirective$z} = await importShared('vue'); -const makeVCardTextProps = propsFactory({ - opacity: [Number, String], - ...makeComponentProps(), - ...makeTagProps() -}, 'VCardText'); -const VCardText = genericComponent()({ - name: 'VCardText', - props: makeVCardTextProps(), - setup(props, _ref) { - let { - slots - } = _ref; - useRender(() => _createVNode$1j(props.tag, { - "class": ['v-card-text', props.class], - "style": [{ - '--v-card-text-opacity': props.opacity - }, props.style] - }, slots)); - return {}; - } -}); - -const {withDirectives:_withDirectives$9,mergeProps:_mergeProps$D,resolveDirective:_resolveDirective$y,createVNode:_createVNode$1i} = await importShared('vue'); -const {computed: computed$13} = await importShared('vue'); -const makeVCardProps = propsFactory({ - appendAvatar: String, - appendIcon: IconValue, - disabled: Boolean, - flat: Boolean, - hover: Boolean, - image: String, - link: { - type: Boolean, - default: undefined - }, - prependAvatar: String, - prependIcon: IconValue, - ripple: { - type: [Boolean, Object], - default: true - }, - subtitle: [String, Number], - text: [String, Number], - title: [String, Number], - ...makeBorderProps(), - ...makeComponentProps(), - ...makeDensityProps(), - ...makeDimensionProps(), - ...makeElevationProps(), - ...makeLoaderProps(), - ...makeLocationProps(), - ...makePositionProps(), - ...makeRoundedProps(), - ...makeRouterProps(), - ...makeTagProps(), - ...makeThemeProps(), - ...makeVariantProps({ - variant: 'elevated' - }) -}, 'VCard'); -const VCard = genericComponent()({ - name: 'VCard', - directives: { - Ripple - }, - props: makeVCardProps(), - setup(props, _ref) { - let { - attrs, - slots - } = _ref; - const { - themeClasses - } = provideTheme(props); - const { - borderClasses - } = useBorder(props); - const { - colorClasses, - colorStyles, - variantClasses - } = useVariant(props); - const { - densityClasses - } = useDensity(props); - const { - dimensionStyles - } = useDimension(props); - const { - elevationClasses - } = useElevation(props); - const { - loaderClasses - } = useLoader(props); - const { - locationStyles - } = useLocation(props); - const { - positionClasses - } = usePosition(props); - const { - roundedClasses - } = useRounded(props); - const link = useLink(props, attrs); - const isLink = computed$13(() => props.link !== false && link.isLink.value); - const isClickable = computed$13(() => !props.disabled && props.link !== false && (props.link || link.isClickable.value)); - useRender(() => { - const Tag = isLink.value ? 'a' : props.tag; - const hasTitle = !!(slots.title || props.title != null); - const hasSubtitle = !!(slots.subtitle || props.subtitle != null); - const hasHeader = hasTitle || hasSubtitle; - const hasAppend = !!(slots.append || props.appendAvatar || props.appendIcon); - const hasPrepend = !!(slots.prepend || props.prependAvatar || props.prependIcon); - const hasImage = !!(slots.image || props.image); - const hasCardItem = hasHeader || hasPrepend || hasAppend; - const hasText = !!(slots.text || props.text != null); - return _withDirectives$9(_createVNode$1i(Tag, _mergeProps$D({ - "class": ['v-card', { - 'v-card--disabled': props.disabled, - 'v-card--flat': props.flat, - 'v-card--hover': props.hover && !(props.disabled || props.flat), - 'v-card--link': isClickable.value - }, themeClasses.value, borderClasses.value, colorClasses.value, densityClasses.value, elevationClasses.value, loaderClasses.value, positionClasses.value, roundedClasses.value, variantClasses.value, props.class], - "style": [colorStyles.value, dimensionStyles.value, locationStyles.value, props.style], - "onClick": isClickable.value && link.navigate, - "tabindex": props.disabled ? -1 : undefined - }, link.linkProps), { - default: () => [hasImage && _createVNode$1i("div", { - "key": "image", - "class": "v-card__image" - }, [!slots.image ? _createVNode$1i(VImg, { - "key": "image-img", - "cover": true, - "src": props.image - }, null) : _createVNode$1i(VDefaultsProvider, { - "key": "image-defaults", - "disabled": !props.image, - "defaults": { - VImg: { - cover: true, - src: props.image - } - } - }, slots.image)]), _createVNode$1i(LoaderSlot, { - "name": "v-card", - "active": !!props.loading, - "color": typeof props.loading === 'boolean' ? undefined : props.loading - }, { - default: slots.loader - }), hasCardItem && _createVNode$1i(VCardItem, { - "key": "item", - "prependAvatar": props.prependAvatar, - "prependIcon": props.prependIcon, - "title": props.title, - "subtitle": props.subtitle, - "appendAvatar": props.appendAvatar, - "appendIcon": props.appendIcon - }, { - default: slots.item, - prepend: slots.prepend, - title: slots.title, - subtitle: slots.subtitle, - append: slots.append - }), hasText && _createVNode$1i(VCardText, { - "key": "text" - }, { - default: () => [slots.text?.() ?? props.text] - }), slots.default?.(), slots.actions && _createVNode$1i(VCardActions, null, { - default: slots.actions - }), genOverlays(isClickable.value, 'v-card')] - }), [[_resolveDirective$y("ripple"), isClickable.value && props.ripple]]); - }); - return {}; - } -}); - -// Utilities -const handleGesture = wrapper => { - const { - touchstartX, - touchendX, - touchstartY, - touchendY - } = wrapper; - const dirRatio = 0.5; - const minDistance = 16; - wrapper.offsetX = touchendX - touchstartX; - wrapper.offsetY = touchendY - touchstartY; - if (Math.abs(wrapper.offsetY) < dirRatio * Math.abs(wrapper.offsetX)) { - wrapper.left && touchendX < touchstartX - minDistance && wrapper.left(wrapper); - wrapper.right && touchendX > touchstartX + minDistance && wrapper.right(wrapper); - } - if (Math.abs(wrapper.offsetX) < dirRatio * Math.abs(wrapper.offsetY)) { - wrapper.up && touchendY < touchstartY - minDistance && wrapper.up(wrapper); - wrapper.down && touchendY > touchstartY + minDistance && wrapper.down(wrapper); - } -}; -function touchstart(event, wrapper) { - const touch = event.changedTouches[0]; - wrapper.touchstartX = touch.clientX; - wrapper.touchstartY = touch.clientY; - wrapper.start?.({ - originalEvent: event, - ...wrapper - }); -} -function touchend(event, wrapper) { - const touch = event.changedTouches[0]; - wrapper.touchendX = touch.clientX; - wrapper.touchendY = touch.clientY; - wrapper.end?.({ - originalEvent: event, - ...wrapper - }); - handleGesture(wrapper); -} -function touchmove(event, wrapper) { - const touch = event.changedTouches[0]; - wrapper.touchmoveX = touch.clientX; - wrapper.touchmoveY = touch.clientY; - wrapper.move?.({ - originalEvent: event, - ...wrapper - }); -} -function createHandlers() { - let value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - const wrapper = { - touchstartX: 0, - touchstartY: 0, - touchendX: 0, - touchendY: 0, - touchmoveX: 0, - touchmoveY: 0, - offsetX: 0, - offsetY: 0, - left: value.left, - right: value.right, - up: value.up, - down: value.down, - start: value.start, - move: value.move, - end: value.end - }; - return { - touchstart: e => touchstart(e, wrapper), - touchend: e => touchend(e, wrapper), - touchmove: e => touchmove(e, wrapper) - }; -} -function mounted$3(el, binding) { - const value = binding.value; - const target = value?.parent ? el.parentElement : el; - const options = value?.options ?? { - passive: true - }; - const uid = binding.instance?.$.uid; // TODO: use custom uid generator - - if (!target || !uid) return; - const handlers = createHandlers(binding.value); - target._touchHandlers = target._touchHandlers ?? Object.create(null); - target._touchHandlers[uid] = handlers; - keys(handlers).forEach(eventName => { - target.addEventListener(eventName, handlers[eventName], options); - }); -} -function unmounted$3(el, binding) { - const target = binding.value?.parent ? el.parentElement : el; - const uid = binding.instance?.$.uid; - if (!target?._touchHandlers || !uid) return; - const handlers = target._touchHandlers[uid]; - keys(handlers).forEach(eventName => { - target.removeEventListener(eventName, handlers[eventName]); - }); - delete target._touchHandlers[uid]; -} -const Touch = { - mounted: mounted$3, - unmounted: unmounted$3 -}; - -const {withDirectives:_withDirectives$8,resolveDirective:_resolveDirective$x,createVNode:_createVNode$1h} = await importShared('vue'); -const {computed: computed$12,provide: provide$9,ref: ref$t,shallowRef: shallowRef$j,watch: watch$i} = await importShared('vue'); -const VWindowSymbol = Symbol.for('vuetify:v-window'); -const VWindowGroupSymbol = Symbol.for('vuetify:v-window-group'); -const makeVWindowProps = propsFactory({ - continuous: Boolean, - nextIcon: { - type: [Boolean, String, Function, Object], - default: '$next' - }, - prevIcon: { - type: [Boolean, String, Function, Object], - default: '$prev' - }, - reverse: Boolean, - showArrows: { - type: [Boolean, String], - validator: v => typeof v === 'boolean' || v === 'hover' - }, - touch: { - type: [Object, Boolean], - default: undefined - }, - direction: { - type: String, - default: 'horizontal' - }, - modelValue: null, - disabled: Boolean, - selectedClass: { - type: String, - default: 'v-window-item--active' - }, - // TODO: mandatory should probably not be exposed but do this for now - mandatory: { - type: [Boolean, String], - default: 'force' - }, - ...makeComponentProps(), - ...makeTagProps(), - ...makeThemeProps() -}, 'VWindow'); -const VWindow = genericComponent()({ - name: 'VWindow', - directives: { - Touch - }, - props: makeVWindowProps(), - emits: { - 'update:modelValue': value => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const { - themeClasses - } = provideTheme(props); - const { - isRtl - } = useRtl(); - const { - t - } = useLocale(); - const group = useGroup(props, VWindowGroupSymbol); - const rootRef = ref$t(); - const isRtlReverse = computed$12(() => isRtl.value ? !props.reverse : props.reverse); - const isReversed = shallowRef$j(false); - const transition = computed$12(() => { - const axis = props.direction === 'vertical' ? 'y' : 'x'; - const reverse = isRtlReverse.value ? !isReversed.value : isReversed.value; - const direction = reverse ? '-reverse' : ''; - return `v-window-${axis}${direction}-transition`; - }); - const transitionCount = shallowRef$j(0); - const transitionHeight = ref$t(undefined); - const activeIndex = computed$12(() => { - return group.items.value.findIndex(item => group.selected.value.includes(item.id)); - }); - watch$i(activeIndex, (newVal, oldVal) => { - const itemsLength = group.items.value.length; - const lastIndex = itemsLength - 1; - if (itemsLength <= 2) { - isReversed.value = newVal < oldVal; - } else if (newVal === lastIndex && oldVal === 0) { - isReversed.value = true; - } else if (newVal === 0 && oldVal === lastIndex) { - isReversed.value = false; - } else { - isReversed.value = newVal < oldVal; - } - }); - provide$9(VWindowSymbol, { - transition, - isReversed, - transitionCount, - transitionHeight, - rootRef - }); - const canMoveBack = computed$12(() => props.continuous || activeIndex.value !== 0); - const canMoveForward = computed$12(() => props.continuous || activeIndex.value !== group.items.value.length - 1); - function prev() { - canMoveBack.value && group.prev(); - } - function next() { - canMoveForward.value && group.next(); - } - const arrows = computed$12(() => { - const arrows = []; - const prevProps = { - icon: isRtl.value ? props.nextIcon : props.prevIcon, - class: `v-window__${isRtlReverse.value ? 'right' : 'left'}`, - onClick: group.prev, - 'aria-label': t('$vuetify.carousel.prev') - }; - arrows.push(canMoveBack.value ? slots.prev ? slots.prev({ - props: prevProps - }) : _createVNode$1h(VBtn, prevProps, null) : _createVNode$1h("div", null, null)); - const nextProps = { - icon: isRtl.value ? props.prevIcon : props.nextIcon, - class: `v-window__${isRtlReverse.value ? 'left' : 'right'}`, - onClick: group.next, - 'aria-label': t('$vuetify.carousel.next') - }; - arrows.push(canMoveForward.value ? slots.next ? slots.next({ - props: nextProps - }) : _createVNode$1h(VBtn, nextProps, null) : _createVNode$1h("div", null, null)); - return arrows; - }); - const touchOptions = computed$12(() => { - if (props.touch === false) return props.touch; - const options = { - left: () => { - isRtlReverse.value ? prev() : next(); - }, - right: () => { - isRtlReverse.value ? next() : prev(); - }, - start: _ref2 => { - let { - originalEvent - } = _ref2; - originalEvent.stopPropagation(); - } - }; - return { - ...options, - ...(props.touch === true ? {} : props.touch) - }; - }); - useRender(() => _withDirectives$8(_createVNode$1h(props.tag, { - "ref": rootRef, - "class": ['v-window', { - 'v-window--show-arrows-on-hover': props.showArrows === 'hover' - }, themeClasses.value, props.class], - "style": props.style - }, { - default: () => [_createVNode$1h("div", { - "class": "v-window__container", - "style": { - height: transitionHeight.value - } - }, [slots.default?.({ - group - }), props.showArrows !== false && _createVNode$1h("div", { - "class": "v-window__controls" - }, [arrows.value])]), slots.additional?.({ - group - })] - }), [[_resolveDirective$x("touch"), touchOptions.value]])); - return { - group - }; - } -}); - -const {createVNode:_createVNode$1g,mergeProps:_mergeProps$C,Fragment:_Fragment$m} = await importShared('vue'); -const {onMounted: onMounted$7,ref: ref$s,watch: watch$h} = await importShared('vue'); -const makeVCarouselProps = propsFactory({ - color: String, - cycle: Boolean, - delimiterIcon: { - type: IconValue, - default: '$delimiter' - }, - height: { - type: [Number, String], - default: 500 - }, - hideDelimiters: Boolean, - hideDelimiterBackground: Boolean, - interval: { - type: [Number, String], - default: 6000, - validator: value => Number(value) > 0 - }, - progress: [Boolean, String], - verticalDelimiters: [Boolean, String], - ...makeVWindowProps({ - continuous: true, - mandatory: 'force', - showArrows: true - }) -}, 'VCarousel'); -const VCarousel = genericComponent()({ - name: 'VCarousel', - props: makeVCarouselProps(), - emits: { - 'update:modelValue': value => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const model = useProxiedModel(props, 'modelValue'); - const { - t - } = useLocale(); - const windowRef = ref$s(); - let slideTimeout = -1; - watch$h(model, restartTimeout); - watch$h(() => props.interval, restartTimeout); - watch$h(() => props.cycle, val => { - if (val) restartTimeout();else window.clearTimeout(slideTimeout); - }); - onMounted$7(startTimeout); - function startTimeout() { - if (!props.cycle || !windowRef.value) return; - slideTimeout = window.setTimeout(windowRef.value.group.next, +props.interval > 0 ? +props.interval : 6000); - } - function restartTimeout() { - window.clearTimeout(slideTimeout); - window.requestAnimationFrame(startTimeout); - } - useRender(() => { - const windowProps = VWindow.filterProps(props); - return _createVNode$1g(VWindow, _mergeProps$C({ - "ref": windowRef - }, windowProps, { - "modelValue": model.value, - "onUpdate:modelValue": $event => model.value = $event, - "class": ['v-carousel', { - 'v-carousel--hide-delimiter-background': props.hideDelimiterBackground, - 'v-carousel--vertical-delimiters': props.verticalDelimiters - }, props.class], - "style": [{ - height: convertToUnit(props.height) - }, props.style] - }), { - default: slots.default, - additional: _ref2 => { - let { - group - } = _ref2; - return _createVNode$1g(_Fragment$m, null, [!props.hideDelimiters && _createVNode$1g("div", { - "class": "v-carousel__controls", - "style": { - left: props.verticalDelimiters === 'left' && props.verticalDelimiters ? 0 : 'auto', - right: props.verticalDelimiters === 'right' ? 0 : 'auto' - } - }, [group.items.value.length > 0 && _createVNode$1g(VDefaultsProvider, { - "defaults": { - VBtn: { - color: props.color, - icon: props.delimiterIcon, - size: 'x-small', - variant: 'text' - } - }, - "scoped": true - }, { - default: () => [group.items.value.map((item, index) => { - const props = { - id: `carousel-item-${item.id}`, - 'aria-label': t('$vuetify.carousel.ariaLabel.delimiter', index + 1, group.items.value.length), - class: ['v-carousel__controls__item', group.isSelected(item.id) && 'v-btn--active'], - onClick: () => group.select(item.id, true) - }; - return slots.item ? slots.item({ - props, - item - }) : _createVNode$1g(VBtn, _mergeProps$C(item, props), null); - })] - })]), props.progress && _createVNode$1g(VProgressLinear, { - "class": "v-carousel__progress", - "color": typeof props.progress === 'string' ? props.progress : undefined, - "modelValue": (group.getItemIndex(model.value) + 1) / group.items.value.length * 100 - }, null)]); - }, - prev: slots.prev, - next: slots.next - }); - }); - return {}; - } -}); - -const {withDirectives:_withDirectives$7,createVNode:_createVNode$1f,vShow:_vShow$3} = await importShared('vue'); -const {computed: computed$11,inject: inject$d,nextTick: nextTick$a,shallowRef: shallowRef$i} = await importShared('vue'); -const makeVWindowItemProps = propsFactory({ - reverseTransition: { - type: [Boolean, String], - default: undefined - }, - transition: { - type: [Boolean, String], - default: undefined - }, - ...makeComponentProps(), - ...makeGroupItemProps(), - ...makeLazyProps() -}, 'VWindowItem'); -const VWindowItem = genericComponent()({ - name: 'VWindowItem', - directives: { - Touch - }, - props: makeVWindowItemProps(), - emits: { - 'group:selected': val => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const window = inject$d(VWindowSymbol); - const groupItem = useGroupItem(props, VWindowGroupSymbol); - const { - isBooted - } = useSsrBoot(); - if (!window || !groupItem) throw new Error('[Vuetify] VWindowItem must be used inside VWindow'); - const isTransitioning = shallowRef$i(false); - const hasTransition = computed$11(() => isBooted.value && (window.isReversed.value ? props.reverseTransition !== false : props.transition !== false)); - function onAfterTransition() { - if (!isTransitioning.value || !window) { - return; - } - - // Finalize transition state. - isTransitioning.value = false; - if (window.transitionCount.value > 0) { - window.transitionCount.value -= 1; - - // Remove container height if we are out of transition. - if (window.transitionCount.value === 0) { - window.transitionHeight.value = undefined; - } - } - } - function onBeforeTransition() { - if (isTransitioning.value || !window) { - return; - } - - // Initialize transition state here. - isTransitioning.value = true; - if (window.transitionCount.value === 0) { - // Set initial height for height transition. - window.transitionHeight.value = convertToUnit(window.rootRef.value?.clientHeight); - } - window.transitionCount.value += 1; - } - function onTransitionCancelled() { - onAfterTransition(); // This should have the same path as normal transition end. - } - function onEnterTransition(el) { - if (!isTransitioning.value) { - return; - } - nextTick$a(() => { - // Do not set height if no transition or cancelled. - if (!hasTransition.value || !isTransitioning.value || !window) { - return; - } - - // Set transition target height. - window.transitionHeight.value = convertToUnit(el.clientHeight); - }); - } - const transition = computed$11(() => { - const name = window.isReversed.value ? props.reverseTransition : props.transition; - return !hasTransition.value ? false : { - name: typeof name !== 'string' ? window.transition.value : name, - onBeforeEnter: onBeforeTransition, - onAfterEnter: onAfterTransition, - onEnterCancelled: onTransitionCancelled, - onBeforeLeave: onBeforeTransition, - onAfterLeave: onAfterTransition, - onLeaveCancelled: onTransitionCancelled, - onEnter: onEnterTransition - }; - }); - const { - hasContent - } = useLazy(props, groupItem.isSelected); - useRender(() => _createVNode$1f(MaybeTransition, { - "transition": transition.value, - "disabled": !isBooted.value - }, { - default: () => [_withDirectives$7(_createVNode$1f("div", { - "class": ['v-window-item', groupItem.selectedClass.value, props.class], - "style": props.style - }, [hasContent.value && slots.default?.()]), [[_vShow$3, groupItem.isSelected.value]])] - })); - return { - groupItem - }; - } -}); - -const {createVNode:_createVNode$1e,mergeProps:_mergeProps$B,resolveDirective:_resolveDirective$w} = await importShared('vue'); -const makeVCarouselItemProps = propsFactory({ - ...makeVImgProps(), - ...makeVWindowItemProps() -}, 'VCarouselItem'); -const VCarouselItem = genericComponent()({ - name: 'VCarouselItem', - inheritAttrs: false, - props: makeVCarouselItemProps(), - setup(props, _ref) { - let { - slots, - attrs - } = _ref; - useRender(() => { - const imgProps = VImg.filterProps(props); - const windowItemProps = VWindowItem.filterProps(props); - return _createVNode$1e(VWindowItem, _mergeProps$B({ - "class": ['v-carousel-item', props.class] - }, windowItemProps), { - default: () => [_createVNode$1e(VImg, _mergeProps$B(attrs, imgProps), slots)] - }); - }); - } -}); - -// Styles -const VCode = createSimpleFunctional('v-code'); - -const {createVNode:_createVNode$1d} = await importShared('vue'); -const {computed: computed$10,onMounted: onMounted$6,ref: ref$r,shallowRef: shallowRef$h,watch: watch$g} = await importShared('vue'); -const makeVColorPickerCanvasProps = propsFactory({ - color: { - type: Object - }, - disabled: Boolean, - dotSize: { - type: [Number, String], - default: 10 - }, - height: { - type: [Number, String], - default: 150 - }, - width: { - type: [Number, String], - default: 300 - }, - ...makeComponentProps() -}, 'VColorPickerCanvas'); -const VColorPickerCanvas = defineComponent({ - name: 'VColorPickerCanvas', - props: makeVColorPickerCanvasProps(), - emits: { - 'update:color': color => true, - 'update:position': hue => true - }, - setup(props, _ref) { - let { - emit - } = _ref; - const isInteracting = shallowRef$h(false); - const canvasRef = ref$r(); - const canvasWidth = shallowRef$h(parseFloat(props.width)); - const canvasHeight = shallowRef$h(parseFloat(props.height)); - const _dotPosition = ref$r({ - x: 0, - y: 0 - }); - const dotPosition = computed$10({ - get: () => _dotPosition.value, - set(val) { - if (!canvasRef.value) return; - const { - x, - y - } = val; - _dotPosition.value = val; - emit('update:color', { - h: props.color?.h ?? 0, - s: clamp(x, 0, canvasWidth.value) / canvasWidth.value, - v: 1 - clamp(y, 0, canvasHeight.value) / canvasHeight.value, - a: props.color?.a ?? 1 - }); - } - }); - const dotStyles = computed$10(() => { - const { - x, - y - } = dotPosition.value; - const radius = parseInt(props.dotSize, 10) / 2; - return { - width: convertToUnit(props.dotSize), - height: convertToUnit(props.dotSize), - transform: `translate(${convertToUnit(x - radius)}, ${convertToUnit(y - radius)})` - }; - }); - const { - resizeRef - } = useResizeObserver(entries => { - if (!resizeRef.el?.offsetParent) return; - const { - width, - height - } = entries[0].contentRect; - canvasWidth.value = width; - canvasHeight.value = height; - }); - function updateDotPosition(x, y, rect) { - const { - left, - top, - width, - height - } = rect; - dotPosition.value = { - x: clamp(x - left, 0, width), - y: clamp(y - top, 0, height) - }; - } - function handleMouseDown(e) { - if (e.type === 'mousedown') { - // Prevent text selection while dragging - e.preventDefault(); - } - if (props.disabled) return; - handleMouseMove(e); - window.addEventListener('mousemove', handleMouseMove); - window.addEventListener('mouseup', handleMouseUp); - window.addEventListener('touchmove', handleMouseMove); - window.addEventListener('touchend', handleMouseUp); - } - function handleMouseMove(e) { - if (props.disabled || !canvasRef.value) return; - isInteracting.value = true; - const coords = getEventCoordinates(e); - updateDotPosition(coords.clientX, coords.clientY, canvasRef.value.getBoundingClientRect()); - } - function handleMouseUp() { - window.removeEventListener('mousemove', handleMouseMove); - window.removeEventListener('mouseup', handleMouseUp); - window.removeEventListener('touchmove', handleMouseMove); - window.removeEventListener('touchend', handleMouseUp); - } - function updateCanvas() { - if (!canvasRef.value) return; - const canvas = canvasRef.value; - const ctx = canvas.getContext('2d'); - if (!ctx) return; - const saturationGradient = ctx.createLinearGradient(0, 0, canvas.width, 0); - saturationGradient.addColorStop(0, 'hsla(0, 0%, 100%, 1)'); // white - saturationGradient.addColorStop(1, `hsla(${props.color?.h ?? 0}, 100%, 50%, 1)`); - ctx.fillStyle = saturationGradient; - ctx.fillRect(0, 0, canvas.width, canvas.height); - const valueGradient = ctx.createLinearGradient(0, 0, 0, canvas.height); - valueGradient.addColorStop(0, 'hsla(0, 0%, 0%, 0)'); // transparent - valueGradient.addColorStop(1, 'hsla(0, 0%, 0%, 1)'); // black - ctx.fillStyle = valueGradient; - ctx.fillRect(0, 0, canvas.width, canvas.height); - } - watch$g(() => props.color?.h, updateCanvas, { - immediate: true - }); - watch$g(() => [canvasWidth.value, canvasHeight.value], (newVal, oldVal) => { - updateCanvas(); - _dotPosition.value = { - x: dotPosition.value.x * newVal[0] / oldVal[0], - y: dotPosition.value.y * newVal[1] / oldVal[1] - }; - }, { - flush: 'post' - }); - watch$g(() => props.color, () => { - if (isInteracting.value) { - isInteracting.value = false; - return; - } - _dotPosition.value = props.color ? { - x: props.color.s * canvasWidth.value, - y: (1 - props.color.v) * canvasHeight.value - } : { - x: 0, - y: 0 - }; - }, { - deep: true, - immediate: true - }); - onMounted$6(() => updateCanvas()); - useRender(() => _createVNode$1d("div", { - "ref": resizeRef, - "class": ['v-color-picker-canvas', props.class], - "style": props.style, - "onMousedown": handleMouseDown, - "onTouchstartPassive": handleMouseDown - }, [_createVNode$1d("canvas", { - "ref": canvasRef, - "width": canvasWidth.value, - "height": canvasHeight.value - }, null), props.color && _createVNode$1d("div", { - "class": ['v-color-picker-canvas__dot', { - 'v-color-picker-canvas__dot--disabled': props.disabled - }], - "style": dotStyles.value - }, null)])); - return {}; - } -}); - -// Utilities -function stripAlpha(color, stripAlpha) { - if (stripAlpha) { - const { - a, - ...rest - } = color; - return rest; - } - return color; -} -function extractColor(color, input) { - if (input == null || typeof input === 'string') { - const hex = HSVtoHex(color); - if (color.a === 1) return hex.slice(0, 7);else return hex; - } - if (typeof input === 'object') { - let converted; - if (has(input, ['r', 'g', 'b'])) converted = HSVtoRGB(color);else if (has(input, ['h', 's', 'l'])) converted = HSVtoHSL(color);else if (has(input, ['h', 's', 'v'])) converted = color; - return stripAlpha(converted, !has(input, ['a']) && color.a === 1); - } - return color; -} -const nullColor = { - h: 0, - s: 0, - v: 0, - a: 1 -}; -const rgba = { - inputProps: { - type: 'number', - min: 0 - }, - inputs: [{ - label: 'R', - max: 255, - step: 1, - getValue: c => Math.round(c.r), - getColor: (c, v) => ({ - ...c, - r: Number(v) - }) - }, { - label: 'G', - max: 255, - step: 1, - getValue: c => Math.round(c.g), - getColor: (c, v) => ({ - ...c, - g: Number(v) - }) - }, { - label: 'B', - max: 255, - step: 1, - getValue: c => Math.round(c.b), - getColor: (c, v) => ({ - ...c, - b: Number(v) - }) - }, { - label: 'A', - max: 1, - step: 0.01, - getValue: _ref => { - let { - a - } = _ref; - return a != null ? Math.round(a * 100) / 100 : 1; - }, - getColor: (c, v) => ({ - ...c, - a: Number(v) - }) - }], - to: HSVtoRGB, - from: RGBtoHSV -}; -const rgb = { - ...rgba, - inputs: rgba.inputs?.slice(0, 3) -}; -const hsla = { - inputProps: { - type: 'number', - min: 0 - }, - inputs: [{ - label: 'H', - max: 360, - step: 1, - getValue: c => Math.round(c.h), - getColor: (c, v) => ({ - ...c, - h: Number(v) - }) - }, { - label: 'S', - max: 1, - step: 0.01, - getValue: c => Math.round(c.s * 100) / 100, - getColor: (c, v) => ({ - ...c, - s: Number(v) - }) - }, { - label: 'L', - max: 1, - step: 0.01, - getValue: c => Math.round(c.l * 100) / 100, - getColor: (c, v) => ({ - ...c, - l: Number(v) - }) - }, { - label: 'A', - max: 1, - step: 0.01, - getValue: _ref2 => { - let { - a - } = _ref2; - return a != null ? Math.round(a * 100) / 100 : 1; - }, - getColor: (c, v) => ({ - ...c, - a: Number(v) - }) - }], - to: HSVtoHSL, - from: HSLtoHSV -}; -const hsl = { - ...hsla, - inputs: hsla.inputs.slice(0, 3) -}; -const hexa = { - inputProps: { - type: 'text' - }, - inputs: [{ - label: 'HEXA', - getValue: c => c, - getColor: (c, v) => v - }], - to: HSVtoHex, - from: HexToHSV -}; -const hex = { - ...hexa, - inputs: [{ - label: 'HEX', - getValue: c => c.slice(0, 7), - getColor: (c, v) => v - }] -}; -const modes = { - rgb, - rgba, - hsl, - hsla, - hex, - hexa -}; - -const {createVNode:_createVNode$1c} = await importShared('vue'); -const {computed: computed$$} = await importShared('vue'); -const VColorPickerInput = _ref => { - let { - label, - ...rest - } = _ref; - return _createVNode$1c("div", { - "class": "v-color-picker-edit__input" - }, [_createVNode$1c("input", rest, null), _createVNode$1c("span", null, [label])]); -}; -const makeVColorPickerEditProps = propsFactory({ - color: Object, - disabled: Boolean, - mode: { - type: String, - default: 'rgba', - validator: v => Object.keys(modes).includes(v) - }, - modes: { - type: Array, - default: () => Object.keys(modes), - validator: v => Array.isArray(v) && v.every(m => Object.keys(modes).includes(m)) - }, - ...makeComponentProps() -}, 'VColorPickerEdit'); -const VColorPickerEdit = defineComponent({ - name: 'VColorPickerEdit', - props: makeVColorPickerEditProps(), - emits: { - 'update:color': color => true, - 'update:mode': mode => true - }, - setup(props, _ref2) { - let { - emit - } = _ref2; - const enabledModes = computed$$(() => { - return props.modes.map(key => ({ - ...modes[key], - name: key - })); - }); - const inputs = computed$$(() => { - const mode = enabledModes.value.find(m => m.name === props.mode); - if (!mode) return []; - const color = props.color ? mode.to(props.color) : null; - return mode.inputs?.map(_ref3 => { - let { - getValue, - getColor, - ...inputProps - } = _ref3; - return { - ...mode.inputProps, - ...inputProps, - disabled: props.disabled, - value: color && getValue(color), - onChange: e => { - const target = e.target; - if (!target) return; - emit('update:color', mode.from(getColor(color ?? mode.to(nullColor), target.value))); - } - }; - }); - }); - useRender(() => _createVNode$1c("div", { - "class": ['v-color-picker-edit', props.class], - "style": props.style - }, [inputs.value?.map(props => _createVNode$1c(VColorPickerInput, props, null)), enabledModes.value.length > 1 && _createVNode$1c(VBtn, { - "icon": "$unfold", - "size": "x-small", - "variant": "plain", - "onClick": () => { - const mi = enabledModes.value.findIndex(m => m.name === props.mode); - emit('update:mode', enabledModes.value[(mi + 1) % enabledModes.value.length].name); - } - }, null)])); - return {}; - } -}); - -const {computed: computed$_,provide: provide$8,ref: ref$q,shallowRef: shallowRef$g,toRef: toRef$m} = await importShared('vue'); -const VSliderSymbol = Symbol.for('vuetify:v-slider'); -function getOffset(e, el, direction) { - const vertical = direction === 'vertical'; - const rect = el.getBoundingClientRect(); - const touch = 'touches' in e ? e.touches[0] : e; - return vertical ? touch.clientY - (rect.top + rect.height / 2) : touch.clientX - (rect.left + rect.width / 2); -} -function getPosition(e, position) { - if ('touches' in e && e.touches.length) return e.touches[0][position];else if ('changedTouches' in e && e.changedTouches.length) return e.changedTouches[0][position];else return e[position]; -} -const makeSliderProps = propsFactory({ - disabled: { - type: Boolean, - default: null - }, - error: Boolean, - readonly: { - type: Boolean, - default: null - }, - max: { - type: [Number, String], - default: 100 - }, - min: { - type: [Number, String], - default: 0 - }, - step: { - type: [Number, String], - default: 0 - }, - thumbColor: String, - thumbLabel: { - type: [Boolean, String], - default: undefined, - validator: v => typeof v === 'boolean' || v === 'always' - }, - thumbSize: { - type: [Number, String], - default: 20 - }, - showTicks: { - type: [Boolean, String], - default: false, - validator: v => typeof v === 'boolean' || v === 'always' - }, - ticks: { - type: [Array, Object] - }, - tickSize: { - type: [Number, String], - default: 2 - }, - color: String, - trackColor: String, - trackFillColor: String, - trackSize: { - type: [Number, String], - default: 4 - }, - direction: { - type: String, - default: 'horizontal', - validator: v => ['vertical', 'horizontal'].includes(v) - }, - reverse: Boolean, - ...makeRoundedProps(), - ...makeElevationProps({ - elevation: 2 - }), - ripple: { - type: Boolean, - default: true - } -}, 'Slider'); -const useSteps = props => { - const min = computed$_(() => parseFloat(props.min)); - const max = computed$_(() => parseFloat(props.max)); - const step = computed$_(() => +props.step > 0 ? parseFloat(props.step) : 0); - const decimals = computed$_(() => Math.max(getDecimals(step.value), getDecimals(min.value))); - function roundValue(value) { - value = parseFloat(value); - if (step.value <= 0) return value; - const clamped = clamp(value, min.value, max.value); - const offset = min.value % step.value; - const newValue = Math.round((clamped - offset) / step.value) * step.value + offset; - return parseFloat(Math.min(newValue, max.value).toFixed(decimals.value)); - } - return { - min, - max, - step, - decimals, - roundValue - }; -}; -const useSlider = _ref => { - let { - props, - steps, - onSliderStart, - onSliderMove, - onSliderEnd, - getActiveThumb - } = _ref; - const { - isRtl - } = useRtl(); - const isReversed = toRef$m(props, 'reverse'); - const vertical = computed$_(() => props.direction === 'vertical'); - const indexFromEnd = computed$_(() => vertical.value !== isReversed.value); - const { - min, - max, - step, - decimals, - roundValue - } = steps; - const thumbSize = computed$_(() => parseInt(props.thumbSize, 10)); - const tickSize = computed$_(() => parseInt(props.tickSize, 10)); - const trackSize = computed$_(() => parseInt(props.trackSize, 10)); - const numTicks = computed$_(() => (max.value - min.value) / step.value); - const disabled = toRef$m(props, 'disabled'); - const thumbColor = computed$_(() => props.error || props.disabled ? undefined : props.thumbColor ?? props.color); - const trackColor = computed$_(() => props.error || props.disabled ? undefined : props.trackColor ?? props.color); - const trackFillColor = computed$_(() => props.error || props.disabled ? undefined : props.trackFillColor ?? props.color); - const mousePressed = shallowRef$g(false); - const startOffset = shallowRef$g(0); - const trackContainerRef = ref$q(); - const activeThumbRef = ref$q(); - function parseMouseMove(e) { - const vertical = props.direction === 'vertical'; - const start = vertical ? 'top' : 'left'; - const length = vertical ? 'height' : 'width'; - const position = vertical ? 'clientY' : 'clientX'; - const { - [start]: trackStart, - [length]: trackLength - } = trackContainerRef.value?.$el.getBoundingClientRect(); - const clickOffset = getPosition(e, position); - - // It is possible for left to be NaN, force to number - let clickPos = Math.min(Math.max((clickOffset - trackStart - startOffset.value) / trackLength, 0), 1) || 0; - if (vertical ? indexFromEnd.value : indexFromEnd.value !== isRtl.value) clickPos = 1 - clickPos; - return roundValue(min.value + clickPos * (max.value - min.value)); - } - const handleStop = e => { - onSliderEnd({ - value: parseMouseMove(e) - }); - mousePressed.value = false; - startOffset.value = 0; - }; - const handleStart = e => { - activeThumbRef.value = getActiveThumb(e); - if (!activeThumbRef.value) return; - activeThumbRef.value.focus(); - mousePressed.value = true; - if (activeThumbRef.value.contains(e.target)) { - startOffset.value = getOffset(e, activeThumbRef.value, props.direction); - } else { - startOffset.value = 0; - onSliderMove({ - value: parseMouseMove(e) - }); - } - onSliderStart({ - value: parseMouseMove(e) - }); - }; - const moveListenerOptions = { - passive: true, - capture: true - }; - function onMouseMove(e) { - onSliderMove({ - value: parseMouseMove(e) - }); - } - function onSliderMouseUp(e) { - e.stopPropagation(); - e.preventDefault(); - handleStop(e); - window.removeEventListener('mousemove', onMouseMove, moveListenerOptions); - window.removeEventListener('mouseup', onSliderMouseUp); - } - function onSliderTouchend(e) { - handleStop(e); - window.removeEventListener('touchmove', onMouseMove, moveListenerOptions); - e.target?.removeEventListener('touchend', onSliderTouchend); - } - function onSliderTouchstart(e) { - handleStart(e); - window.addEventListener('touchmove', onMouseMove, moveListenerOptions); - e.target?.addEventListener('touchend', onSliderTouchend, { - passive: false - }); - } - function onSliderMousedown(e) { - e.preventDefault(); - handleStart(e); - window.addEventListener('mousemove', onMouseMove, moveListenerOptions); - window.addEventListener('mouseup', onSliderMouseUp, { - passive: false - }); - } - const position = val => { - const percentage = (val - min.value) / (max.value - min.value) * 100; - return clamp(isNaN(percentage) ? 0 : percentage, 0, 100); - }; - const showTicks = toRef$m(props, 'showTicks'); - const parsedTicks = computed$_(() => { - if (!showTicks.value) return []; - if (!props.ticks) { - return numTicks.value !== Infinity ? createRange(numTicks.value + 1).map(t => { - const value = min.value + t * step.value; - return { - value, - position: position(value) - }; - }) : []; - } - if (Array.isArray(props.ticks)) return props.ticks.map(t => ({ - value: t, - position: position(t), - label: t.toString() - })); - return Object.keys(props.ticks).map(key => ({ - value: parseFloat(key), - position: position(parseFloat(key)), - label: props.ticks[key] - })); - }); - const hasLabels = computed$_(() => parsedTicks.value.some(_ref2 => { - let { - label - } = _ref2; - return !!label; - })); - const data = { - activeThumbRef, - color: toRef$m(props, 'color'), - decimals, - disabled, - direction: toRef$m(props, 'direction'), - elevation: toRef$m(props, 'elevation'), - hasLabels, - isReversed, - indexFromEnd, - min, - max, - mousePressed, - numTicks, - onSliderMousedown, - onSliderTouchstart, - parsedTicks, - parseMouseMove, - position, - readonly: toRef$m(props, 'readonly'), - rounded: toRef$m(props, 'rounded'), - roundValue, - showTicks, - startOffset, - step, - thumbSize, - thumbColor, - thumbLabel: toRef$m(props, 'thumbLabel'), - ticks: toRef$m(props, 'ticks'), - tickSize, - trackColor, - trackContainerRef, - trackFillColor, - trackSize, - vertical - }; - provide$8(VSliderSymbol, data); - return data; -}; - -const {vShow:_vShow$2,withDirectives:_withDirectives$6,resolveDirective:_resolveDirective$v,createVNode:_createVNode$1b} = await importShared('vue'); -const {computed: computed$Z,inject: inject$c} = await importShared('vue'); -const makeVSliderThumbProps = propsFactory({ - focused: Boolean, - max: { - type: Number, - required: true - }, - min: { - type: Number, - required: true - }, - modelValue: { - type: Number, - required: true - }, - position: { - type: Number, - required: true - }, - ripple: { - type: [Boolean, Object], - default: true - }, - name: String, - ...makeComponentProps() -}, 'VSliderThumb'); -const VSliderThumb = genericComponent()({ - name: 'VSliderThumb', - directives: { - Ripple - }, - props: makeVSliderThumbProps(), - emits: { - 'update:modelValue': v => true - }, - setup(props, _ref) { - let { - slots, - emit - } = _ref; - const slider = inject$c(VSliderSymbol); - const { - isRtl, - rtlClasses - } = useRtl(); - if (!slider) throw new Error('[Vuetify] v-slider-thumb must be used inside v-slider or v-range-slider'); - const { - thumbColor, - step, - disabled, - thumbSize, - thumbLabel, - direction, - isReversed, - vertical, - readonly, - elevation, - mousePressed, - decimals, - indexFromEnd - } = slider; - const elevationProps = computed$Z(() => !disabled.value ? elevation.value : undefined); - const { - elevationClasses - } = useElevation(elevationProps); - const { - textColorClasses, - textColorStyles - } = useTextColor(thumbColor); - const { - pageup, - pagedown, - end, - home, - left, - right, - down, - up - } = keyValues; - const relevantKeys = [pageup, pagedown, end, home, left, right, down, up]; - const multipliers = computed$Z(() => { - if (step.value) return [1, 2, 3];else return [1, 5, 10]; - }); - function parseKeydown(e, value) { - if (!relevantKeys.includes(e.key)) return; - e.preventDefault(); - const _step = step.value || 0.1; - const steps = (props.max - props.min) / _step; - if ([left, right, down, up].includes(e.key)) { - const increase = vertical.value ? [isRtl.value ? left : right, isReversed.value ? down : up] : indexFromEnd.value !== isRtl.value ? [left, up] : [right, up]; - const direction = increase.includes(e.key) ? 1 : -1; - const multiplier = e.shiftKey ? 2 : e.ctrlKey ? 1 : 0; - value = value + direction * _step * multipliers.value[multiplier]; - } else if (e.key === home) { - value = props.min; - } else if (e.key === end) { - value = props.max; - } else { - const direction = e.key === pagedown ? 1 : -1; - value = value - direction * _step * (steps > 100 ? steps / 10 : 10); - } - return Math.max(props.min, Math.min(props.max, value)); - } - function onKeydown(e) { - const newValue = parseKeydown(e, props.modelValue); - newValue != null && emit('update:modelValue', newValue); - } - useRender(() => { - const positionPercentage = convertToUnit(indexFromEnd.value ? 100 - props.position : props.position, '%'); - return _createVNode$1b("div", { - "class": ['v-slider-thumb', { - 'v-slider-thumb--focused': props.focused, - 'v-slider-thumb--pressed': props.focused && mousePressed.value - }, props.class, rtlClasses.value], - "style": [{ - '--v-slider-thumb-position': positionPercentage, - '--v-slider-thumb-size': convertToUnit(thumbSize.value) - }, props.style], - "role": "slider", - "tabindex": disabled.value ? -1 : 0, - "aria-label": props.name, - "aria-valuemin": props.min, - "aria-valuemax": props.max, - "aria-valuenow": props.modelValue, - "aria-readonly": !!readonly.value, - "aria-orientation": direction.value, - "onKeydown": !readonly.value ? onKeydown : undefined - }, [_createVNode$1b("div", { - "class": ['v-slider-thumb__surface', textColorClasses.value, elevationClasses.value], - "style": { - ...textColorStyles.value - } - }, null), _withDirectives$6(_createVNode$1b("div", { - "class": ['v-slider-thumb__ripple', textColorClasses.value], - "style": textColorStyles.value - }, null), [[_resolveDirective$v("ripple"), props.ripple, null, { - circle: true, - center: true - }]]), _createVNode$1b(VScaleTransition, { - "origin": "bottom center" - }, { - default: () => [_withDirectives$6(_createVNode$1b("div", { - "class": "v-slider-thumb__label-container" - }, [_createVNode$1b("div", { - "class": ['v-slider-thumb__label'] - }, [_createVNode$1b("div", null, [slots['thumb-label']?.({ - modelValue: props.modelValue - }) ?? props.modelValue.toFixed(step.value ? decimals.value : 1)])])]), [[_vShow$2, thumbLabel.value && props.focused || thumbLabel.value === 'always']])] - })]); - }); - return {}; - } -}); - -const {createVNode:_createVNode$1a} = await importShared('vue'); -const {computed: computed$Y,inject: inject$b} = await importShared('vue'); -const makeVSliderTrackProps = propsFactory({ - start: { - type: Number, - required: true - }, - stop: { - type: Number, - required: true - }, - ...makeComponentProps() -}, 'VSliderTrack'); -const VSliderTrack = genericComponent()({ - name: 'VSliderTrack', - props: makeVSliderTrackProps(), - emits: {}, - setup(props, _ref) { - let { - slots - } = _ref; - const slider = inject$b(VSliderSymbol); - if (!slider) throw new Error('[Vuetify] v-slider-track must be inside v-slider or v-range-slider'); - const { - color, - parsedTicks, - rounded, - showTicks, - tickSize, - trackColor, - trackFillColor, - trackSize, - vertical, - min, - max, - indexFromEnd - } = slider; - const { - roundedClasses - } = useRounded(rounded); - const { - backgroundColorClasses: trackFillColorClasses, - backgroundColorStyles: trackFillColorStyles - } = useBackgroundColor(trackFillColor); - const { - backgroundColorClasses: trackColorClasses, - backgroundColorStyles: trackColorStyles - } = useBackgroundColor(trackColor); - const startDir = computed$Y(() => `inset-${vertical.value ? 'block' : 'inline'}-${indexFromEnd.value ? 'end' : 'start'}`); - const endDir = computed$Y(() => vertical.value ? 'height' : 'width'); - const backgroundStyles = computed$Y(() => { - return { - [startDir.value]: '0%', - [endDir.value]: '100%' - }; - }); - const trackFillWidth = computed$Y(() => props.stop - props.start); - const trackFillStyles = computed$Y(() => { - return { - [startDir.value]: convertToUnit(props.start, '%'), - [endDir.value]: convertToUnit(trackFillWidth.value, '%') - }; - }); - const computedTicks = computed$Y(() => { - if (!showTicks.value) return []; - const ticks = vertical.value ? parsedTicks.value.slice().reverse() : parsedTicks.value; - return ticks.map((tick, index) => { - const directionValue = tick.value !== min.value && tick.value !== max.value ? convertToUnit(tick.position, '%') : undefined; - return _createVNode$1a("div", { - "key": tick.value, - "class": ['v-slider-track__tick', { - 'v-slider-track__tick--filled': tick.position >= props.start && tick.position <= props.stop, - 'v-slider-track__tick--first': tick.value === min.value, - 'v-slider-track__tick--last': tick.value === max.value - }], - "style": { - [startDir.value]: directionValue - } - }, [(tick.label || slots['tick-label']) && _createVNode$1a("div", { - "class": "v-slider-track__tick-label" - }, [slots['tick-label']?.({ - tick, - index - }) ?? tick.label])]); - }); - }); - useRender(() => { - return _createVNode$1a("div", { - "class": ['v-slider-track', roundedClasses.value, props.class], - "style": [{ - '--v-slider-track-size': convertToUnit(trackSize.value), - '--v-slider-tick-size': convertToUnit(tickSize.value) - }, props.style] - }, [_createVNode$1a("div", { - "class": ['v-slider-track__background', trackColorClasses.value, { - 'v-slider-track__background--opacity': !!color.value || !trackFillColor.value - }], - "style": { - ...backgroundStyles.value, - ...trackColorStyles.value - } - }, null), _createVNode$1a("div", { - "class": ['v-slider-track__fill', trackFillColorClasses.value], - "style": { - ...trackFillStyles.value, - ...trackFillColorStyles.value - } - }, null), showTicks.value && _createVNode$1a("div", { - "class": ['v-slider-track__ticks', { - 'v-slider-track__ticks--always-show': showTicks.value === 'always' - }] - }, [computedTicks.value])]); - }); - return {}; - } -}); - -const {mergeProps:_mergeProps$A,createVNode:_createVNode$19,Fragment:_Fragment$l} = await importShared('vue'); -const {computed: computed$X,ref: ref$p} = await importShared('vue'); -const makeVSliderProps = propsFactory({ - ...makeFocusProps(), - ...makeSliderProps(), - ...makeVInputProps(), - modelValue: { - type: [Number, String], - default: 0 - } -}, 'VSlider'); -const VSlider = genericComponent()({ - name: 'VSlider', - props: makeVSliderProps(), - emits: { - 'update:focused': value => true, - 'update:modelValue': v => true, - start: value => true, - end: value => true - }, - setup(props, _ref) { - let { - slots, - emit - } = _ref; - const thumbContainerRef = ref$p(); - const { - rtlClasses - } = useRtl(); - const steps = useSteps(props); - const model = useProxiedModel(props, 'modelValue', undefined, value => { - return steps.roundValue(value == null ? steps.min.value : value); - }); - const { - min, - max, - mousePressed, - roundValue, - onSliderMousedown, - onSliderTouchstart, - trackContainerRef, - position, - hasLabels, - readonly - } = useSlider({ - props, - steps, - onSliderStart: () => { - emit('start', model.value); - }, - onSliderEnd: _ref2 => { - let { - value - } = _ref2; - const roundedValue = roundValue(value); - model.value = roundedValue; - emit('end', roundedValue); - }, - onSliderMove: _ref3 => { - let { - value - } = _ref3; - return model.value = roundValue(value); - }, - getActiveThumb: () => thumbContainerRef.value?.$el - }); - const { - isFocused, - focus, - blur - } = useFocus(props); - const trackStop = computed$X(() => position(model.value)); - useRender(() => { - const inputProps = VInput.filterProps(props); - const hasPrepend = !!(props.label || slots.label || slots.prepend); - return _createVNode$19(VInput, _mergeProps$A({ - "class": ['v-slider', { - 'v-slider--has-labels': !!slots['tick-label'] || hasLabels.value, - 'v-slider--focused': isFocused.value, - 'v-slider--pressed': mousePressed.value, - 'v-slider--disabled': props.disabled - }, rtlClasses.value, props.class], - "style": props.style - }, inputProps, { - "focused": isFocused.value - }), { - ...slots, - prepend: hasPrepend ? slotProps => _createVNode$19(_Fragment$l, null, [slots.label?.(slotProps) ?? (props.label ? _createVNode$19(VLabel, { - "id": slotProps.id.value, - "class": "v-slider__label", - "text": props.label - }, null) : undefined), slots.prepend?.(slotProps)]) : undefined, - default: _ref4 => { - let { - id, - messagesId - } = _ref4; - return _createVNode$19("div", { - "class": "v-slider__container", - "onMousedown": !readonly.value ? onSliderMousedown : undefined, - "onTouchstartPassive": !readonly.value ? onSliderTouchstart : undefined - }, [_createVNode$19("input", { - "id": id.value, - "name": props.name || id.value, - "disabled": !!props.disabled, - "readonly": !!props.readonly, - "tabindex": "-1", - "value": model.value - }, null), _createVNode$19(VSliderTrack, { - "ref": trackContainerRef, - "start": 0, - "stop": trackStop.value - }, { - 'tick-label': slots['tick-label'] - }), _createVNode$19(VSliderThumb, { - "ref": thumbContainerRef, - "aria-describedby": messagesId.value, - "focused": isFocused.value, - "min": min.value, - "max": max.value, - "modelValue": model.value, - "onUpdate:modelValue": v => model.value = v, - "position": trackStop.value, - "elevation": props.elevation, - "onFocus": focus, - "onBlur": blur, - "ripple": props.ripple, - "name": props.name - }, { - 'thumb-label': slots['thumb-label'] - })]); - } - }); - }); - return {}; - } -}); - -const {createVNode:_createVNode$18} = await importShared('vue'); -const {onUnmounted} = await importShared('vue'); -const makeVColorPickerPreviewProps = propsFactory({ - color: { - type: Object - }, - disabled: Boolean, - hideAlpha: Boolean, - ...makeComponentProps() -}, 'VColorPickerPreview'); -const VColorPickerPreview = defineComponent({ - name: 'VColorPickerPreview', - props: makeVColorPickerPreviewProps(), - emits: { - 'update:color': color => true - }, - setup(props, _ref) { - let { - emit - } = _ref; - const abortController = new AbortController(); - onUnmounted(() => abortController.abort()); - async function openEyeDropper() { - if (!SUPPORTS_EYE_DROPPER) return; - const eyeDropper = new window.EyeDropper(); - try { - const result = await eyeDropper.open({ - signal: abortController.signal - }); - const colorHexValue = HexToHSV(result.sRGBHex); - emit('update:color', { - ...(props.color ?? nullColor), - ...colorHexValue - }); - } catch (e) {} - } - useRender(() => _createVNode$18("div", { - "class": ['v-color-picker-preview', { - 'v-color-picker-preview--hide-alpha': props.hideAlpha - }, props.class], - "style": props.style - }, [SUPPORTS_EYE_DROPPER && _createVNode$18("div", { - "class": "v-color-picker-preview__eye-dropper", - "key": "eyeDropper" - }, [_createVNode$18(VBtn, { - "onClick": openEyeDropper, - "icon": "$eyeDropper", - "variant": "plain", - "density": "comfortable" - }, null)]), _createVNode$18("div", { - "class": "v-color-picker-preview__dot" - }, [_createVNode$18("div", { - "style": { - background: HSVtoCSS(props.color ?? nullColor) - } - }, null)]), _createVNode$18("div", { - "class": "v-color-picker-preview__sliders" - }, [_createVNode$18(VSlider, { - "class": "v-color-picker-preview__track v-color-picker-preview__hue", - "modelValue": props.color?.h, - "onUpdate:modelValue": h => emit('update:color', { - ...(props.color ?? nullColor), - h - }), - "step": 0, - "min": 0, - "max": 360, - "disabled": props.disabled, - "thumbSize": 14, - "trackSize": 8, - "trackFillColor": "white", - "hideDetails": true - }, null), !props.hideAlpha && _createVNode$18(VSlider, { - "class": "v-color-picker-preview__track v-color-picker-preview__alpha", - "modelValue": props.color?.a ?? 1, - "onUpdate:modelValue": a => emit('update:color', { - ...(props.color ?? nullColor), - a - }), - "step": 1 / 256, - "min": 0, - "max": 1, - "disabled": props.disabled, - "thumbSize": 14, - "trackSize": 8, - "trackFillColor": "white", - "hideDetails": true - }, null)])])); - return {}; - } -}); - -const red = { - base: '#f44336', - lighten5: '#ffebee', - lighten4: '#ffcdd2', - lighten3: '#ef9a9a', - lighten2: '#e57373', - lighten1: '#ef5350', - darken1: '#e53935', - darken2: '#d32f2f', - darken3: '#c62828', - darken4: '#b71c1c', - accent1: '#ff8a80', - accent2: '#ff5252', - accent3: '#ff1744', - accent4: '#d50000' -}; -const pink = { - base: '#e91e63', - lighten5: '#fce4ec', - lighten4: '#f8bbd0', - lighten3: '#f48fb1', - lighten2: '#f06292', - lighten1: '#ec407a', - darken1: '#d81b60', - darken2: '#c2185b', - darken3: '#ad1457', - darken4: '#880e4f', - accent1: '#ff80ab', - accent2: '#ff4081', - accent3: '#f50057', - accent4: '#c51162' -}; -const purple = { - base: '#9c27b0', - lighten5: '#f3e5f5', - lighten4: '#e1bee7', - lighten3: '#ce93d8', - lighten2: '#ba68c8', - lighten1: '#ab47bc', - darken1: '#8e24aa', - darken2: '#7b1fa2', - darken3: '#6a1b9a', - darken4: '#4a148c', - accent1: '#ea80fc', - accent2: '#e040fb', - accent3: '#d500f9', - accent4: '#aa00ff' -}; -const deepPurple = { - base: '#673ab7', - lighten5: '#ede7f6', - lighten4: '#d1c4e9', - lighten3: '#b39ddb', - lighten2: '#9575cd', - lighten1: '#7e57c2', - darken1: '#5e35b1', - darken2: '#512da8', - darken3: '#4527a0', - darken4: '#311b92', - accent1: '#b388ff', - accent2: '#7c4dff', - accent3: '#651fff', - accent4: '#6200ea' -}; -const indigo = { - base: '#3f51b5', - lighten5: '#e8eaf6', - lighten4: '#c5cae9', - lighten3: '#9fa8da', - lighten2: '#7986cb', - lighten1: '#5c6bc0', - darken1: '#3949ab', - darken2: '#303f9f', - darken3: '#283593', - darken4: '#1a237e', - accent1: '#8c9eff', - accent2: '#536dfe', - accent3: '#3d5afe', - accent4: '#304ffe' -}; -const blue = { - base: '#2196f3', - lighten5: '#e3f2fd', - lighten4: '#bbdefb', - lighten3: '#90caf9', - lighten2: '#64b5f6', - lighten1: '#42a5f5', - darken1: '#1e88e5', - darken2: '#1976d2', - darken3: '#1565c0', - darken4: '#0d47a1', - accent1: '#82b1ff', - accent2: '#448aff', - accent3: '#2979ff', - accent4: '#2962ff' -}; -const lightBlue = { - base: '#03a9f4', - lighten5: '#e1f5fe', - lighten4: '#b3e5fc', - lighten3: '#81d4fa', - lighten2: '#4fc3f7', - lighten1: '#29b6f6', - darken1: '#039be5', - darken2: '#0288d1', - darken3: '#0277bd', - darken4: '#01579b', - accent1: '#80d8ff', - accent2: '#40c4ff', - accent3: '#00b0ff', - accent4: '#0091ea' -}; -const cyan = { - base: '#00bcd4', - lighten5: '#e0f7fa', - lighten4: '#b2ebf2', - lighten3: '#80deea', - lighten2: '#4dd0e1', - lighten1: '#26c6da', - darken1: '#00acc1', - darken2: '#0097a7', - darken3: '#00838f', - darken4: '#006064', - accent1: '#84ffff', - accent2: '#18ffff', - accent3: '#00e5ff', - accent4: '#00b8d4' -}; -const teal = { - base: '#009688', - lighten5: '#e0f2f1', - lighten4: '#b2dfdb', - lighten3: '#80cbc4', - lighten2: '#4db6ac', - lighten1: '#26a69a', - darken1: '#00897b', - darken2: '#00796b', - darken3: '#00695c', - darken4: '#004d40', - accent1: '#a7ffeb', - accent2: '#64ffda', - accent3: '#1de9b6', - accent4: '#00bfa5' -}; -const green = { - base: '#4caf50', - lighten5: '#e8f5e9', - lighten4: '#c8e6c9', - lighten3: '#a5d6a7', - lighten2: '#81c784', - lighten1: '#66bb6a', - darken1: '#43a047', - darken2: '#388e3c', - darken3: '#2e7d32', - darken4: '#1b5e20', - accent1: '#b9f6ca', - accent2: '#69f0ae', - accent3: '#00e676', - accent4: '#00c853' -}; -const lightGreen = { - base: '#8bc34a', - lighten5: '#f1f8e9', - lighten4: '#dcedc8', - lighten3: '#c5e1a5', - lighten2: '#aed581', - lighten1: '#9ccc65', - darken1: '#7cb342', - darken2: '#689f38', - darken3: '#558b2f', - darken4: '#33691e', - accent1: '#ccff90', - accent2: '#b2ff59', - accent3: '#76ff03', - accent4: '#64dd17' -}; -const lime = { - base: '#cddc39', - lighten5: '#f9fbe7', - lighten4: '#f0f4c3', - lighten3: '#e6ee9c', - lighten2: '#dce775', - lighten1: '#d4e157', - darken1: '#c0ca33', - darken2: '#afb42b', - darken3: '#9e9d24', - darken4: '#827717', - accent1: '#f4ff81', - accent2: '#eeff41', - accent3: '#c6ff00', - accent4: '#aeea00' -}; -const yellow = { - base: '#ffeb3b', - lighten5: '#fffde7', - lighten4: '#fff9c4', - lighten3: '#fff59d', - lighten2: '#fff176', - lighten1: '#ffee58', - darken1: '#fdd835', - darken2: '#fbc02d', - darken3: '#f9a825', - darken4: '#f57f17', - accent1: '#ffff8d', - accent2: '#ffff00', - accent3: '#ffea00', - accent4: '#ffd600' -}; -const amber = { - base: '#ffc107', - lighten5: '#fff8e1', - lighten4: '#ffecb3', - lighten3: '#ffe082', - lighten2: '#ffd54f', - lighten1: '#ffca28', - darken1: '#ffb300', - darken2: '#ffa000', - darken3: '#ff8f00', - darken4: '#ff6f00', - accent1: '#ffe57f', - accent2: '#ffd740', - accent3: '#ffc400', - accent4: '#ffab00' -}; -const orange = { - base: '#ff9800', - lighten5: '#fff3e0', - lighten4: '#ffe0b2', - lighten3: '#ffcc80', - lighten2: '#ffb74d', - lighten1: '#ffa726', - darken1: '#fb8c00', - darken2: '#f57c00', - darken3: '#ef6c00', - darken4: '#e65100', - accent1: '#ffd180', - accent2: '#ffab40', - accent3: '#ff9100', - accent4: '#ff6d00' -}; -const deepOrange = { - base: '#ff5722', - lighten5: '#fbe9e7', - lighten4: '#ffccbc', - lighten3: '#ffab91', - lighten2: '#ff8a65', - lighten1: '#ff7043', - darken1: '#f4511e', - darken2: '#e64a19', - darken3: '#d84315', - darken4: '#bf360c', - accent1: '#ff9e80', - accent2: '#ff6e40', - accent3: '#ff3d00', - accent4: '#dd2c00' -}; -const brown = { - base: '#795548', - lighten5: '#efebe9', - lighten4: '#d7ccc8', - lighten3: '#bcaaa4', - lighten2: '#a1887f', - lighten1: '#8d6e63', - darken1: '#6d4c41', - darken2: '#5d4037', - darken3: '#4e342e', - darken4: '#3e2723' -}; -const blueGrey = { - base: '#607d8b', - lighten5: '#eceff1', - lighten4: '#cfd8dc', - lighten3: '#b0bec5', - lighten2: '#90a4ae', - lighten1: '#78909c', - darken1: '#546e7a', - darken2: '#455a64', - darken3: '#37474f', - darken4: '#263238' -}; -const grey = { - base: '#9e9e9e', - lighten5: '#fafafa', - lighten4: '#f5f5f5', - lighten3: '#eeeeee', - lighten2: '#e0e0e0', - lighten1: '#bdbdbd', - darken1: '#757575', - darken2: '#616161', - darken3: '#424242', - darken4: '#212121' -}; -const shades = { - black: '#000000', - white: '#ffffff', - transparent: '#ffffff00' -}; -const colors = { - red, - pink, - purple, - deepPurple, - indigo, - blue, - lightBlue, - cyan, - teal, - green, - lightGreen, - lime, - yellow, - amber, - orange, - deepOrange, - brown, - blueGrey, - grey, - shades -}; - -const {createVNode:_createVNode$17} = await importShared('vue'); -const makeVColorPickerSwatchesProps = propsFactory({ - swatches: { - type: Array, - default: () => parseDefaultColors(colors) - }, - disabled: Boolean, - color: Object, - maxHeight: [Number, String], - ...makeComponentProps() -}, 'VColorPickerSwatches'); -function parseDefaultColors(colors) { - return Object.keys(colors).map(key => { - const color = colors[key]; - return color.base ? [color.base, color.darken4, color.darken3, color.darken2, color.darken1, color.lighten1, color.lighten2, color.lighten3, color.lighten4, color.lighten5] : [color.black, color.white, color.transparent]; - }); -} -const VColorPickerSwatches = defineComponent({ - name: 'VColorPickerSwatches', - props: makeVColorPickerSwatchesProps(), - emits: { - 'update:color': color => true - }, - setup(props, _ref) { - let { - emit - } = _ref; - useRender(() => _createVNode$17("div", { - "class": ['v-color-picker-swatches', props.class], - "style": [{ - maxHeight: convertToUnit(props.maxHeight) - }, props.style] - }, [_createVNode$17("div", null, [props.swatches.map(swatch => _createVNode$17("div", { - "class": "v-color-picker-swatches__swatch" - }, [swatch.map(color => { - const rgba = parseColor(color); - const hsva = RGBtoHSV(rgba); - const background = RGBtoCSS(rgba); - return _createVNode$17("div", { - "class": "v-color-picker-swatches__color", - "onClick": () => hsva && emit('update:color', hsva) - }, [_createVNode$17("div", { - "style": { - background - } - }, [props.color && deepEqual(props.color, hsva) ? _createVNode$17(VIcon, { - "size": "x-small", - "icon": "$success", - "color": getContrast(color, '#FFFFFF') > 2 ? 'white' : 'black' - }, null) : undefined])]); - })]))])])); - return {}; - } -}); - -const {createVNode:_createVNode$16,resolveDirective:_resolveDirective$u} = await importShared('vue'); -const {toRef: toRef$l} = await importShared('vue'); -const makeVSheetProps = propsFactory({ - color: String, - ...makeBorderProps(), - ...makeComponentProps(), - ...makeDimensionProps(), - ...makeElevationProps(), - ...makeLocationProps(), - ...makePositionProps(), - ...makeRoundedProps(), - ...makeTagProps(), - ...makeThemeProps() -}, 'VSheet'); -const VSheet = genericComponent()({ - name: 'VSheet', - props: makeVSheetProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - themeClasses - } = provideTheme(props); - const { - backgroundColorClasses, - backgroundColorStyles - } = useBackgroundColor(toRef$l(props, 'color')); - const { - borderClasses - } = useBorder(props); - const { - dimensionStyles - } = useDimension(props); - const { - elevationClasses - } = useElevation(props); - const { - locationStyles - } = useLocation(props); - const { - positionClasses - } = usePosition(props); - const { - roundedClasses - } = useRounded(props); - useRender(() => _createVNode$16(props.tag, { - "class": ['v-sheet', themeClasses.value, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, positionClasses.value, roundedClasses.value, props.class], - "style": [backgroundColorStyles.value, dimensionStyles.value, locationStyles.value, props.style] - }, slots)); - return {}; - } -}); - -const {mergeProps:_mergeProps$z,createVNode:_createVNode$15} = await importShared('vue'); -const {computed: computed$W,onBeforeMount,ref: ref$o,watch: watch$f} = await importShared('vue'); -const makeVColorPickerProps = propsFactory({ - canvasHeight: { - type: [String, Number], - default: 150 - }, - disabled: Boolean, - dotSize: { - type: [Number, String], - default: 10 - }, - hideCanvas: Boolean, - hideSliders: Boolean, - hideInputs: Boolean, - mode: { - type: String, - default: 'rgba', - validator: v => Object.keys(modes).includes(v) - }, - modes: { - type: Array, - default: () => Object.keys(modes), - validator: v => Array.isArray(v) && v.every(m => Object.keys(modes).includes(m)) - }, - showSwatches: Boolean, - swatches: Array, - swatchesMaxHeight: { - type: [Number, String], - default: 150 - }, - modelValue: { - type: [Object, String] - }, - ...omit(makeVSheetProps({ - width: 300 - }), ['height', 'location', 'minHeight', 'maxHeight', 'minWidth', 'maxWidth']) -}, 'VColorPicker'); -const VColorPicker = defineComponent({ - name: 'VColorPicker', - props: makeVColorPickerProps(), - emits: { - 'update:modelValue': color => true, - 'update:mode': mode => true - }, - setup(props) { - const mode = useProxiedModel(props, 'mode'); - const hue = ref$o(null); - const model = useProxiedModel(props, 'modelValue', undefined, v => { - if (v == null || v === '') return null; - let c; - try { - c = RGBtoHSV(parseColor(v)); - } catch (err) { - consoleWarn(err); - return null; - } - return c; - }, v => { - if (!v) return null; - return extractColor(v, props.modelValue); - }); - const currentColor = computed$W(() => { - return model.value ? { - ...model.value, - h: hue.value ?? model.value.h - } : null; - }); - const { - rtlClasses - } = useRtl(); - let externalChange = true; - watch$f(model, v => { - if (!externalChange) { - // prevent hue shift from rgb conversion inaccuracy - externalChange = true; - return; - } - if (!v) return; - hue.value = v.h; - }, { - immediate: true - }); - const updateColor = hsva => { - externalChange = false; - hue.value = hsva.h; - model.value = hsva; - }; - onBeforeMount(() => { - if (!props.modes.includes(mode.value)) mode.value = props.modes[0]; - }); - provideDefaults({ - VSlider: { - color: undefined, - trackColor: undefined, - trackFillColor: undefined - } - }); - useRender(() => { - const sheetProps = VSheet.filterProps(props); - return _createVNode$15(VSheet, _mergeProps$z({ - "rounded": props.rounded, - "elevation": props.elevation, - "theme": props.theme, - "class": ['v-color-picker', rtlClasses.value, props.class], - "style": [{ - '--v-color-picker-color-hsv': HSVtoCSS({ - ...(currentColor.value ?? nullColor), - a: 1 - }) - }, props.style] - }, sheetProps, { - "maxWidth": props.width - }), { - default: () => [!props.hideCanvas && _createVNode$15(VColorPickerCanvas, { - "key": "canvas", - "color": currentColor.value, - "onUpdate:color": updateColor, - "disabled": props.disabled, - "dotSize": props.dotSize, - "width": props.width, - "height": props.canvasHeight - }, null), (!props.hideSliders || !props.hideInputs) && _createVNode$15("div", { - "key": "controls", - "class": "v-color-picker__controls" - }, [!props.hideSliders && _createVNode$15(VColorPickerPreview, { - "key": "preview", - "color": currentColor.value, - "onUpdate:color": updateColor, - "hideAlpha": !mode.value.endsWith('a'), - "disabled": props.disabled - }, null), !props.hideInputs && _createVNode$15(VColorPickerEdit, { - "key": "edit", - "modes": props.modes, - "mode": mode.value, - "onUpdate:mode": m => mode.value = m, - "color": currentColor.value, - "onUpdate:color": updateColor, - "disabled": props.disabled - }, null)]), props.showSwatches && _createVNode$15(VColorPickerSwatches, { - "key": "swatches", - "color": currentColor.value, - "onUpdate:color": updateColor, - "maxHeight": props.swatchesMaxHeight, - "swatches": props.swatches, - "disabled": props.disabled - }, null)] - }); - }); - return {}; - } -}); - -const {createTextVNode:_createTextVNode$4,mergeProps:_mergeProps$y,createVNode:_createVNode$14,Fragment:_Fragment$k} = await importShared('vue'); -const {computed: computed$V,mergeProps: mergeProps$5,nextTick: nextTick$9,ref: ref$n,shallowRef: shallowRef$f,watch: watch$e} = await importShared('vue'); -function highlightResult(text, matches, length) { - if (matches == null) return text; - if (Array.isArray(matches)) throw new Error('Multiple matches is not implemented'); - return typeof matches === 'number' && ~matches ? _createVNode$14(_Fragment$k, null, [_createVNode$14("span", { - "class": "v-combobox__unmask" - }, [text.substr(0, matches)]), _createVNode$14("span", { - "class": "v-combobox__mask" - }, [text.substr(matches, length)]), _createVNode$14("span", { - "class": "v-combobox__unmask" - }, [text.substr(matches + length)])]) : text; -} -const makeVComboboxProps = propsFactory({ - autoSelectFirst: { - type: [Boolean, String] - }, - clearOnSelect: { - type: Boolean, - default: true - }, - delimiters: Array, - ...makeFilterProps({ - filterKeys: ['title'] - }), - ...makeSelectProps({ - hideNoData: true, - returnObject: true - }), - ...omit(makeVTextFieldProps({ - modelValue: null, - role: 'combobox' - }), ['validationValue', 'dirty', 'appendInnerIcon']), - ...makeTransitionProps({ - transition: false - }) -}, 'VCombobox'); -const VCombobox = genericComponent()({ - name: 'VCombobox', - props: makeVComboboxProps(), - emits: { - 'update:focused': focused => true, - 'update:modelValue': value => true, - 'update:search': value => true, - 'update:menu': value => true - }, - setup(props, _ref) { - let { - emit, - slots - } = _ref; - const { - t - } = useLocale(); - const vTextFieldRef = ref$n(); - const isFocused = shallowRef$f(false); - const isPristine = shallowRef$f(true); - const listHasFocus = shallowRef$f(false); - const vMenuRef = ref$n(); - const vVirtualScrollRef = ref$n(); - const _menu = useProxiedModel(props, 'menu'); - const menu = computed$V({ - get: () => _menu.value, - set: v => { - if (_menu.value && !v && vMenuRef.value?.ΨopenChildren.size) return; - _menu.value = v; - } - }); - const selectionIndex = shallowRef$f(-1); - let cleared = false; - const color = computed$V(() => vTextFieldRef.value?.color); - const label = computed$V(() => menu.value ? props.closeText : props.openText); - const { - items, - transformIn, - transformOut - } = useItems(props); - const { - textColorClasses, - textColorStyles - } = useTextColor(color); - const model = useProxiedModel(props, 'modelValue', [], v => transformIn(wrapInArray(v)), v => { - const transformed = transformOut(v); - return props.multiple ? transformed : transformed[0] ?? null; - }); - const form = useForm(); - const hasChips = computed$V(() => !!(props.chips || slots.chip)); - const hasSelectionSlot = computed$V(() => hasChips.value || !!slots.selection); - const _search = shallowRef$f(!props.multiple && !hasSelectionSlot.value ? model.value[0]?.title ?? '' : ''); - const search = computed$V({ - get: () => { - return _search.value; - }, - set: val => { - _search.value = val ?? ''; - if (!props.multiple && !hasSelectionSlot.value) { - model.value = [transformItem$3(props, val)]; - } - if (val && props.multiple && props.delimiters?.length) { - const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`)); - if (values.length > 1) { - values.forEach(v => { - v = v.trim(); - if (v) select(transformItem$3(props, v)); - }); - _search.value = ''; - } - } - if (!val) selectionIndex.value = -1; - isPristine.value = !val; - } - }); - const counterValue = computed$V(() => { - return typeof props.counterValue === 'function' ? props.counterValue(model.value) : typeof props.counterValue === 'number' ? props.counterValue : props.multiple ? model.value.length : search.value.length; - }); - watch$e(_search, value => { - if (cleared) { - // wait for clear to finish, VTextField sets _search to null - // then search computed triggers and updates _search to '' - nextTick$9(() => cleared = false); - } else if (isFocused.value && !menu.value) { - menu.value = true; - } - emit('update:search', value); - }); - watch$e(model, value => { - if (!props.multiple && !hasSelectionSlot.value) { - _search.value = value[0]?.title ?? ''; - } - }); - const { - filteredItems, - getMatches - } = useFilter(props, items, () => isPristine.value ? '' : search.value); - const displayItems = computed$V(() => { - if (props.hideSelected) { - return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value)); - } - return filteredItems.value; - }); - const selectedValues = computed$V(() => model.value.map(selection => selection.value)); - const highlightFirst = computed$V(() => { - const selectFirst = props.autoSelectFirst === true || props.autoSelectFirst === 'exact' && search.value === displayItems.value[0]?.title; - return selectFirst && displayItems.value.length > 0 && !isPristine.value && !listHasFocus.value; - }); - const menuDisabled = computed$V(() => props.hideNoData && !displayItems.value.length || props.readonly || form?.isReadonly.value); - const listRef = ref$n(); - const listEvents = useScrolling(listRef, vTextFieldRef); - function onClear(e) { - cleared = true; - if (props.openOnClear) { - menu.value = true; - } - } - function onMousedownControl() { - if (menuDisabled.value) return; - menu.value = true; - } - function onMousedownMenuIcon(e) { - if (menuDisabled.value) return; - if (isFocused.value) { - e.preventDefault(); - e.stopPropagation(); - } - menu.value = !menu.value; - } - function onListKeydown(e) { - if (checkPrintable(e)) { - vTextFieldRef.value?.focus(); - } - } - // eslint-disable-next-line complexity - function onKeydown(e) { - if (isComposingIgnoreKey(e) || props.readonly || form?.isReadonly.value) return; - const selectionStart = vTextFieldRef.value.selectionStart; - const length = model.value.length; - if (selectionIndex.value > -1 || ['Enter', 'ArrowDown', 'ArrowUp'].includes(e.key)) { - e.preventDefault(); - } - if (['Enter', 'ArrowDown'].includes(e.key)) { - menu.value = true; - } - if (['Escape'].includes(e.key)) { - menu.value = false; - } - if (['Enter', 'Escape', 'Tab'].includes(e.key)) { - if (highlightFirst.value && ['Enter', 'Tab'].includes(e.key) && !model.value.some(_ref2 => { - let { - value - } = _ref2; - return value === displayItems.value[0].value; - })) { - select(filteredItems.value[0]); - } - isPristine.value = true; - } - if (e.key === 'ArrowDown' && highlightFirst.value) { - listRef.value?.focus('next'); - } - if (e.key === 'Enter' && search.value) { - select(transformItem$3(props, search.value)); - if (hasSelectionSlot.value) _search.value = ''; - } - if (['Backspace', 'Delete'].includes(e.key)) { - if (!props.multiple && hasSelectionSlot.value && model.value.length > 0 && !search.value) return select(model.value[0], false); - if (~selectionIndex.value) { - const originalSelectionIndex = selectionIndex.value; - select(model.value[selectionIndex.value], false); - selectionIndex.value = originalSelectionIndex >= length - 1 ? length - 2 : originalSelectionIndex; - } else if (e.key === 'Backspace' && !search.value) { - selectionIndex.value = length - 1; - } - } - if (!props.multiple) return; - if (e.key === 'ArrowLeft') { - if (selectionIndex.value < 0 && selectionStart > 0) return; - const prev = selectionIndex.value > -1 ? selectionIndex.value - 1 : length - 1; - if (model.value[prev]) { - selectionIndex.value = prev; - } else { - selectionIndex.value = -1; - vTextFieldRef.value.setSelectionRange(search.value.length, search.value.length); - } - } - if (e.key === 'ArrowRight') { - if (selectionIndex.value < 0) return; - const next = selectionIndex.value + 1; - if (model.value[next]) { - selectionIndex.value = next; - } else { - selectionIndex.value = -1; - vTextFieldRef.value.setSelectionRange(0, 0); - } - } - } - function onAfterEnter() { - if (props.eager) { - vVirtualScrollRef.value?.calculateVisibleItems(); - } - } - function onAfterLeave() { - if (isFocused.value) { - isPristine.value = true; - vTextFieldRef.value?.focus(); - } - } - /** @param set - null means toggle */ - function select(item) { - let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - if (!item || item.props.disabled) return; - if (props.multiple) { - const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value)); - const add = set == null ? !~index : set; - if (~index) { - const value = add ? [...model.value, item] : [...model.value]; - value.splice(index, 1); - model.value = value; - } else if (add) { - model.value = [...model.value, item]; - } - if (props.clearOnSelect) { - search.value = ''; - } - } else { - const add = set !== false; - model.value = add ? [item] : []; - _search.value = add && !hasSelectionSlot.value ? item.title : ''; - - // watch for search watcher to trigger - nextTick$9(() => { - menu.value = false; - isPristine.value = true; - }); - } - } - function onFocusin(e) { - isFocused.value = true; - setTimeout(() => { - listHasFocus.value = true; - }); - } - function onFocusout(e) { - listHasFocus.value = false; - } - function onUpdateModelValue(v) { - if (v == null || v === '' && !props.multiple && !hasSelectionSlot.value) model.value = []; - } - watch$e(isFocused, (val, oldVal) => { - if (val || val === oldVal) return; - selectionIndex.value = -1; - menu.value = false; - if (search.value) { - if (props.multiple) { - select(transformItem$3(props, search.value)); - return; - } - if (!hasSelectionSlot.value) return; - if (model.value.some(_ref3 => { - let { - title - } = _ref3; - return title === search.value; - })) { - _search.value = ''; - } else { - select(transformItem$3(props, search.value)); - } - } - }); - watch$e(menu, () => { - if (!props.hideSelected && menu.value && model.value.length) { - const index = displayItems.value.findIndex(item => model.value.some(s => props.valueComparator(s.value, item.value))); - IN_BROWSER && window.requestAnimationFrame(() => { - index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index); - }); - } - }); - watch$e(() => props.items, (newVal, oldVal) => { - if (menu.value) return; - if (isFocused.value && !oldVal.length && newVal.length) { - menu.value = true; - } - }); - useRender(() => { - const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']); - const isDirty = model.value.length > 0; - const textFieldProps = VTextField.filterProps(props); - return _createVNode$14(VTextField, _mergeProps$y({ - "ref": vTextFieldRef - }, textFieldProps, { - "modelValue": search.value, - "onUpdate:modelValue": [$event => search.value = $event, onUpdateModelValue], - "focused": isFocused.value, - "onUpdate:focused": $event => isFocused.value = $event, - "validationValue": model.externalValue, - "counterValue": counterValue.value, - "dirty": isDirty, - "class": ['v-combobox', { - 'v-combobox--active-menu': menu.value, - 'v-combobox--chips': !!props.chips, - 'v-combobox--selection-slot': !!hasSelectionSlot.value, - 'v-combobox--selecting-index': selectionIndex.value > -1, - [`v-combobox--${props.multiple ? 'multiple' : 'single'}`]: true - }, props.class], - "style": props.style, - "readonly": props.readonly, - "placeholder": isDirty ? undefined : props.placeholder, - "onClick:clear": onClear, - "onMousedown:control": onMousedownControl, - "onKeydown": onKeydown - }), { - ...slots, - default: () => _createVNode$14(_Fragment$k, null, [_createVNode$14(VMenu, _mergeProps$y({ - "ref": vMenuRef, - "modelValue": menu.value, - "onUpdate:modelValue": $event => menu.value = $event, - "activator": "parent", - "contentClass": "v-combobox__content", - "disabled": menuDisabled.value, - "eager": props.eager, - "maxHeight": 310, - "openOnClick": false, - "closeOnContentClick": false, - "transition": props.transition, - "onAfterEnter": onAfterEnter, - "onAfterLeave": onAfterLeave - }, props.menuProps), { - default: () => [hasList && _createVNode$14(VList, _mergeProps$y({ - "ref": listRef, - "selected": selectedValues.value, - "selectStrategy": props.multiple ? 'independent' : 'single-independent', - "onMousedown": e => e.preventDefault(), - "onKeydown": onListKeydown, - "onFocusin": onFocusin, - "onFocusout": onFocusout, - "tabindex": "-1", - "aria-live": "polite", - "color": props.itemColor ?? props.color - }, listEvents, props.listProps), { - default: () => [slots['prepend-item']?.(), !displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? _createVNode$14(VListItem, { - "title": t(props.noDataText) - }, null)), _createVNode$14(VVirtualScroll, { - "ref": vVirtualScrollRef, - "renderless": true, - "items": displayItems.value - }, { - default: _ref4 => { - let { - item, - index, - itemRef - } = _ref4; - const itemProps = mergeProps$5(item.props, { - ref: itemRef, - key: index, - active: highlightFirst.value && index === 0 ? true : undefined, - onClick: () => select(item, null) - }); - return slots.item?.({ - item, - index, - props: itemProps - }) ?? _createVNode$14(VListItem, _mergeProps$y(itemProps, { - "role": "option" - }), { - prepend: _ref5 => { - let { - isSelected - } = _ref5; - return _createVNode$14(_Fragment$k, null, [props.multiple && !props.hideSelected ? _createVNode$14(VCheckboxBtn, { - "key": item.value, - "modelValue": isSelected, - "ripple": false, - "tabindex": "-1" - }, null) : undefined, item.props.prependAvatar && _createVNode$14(VAvatar, { - "image": item.props.prependAvatar - }, null), item.props.prependIcon && _createVNode$14(VIcon, { - "icon": item.props.prependIcon - }, null)]); - }, - title: () => { - return isPristine.value ? item.title : highlightResult(item.title, getMatches(item)?.title, search.value?.length ?? 0); - } - }); - } - }), slots['append-item']?.()] - })] - }), model.value.map((item, index) => { - function onChipClose(e) { - e.stopPropagation(); - e.preventDefault(); - select(item, false); - } - const slotProps = { - 'onClick:close': onChipClose, - onKeydown(e) { - if (e.key !== 'Enter' && e.key !== ' ') return; - e.preventDefault(); - e.stopPropagation(); - onChipClose(e); - }, - onMousedown(e) { - e.preventDefault(); - e.stopPropagation(); - }, - modelValue: true, - 'onUpdate:modelValue': undefined - }; - const hasSlot = hasChips.value ? !!slots.chip : !!slots.selection; - const slotContent = hasSlot ? ensureValidVNode(hasChips.value ? slots.chip({ - item, - index, - props: slotProps - }) : slots.selection({ - item, - index - })) : undefined; - if (hasSlot && !slotContent) return undefined; - return _createVNode$14("div", { - "key": item.value, - "class": ['v-combobox__selection', index === selectionIndex.value && ['v-combobox__selection--selected', textColorClasses.value]], - "style": index === selectionIndex.value ? textColorStyles.value : {} - }, [hasChips.value ? !slots.chip ? _createVNode$14(VChip, _mergeProps$y({ - "key": "chip", - "closable": props.closableChips, - "size": "small", - "text": item.title, - "disabled": item.props.disabled - }, slotProps), null) : _createVNode$14(VDefaultsProvider, { - "key": "chip-defaults", - "defaults": { - VChip: { - closable: props.closableChips, - size: 'small', - text: item.title - } - } - }, { - default: () => [slotContent] - }) : slotContent ?? _createVNode$14("span", { - "class": "v-combobox__selection-text" - }, [item.title, props.multiple && index < model.value.length - 1 && _createVNode$14("span", { - "class": "v-combobox__selection-comma" - }, [_createTextVNode$4(",")])])]); - })]), - 'append-inner': function () { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - return _createVNode$14(_Fragment$k, null, [slots['append-inner']?.(...args), (!props.hideNoData || props.items.length) && props.menuIcon ? _createVNode$14(VIcon, { - "class": "v-combobox__menu-icon", - "icon": props.menuIcon, - "onMousedown": onMousedownMenuIcon, - "onClick": noop, - "aria-label": t(label.value), - "title": t(label.value), - "tabindex": "-1" - }, null) : undefined]); - } - }); - }); - return forwardRefs({ - isFocused, - isPristine, - menu, - search, - selectionIndex, - filteredItems, - select - }, vTextFieldRef); - } -}); - -const {createVNode:_createVNode$13,Fragment:_Fragment$j} = await importShared('vue'); -const {computed: computed$U,ref: ref$m,toRaw,watchEffect: watchEffect$9} = await importShared('vue'); -const makeVConfirmEditProps = propsFactory({ - modelValue: null, - color: String, - cancelText: { - type: String, - default: '$vuetify.confirmEdit.cancel' - }, - okText: { - type: String, - default: '$vuetify.confirmEdit.ok' - } -}, 'VConfirmEdit'); -const VConfirmEdit = genericComponent()({ - name: 'VConfirmEdit', - props: makeVConfirmEditProps(), - emits: { - cancel: () => true, - save: value => true, - 'update:modelValue': value => true - }, - setup(props, _ref) { - let { - emit, - slots - } = _ref; - const model = useProxiedModel(props, 'modelValue'); - const internalModel = ref$m(); - watchEffect$9(() => { - internalModel.value = structuredClone(toRaw(model.value)); - }); - const { - t - } = useLocale(); - const isPristine = computed$U(() => { - return deepEqual(model.value, internalModel.value); - }); - function save() { - model.value = internalModel.value; - emit('save', internalModel.value); - } - function cancel() { - internalModel.value = structuredClone(toRaw(model.value)); - emit('cancel'); - } - let actionsUsed = false; - useRender(() => { - const actions = _createVNode$13(_Fragment$j, null, [_createVNode$13(VBtn, { - "disabled": isPristine.value, - "variant": "text", - "color": props.color, - "onClick": cancel, - "text": t(props.cancelText) - }, null), _createVNode$13(VBtn, { - "disabled": isPristine.value, - "variant": "text", - "color": props.color, - "onClick": save, - "text": t(props.okText) - }, null)]); - return _createVNode$13(_Fragment$j, null, [slots.default?.({ - model: internalModel, - save, - cancel, - isPristine: isPristine.value, - get actions() { - actionsUsed = true; - return actions; - } - }), !actionsUsed && actions]); - }); - return { - save, - cancel, - isPristine - }; - } -}); - -const {inject: inject$a,provide: provide$7,toRef: toRef$k} = await importShared('vue'); -const makeDataTableExpandProps = propsFactory({ - expandOnClick: Boolean, - showExpand: Boolean, - expanded: { - type: Array, - default: () => [] - } -}, 'DataTable-expand'); -const VDataTableExpandedKey = Symbol.for('vuetify:datatable:expanded'); -function provideExpanded(props) { - const expandOnClick = toRef$k(props, 'expandOnClick'); - const expanded = useProxiedModel(props, 'expanded', props.expanded, v => { - return new Set(v); - }, v => { - return [...v.values()]; - }); - function expand(item, value) { - const newExpanded = new Set(expanded.value); - if (!value) { - newExpanded.delete(item.value); - } else { - newExpanded.add(item.value); - } - expanded.value = newExpanded; - } - function isExpanded(item) { - return expanded.value.has(item.value); - } - function toggleExpand(item) { - expand(item, !isExpanded(item)); - } - const data = { - expand, - expanded, - expandOnClick, - isExpanded, - toggleExpand - }; - provide$7(VDataTableExpandedKey, data); - return data; -} -function useExpanded() { - const data = inject$a(VDataTableExpandedKey); - if (!data) throw new Error('foo'); - return data; -} - -const {computed: computed$T,inject: inject$9,provide: provide$6,ref: ref$l} = await importShared('vue'); -const makeDataTableGroupProps = propsFactory({ - groupBy: { - type: Array, - default: () => [] - } -}, 'DataTable-group'); -const VDataTableGroupSymbol = Symbol.for('vuetify:data-table-group'); -function createGroupBy(props) { - const groupBy = useProxiedModel(props, 'groupBy'); - return { - groupBy - }; -} -function provideGroupBy(options) { - const { - disableSort, - groupBy, - sortBy - } = options; - const opened = ref$l(new Set()); - const sortByWithGroups = computed$T(() => { - return groupBy.value.map(val => ({ - ...val, - order: val.order ?? false - })).concat(disableSort?.value ? [] : sortBy.value); - }); - function isGroupOpen(group) { - return opened.value.has(group.id); - } - function toggleGroup(group) { - const newOpened = new Set(opened.value); - if (!isGroupOpen(group)) newOpened.add(group.id);else newOpened.delete(group.id); - opened.value = newOpened; - } - function extractRows(items) { - function dive(group) { - const arr = []; - for (const item of group.items) { - if ('type' in item && item.type === 'group') { - arr.push(...dive(item)); - } else { - arr.push(item); - } - } - return arr; - } - return dive({ - items}); - } - - // onBeforeMount(() => { - // for (const key of groupedItems.value.keys()) { - // opened.value.add(key) - // } - // }) - - const data = { - sortByWithGroups, - toggleGroup, - opened, - groupBy, - extractRows, - isGroupOpen - }; - provide$6(VDataTableGroupSymbol, data); - return data; -} -function useGroupBy() { - const data = inject$9(VDataTableGroupSymbol); - if (!data) throw new Error('Missing group!'); - return data; -} -function groupItemsByProperty(items, groupBy) { - if (!items.length) return []; - const groups = new Map(); - for (const item of items) { - const value = getObjectValueByPath(item.raw, groupBy); - if (!groups.has(value)) { - groups.set(value, []); - } - groups.get(value).push(item); - } - return groups; -} -function groupItems(items, groupBy) { - let depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; - let prefix = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'root'; - if (!groupBy.length) return []; - const groupedItems = groupItemsByProperty(items, groupBy[0]); - const groups = []; - const rest = groupBy.slice(1); - groupedItems.forEach((items, value) => { - const key = groupBy[0]; - const id = `${prefix}_${key}_${value}`; - groups.push({ - depth, - id, - key, - value, - items: rest.length ? groupItems(items, rest, depth + 1, id) : items, - type: 'group' - }); - }); - return groups; -} -function flattenItems(items, opened) { - const flatItems = []; - for (const item of items) { - // TODO: make this better - if ('type' in item && item.type === 'group') { - if (item.value != null) { - flatItems.push(item); - } - if (opened.has(item.id) || item.value == null) { - flatItems.push(...flattenItems(item.items, opened)); - } - } else { - flatItems.push(item); - } - } - return flatItems; -} -function useGroupedItems(items, groupBy, opened) { - const flatItems = computed$T(() => { - if (!groupBy.value.length) return items.value; - const groupedItems = groupItems(items.value, groupBy.value.map(item => item.key)); - return flattenItems(groupedItems, opened.value); - }); - return { - flatItems - }; -} - -// Utilities -const {computed: computed$S,watch: watch$d} = await importShared('vue'); -function useOptions(_ref) { - let { - page, - itemsPerPage, - sortBy, - groupBy, - search - } = _ref; - const vm = getCurrentInstance('VDataTable'); - const options = computed$S(() => ({ - page: page.value, - itemsPerPage: itemsPerPage.value, - sortBy: sortBy.value, - groupBy: groupBy.value, - search: search.value - })); - let oldOptions = null; - watch$d(options, () => { - if (deepEqual(oldOptions, options.value)) return; - - // Reset page when searching - if (oldOptions && oldOptions.search !== options.value.search) { - page.value = 1; - } - vm.emit('update:options', options.value); - oldOptions = options.value; - }, { - deep: true, - immediate: true - }); -} - -const {computed: computed$R,inject: inject$8,provide: provide$5,watch: watch$c} = await importShared('vue'); -const makeDataTablePaginateProps = propsFactory({ - page: { - type: [Number, String], - default: 1 - }, - itemsPerPage: { - type: [Number, String], - default: 10 - } -}, 'DataTable-paginate'); -const VDataTablePaginationSymbol = Symbol.for('vuetify:data-table-pagination'); -function createPagination(props) { - const page = useProxiedModel(props, 'page', undefined, value => +(value ?? 1)); - const itemsPerPage = useProxiedModel(props, 'itemsPerPage', undefined, value => +(value ?? 10)); - return { - page, - itemsPerPage - }; -} -function providePagination(options) { - const { - page, - itemsPerPage, - itemsLength - } = options; - const startIndex = computed$R(() => { - if (itemsPerPage.value === -1) return 0; - return itemsPerPage.value * (page.value - 1); - }); - const stopIndex = computed$R(() => { - if (itemsPerPage.value === -1) return itemsLength.value; - return Math.min(itemsLength.value, startIndex.value + itemsPerPage.value); - }); - const pageCount = computed$R(() => { - if (itemsPerPage.value === -1 || itemsLength.value === 0) return 1; - return Math.ceil(itemsLength.value / itemsPerPage.value); - }); - - // Don't run immediately, items may not have been loaded yet: #17966 - watch$c([page, pageCount], () => { - if (page.value > pageCount.value) { - page.value = pageCount.value; - } - }); - function setItemsPerPage(value) { - itemsPerPage.value = value; - page.value = 1; - } - function nextPage() { - page.value = clamp(page.value + 1, 1, pageCount.value); - } - function prevPage() { - page.value = clamp(page.value - 1, 1, pageCount.value); - } - function setPage(value) { - page.value = clamp(value, 1, pageCount.value); - } - const data = { - page, - itemsPerPage, - startIndex, - stopIndex, - pageCount, - itemsLength, - nextPage, - prevPage, - setPage, - setItemsPerPage - }; - provide$5(VDataTablePaginationSymbol, data); - return data; -} -function usePagination() { - const data = inject$8(VDataTablePaginationSymbol); - if (!data) throw new Error('Missing pagination!'); - return data; -} -function usePaginatedItems(options) { - const vm = getCurrentInstance('usePaginatedItems'); - const { - items, - startIndex, - stopIndex, - itemsPerPage - } = options; - const paginatedItems = computed$R(() => { - if (itemsPerPage.value <= 0) return items.value; - return items.value.slice(startIndex.value, stopIndex.value); - }); - watch$c(paginatedItems, val => { - vm.emit('update:currentItems', val); - }); - return { - paginatedItems - }; -} - -const {computed: computed$Q,inject: inject$7,provide: provide$4} = await importShared('vue'); -const singleSelectStrategy = { - showSelectAll: false, - allSelected: () => [], - select: _ref => { - let { - items, - value - } = _ref; - return new Set(value ? [items[0]?.value] : []); - }, - selectAll: _ref2 => { - let { - selected - } = _ref2; - return selected; - } -}; -const pageSelectStrategy = { - showSelectAll: true, - allSelected: _ref3 => { - let { - currentPage - } = _ref3; - return currentPage; - }, - select: _ref4 => { - let { - items, - value, - selected - } = _ref4; - for (const item of items) { - if (value) selected.add(item.value);else selected.delete(item.value); - } - return selected; - }, - selectAll: _ref5 => { - let { - value, - currentPage, - selected - } = _ref5; - return pageSelectStrategy.select({ - items: currentPage, - value, - selected - }); - } -}; -const allSelectStrategy = { - showSelectAll: true, - allSelected: _ref6 => { - let { - allItems - } = _ref6; - return allItems; - }, - select: _ref7 => { - let { - items, - value, - selected - } = _ref7; - for (const item of items) { - if (value) selected.add(item.value);else selected.delete(item.value); - } - return selected; - }, - selectAll: _ref8 => { - let { - value, - allItems, - selected - } = _ref8; - return allSelectStrategy.select({ - items: allItems, - value, - selected - }); - } -}; -const makeDataTableSelectProps = propsFactory({ - showSelect: Boolean, - selectStrategy: { - type: [String, Object], - default: 'page' - }, - modelValue: { - type: Array, - default: () => [] - }, - valueComparator: { - type: Function, - default: deepEqual - } -}, 'DataTable-select'); -const VDataTableSelectionSymbol = Symbol.for('vuetify:data-table-selection'); -function provideSelection(props, _ref9) { - let { - allItems, - currentPage - } = _ref9; - const selected = useProxiedModel(props, 'modelValue', props.modelValue, v => { - return new Set(wrapInArray(v).map(v => { - return allItems.value.find(item => props.valueComparator(v, item.value))?.value ?? v; - })); - }, v => { - return [...v.values()]; - }); - const allSelectable = computed$Q(() => allItems.value.filter(item => item.selectable)); - const currentPageSelectable = computed$Q(() => currentPage.value.filter(item => item.selectable)); - const selectStrategy = computed$Q(() => { - if (typeof props.selectStrategy === 'object') return props.selectStrategy; - switch (props.selectStrategy) { - case 'single': - return singleSelectStrategy; - case 'all': - return allSelectStrategy; - case 'page': - default: - return pageSelectStrategy; - } - }); - function isSelected(items) { - return wrapInArray(items).every(item => selected.value.has(item.value)); - } - function isSomeSelected(items) { - return wrapInArray(items).some(item => selected.value.has(item.value)); - } - function select(items, value) { - const newSelected = selectStrategy.value.select({ - items, - value, - selected: new Set(selected.value) - }); - selected.value = newSelected; - } - function toggleSelect(item) { - select([item], !isSelected([item])); - } - function selectAll(value) { - const newSelected = selectStrategy.value.selectAll({ - value, - allItems: allSelectable.value, - currentPage: currentPageSelectable.value, - selected: new Set(selected.value) - }); - selected.value = newSelected; - } - const someSelected = computed$Q(() => selected.value.size > 0); - const allSelected = computed$Q(() => { - const items = selectStrategy.value.allSelected({ - allItems: allSelectable.value, - currentPage: currentPageSelectable.value - }); - return !!items.length && isSelected(items); - }); - const showSelectAll = computed$Q(() => selectStrategy.value.showSelectAll); - const data = { - toggleSelect, - select, - selectAll, - isSelected, - isSomeSelected, - someSelected, - allSelected, - showSelectAll - }; - provide$4(VDataTableSelectionSymbol, data); - return data; -} -function useSelection() { - const data = inject$7(VDataTableSelectionSymbol); - if (!data) throw new Error('Missing selection!'); - return data; -} - -const {computed: computed$P,inject: inject$6,provide: provide$3,toRef: toRef$j} = await importShared('vue'); -const makeDataTableSortProps = propsFactory({ - sortBy: { - type: Array, - default: () => [] - }, - customKeySort: Object, - multiSort: Boolean, - mustSort: Boolean -}, 'DataTable-sort'); -const VDataTableSortSymbol = Symbol.for('vuetify:data-table-sort'); -function createSort(props) { - const sortBy = useProxiedModel(props, 'sortBy'); - const mustSort = toRef$j(props, 'mustSort'); - const multiSort = toRef$j(props, 'multiSort'); - return { - sortBy, - mustSort, - multiSort - }; -} -function provideSort(options) { - const { - sortBy, - mustSort, - multiSort, - page - } = options; - const toggleSort = column => { - if (column.key == null) return; - let newSortBy = sortBy.value.map(x => ({ - ...x - })) ?? []; - const item = newSortBy.find(x => x.key === column.key); - if (!item) { - if (multiSort.value) newSortBy = [...newSortBy, { - key: column.key, - order: 'asc' - }];else newSortBy = [{ - key: column.key, - order: 'asc' - }]; - } else if (item.order === 'desc') { - if (mustSort.value) { - item.order = 'asc'; - } else { - newSortBy = newSortBy.filter(x => x.key !== column.key); - } - } else { - item.order = 'desc'; - } - sortBy.value = newSortBy; - if (page) page.value = 1; - }; - function isSorted(column) { - return !!sortBy.value.find(item => item.key === column.key); - } - const data = { - sortBy, - toggleSort, - isSorted - }; - provide$3(VDataTableSortSymbol, data); - return data; -} -function useSort() { - const data = inject$6(VDataTableSortSymbol); - if (!data) throw new Error('Missing sort!'); - return data; -} - -// TODO: abstract into project composable -function useSortedItems(props, items, sortBy, options) { - const locale = useLocale(); - const sortedItems = computed$P(() => { - if (!sortBy.value.length) return items.value; - return sortItems(items.value, sortBy.value, locale.current.value, { - transform: options?.transform, - sortFunctions: { - ...props.customKeySort, - ...options?.sortFunctions?.value - }, - sortRawFunctions: options?.sortRawFunctions?.value - }); - }); - return { - sortedItems - }; -} -function sortItems(items, sortByItems, locale, options) { - const stringCollator = new Intl.Collator(locale, { - sensitivity: 'accent', - usage: 'sort' - }); - const transformedItems = items.map(item => [item, options?.transform ? options.transform(item) : item]); - return transformedItems.sort((a, b) => { - for (let i = 0; i < sortByItems.length; i++) { - let hasCustomResult = false; - const sortKey = sortByItems[i].key; - const sortOrder = sortByItems[i].order ?? 'asc'; - if (sortOrder === false) continue; - let sortA = getObjectValueByPath(a[1], sortKey); - let sortB = getObjectValueByPath(b[1], sortKey); - let sortARaw = a[0].raw; - let sortBRaw = b[0].raw; - if (sortOrder === 'desc') { - [sortA, sortB] = [sortB, sortA]; - [sortARaw, sortBRaw] = [sortBRaw, sortARaw]; - } - if (options?.sortRawFunctions?.[sortKey]) { - const customResult = options.sortRawFunctions[sortKey](sortARaw, sortBRaw); - if (customResult == null) continue; - hasCustomResult = true; - if (customResult) return customResult; - } - if (options?.sortFunctions?.[sortKey]) { - const customResult = options.sortFunctions[sortKey](sortA, sortB); - if (customResult == null) continue; - hasCustomResult = true; - if (customResult) return customResult; - } - if (hasCustomResult) continue; - - // Dates should be compared numerically - if (sortA instanceof Date && sortB instanceof Date) { - return sortA.getTime() - sortB.getTime(); - } - [sortA, sortB] = [sortA, sortB].map(s => s != null ? s.toString().toLocaleLowerCase() : s); - if (sortA !== sortB) { - if (isEmpty(sortA) && isEmpty(sortB)) return 0; - if (isEmpty(sortA)) return -1; - if (isEmpty(sortB)) return 1; - if (!isNaN(sortA) && !isNaN(sortB)) return Number(sortA) - Number(sortB); - return stringCollator.compare(sortA, sortB); - } - } - return 0; - }).map(_ref => { - let [item] = _ref; - return item; - }); -} - -// Utilities -const {computed: computed$O} = await importShared('vue'); -// Composables -const makeDataIteratorItemsProps = propsFactory({ - items: { - type: Array, - default: () => [] - }, - itemValue: { - type: [String, Array, Function], - default: 'id' - }, - itemSelectable: { - type: [String, Array, Function], - default: null - }, - returnObject: Boolean -}, 'DataIterator-items'); -function transformItem$1(props, item) { - const value = props.returnObject ? item : getPropertyFromItem(item, props.itemValue); - const selectable = getPropertyFromItem(item, props.itemSelectable, true); - return { - type: 'item', - value, - selectable, - raw: item - }; -} -function transformItems$1(props, items) { - const array = []; - for (const item of items) { - array.push(transformItem$1(props, item)); - } - return array; -} -function useDataIteratorItems(props) { - const items = computed$O(() => transformItems$1(props, props.items)); - return { - items - }; -} - -const {createVNode:_createVNode$12} = await importShared('vue'); -const {computed: computed$N,toRef: toRef$i} = await importShared('vue'); -const makeVDataIteratorProps = propsFactory({ - search: String, - loading: Boolean, - ...makeComponentProps(), - ...makeDataIteratorItemsProps(), - ...makeDataTableSelectProps(), - ...makeDataTableSortProps(), - ...makeDataTablePaginateProps({ - itemsPerPage: 5 - }), - ...makeDataTableExpandProps(), - ...makeDataTableGroupProps(), - ...makeFilterProps(), - ...makeTagProps(), - ...makeTransitionProps({ - transition: { - component: VFadeTransition, - hideOnLeave: true - } - }) -}, 'VDataIterator'); -const VDataIterator = genericComponent()({ - name: 'VDataIterator', - props: makeVDataIteratorProps(), - emits: { - 'update:modelValue': value => true, - 'update:groupBy': value => true, - 'update:page': value => true, - 'update:itemsPerPage': value => true, - 'update:sortBy': value => true, - 'update:options': value => true, - 'update:expanded': value => true, - 'update:currentItems': value => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const groupBy = useProxiedModel(props, 'groupBy'); - const search = toRef$i(props, 'search'); - const { - items - } = useDataIteratorItems(props); - const { - filteredItems - } = useFilter(props, items, search, { - transform: item => item.raw - }); - const { - sortBy, - multiSort, - mustSort - } = createSort(props); - const { - page, - itemsPerPage - } = createPagination(props); - const { - toggleSort - } = provideSort({ - sortBy, - multiSort, - mustSort, - page - }); - const { - sortByWithGroups, - opened, - extractRows, - isGroupOpen, - toggleGroup - } = provideGroupBy({ - groupBy, - sortBy - }); - const { - sortedItems - } = useSortedItems(props, filteredItems, sortByWithGroups, { - transform: item => item.raw - }); - const { - flatItems - } = useGroupedItems(sortedItems, groupBy, opened); - const itemsLength = computed$N(() => flatItems.value.length); - const { - startIndex, - stopIndex, - pageCount, - prevPage, - nextPage, - setItemsPerPage, - setPage - } = providePagination({ - page, - itemsPerPage, - itemsLength - }); - const { - paginatedItems - } = usePaginatedItems({ - items: flatItems, - startIndex, - stopIndex, - itemsPerPage - }); - const paginatedItemsWithoutGroups = computed$N(() => extractRows(paginatedItems.value)); - const { - isSelected, - select, - selectAll, - toggleSelect - } = provideSelection(props, { - allItems: items, - currentPage: paginatedItemsWithoutGroups - }); - const { - isExpanded, - toggleExpand - } = provideExpanded(props); - useOptions({ - page, - itemsPerPage, - sortBy, - groupBy, - search - }); - const slotProps = computed$N(() => ({ - page: page.value, - itemsPerPage: itemsPerPage.value, - sortBy: sortBy.value, - pageCount: pageCount.value, - toggleSort, - prevPage, - nextPage, - setPage, - setItemsPerPage, - isSelected, - select, - selectAll, - toggleSelect, - isExpanded, - toggleExpand, - isGroupOpen, - toggleGroup, - items: paginatedItemsWithoutGroups.value, - groupedItems: paginatedItems.value - })); - useRender(() => _createVNode$12(props.tag, { - "class": ['v-data-iterator', { - 'v-data-iterator--loading': props.loading - }, props.class], - "style": props.style - }, { - default: () => [slots.header?.(slotProps.value), _createVNode$12(MaybeTransition, { - "transition": props.transition - }, { - default: () => [props.loading ? _createVNode$12(LoaderSlot, { - "key": "loader", - "name": "v-data-iterator", - "active": true - }, { - default: slotProps => slots.loader?.(slotProps) - }) : _createVNode$12("div", { - "key": "items" - }, [!paginatedItems.value.length ? slots['no-data']?.() : slots.default?.(slotProps.value)])] - }), slots.footer?.(slotProps.value)] - })); - return {}; - } -}); - -// Utilities -const {onBeforeUpdate,ref: ref$k} = await importShared('vue'); - - -// Types - -function useRefs() { - const refs = ref$k([]); - onBeforeUpdate(() => refs.value = []); - function updateRef(e, i) { - refs.value[i] = e; - } - return { - refs, - updateRef - }; -} - -const {createVNode:_createVNode$11,mergeProps:_mergeProps$x} = await importShared('vue'); -const {computed: computed$M,nextTick: nextTick$8,shallowRef: shallowRef$e,toRef: toRef$h} = await importShared('vue'); -const makeVPaginationProps = propsFactory({ - activeColor: String, - start: { - type: [Number, String], - default: 1 - }, - modelValue: { - type: Number, - default: props => props.start - }, - disabled: Boolean, - length: { - type: [Number, String], - default: 1, - validator: val => val % 1 === 0 - }, - totalVisible: [Number, String], - firstIcon: { - type: IconValue, - default: '$first' - }, - prevIcon: { - type: IconValue, - default: '$prev' - }, - nextIcon: { - type: IconValue, - default: '$next' - }, - lastIcon: { - type: IconValue, - default: '$last' - }, - ariaLabel: { - type: String, - default: '$vuetify.pagination.ariaLabel.root' - }, - pageAriaLabel: { - type: String, - default: '$vuetify.pagination.ariaLabel.page' - }, - currentPageAriaLabel: { - type: String, - default: '$vuetify.pagination.ariaLabel.currentPage' - }, - firstAriaLabel: { - type: String, - default: '$vuetify.pagination.ariaLabel.first' - }, - previousAriaLabel: { - type: String, - default: '$vuetify.pagination.ariaLabel.previous' - }, - nextAriaLabel: { - type: String, - default: '$vuetify.pagination.ariaLabel.next' - }, - lastAriaLabel: { - type: String, - default: '$vuetify.pagination.ariaLabel.last' - }, - ellipsis: { - type: String, - default: '...' - }, - showFirstLastPage: Boolean, - ...makeBorderProps(), - ...makeComponentProps(), - ...makeDensityProps(), - ...makeElevationProps(), - ...makeRoundedProps(), - ...makeSizeProps(), - ...makeTagProps({ - tag: 'nav' - }), - ...makeThemeProps(), - ...makeVariantProps({ - variant: 'text' - }) -}, 'VPagination'); -const VPagination = genericComponent()({ - name: 'VPagination', - props: makeVPaginationProps(), - emits: { - 'update:modelValue': value => true, - first: value => true, - prev: value => true, - next: value => true, - last: value => true - }, - setup(props, _ref) { - let { - slots, - emit - } = _ref; - const page = useProxiedModel(props, 'modelValue'); - const { - t, - n - } = useLocale(); - const { - isRtl - } = useRtl(); - const { - themeClasses - } = provideTheme(props); - const { - width - } = useDisplay(); - const maxButtons = shallowRef$e(-1); - provideDefaults(undefined, { - scoped: true - }); - const { - resizeRef - } = useResizeObserver(entries => { - if (!entries.length) return; - const { - target, - contentRect - } = entries[0]; - const firstItem = target.querySelector('.v-pagination__list > *'); - if (!firstItem) return; - const totalWidth = contentRect.width; - const itemWidth = firstItem.offsetWidth + parseFloat(getComputedStyle(firstItem).marginRight) * 2; - maxButtons.value = getMax(totalWidth, itemWidth); - }); - const length = computed$M(() => parseInt(props.length, 10)); - const start = computed$M(() => parseInt(props.start, 10)); - const totalVisible = computed$M(() => { - if (props.totalVisible != null) return parseInt(props.totalVisible, 10);else if (maxButtons.value >= 0) return maxButtons.value; - return getMax(width.value, 58); - }); - function getMax(totalWidth, itemWidth) { - const minButtons = props.showFirstLastPage ? 5 : 3; - return Math.max(0, Math.floor( - // Round to two decimal places to avoid floating point errors - +((totalWidth - itemWidth * minButtons) / itemWidth).toFixed(2))); - } - const range = computed$M(() => { - if (length.value <= 0 || isNaN(length.value) || length.value > Number.MAX_SAFE_INTEGER) return []; - if (totalVisible.value <= 0) return [];else if (totalVisible.value === 1) return [page.value]; - if (length.value <= totalVisible.value) { - return createRange(length.value, start.value); - } - const even = totalVisible.value % 2 === 0; - const middle = even ? totalVisible.value / 2 : Math.floor(totalVisible.value / 2); - const left = even ? middle : middle + 1; - const right = length.value - middle; - if (left - page.value >= 0) { - return [...createRange(Math.max(1, totalVisible.value - 1), start.value), props.ellipsis, length.value]; - } else if (page.value - right >= (even ? 1 : 0)) { - const rangeLength = totalVisible.value - 1; - const rangeStart = length.value - rangeLength + start.value; - return [start.value, props.ellipsis, ...createRange(rangeLength, rangeStart)]; - } else { - const rangeLength = Math.max(1, totalVisible.value - 3); - const rangeStart = rangeLength === 1 ? page.value : page.value - Math.ceil(rangeLength / 2) + start.value; - return [start.value, props.ellipsis, ...createRange(rangeLength, rangeStart), props.ellipsis, length.value]; - } - }); - - // TODO: 'first' | 'prev' | 'next' | 'last' does not work here? - function setValue(e, value, event) { - e.preventDefault(); - page.value = value; - event && emit(event, value); - } - const { - refs, - updateRef - } = useRefs(); - provideDefaults({ - VPaginationBtn: { - color: toRef$h(props, 'color'), - border: toRef$h(props, 'border'), - density: toRef$h(props, 'density'), - size: toRef$h(props, 'size'), - variant: toRef$h(props, 'variant'), - rounded: toRef$h(props, 'rounded'), - elevation: toRef$h(props, 'elevation') - } - }); - const items = computed$M(() => { - return range.value.map((item, index) => { - const ref = e => updateRef(e, index); - if (typeof item === 'string') { - return { - isActive: false, - key: `ellipsis-${index}`, - page: item, - props: { - ref, - ellipsis: true, - icon: true, - disabled: true - } - }; - } else { - const isActive = item === page.value; - return { - isActive, - key: item, - page: n(item), - props: { - ref, - ellipsis: false, - icon: true, - disabled: !!props.disabled || +props.length < 2, - color: isActive ? props.activeColor : props.color, - 'aria-current': isActive, - 'aria-label': t(isActive ? props.currentPageAriaLabel : props.pageAriaLabel, item), - onClick: e => setValue(e, item) - } - }; - } - }); - }); - const controls = computed$M(() => { - const prevDisabled = !!props.disabled || page.value <= start.value; - const nextDisabled = !!props.disabled || page.value >= start.value + length.value - 1; - return { - first: props.showFirstLastPage ? { - icon: isRtl.value ? props.lastIcon : props.firstIcon, - onClick: e => setValue(e, start.value, 'first'), - disabled: prevDisabled, - 'aria-label': t(props.firstAriaLabel), - 'aria-disabled': prevDisabled - } : undefined, - prev: { - icon: isRtl.value ? props.nextIcon : props.prevIcon, - onClick: e => setValue(e, page.value - 1, 'prev'), - disabled: prevDisabled, - 'aria-label': t(props.previousAriaLabel), - 'aria-disabled': prevDisabled - }, - next: { - icon: isRtl.value ? props.prevIcon : props.nextIcon, - onClick: e => setValue(e, page.value + 1, 'next'), - disabled: nextDisabled, - 'aria-label': t(props.nextAriaLabel), - 'aria-disabled': nextDisabled - }, - last: props.showFirstLastPage ? { - icon: isRtl.value ? props.firstIcon : props.lastIcon, - onClick: e => setValue(e, start.value + length.value - 1, 'last'), - disabled: nextDisabled, - 'aria-label': t(props.lastAriaLabel), - 'aria-disabled': nextDisabled - } : undefined - }; - }); - function updateFocus() { - const currentIndex = page.value - start.value; - refs.value[currentIndex]?.$el.focus(); - } - function onKeydown(e) { - if (e.key === keyValues.left && !props.disabled && page.value > +props.start) { - page.value = page.value - 1; - nextTick$8(updateFocus); - } else if (e.key === keyValues.right && !props.disabled && page.value < start.value + length.value - 1) { - page.value = page.value + 1; - nextTick$8(updateFocus); - } - } - useRender(() => _createVNode$11(props.tag, { - "ref": resizeRef, - "class": ['v-pagination', themeClasses.value, props.class], - "style": props.style, - "role": "navigation", - "aria-label": t(props.ariaLabel), - "onKeydown": onKeydown, - "data-test": "v-pagination-root" - }, { - default: () => [_createVNode$11("ul", { - "class": "v-pagination__list" - }, [props.showFirstLastPage && _createVNode$11("li", { - "key": "first", - "class": "v-pagination__first", - "data-test": "v-pagination-first" - }, [slots.first ? slots.first(controls.value.first) : _createVNode$11(VBtn, _mergeProps$x({ - "_as": "VPaginationBtn" - }, controls.value.first), null)]), _createVNode$11("li", { - "key": "prev", - "class": "v-pagination__prev", - "data-test": "v-pagination-prev" - }, [slots.prev ? slots.prev(controls.value.prev) : _createVNode$11(VBtn, _mergeProps$x({ - "_as": "VPaginationBtn" - }, controls.value.prev), null)]), items.value.map((item, index) => _createVNode$11("li", { - "key": item.key, - "class": ['v-pagination__item', { - 'v-pagination__item--is-active': item.isActive - }], - "data-test": "v-pagination-item" - }, [slots.item ? slots.item(item) : _createVNode$11(VBtn, _mergeProps$x({ - "_as": "VPaginationBtn" - }, item.props), { - default: () => [item.page] - })])), _createVNode$11("li", { - "key": "next", - "class": "v-pagination__next", - "data-test": "v-pagination-next" - }, [slots.next ? slots.next(controls.value.next) : _createVNode$11(VBtn, _mergeProps$x({ - "_as": "VPaginationBtn" - }, controls.value.next), null)]), props.showFirstLastPage && _createVNode$11("li", { - "key": "last", - "class": "v-pagination__last", - "data-test": "v-pagination-last" - }, [slots.last ? slots.last(controls.value.last) : _createVNode$11(VBtn, _mergeProps$x({ - "_as": "VPaginationBtn" - }, controls.value.last), null)])])] - })); - return {}; - } -}); - -const {mergeProps:_mergeProps$w,createVNode:_createVNode$10} = await importShared('vue'); -const {computed: computed$L} = await importShared('vue'); -const makeVDataTableFooterProps = propsFactory({ - prevIcon: { - type: IconValue, - default: '$prev' - }, - nextIcon: { - type: IconValue, - default: '$next' - }, - firstIcon: { - type: IconValue, - default: '$first' - }, - lastIcon: { - type: IconValue, - default: '$last' - }, - itemsPerPageText: { - type: String, - default: '$vuetify.dataFooter.itemsPerPageText' - }, - pageText: { - type: String, - default: '$vuetify.dataFooter.pageText' - }, - firstPageLabel: { - type: String, - default: '$vuetify.dataFooter.firstPage' - }, - prevPageLabel: { - type: String, - default: '$vuetify.dataFooter.prevPage' - }, - nextPageLabel: { - type: String, - default: '$vuetify.dataFooter.nextPage' - }, - lastPageLabel: { - type: String, - default: '$vuetify.dataFooter.lastPage' - }, - itemsPerPageOptions: { - type: Array, - default: () => [{ - value: 10, - title: '10' - }, { - value: 25, - title: '25' - }, { - value: 50, - title: '50' - }, { - value: 100, - title: '100' - }, { - value: -1, - title: '$vuetify.dataFooter.itemsPerPageAll' - }] - }, - showCurrentPage: Boolean -}, 'VDataTableFooter'); -const VDataTableFooter = genericComponent()({ - name: 'VDataTableFooter', - props: makeVDataTableFooterProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - t - } = useLocale(); - const { - page, - pageCount, - startIndex, - stopIndex, - itemsLength, - itemsPerPage, - setItemsPerPage - } = usePagination(); - const itemsPerPageOptions = computed$L(() => props.itemsPerPageOptions.map(option => { - if (typeof option === 'number') { - return { - value: option, - title: option === -1 ? t('$vuetify.dataFooter.itemsPerPageAll') : String(option) - }; - } - return { - ...option, - title: !isNaN(Number(option.title)) ? option.title : t(option.title) - }; - })); - useRender(() => { - const paginationProps = VPagination.filterProps(props); - return _createVNode$10("div", { - "class": "v-data-table-footer" - }, [slots.prepend?.(), _createVNode$10("div", { - "class": "v-data-table-footer__items-per-page" - }, [_createVNode$10("span", null, [t(props.itemsPerPageText)]), _createVNode$10(VSelect, { - "items": itemsPerPageOptions.value, - "modelValue": itemsPerPage.value, - "onUpdate:modelValue": v => setItemsPerPage(Number(v)), - "density": "compact", - "variant": "outlined", - "hide-details": true - }, null)]), _createVNode$10("div", { - "class": "v-data-table-footer__info" - }, [_createVNode$10("div", null, [t(props.pageText, !itemsLength.value ? 0 : startIndex.value + 1, stopIndex.value, itemsLength.value)])]), _createVNode$10("div", { - "class": "v-data-table-footer__pagination" - }, [_createVNode$10(VPagination, _mergeProps$w({ - "modelValue": page.value, - "onUpdate:modelValue": $event => page.value = $event, - "density": "comfortable", - "first-aria-label": props.firstPageLabel, - "last-aria-label": props.lastPageLabel, - "length": pageCount.value, - "next-aria-label": props.nextPageLabel, - "previous-aria-label": props.prevPageLabel, - "rounded": true, - "show-first-last-page": true, - "total-visible": props.showCurrentPage ? 1 : 0, - "variant": "plain" - }, paginationProps), null)])]); - }); - return {}; - } -}); - -const {createVNode:_createVNode$$} = await importShared('vue'); -const VDataTableColumn = defineFunctionalComponent({ - align: { - type: String, - default: 'start' - }, - fixed: Boolean, - fixedOffset: [Number, String], - height: [Number, String], - lastFixed: Boolean, - noPadding: Boolean, - tag: String, - width: [Number, String], - maxWidth: [Number, String], - nowrap: Boolean -}, (props, _ref) => { - let { - slots - } = _ref; - const Tag = props.tag ?? 'td'; - return _createVNode$$(Tag, { - "class": ['v-data-table__td', { - 'v-data-table-column--fixed': props.fixed, - 'v-data-table-column--last-fixed': props.lastFixed, - 'v-data-table-column--no-padding': props.noPadding, - 'v-data-table-column--nowrap': props.nowrap - }, `v-data-table-column--align-${props.align}`], - "style": { - height: convertToUnit(props.height), - width: convertToUnit(props.width), - maxWidth: convertToUnit(props.maxWidth), - left: convertToUnit(props.fixedOffset || null) - } - }, { - default: () => [slots.default?.()] - }); -}); - -// Utilities -const {capitalize: capitalize$2,inject: inject$5,provide: provide$2,ref: ref$j,watchEffect: watchEffect$8} = await importShared('vue'); -const makeDataTableHeaderProps = propsFactory({ - headers: Array -}, 'DataTable-header'); -const VDataTableHeadersSymbol = Symbol.for('vuetify:data-table-headers'); -const defaultHeader = { - title: '', - sortable: false -}; -const defaultActionHeader = { - ...defaultHeader, - width: 48 -}; -function priorityQueue() { - let arr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - const queue = arr.map(element => ({ - element, - priority: 0 - })); - return { - enqueue: (element, priority) => { - let added = false; - for (let i = 0; i < queue.length; i++) { - const item = queue[i]; - if (item.priority > priority) { - queue.splice(i, 0, { - element, - priority - }); - added = true; - break; - } - } - if (!added) queue.push({ - element, - priority - }); - }, - size: () => queue.length, - count: () => { - let count = 0; - if (!queue.length) return 0; - const whole = Math.floor(queue[0].priority); - for (let i = 0; i < queue.length; i++) { - if (Math.floor(queue[i].priority) === whole) count += 1; - } - return count; - }, - dequeue: () => { - return queue.shift(); - } - }; -} -function extractLeaves(item) { - let columns = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; - if (!item.children) { - columns.push(item); - } else { - for (const child of item.children) { - extractLeaves(child, columns); - } - } - return columns; -} -function extractKeys(headers) { - let keys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Set(); - for (const item of headers) { - if (item.key) keys.add(item.key); - if (item.children) { - extractKeys(item.children, keys); - } - } - return keys; -} -function getDefaultItem(item) { - if (!item.key) return undefined; - if (item.key === 'data-table-group') return defaultHeader; - if (['data-table-expand', 'data-table-select'].includes(item.key)) return defaultActionHeader; - return undefined; -} -function getDepth(item) { - let depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - if (!item.children) return depth; - return Math.max(depth, ...item.children.map(child => getDepth(child, depth + 1))); -} -function parseFixedColumns(items) { - let seenFixed = false; - function setFixed(item) { - let parentFixed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - if (!item) return; - if (parentFixed) { - item.fixed = true; - } - if (item.fixed) { - if (item.children) { - for (let i = item.children.length - 1; i >= 0; i--) { - setFixed(item.children[i], true); - } - } else { - if (!seenFixed) { - item.lastFixed = true; - } else if (isNaN(+item.width)) { - consoleError(`Multiple fixed columns should have a static width (key: ${item.key})`); - } - seenFixed = true; - } - } else { - if (item.children) { - for (let i = item.children.length - 1; i >= 0; i--) { - setFixed(item.children[i]); - } - } else { - seenFixed = false; - } - } - } - for (let i = items.length - 1; i >= 0; i--) { - setFixed(items[i]); - } - function setFixedOffset(item) { - let fixedOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - if (!item) return fixedOffset; - if (item.children) { - item.fixedOffset = fixedOffset; - for (const child of item.children) { - fixedOffset = setFixedOffset(child, fixedOffset); - } - } else if (item.fixed) { - item.fixedOffset = fixedOffset; - fixedOffset += parseFloat(item.width || '0') || 0; - } - return fixedOffset; - } - let fixedOffset = 0; - for (const item of items) { - fixedOffset = setFixedOffset(item, fixedOffset); - } -} -function parse(items, maxDepth) { - const headers = []; - let currentDepth = 0; - const queue = priorityQueue(items); - while (queue.size() > 0) { - let rowSize = queue.count(); - const row = []; - let fraction = 1; - while (rowSize > 0) { - const { - element: item, - priority - } = queue.dequeue(); - const diff = maxDepth - currentDepth - getDepth(item); - row.push({ - ...item, - rowspan: diff ?? 1, - colspan: item.children ? extractLeaves(item).length : 1 - }); - if (item.children) { - for (const child of item.children) { - // This internally sorts items that are on the same priority "row" - const sort = priority % 1 + fraction / Math.pow(10, currentDepth + 2); - queue.enqueue(child, currentDepth + diff + sort); - } - } - fraction += 1; - rowSize -= 1; - } - currentDepth += 1; - headers.push(row); - } - const columns = items.map(item => extractLeaves(item)).flat(); - return { - columns, - headers - }; -} -function convertToInternalHeaders(items) { - const internalHeaders = []; - for (const item of items) { - const defaultItem = { - ...getDefaultItem(item), - ...item - }; - const key = defaultItem.key ?? (typeof defaultItem.value === 'string' ? defaultItem.value : null); - const value = defaultItem.value ?? key ?? null; - const internalItem = { - ...defaultItem, - key, - value, - sortable: defaultItem.sortable ?? (defaultItem.key != null || !!defaultItem.sort), - children: defaultItem.children ? convertToInternalHeaders(defaultItem.children) : undefined - }; - internalHeaders.push(internalItem); - } - return internalHeaders; -} -function createHeaders(props, options) { - const headers = ref$j([]); - const columns = ref$j([]); - const sortFunctions = ref$j({}); - const sortRawFunctions = ref$j({}); - const filterFunctions = ref$j({}); - watchEffect$8(() => { - const _headers = props.headers || Object.keys(props.items[0] ?? {}).map(key => ({ - key, - title: capitalize$2(key) - })); - const items = _headers.slice(); - const keys = extractKeys(items); - if (options?.groupBy?.value.length && !keys.has('data-table-group')) { - items.unshift({ - key: 'data-table-group', - title: 'Group' - }); - } - if (options?.showSelect?.value && !keys.has('data-table-select')) { - items.unshift({ - key: 'data-table-select' - }); - } - if (options?.showExpand?.value && !keys.has('data-table-expand')) { - items.push({ - key: 'data-table-expand' - }); - } - const internalHeaders = convertToInternalHeaders(items); - parseFixedColumns(internalHeaders); - const maxDepth = Math.max(...internalHeaders.map(item => getDepth(item))) + 1; - const parsed = parse(internalHeaders, maxDepth); - headers.value = parsed.headers; - columns.value = parsed.columns; - const flatHeaders = parsed.headers.flat(1); - for (const header of flatHeaders) { - if (!header.key) continue; - if (header.sortable) { - if (header.sort) { - sortFunctions.value[header.key] = header.sort; - } - if (header.sortRaw) { - sortRawFunctions.value[header.key] = header.sortRaw; - } - } - if (header.filter) { - filterFunctions.value[header.key] = header.filter; - } - } - }); - const data = { - headers, - columns, - sortFunctions, - sortRawFunctions, - filterFunctions - }; - provide$2(VDataTableHeadersSymbol, data); - return data; -} -function useHeaders() { - const data = inject$5(VDataTableHeadersSymbol); - if (!data) throw new Error('Missing headers!'); - return data; -} - -const {resolveDirective:_resolveDirective$t,Fragment:_Fragment$i,mergeProps:_mergeProps$v,createVNode:_createVNode$_} = await importShared('vue'); -const {computed: computed$K,mergeProps: mergeProps$4} = await importShared('vue'); -const makeVDataTableHeadersProps = propsFactory({ - color: String, - sticky: Boolean, - disableSort: Boolean, - multiSort: Boolean, - sortAscIcon: { - type: IconValue, - default: '$sortAsc' - }, - sortDescIcon: { - type: IconValue, - default: '$sortDesc' - }, - headerProps: { - type: Object - }, - ...makeDisplayProps(), - ...makeLoaderProps() -}, 'VDataTableHeaders'); -const VDataTableHeaders = genericComponent()({ - name: 'VDataTableHeaders', - props: makeVDataTableHeadersProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - t - } = useLocale(); - const { - toggleSort, - sortBy, - isSorted - } = useSort(); - const { - someSelected, - allSelected, - selectAll, - showSelectAll - } = useSelection(); - const { - columns, - headers - } = useHeaders(); - const { - loaderClasses - } = useLoader(props); - function getFixedStyles(column, y) { - if (!props.sticky && !column.fixed) return undefined; - return { - position: 'sticky', - left: column.fixed ? convertToUnit(column.fixedOffset) : undefined, - top: props.sticky ? `calc(var(--v-table-header-height) * ${y})` : undefined - }; - } - function getSortIcon(column) { - const item = sortBy.value.find(item => item.key === column.key); - if (!item) return props.sortAscIcon; - return item.order === 'asc' ? props.sortAscIcon : props.sortDescIcon; - } - const { - backgroundColorClasses, - backgroundColorStyles - } = useBackgroundColor(props, 'color'); - const { - displayClasses, - mobile - } = useDisplay(props); - const slotProps = computed$K(() => ({ - headers: headers.value, - columns: columns.value, - toggleSort, - isSorted, - sortBy: sortBy.value, - someSelected: someSelected.value, - allSelected: allSelected.value, - selectAll, - getSortIcon - })); - const headerCellClasses = computed$K(() => ['v-data-table__th', { - 'v-data-table__th--sticky': props.sticky - }, displayClasses.value, loaderClasses.value]); - const VDataTableHeaderCell = _ref2 => { - let { - column, - x, - y - } = _ref2; - const noPadding = column.key === 'data-table-select' || column.key === 'data-table-expand'; - const headerProps = mergeProps$4(props.headerProps ?? {}, column.headerProps ?? {}); - return _createVNode$_(VDataTableColumn, _mergeProps$v({ - "tag": "th", - "align": column.align, - "class": [{ - 'v-data-table__th--sortable': column.sortable && !props.disableSort, - 'v-data-table__th--sorted': isSorted(column), - 'v-data-table__th--fixed': column.fixed - }, ...headerCellClasses.value], - "style": { - width: convertToUnit(column.width), - minWidth: convertToUnit(column.minWidth), - maxWidth: convertToUnit(column.maxWidth), - ...getFixedStyles(column, y) - }, - "colspan": column.colspan, - "rowspan": column.rowspan, - "onClick": column.sortable ? () => toggleSort(column) : undefined, - "fixed": column.fixed, - "nowrap": column.nowrap, - "lastFixed": column.lastFixed, - "noPadding": noPadding - }, headerProps), { - default: () => { - const columnSlotName = `header.${column.key}`; - const columnSlotProps = { - column, - selectAll, - isSorted, - toggleSort, - sortBy: sortBy.value, - someSelected: someSelected.value, - allSelected: allSelected.value, - getSortIcon - }; - if (slots[columnSlotName]) return slots[columnSlotName](columnSlotProps); - if (column.key === 'data-table-select') { - return slots['header.data-table-select']?.(columnSlotProps) ?? (showSelectAll.value && _createVNode$_(VCheckboxBtn, { - "modelValue": allSelected.value, - "indeterminate": someSelected.value && !allSelected.value, - "onUpdate:modelValue": selectAll - }, null)); - } - return _createVNode$_("div", { - "class": "v-data-table-header__content" - }, [_createVNode$_("span", null, [column.title]), column.sortable && !props.disableSort && _createVNode$_(VIcon, { - "key": "icon", - "class": "v-data-table-header__sort-icon", - "icon": getSortIcon(column) - }, null), props.multiSort && isSorted(column) && _createVNode$_("div", { - "key": "badge", - "class": ['v-data-table-header__sort-badge', ...backgroundColorClasses.value], - "style": backgroundColorStyles.value - }, [sortBy.value.findIndex(x => x.key === column.key) + 1])]); - } - }); - }; - const VDataTableMobileHeaderCell = () => { - const headerProps = mergeProps$4(props.headerProps ?? {} ?? {}); - const displayItems = computed$K(() => { - return columns.value.filter(column => column?.sortable && !props.disableSort); - }); - const appendIcon = computed$K(() => { - const showSelectColumn = columns.value.find(column => column.key === 'data-table-select'); - if (showSelectColumn == null) return; - return allSelected.value ? '$checkboxOn' : someSelected.value ? '$checkboxIndeterminate' : '$checkboxOff'; - }); - return _createVNode$_(VDataTableColumn, _mergeProps$v({ - "tag": "th", - "class": [...headerCellClasses.value], - "colspan": headers.value.length + 1 - }, headerProps), { - default: () => [_createVNode$_("div", { - "class": "v-data-table-header__content" - }, [_createVNode$_(VSelect, { - "chips": true, - "class": "v-data-table__td-sort-select", - "clearable": true, - "density": "default", - "items": displayItems.value, - "label": t('$vuetify.dataTable.sortBy'), - "multiple": props.multiSort, - "variant": "underlined", - "onClick:clear": () => sortBy.value = [], - "appendIcon": appendIcon.value, - "onClick:append": () => selectAll(!allSelected.value) - }, { - ...slots, - chip: props => _createVNode$_(VChip, { - "onClick": props.item.raw?.sortable ? () => toggleSort(props.item.raw) : undefined, - "onMousedown": e => { - e.preventDefault(); - e.stopPropagation(); - } - }, { - default: () => [props.item.title, _createVNode$_(VIcon, { - "class": ['v-data-table__td-sort-icon', isSorted(props.item.raw) && 'v-data-table__td-sort-icon-active'], - "icon": getSortIcon(props.item.raw), - "size": "small" - }, null)] - }) - })])] - }); - }; - useRender(() => { - return mobile.value ? _createVNode$_("tr", null, [_createVNode$_(VDataTableMobileHeaderCell, null, null)]) : _createVNode$_(_Fragment$i, null, [slots.headers ? slots.headers(slotProps.value) : headers.value.map((row, y) => _createVNode$_("tr", null, [row.map((column, x) => _createVNode$_(VDataTableHeaderCell, { - "column": column, - "x": x, - "y": y - }, null))])), props.loading && _createVNode$_("tr", { - "class": "v-data-table-progress" - }, [_createVNode$_("th", { - "colspan": columns.value.length - }, [_createVNode$_(LoaderSlot, { - "name": "v-data-table-progress", - "absolute": true, - "active": true, - "color": typeof props.loading === 'boolean' ? undefined : props.loading, - "indeterminate": true - }, { - default: slots.loader - })])])]); - }); - } -}); - -const {createTextVNode:_createTextVNode$3,createVNode:_createVNode$Z} = await importShared('vue'); -const {computed: computed$J} = await importShared('vue'); -const makeVDataTableGroupHeaderRowProps = propsFactory({ - item: { - type: Object, - required: true - } -}, 'VDataTableGroupHeaderRow'); -const VDataTableGroupHeaderRow = genericComponent()({ - name: 'VDataTableGroupHeaderRow', - props: makeVDataTableGroupHeaderRowProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - isGroupOpen, - toggleGroup, - extractRows - } = useGroupBy(); - const { - isSelected, - isSomeSelected, - select - } = useSelection(); - const { - columns - } = useHeaders(); - const rows = computed$J(() => { - return extractRows([props.item]); - }); - return () => _createVNode$Z("tr", { - "class": "v-data-table-group-header-row", - "style": { - '--v-data-table-group-header-row-depth': props.item.depth - } - }, [columns.value.map(column => { - if (column.key === 'data-table-group') { - const icon = isGroupOpen(props.item) ? '$expand' : '$next'; - const onClick = () => toggleGroup(props.item); - return slots['data-table-group']?.({ - item: props.item, - count: rows.value.length, - props: { - icon, - onClick - } - }) ?? _createVNode$Z(VDataTableColumn, { - "class": "v-data-table-group-header-row__column" - }, { - default: () => [_createVNode$Z(VBtn, { - "size": "small", - "variant": "text", - "icon": icon, - "onClick": onClick - }, null), _createVNode$Z("span", null, [props.item.value]), _createVNode$Z("span", null, [_createTextVNode$3("("), rows.value.length, _createTextVNode$3(")")])] - }); - } - if (column.key === 'data-table-select') { - const modelValue = isSelected(rows.value); - const indeterminate = isSomeSelected(rows.value) && !modelValue; - const selectGroup = v => select(rows.value, v); - return slots['data-table-select']?.({ - props: { - modelValue, - indeterminate, - 'onUpdate:modelValue': selectGroup - } - }) ?? _createVNode$Z("td", null, [_createVNode$Z(VCheckboxBtn, { - "modelValue": modelValue, - "indeterminate": indeterminate, - "onUpdate:modelValue": selectGroup - }, null)]); - } - return _createVNode$Z("td", null, null); - })]); - } -}); - -const {mergeProps:_mergeProps$u,Fragment:_Fragment$h,createVNode:_createVNode$Y} = await importShared('vue'); -const {toDisplayString,withModifiers} = await importShared('vue'); -const makeVDataTableRowProps = propsFactory({ - index: Number, - item: Object, - cellProps: [Object, Function], - onClick: EventProp(), - onContextmenu: EventProp(), - onDblclick: EventProp(), - ...makeDisplayProps() -}, 'VDataTableRow'); -const VDataTableRow = genericComponent()({ - name: 'VDataTableRow', - props: makeVDataTableRowProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - displayClasses, - mobile - } = useDisplay(props, 'v-data-table__tr'); - const { - isSelected, - toggleSelect, - someSelected, - allSelected, - selectAll - } = useSelection(); - const { - isExpanded, - toggleExpand - } = useExpanded(); - const { - toggleSort, - sortBy, - isSorted - } = useSort(); - const { - columns - } = useHeaders(); - useRender(() => _createVNode$Y("tr", { - "class": ['v-data-table__tr', { - 'v-data-table__tr--clickable': !!(props.onClick || props.onContextmenu || props.onDblclick) - }, displayClasses.value], - "onClick": props.onClick, - "onContextmenu": props.onContextmenu, - "onDblclick": props.onDblclick - }, [props.item && columns.value.map((column, i) => { - const item = props.item; - const slotName = `item.${column.key}`; - const headerSlotName = `header.${column.key}`; - const slotProps = { - index: props.index, - item: item.raw, - internalItem: item, - value: getObjectValueByPath(item.columns, column.key), - column, - isSelected, - toggleSelect, - isExpanded, - toggleExpand - }; - const columnSlotProps = { - column, - selectAll, - isSorted, - toggleSort, - sortBy: sortBy.value, - someSelected: someSelected.value, - allSelected: allSelected.value, - getSortIcon: () => '' - }; - const cellProps = typeof props.cellProps === 'function' ? props.cellProps({ - index: slotProps.index, - item: slotProps.item, - internalItem: slotProps.internalItem, - value: slotProps.value, - column - }) : props.cellProps; - const columnCellProps = typeof column.cellProps === 'function' ? column.cellProps({ - index: slotProps.index, - item: slotProps.item, - internalItem: slotProps.internalItem, - value: slotProps.value - }) : column.cellProps; - return _createVNode$Y(VDataTableColumn, _mergeProps$u({ - "align": column.align, - "class": { - 'v-data-table__td--expanded-row': column.key === 'data-table-expand', - 'v-data-table__td--select-row': column.key === 'data-table-select' - }, - "fixed": column.fixed, - "fixedOffset": column.fixedOffset, - "lastFixed": column.lastFixed, - "maxWidth": !mobile.value ? column.maxWidth : undefined, - "noPadding": column.key === 'data-table-select' || column.key === 'data-table-expand', - "nowrap": column.nowrap, - "width": !mobile.value ? column.width : undefined - }, cellProps, columnCellProps), { - default: () => { - if (slots[slotName] && !mobile.value) return slots[slotName]?.(slotProps); - if (column.key === 'data-table-select') { - return slots['item.data-table-select']?.(slotProps) ?? _createVNode$Y(VCheckboxBtn, { - "disabled": !item.selectable, - "modelValue": isSelected([item]), - "onClick": withModifiers(() => toggleSelect(item), ['stop']) - }, null); - } - if (column.key === 'data-table-expand') { - return slots['item.data-table-expand']?.(slotProps) ?? _createVNode$Y(VBtn, { - "icon": isExpanded(item) ? '$collapse' : '$expand', - "size": "small", - "variant": "text", - "onClick": withModifiers(() => toggleExpand(item), ['stop']) - }, null); - } - const displayValue = toDisplayString(slotProps.value); - return !mobile.value ? displayValue : _createVNode$Y(_Fragment$h, null, [_createVNode$Y("div", { - "class": "v-data-table__td-title" - }, [slots[headerSlotName]?.(columnSlotProps) ?? column.title]), _createVNode$Y("div", { - "class": "v-data-table__td-value" - }, [slots[slotName]?.(slotProps) ?? displayValue])]); - } - }); - })])); - } -}); - -const {mergeProps:_mergeProps$t,resolveDirective:_resolveDirective$s,Fragment:_Fragment$g,createVNode:_createVNode$X} = await importShared('vue'); -const {Fragment,mergeProps: mergeProps$3} = await importShared('vue'); -const makeVDataTableRowsProps = propsFactory({ - loading: [Boolean, String], - loadingText: { - type: String, - default: '$vuetify.dataIterator.loadingText' - }, - hideNoData: Boolean, - items: { - type: Array, - default: () => [] - }, - noDataText: { - type: String, - default: '$vuetify.noDataText' - }, - rowProps: [Object, Function], - cellProps: [Object, Function], - ...makeDisplayProps() -}, 'VDataTableRows'); -const VDataTableRows = genericComponent()({ - name: 'VDataTableRows', - inheritAttrs: false, - props: makeVDataTableRowsProps(), - setup(props, _ref) { - let { - attrs, - slots - } = _ref; - const { - columns - } = useHeaders(); - const { - expandOnClick, - toggleExpand, - isExpanded - } = useExpanded(); - const { - isSelected, - toggleSelect - } = useSelection(); - const { - toggleGroup, - isGroupOpen - } = useGroupBy(); - const { - t - } = useLocale(); - const { - mobile - } = useDisplay(props); - useRender(() => { - if (props.loading && (!props.items.length || slots.loading)) { - return _createVNode$X("tr", { - "class": "v-data-table-rows-loading", - "key": "loading" - }, [_createVNode$X("td", { - "colspan": columns.value.length - }, [slots.loading?.() ?? t(props.loadingText)])]); - } - if (!props.loading && !props.items.length && !props.hideNoData) { - return _createVNode$X("tr", { - "class": "v-data-table-rows-no-data", - "key": "no-data" - }, [_createVNode$X("td", { - "colspan": columns.value.length - }, [slots['no-data']?.() ?? t(props.noDataText)])]); - } - return _createVNode$X(_Fragment$g, null, [props.items.map((item, index) => { - if (item.type === 'group') { - const slotProps = { - index, - item, - columns: columns.value, - isExpanded, - toggleExpand, - isSelected, - toggleSelect, - toggleGroup, - isGroupOpen - }; - return slots['group-header'] ? slots['group-header'](slotProps) : _createVNode$X(VDataTableGroupHeaderRow, _mergeProps$t({ - "key": `group-header_${item.id}`, - "item": item - }, getPrefixedEventHandlers(attrs, ':group-header', () => slotProps)), slots); - } - const slotProps = { - index, - item: item.raw, - internalItem: item, - columns: columns.value, - isExpanded, - toggleExpand, - isSelected, - toggleSelect - }; - const itemSlotProps = { - ...slotProps, - props: mergeProps$3({ - key: `item_${item.key ?? item.index}`, - onClick: expandOnClick.value ? () => { - toggleExpand(item); - } : undefined, - index, - item, - cellProps: props.cellProps, - mobile: mobile.value - }, getPrefixedEventHandlers(attrs, ':row', () => slotProps), typeof props.rowProps === 'function' ? props.rowProps({ - item: slotProps.item, - index: slotProps.index, - internalItem: slotProps.internalItem - }) : props.rowProps) - }; - return _createVNode$X(_Fragment$g, { - "key": itemSlotProps.props.key - }, [slots.item ? slots.item(itemSlotProps) : _createVNode$X(VDataTableRow, itemSlotProps.props, slots), isExpanded(item) && slots['expanded-row']?.(slotProps)]); - })]); - }); - return {}; - } -}); - -const {createVNode:_createVNode$W} = await importShared('vue'); -const makeVTableProps = propsFactory({ - fixedHeader: Boolean, - fixedFooter: Boolean, - height: [Number, String], - hover: Boolean, - ...makeComponentProps(), - ...makeDensityProps(), - ...makeTagProps(), - ...makeThemeProps() -}, 'VTable'); -const VTable = genericComponent()({ - name: 'VTable', - props: makeVTableProps(), - setup(props, _ref) { - let { - slots, - emit - } = _ref; - const { - themeClasses - } = provideTheme(props); - const { - densityClasses - } = useDensity(props); - useRender(() => _createVNode$W(props.tag, { - "class": ['v-table', { - 'v-table--fixed-height': !!props.height, - 'v-table--fixed-header': props.fixedHeader, - 'v-table--fixed-footer': props.fixedFooter, - 'v-table--has-top': !!slots.top, - 'v-table--has-bottom': !!slots.bottom, - 'v-table--hover': props.hover - }, themeClasses.value, densityClasses.value, props.class], - "style": props.style - }, { - default: () => [slots.top?.(), slots.default ? _createVNode$W("div", { - "class": "v-table__wrapper", - "style": { - height: convertToUnit(props.height) - } - }, [_createVNode$W("table", null, [slots.default()])]) : slots.wrapper?.(), slots.bottom?.()] - })); - return {}; - } -}); - -// Utilities -const {computed: computed$I} = await importShared('vue'); -// Composables -const makeDataTableItemsProps = propsFactory({ - items: { - type: Array, - default: () => [] - }, - itemValue: { - type: [String, Array, Function], - default: 'id' - }, - itemSelectable: { - type: [String, Array, Function], - default: null - }, - rowProps: [Object, Function], - cellProps: [Object, Function], - returnObject: Boolean -}, 'DataTable-items'); -function transformItem(props, item, index, columns) { - const value = props.returnObject ? item : getPropertyFromItem(item, props.itemValue); - const selectable = getPropertyFromItem(item, props.itemSelectable, true); - const itemColumns = columns.reduce((obj, column) => { - if (column.key != null) obj[column.key] = getPropertyFromItem(item, column.value); - return obj; - }, {}); - return { - type: 'item', - key: props.returnObject ? getPropertyFromItem(item, props.itemValue) : value, - index, - value, - selectable, - columns: itemColumns, - raw: item - }; -} -function transformItems(props, items, columns) { - return items.map((item, index) => transformItem(props, item, index, columns)); -} -function useDataTableItems(props, columns) { - const items = computed$I(() => transformItems(props, props.items, columns.value)); - return { - items - }; -} - -const {mergeProps:_mergeProps$s,createVNode:_createVNode$V,resolveDirective:_resolveDirective$r,Fragment:_Fragment$f} = await importShared('vue'); -const {computed: computed$H,toRef: toRef$g,toRefs: toRefs$3} = await importShared('vue'); -const makeDataTableProps = propsFactory({ - ...makeVDataTableRowsProps(), - hideDefaultBody: Boolean, - hideDefaultFooter: Boolean, - hideDefaultHeader: Boolean, - width: [String, Number], - search: String, - ...makeDataTableExpandProps(), - ...makeDataTableGroupProps(), - ...makeDataTableHeaderProps(), - ...makeDataTableItemsProps(), - ...makeDataTableSelectProps(), - ...makeDataTableSortProps(), - ...makeVDataTableHeadersProps(), - ...makeVTableProps() -}, 'DataTable'); -const makeVDataTableProps = propsFactory({ - ...makeDataTablePaginateProps(), - ...makeDataTableProps(), - ...makeFilterProps(), - ...makeVDataTableFooterProps() -}, 'VDataTable'); -const VDataTable = genericComponent()({ - name: 'VDataTable', - props: makeVDataTableProps(), - emits: { - 'update:modelValue': value => true, - 'update:page': value => true, - 'update:itemsPerPage': value => true, - 'update:sortBy': value => true, - 'update:options': value => true, - 'update:groupBy': value => true, - 'update:expanded': value => true, - 'update:currentItems': value => true - }, - setup(props, _ref) { - let { - attrs, - slots - } = _ref; - const { - groupBy - } = createGroupBy(props); - const { - sortBy, - multiSort, - mustSort - } = createSort(props); - const { - page, - itemsPerPage - } = createPagination(props); - const { - disableSort - } = toRefs$3(props); - const { - columns, - headers, - sortFunctions, - sortRawFunctions, - filterFunctions - } = createHeaders(props, { - groupBy, - showSelect: toRef$g(props, 'showSelect'), - showExpand: toRef$g(props, 'showExpand') - }); - const { - items - } = useDataTableItems(props, columns); - const search = toRef$g(props, 'search'); - const { - filteredItems - } = useFilter(props, items, search, { - transform: item => item.columns, - customKeyFilter: filterFunctions - }); - const { - toggleSort - } = provideSort({ - sortBy, - multiSort, - mustSort, - page - }); - const { - sortByWithGroups, - opened, - extractRows, - isGroupOpen, - toggleGroup - } = provideGroupBy({ - groupBy, - sortBy, - disableSort - }); - const { - sortedItems - } = useSortedItems(props, filteredItems, sortByWithGroups, { - transform: item => ({ - ...item.raw, - ...item.columns - }), - sortFunctions, - sortRawFunctions - }); - const { - flatItems - } = useGroupedItems(sortedItems, groupBy, opened); - const itemsLength = computed$H(() => flatItems.value.length); - const { - startIndex, - stopIndex, - pageCount, - setItemsPerPage - } = providePagination({ - page, - itemsPerPage, - itemsLength - }); - const { - paginatedItems - } = usePaginatedItems({ - items: flatItems, - startIndex, - stopIndex, - itemsPerPage - }); - const paginatedItemsWithoutGroups = computed$H(() => extractRows(paginatedItems.value)); - const { - isSelected, - select, - selectAll, - toggleSelect, - someSelected, - allSelected - } = provideSelection(props, { - allItems: items, - currentPage: paginatedItemsWithoutGroups - }); - const { - isExpanded, - toggleExpand - } = provideExpanded(props); - useOptions({ - page, - itemsPerPage, - sortBy, - groupBy, - search - }); - provideDefaults({ - VDataTableRows: { - hideNoData: toRef$g(props, 'hideNoData'), - noDataText: toRef$g(props, 'noDataText'), - loading: toRef$g(props, 'loading'), - loadingText: toRef$g(props, 'loadingText') - } - }); - const slotProps = computed$H(() => ({ - page: page.value, - itemsPerPage: itemsPerPage.value, - sortBy: sortBy.value, - pageCount: pageCount.value, - toggleSort, - setItemsPerPage, - someSelected: someSelected.value, - allSelected: allSelected.value, - isSelected, - select, - selectAll, - toggleSelect, - isExpanded, - toggleExpand, - isGroupOpen, - toggleGroup, - items: paginatedItemsWithoutGroups.value.map(item => item.raw), - internalItems: paginatedItemsWithoutGroups.value, - groupedItems: paginatedItems.value, - columns: columns.value, - headers: headers.value - })); - useRender(() => { - const dataTableFooterProps = VDataTableFooter.filterProps(props); - const dataTableHeadersProps = VDataTableHeaders.filterProps(props); - const dataTableRowsProps = VDataTableRows.filterProps(props); - const tableProps = VTable.filterProps(props); - return _createVNode$V(VTable, _mergeProps$s({ - "class": ['v-data-table', { - 'v-data-table--show-select': props.showSelect, - 'v-data-table--loading': props.loading - }, props.class], - "style": props.style - }, tableProps), { - top: () => slots.top?.(slotProps.value), - default: () => slots.default ? slots.default(slotProps.value) : _createVNode$V(_Fragment$f, null, [slots.colgroup?.(slotProps.value), !props.hideDefaultHeader && _createVNode$V("thead", { - "key": "thead" - }, [_createVNode$V(VDataTableHeaders, dataTableHeadersProps, slots)]), slots.thead?.(slotProps.value), !props.hideDefaultBody && _createVNode$V("tbody", null, [slots['body.prepend']?.(slotProps.value), slots.body ? slots.body(slotProps.value) : _createVNode$V(VDataTableRows, _mergeProps$s(attrs, dataTableRowsProps, { - "items": paginatedItems.value - }), slots), slots['body.append']?.(slotProps.value)]), slots.tbody?.(slotProps.value), slots.tfoot?.(slotProps.value)]), - bottom: () => slots.bottom ? slots.bottom(slotProps.value) : !props.hideDefaultFooter && _createVNode$V(_Fragment$f, null, [_createVNode$V(VDivider, null, null), _createVNode$V(VDataTableFooter, dataTableFooterProps, { - prepend: slots['footer.prepend'] - })]) - }); - }); - return {}; - } -}); - -const {createVNode:_createVNode$U,mergeProps:_mergeProps$r,resolveDirective:_resolveDirective$q} = await importShared('vue'); -const {computed: computed$G,shallowRef: shallowRef$d,toRef: toRef$f,toRefs: toRefs$2} = await importShared('vue'); -const makeVDataTableVirtualProps = propsFactory({ - ...makeDataTableProps(), - ...makeDataTableGroupProps(), - ...makeVirtualProps(), - ...makeFilterProps() -}, 'VDataTableVirtual'); -const VDataTableVirtual = genericComponent()({ - name: 'VDataTableVirtual', - props: makeVDataTableVirtualProps(), - emits: { - 'update:modelValue': value => true, - 'update:sortBy': value => true, - 'update:options': value => true, - 'update:groupBy': value => true, - 'update:expanded': value => true - }, - setup(props, _ref) { - let { - attrs, - slots - } = _ref; - const { - groupBy - } = createGroupBy(props); - const { - sortBy, - multiSort, - mustSort - } = createSort(props); - const { - disableSort - } = toRefs$2(props); - const { - columns, - headers, - filterFunctions, - sortFunctions, - sortRawFunctions - } = createHeaders(props, { - groupBy, - showSelect: toRef$f(props, 'showSelect'), - showExpand: toRef$f(props, 'showExpand') - }); - const { - items - } = useDataTableItems(props, columns); - const search = toRef$f(props, 'search'); - const { - filteredItems - } = useFilter(props, items, search, { - transform: item => item.columns, - customKeyFilter: filterFunctions - }); - const { - toggleSort - } = provideSort({ - sortBy, - multiSort, - mustSort - }); - const { - sortByWithGroups, - opened, - extractRows, - isGroupOpen, - toggleGroup - } = provideGroupBy({ - groupBy, - sortBy, - disableSort - }); - const { - sortedItems - } = useSortedItems(props, filteredItems, sortByWithGroups, { - transform: item => ({ - ...item.raw, - ...item.columns - }), - sortFunctions, - sortRawFunctions - }); - const { - flatItems - } = useGroupedItems(sortedItems, groupBy, opened); - const allItems = computed$G(() => extractRows(flatItems.value)); - const { - isSelected, - select, - selectAll, - toggleSelect, - someSelected, - allSelected - } = provideSelection(props, { - allItems, - currentPage: allItems - }); - const { - isExpanded, - toggleExpand - } = provideExpanded(props); - const { - containerRef, - markerRef, - paddingTop, - paddingBottom, - computedItems, - handleItemResize, - handleScroll, - handleScrollend - } = useVirtual(props, flatItems); - const displayItems = computed$G(() => computedItems.value.map(item => item.raw)); - useOptions({ - sortBy, - page: shallowRef$d(1), - itemsPerPage: shallowRef$d(-1), - groupBy, - search - }); - provideDefaults({ - VDataTableRows: { - hideNoData: toRef$f(props, 'hideNoData'), - noDataText: toRef$f(props, 'noDataText'), - loading: toRef$f(props, 'loading'), - loadingText: toRef$f(props, 'loadingText') - } - }); - const slotProps = computed$G(() => ({ - sortBy: sortBy.value, - toggleSort, - someSelected: someSelected.value, - allSelected: allSelected.value, - isSelected, - select, - selectAll, - toggleSelect, - isExpanded, - toggleExpand, - isGroupOpen, - toggleGroup, - items: allItems.value.map(item => item.raw), - internalItems: allItems.value, - groupedItems: flatItems.value, - columns: columns.value, - headers: headers.value - })); - useRender(() => { - const dataTableHeadersProps = VDataTableHeaders.filterProps(props); - const dataTableRowsProps = VDataTableRows.filterProps(props); - const tableProps = VTable.filterProps(props); - return _createVNode$U(VTable, _mergeProps$r({ - "class": ['v-data-table', { - 'v-data-table--loading': props.loading - }, props.class], - "style": props.style - }, tableProps), { - top: () => slots.top?.(slotProps.value), - wrapper: () => _createVNode$U("div", { - "ref": containerRef, - "onScrollPassive": handleScroll, - "onScrollend": handleScrollend, - "class": "v-table__wrapper", - "style": { - height: convertToUnit(props.height) - } - }, [_createVNode$U("table", null, [slots.colgroup?.(slotProps.value), !props.hideDefaultHeader && _createVNode$U("thead", { - "key": "thead" - }, [_createVNode$U(VDataTableHeaders, _mergeProps$r(dataTableHeadersProps, { - "sticky": props.fixedHeader - }), slots)]), !props.hideDefaultBody && _createVNode$U("tbody", null, [_createVNode$U("tr", { - "ref": markerRef, - "style": { - height: convertToUnit(paddingTop.value), - border: 0 - } - }, [_createVNode$U("td", { - "colspan": columns.value.length, - "style": { - height: 0, - border: 0 - } - }, null)]), slots['body.prepend']?.(slotProps.value), _createVNode$U(VDataTableRows, _mergeProps$r(attrs, dataTableRowsProps, { - "items": displayItems.value - }), { - ...slots, - item: itemSlotProps => _createVNode$U(VVirtualScrollItem, { - "key": itemSlotProps.internalItem.index, - "renderless": true, - "onUpdate:height": height => handleItemResize(itemSlotProps.internalItem.index, height) - }, { - default: _ref2 => { - let { - itemRef - } = _ref2; - return slots.item?.({ - ...itemSlotProps, - itemRef - }) ?? _createVNode$U(VDataTableRow, _mergeProps$r(itemSlotProps.props, { - "ref": itemRef, - "key": itemSlotProps.internalItem.index, - "index": itemSlotProps.internalItem.index - }), slots); - } - }) - }), slots['body.append']?.(slotProps.value), _createVNode$U("tr", { - "style": { - height: convertToUnit(paddingBottom.value), - border: 0 - } - }, [_createVNode$U("td", { - "colspan": columns.value.length, - "style": { - height: 0, - border: 0 - } - }, null)])])])]), - bottom: () => slots.bottom?.(slotProps.value) - }); - }); - } -}); - -const {createVNode:_createVNode$T,mergeProps:_mergeProps$q,resolveDirective:_resolveDirective$p,Fragment:_Fragment$e} = await importShared('vue'); -const {computed: computed$F,provide: provide$1,toRef: toRef$e,toRefs: toRefs$1} = await importShared('vue'); -const makeVDataTableServerProps = propsFactory({ - itemsLength: { - type: [Number, String], - required: true - }, - ...makeDataTablePaginateProps(), - ...makeDataTableProps(), - ...makeVDataTableFooterProps() -}, 'VDataTableServer'); -const VDataTableServer = genericComponent()({ - name: 'VDataTableServer', - props: makeVDataTableServerProps(), - emits: { - 'update:modelValue': value => true, - 'update:page': page => true, - 'update:itemsPerPage': page => true, - 'update:sortBy': sortBy => true, - 'update:options': options => true, - 'update:expanded': options => true, - 'update:groupBy': value => true - }, - setup(props, _ref) { - let { - attrs, - slots - } = _ref; - const { - groupBy - } = createGroupBy(props); - const { - sortBy, - multiSort, - mustSort - } = createSort(props); - const { - page, - itemsPerPage - } = createPagination(props); - const { - disableSort - } = toRefs$1(props); - const itemsLength = computed$F(() => parseInt(props.itemsLength, 10)); - const { - columns, - headers - } = createHeaders(props, { - groupBy, - showSelect: toRef$e(props, 'showSelect'), - showExpand: toRef$e(props, 'showExpand') - }); - const { - items - } = useDataTableItems(props, columns); - const { - toggleSort - } = provideSort({ - sortBy, - multiSort, - mustSort, - page - }); - const { - opened, - isGroupOpen, - toggleGroup, - extractRows - } = provideGroupBy({ - groupBy, - sortBy, - disableSort - }); - const { - pageCount, - setItemsPerPage - } = providePagination({ - page, - itemsPerPage, - itemsLength - }); - const { - flatItems - } = useGroupedItems(items, groupBy, opened); - const { - isSelected, - select, - selectAll, - toggleSelect, - someSelected, - allSelected - } = provideSelection(props, { - allItems: items, - currentPage: items - }); - const { - isExpanded, - toggleExpand - } = provideExpanded(props); - const itemsWithoutGroups = computed$F(() => extractRows(items.value)); - useOptions({ - page, - itemsPerPage, - sortBy, - groupBy, - search: toRef$e(props, 'search') - }); - provide$1('v-data-table', { - toggleSort, - sortBy - }); - provideDefaults({ - VDataTableRows: { - hideNoData: toRef$e(props, 'hideNoData'), - noDataText: toRef$e(props, 'noDataText'), - loading: toRef$e(props, 'loading'), - loadingText: toRef$e(props, 'loadingText') - } - }); - const slotProps = computed$F(() => ({ - page: page.value, - itemsPerPage: itemsPerPage.value, - sortBy: sortBy.value, - pageCount: pageCount.value, - toggleSort, - setItemsPerPage, - someSelected: someSelected.value, - allSelected: allSelected.value, - isSelected, - select, - selectAll, - toggleSelect, - isExpanded, - toggleExpand, - isGroupOpen, - toggleGroup, - items: itemsWithoutGroups.value.map(item => item.raw), - internalItems: itemsWithoutGroups.value, - groupedItems: flatItems.value, - columns: columns.value, - headers: headers.value - })); - useRender(() => { - const dataTableFooterProps = VDataTableFooter.filterProps(props); - const dataTableHeadersProps = VDataTableHeaders.filterProps(props); - const dataTableRowsProps = VDataTableRows.filterProps(props); - const tableProps = VTable.filterProps(props); - return _createVNode$T(VTable, _mergeProps$q({ - "class": ['v-data-table', { - 'v-data-table--loading': props.loading - }, props.class], - "style": props.style - }, tableProps), { - top: () => slots.top?.(slotProps.value), - default: () => slots.default ? slots.default(slotProps.value) : _createVNode$T(_Fragment$e, null, [slots.colgroup?.(slotProps.value), !props.hideDefaultHeader && _createVNode$T("thead", { - "key": "thead", - "class": "v-data-table__thead", - "role": "rowgroup" - }, [_createVNode$T(VDataTableHeaders, _mergeProps$q(dataTableHeadersProps, { - "sticky": props.fixedHeader - }), slots)]), slots.thead?.(slotProps.value), !props.hideDefaultBody && _createVNode$T("tbody", { - "class": "v-data-table__tbody", - "role": "rowgroup" - }, [slots['body.prepend']?.(slotProps.value), slots.body ? slots.body(slotProps.value) : _createVNode$T(VDataTableRows, _mergeProps$q(attrs, dataTableRowsProps, { - "items": flatItems.value - }), slots), slots['body.append']?.(slotProps.value)]), slots.tbody?.(slotProps.value), slots.tfoot?.(slotProps.value)]), - bottom: () => slots.bottom ? slots.bottom(slotProps.value) : !props.hideDefaultFooter && _createVNode$T(_Fragment$e, null, [_createVNode$T(VDivider, null, null), _createVNode$T(VDataTableFooter, dataTableFooterProps, { - prepend: slots['footer.prepend'] - })]) - }); - }); - } -}); - -const {createVNode:_createVNode$S,resolveDirective:_resolveDirective$o} = await importShared('vue'); -const makeVContainerProps = propsFactory({ - fluid: { - type: Boolean, - default: false - }, - ...makeComponentProps(), - ...makeDimensionProps(), - ...makeTagProps() -}, 'VContainer'); -const VContainer = genericComponent()({ - name: 'VContainer', - props: makeVContainerProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - rtlClasses - } = useRtl(); - const { - dimensionStyles - } = useDimension(props); - useRender(() => _createVNode$S(props.tag, { - "class": ['v-container', { - 'v-container--fluid': props.fluid - }, rtlClasses.value, props.class], - "style": [dimensionStyles.value, props.style] - }, slots)); - return {}; - } -}); - -const {capitalize: capitalize$1,computed: computed$E,h: h$2} = await importShared('vue'); -const breakpointProps = (() => { - return breakpoints.reduce((props, val) => { - props[val] = { - type: [Boolean, String, Number], - default: false - }; - return props; - }, {}); -})(); -const offsetProps = (() => { - return breakpoints.reduce((props, val) => { - const offsetKey = 'offset' + capitalize$1(val); - props[offsetKey] = { - type: [String, Number], - default: null - }; - return props; - }, {}); -})(); -const orderProps = (() => { - return breakpoints.reduce((props, val) => { - const orderKey = 'order' + capitalize$1(val); - props[orderKey] = { - type: [String, Number], - default: null - }; - return props; - }, {}); -})(); -const propMap$1 = { - col: Object.keys(breakpointProps), - offset: Object.keys(offsetProps), - order: Object.keys(orderProps) -}; -function breakpointClass$1(type, prop, val) { - let className = type; - if (val == null || val === false) { - return undefined; - } - if (prop) { - const breakpoint = prop.replace(type, ''); - className += `-${breakpoint}`; - } - if (type === 'col') { - className = 'v-' + className; - } - // Handling the boolean style prop when accepting [Boolean, String, Number] - // means Vue will not convert to sm: true for us. - // Since the default is false, an empty string indicates the prop's presence. - if (type === 'col' && (val === '' || val === true)) { - // .v-col-md - return className.toLowerCase(); - } - // .order-md-6 - className += `-${val}`; - return className.toLowerCase(); -} -const ALIGN_SELF_VALUES = ['auto', 'start', 'end', 'center', 'baseline', 'stretch']; -const makeVColProps = propsFactory({ - cols: { - type: [Boolean, String, Number], - default: false - }, - ...breakpointProps, - offset: { - type: [String, Number], - default: null - }, - ...offsetProps, - order: { - type: [String, Number], - default: null - }, - ...orderProps, - alignSelf: { - type: String, - default: null, - validator: str => ALIGN_SELF_VALUES.includes(str) - }, - ...makeComponentProps(), - ...makeTagProps() -}, 'VCol'); -const VCol = genericComponent()({ - name: 'VCol', - props: makeVColProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const classes = computed$E(() => { - const classList = []; - - // Loop through `col`, `offset`, `order` breakpoint props - let type; - for (type in propMap$1) { - propMap$1[type].forEach(prop => { - const value = props[prop]; - const className = breakpointClass$1(type, prop, value); - if (className) classList.push(className); - }); - } - const hasColClasses = classList.some(className => className.startsWith('v-col-')); - classList.push({ - // Default to .v-col if no other col-{bp}-* classes generated nor `cols` specified. - 'v-col': !hasColClasses || !props.cols, - [`v-col-${props.cols}`]: props.cols, - [`offset-${props.offset}`]: props.offset, - [`order-${props.order}`]: props.order, - [`align-self-${props.alignSelf}`]: props.alignSelf - }); - return classList; - }); - return () => h$2(props.tag, { - class: [classes.value, props.class], - style: props.style - }, slots.default?.()); - } -}); - -const {capitalize,computed: computed$D,h: h$1} = await importShared('vue'); -const ALIGNMENT = ['start', 'end', 'center']; -const SPACE = ['space-between', 'space-around', 'space-evenly']; -function makeRowProps(prefix, def) { - return breakpoints.reduce((props, val) => { - const prefixKey = prefix + capitalize(val); - props[prefixKey] = def(); - return props; - }, {}); -} -const ALIGN_VALUES = [...ALIGNMENT, 'baseline', 'stretch']; -const alignValidator = str => ALIGN_VALUES.includes(str); -const alignProps = makeRowProps('align', () => ({ - type: String, - default: null, - validator: alignValidator -})); -const JUSTIFY_VALUES = [...ALIGNMENT, ...SPACE]; -const justifyValidator = str => JUSTIFY_VALUES.includes(str); -const justifyProps = makeRowProps('justify', () => ({ - type: String, - default: null, - validator: justifyValidator -})); -const ALIGN_CONTENT_VALUES = [...ALIGNMENT, ...SPACE, 'stretch']; -const alignContentValidator = str => ALIGN_CONTENT_VALUES.includes(str); -const alignContentProps = makeRowProps('alignContent', () => ({ - type: String, - default: null, - validator: alignContentValidator -})); -const propMap = { - align: Object.keys(alignProps), - justify: Object.keys(justifyProps), - alignContent: Object.keys(alignContentProps) -}; -const classMap = { - align: 'align', - justify: 'justify', - alignContent: 'align-content' -}; -function breakpointClass(type, prop, val) { - let className = classMap[type]; - if (val == null) { - return undefined; - } - if (prop) { - // alignSm -> Sm - const breakpoint = prop.replace(type, ''); - className += `-${breakpoint}`; - } - // .align-items-sm-center - className += `-${val}`; - return className.toLowerCase(); -} -const makeVRowProps = propsFactory({ - dense: Boolean, - noGutters: Boolean, - align: { - type: String, - default: null, - validator: alignValidator - }, - ...alignProps, - justify: { - type: String, - default: null, - validator: justifyValidator - }, - ...justifyProps, - alignContent: { - type: String, - default: null, - validator: alignContentValidator - }, - ...alignContentProps, - ...makeComponentProps(), - ...makeTagProps() -}, 'VRow'); -const VRow = genericComponent()({ - name: 'VRow', - props: makeVRowProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const classes = computed$D(() => { - const classList = []; - - // Loop through `align`, `justify`, `alignContent` breakpoint props - let type; - for (type in propMap) { - propMap[type].forEach(prop => { - const value = props[prop]; - const className = breakpointClass(type, prop, value); - if (className) classList.push(className); - }); - } - classList.push({ - 'v-row--no-gutters': props.noGutters, - 'v-row--dense': props.dense, - [`align-${props.align}`]: props.align, - [`justify-${props.justify}`]: props.justify, - [`align-content-${props.alignContent}`]: props.alignContent - }); - return classList; - }); - return () => h$1(props.tag, { - class: ['v-row', classes.value, props.class], - style: props.style - }, slots.default?.()); - } -}); - -// Styles -const VSpacer = createSimpleFunctional('v-spacer', 'div', 'VSpacer'); - -const {createVNode:_createVNode$R} = await importShared('vue'); -const {computed: computed$C} = await importShared('vue'); -const makeVDatePickerControlsProps = propsFactory({ - active: { - type: [String, Array], - default: undefined - }, - disabled: { - type: [Boolean, String, Array], - default: false - }, - nextIcon: { - type: IconValue, - default: '$next' - }, - prevIcon: { - type: IconValue, - default: '$prev' - }, - modeIcon: { - type: IconValue, - default: '$subgroup' - }, - text: String, - viewMode: { - type: String, - default: 'month' - } -}, 'VDatePickerControls'); -const VDatePickerControls = genericComponent()({ - name: 'VDatePickerControls', - props: makeVDatePickerControlsProps(), - emits: { - 'click:year': () => true, - 'click:month': () => true, - 'click:prev': () => true, - 'click:next': () => true, - 'click:text': () => true - }, - setup(props, _ref) { - let { - emit - } = _ref; - const disableMonth = computed$C(() => { - return Array.isArray(props.disabled) ? props.disabled.includes('text') : !!props.disabled; - }); - const disableYear = computed$C(() => { - return Array.isArray(props.disabled) ? props.disabled.includes('mode') : !!props.disabled; - }); - const disablePrev = computed$C(() => { - return Array.isArray(props.disabled) ? props.disabled.includes('prev') : !!props.disabled; - }); - const disableNext = computed$C(() => { - return Array.isArray(props.disabled) ? props.disabled.includes('next') : !!props.disabled; - }); - function onClickPrev() { - emit('click:prev'); - } - function onClickNext() { - emit('click:next'); - } - function onClickYear() { - emit('click:year'); - } - function onClickMonth() { - emit('click:month'); - } - useRender(() => { - // TODO: add slot support and scope defaults - return _createVNode$R("div", { - "class": ['v-date-picker-controls'] - }, [_createVNode$R(VBtn, { - "class": "v-date-picker-controls__month-btn", - "disabled": disableMonth.value, - "text": props.text, - "variant": "text", - "rounded": true, - "onClick": onClickMonth - }, null), _createVNode$R(VBtn, { - "key": "mode-btn", - "class": "v-date-picker-controls__mode-btn", - "disabled": disableYear.value, - "density": "comfortable", - "icon": props.modeIcon, - "variant": "text", - "onClick": onClickYear - }, null), _createVNode$R(VSpacer, { - "key": "mode-spacer" - }, null), _createVNode$R("div", { - "key": "month-buttons", - "class": "v-date-picker-controls__month" - }, [_createVNode$R(VBtn, { - "disabled": disablePrev.value, - "icon": props.prevIcon, - "variant": "text", - "onClick": onClickPrev - }, null), _createVNode$R(VBtn, { - "disabled": disableNext.value, - "icon": props.nextIcon, - "variant": "text", - "onClick": onClickNext - }, null)])]); - }); - return {}; - } -}); - -const {createVNode:_createVNode$Q} = await importShared('vue'); -const makeVDatePickerHeaderProps = propsFactory({ - appendIcon: String, - color: String, - header: String, - transition: String, - onClick: EventProp() -}, 'VDatePickerHeader'); -const VDatePickerHeader = genericComponent()({ - name: 'VDatePickerHeader', - props: makeVDatePickerHeaderProps(), - emits: { - click: () => true, - 'click:append': () => true - }, - setup(props, _ref) { - let { - emit, - slots - } = _ref; - const { - backgroundColorClasses, - backgroundColorStyles - } = useBackgroundColor(props, 'color'); - function onClick() { - emit('click'); - } - function onClickAppend() { - emit('click:append'); - } - useRender(() => { - const hasContent = !!(slots.default || props.header); - const hasAppend = !!(slots.append || props.appendIcon); - return _createVNode$Q("div", { - "class": ['v-date-picker-header', { - 'v-date-picker-header--clickable': !!props.onClick - }, backgroundColorClasses.value], - "style": backgroundColorStyles.value, - "onClick": onClick - }, [slots.prepend && _createVNode$Q("div", { - "key": "prepend", - "class": "v-date-picker-header__prepend" - }, [slots.prepend()]), hasContent && _createVNode$Q(MaybeTransition, { - "key": "content", - "name": props.transition - }, { - default: () => [_createVNode$Q("div", { - "key": props.header, - "class": "v-date-picker-header__content" - }, [slots.default?.() ?? props.header])] - }), hasAppend && _createVNode$Q("div", { - "class": "v-date-picker-header__append" - }, [!slots.append ? _createVNode$Q(VBtn, { - "key": "append-btn", - "icon": props.appendIcon, - "variant": "text", - "onClick": onClickAppend - }, null) : _createVNode$Q(VDefaultsProvider, { - "key": "append-defaults", - "disabled": !props.appendIcon, - "defaults": { - VBtn: { - icon: props.appendIcon, - variant: 'text' - } - } - }, { - default: () => [slots.append?.()] - })])]); - }); - return {}; - } -}); - -const {computed: computed$B} = await importShared('vue'); -// Types -// Composables -const makeCalendarProps = propsFactory({ - allowedDates: [Array, Function], - disabled: Boolean, - displayValue: null, - modelValue: Array, - month: [Number, String], - max: null, - min: null, - showAdjacentMonths: Boolean, - year: [Number, String], - weekdays: { - type: Array, - default: () => [0, 1, 2, 3, 4, 5, 6] - }, - weeksInMonth: { - type: String, - default: 'dynamic' - }, - firstDayOfWeek: [Number, String] -}, 'calendar'); -function useCalendar(props) { - const adapter = useDate(); - const model = useProxiedModel(props, 'modelValue', [], v => wrapInArray(v)); - const displayValue = computed$B(() => { - if (props.displayValue) return adapter.date(props.displayValue); - if (model.value.length > 0) return adapter.date(model.value[0]); - if (props.min) return adapter.date(props.min); - if (Array.isArray(props.allowedDates)) return adapter.date(props.allowedDates[0]); - return adapter.date(); - }); - const year = useProxiedModel(props, 'year', undefined, v => { - const value = v != null ? Number(v) : adapter.getYear(displayValue.value); - return adapter.startOfYear(adapter.setYear(adapter.date(), value)); - }, v => adapter.getYear(v)); - const month = useProxiedModel(props, 'month', undefined, v => { - const value = v != null ? Number(v) : adapter.getMonth(displayValue.value); - const date = adapter.setYear(adapter.startOfMonth(adapter.date()), adapter.getYear(year.value)); - return adapter.setMonth(date, value); - }, v => adapter.getMonth(v)); - const weekDays = computed$B(() => { - const firstDayOfWeek = Number(props.firstDayOfWeek ?? 0); - return props.weekdays.map(day => (day + firstDayOfWeek) % 7); - }); - const weeksInMonth = computed$B(() => { - const weeks = adapter.getWeekArray(month.value, props.firstDayOfWeek); - const days = weeks.flat(); - - // Make sure there's always 6 weeks in month (6 * 7 days) - // if weeksInMonth is 'static' - const daysInMonth = 6 * 7; - if (props.weeksInMonth === 'static' && days.length < daysInMonth) { - const lastDay = days[days.length - 1]; - let week = []; - for (let day = 1; day <= daysInMonth - days.length; day++) { - week.push(adapter.addDays(lastDay, day)); - if (day % 7 === 0) { - weeks.push(week); - week = []; - } - } - } - return weeks; - }); - function genDays(days, today) { - return days.filter(date => { - return weekDays.value.includes(adapter.toJsDate(date).getDay()); - }).map((date, index) => { - const isoDate = adapter.toISO(date); - const isAdjacent = !adapter.isSameMonth(date, month.value); - const isStart = adapter.isSameDay(date, adapter.startOfMonth(month.value)); - const isEnd = adapter.isSameDay(date, adapter.endOfMonth(month.value)); - const isSame = adapter.isSameDay(date, month.value); - return { - date, - isoDate, - formatted: adapter.format(date, 'keyboardDate'), - year: adapter.getYear(date), - month: adapter.getMonth(date), - isDisabled: isDisabled(date), - isWeekStart: index % 7 === 0, - isWeekEnd: index % 7 === 6, - isToday: adapter.isSameDay(date, today), - isAdjacent, - isHidden: isAdjacent && !props.showAdjacentMonths, - isStart, - isSelected: model.value.some(value => adapter.isSameDay(date, value)), - isEnd, - isSame, - localized: adapter.format(date, 'dayOfMonth') - }; - }); - } - const daysInWeek = computed$B(() => { - const lastDay = adapter.startOfWeek(displayValue.value, props.firstDayOfWeek); - const week = []; - for (let day = 0; day <= 6; day++) { - week.push(adapter.addDays(lastDay, day)); - } - const today = adapter.date(); - return genDays(week, today); - }); - const daysInMonth = computed$B(() => { - const days = weeksInMonth.value.flat(); - const today = adapter.date(); - return genDays(days, today); - }); - const weekNumbers = computed$B(() => { - return weeksInMonth.value.map(week => { - return week.length ? getWeek(adapter, week[0]) : null; - }); - }); - function isDisabled(value) { - if (props.disabled) return true; - const date = adapter.date(value); - if (props.min && adapter.isAfter(adapter.date(props.min), date)) return true; - if (props.max && adapter.isAfter(date, adapter.date(props.max))) return true; - if (Array.isArray(props.allowedDates) && props.allowedDates.length > 0) { - return !props.allowedDates.some(d => adapter.isSameDay(adapter.date(d), date)); - } - if (typeof props.allowedDates === 'function') { - return !props.allowedDates(date); - } - return false; - } - return { - displayValue, - daysInMonth, - daysInWeek, - genDays, - model, - weeksInMonth, - weekDays, - weekNumbers - }; -} - -const {createVNode:_createVNode$P,createTextVNode:_createTextVNode$2} = await importShared('vue'); -const {computed: computed$A,ref: ref$i,shallowRef: shallowRef$c,watch: watch$b} = await importShared('vue'); -const makeVDatePickerMonthProps = propsFactory({ - color: String, - hideWeekdays: Boolean, - multiple: [Boolean, Number, String], - showWeek: Boolean, - transition: { - type: String, - default: 'picker-transition' - }, - reverseTransition: { - type: String, - default: 'picker-reverse-transition' - }, - ...makeCalendarProps() -}, 'VDatePickerMonth'); -const VDatePickerMonth = genericComponent()({ - name: 'VDatePickerMonth', - props: makeVDatePickerMonthProps(), - emits: { - 'update:modelValue': date => true, - 'update:month': date => true, - 'update:year': date => true - }, - setup(props, _ref) { - let { - emit, - slots - } = _ref; - const daysRef = ref$i(); - const { - daysInMonth, - model, - weekNumbers - } = useCalendar(props); - const adapter = useDate(); - const rangeStart = shallowRef$c(); - const rangeStop = shallowRef$c(); - const isReverse = shallowRef$c(false); - const transition = computed$A(() => { - return !isReverse.value ? props.transition : props.reverseTransition; - }); - if (props.multiple === 'range' && model.value.length > 0) { - rangeStart.value = model.value[0]; - if (model.value.length > 1) { - rangeStop.value = model.value[model.value.length - 1]; - } - } - const atMax = computed$A(() => { - const max = ['number', 'string'].includes(typeof props.multiple) ? Number(props.multiple) : Infinity; - return model.value.length >= max; - }); - watch$b(daysInMonth, (val, oldVal) => { - if (!oldVal) return; - isReverse.value = adapter.isBefore(val[0].date, oldVal[0].date); - }); - function onRangeClick(value) { - const _value = adapter.startOfDay(value); - if (model.value.length === 0) { - rangeStart.value = undefined; - } else if (model.value.length === 1) { - rangeStart.value = model.value[0]; - rangeStop.value = undefined; - } - if (!rangeStart.value) { - rangeStart.value = _value; - model.value = [rangeStart.value]; - } else if (!rangeStop.value) { - if (adapter.isSameDay(_value, rangeStart.value)) { - rangeStart.value = undefined; - model.value = []; - return; - } else if (adapter.isBefore(_value, rangeStart.value)) { - rangeStop.value = adapter.endOfDay(rangeStart.value); - rangeStart.value = _value; - } else { - rangeStop.value = adapter.endOfDay(_value); - } - const diff = adapter.getDiff(rangeStop.value, rangeStart.value, 'days'); - const datesInRange = [rangeStart.value]; - for (let i = 1; i < diff; i++) { - const nextDate = adapter.addDays(rangeStart.value, i); - datesInRange.push(nextDate); - } - datesInRange.push(rangeStop.value); - model.value = datesInRange; - } else { - rangeStart.value = value; - rangeStop.value = undefined; - model.value = [rangeStart.value]; - } - } - function onMultipleClick(value) { - const index = model.value.findIndex(selection => adapter.isSameDay(selection, value)); - if (index === -1) { - model.value = [...model.value, value]; - } else { - const value = [...model.value]; - value.splice(index, 1); - model.value = value; - } - } - function onClick(value) { - if (props.multiple === 'range') { - onRangeClick(value); - } else if (props.multiple) { - onMultipleClick(value); - } else { - model.value = [value]; - } - } - return () => _createVNode$P("div", { - "class": "v-date-picker-month" - }, [props.showWeek && _createVNode$P("div", { - "key": "weeks", - "class": "v-date-picker-month__weeks" - }, [!props.hideWeekdays && _createVNode$P("div", { - "key": "hide-week-days", - "class": "v-date-picker-month__day" - }, [_createTextVNode$2("\xA0")]), weekNumbers.value.map(week => _createVNode$P("div", { - "class": ['v-date-picker-month__day', 'v-date-picker-month__day--adjacent'] - }, [week]))]), _createVNode$P(MaybeTransition, { - "name": transition.value - }, { - default: () => [_createVNode$P("div", { - "ref": daysRef, - "key": daysInMonth.value[0].date?.toString(), - "class": "v-date-picker-month__days" - }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => _createVNode$P("div", { - "class": ['v-date-picker-month__day', 'v-date-picker-month__weekday'] - }, [weekDay])), daysInMonth.value.map((item, i) => { - const slotProps = { - props: { - onClick: () => onClick(item.date) - }, - item, - i - }; - if (atMax.value && !item.isSelected) { - item.isDisabled = true; - } - return _createVNode$P("div", { - "class": ['v-date-picker-month__day', { - 'v-date-picker-month__day--adjacent': item.isAdjacent, - 'v-date-picker-month__day--hide-adjacent': item.isHidden, - 'v-date-picker-month__day--selected': item.isSelected, - 'v-date-picker-month__day--week-end': item.isWeekEnd, - 'v-date-picker-month__day--week-start': item.isWeekStart - }], - "data-v-date": !item.isDisabled ? item.isoDate : undefined - }, [(props.showAdjacentMonths || !item.isAdjacent) && _createVNode$P(VDefaultsProvider, { - "defaults": { - VBtn: { - class: 'v-date-picker-month__day-btn', - color: (item.isSelected || item.isToday) && !item.isDisabled ? props.color : undefined, - disabled: item.isDisabled, - icon: true, - ripple: false, - text: item.localized, - variant: item.isDisabled ? item.isToday ? 'outlined' : 'text' : item.isToday && !item.isSelected ? 'outlined' : 'flat', - onClick: () => onClick(item.date) - } - } - }, { - default: () => [slots.day?.(slotProps) ?? _createVNode$P(VBtn, slotProps.props, null)] - })]); - })])] - })]); - } -}); - -const {createVNode:_createVNode$O,mergeProps:_mergeProps$p} = await importShared('vue'); -const {computed: computed$z,watchEffect: watchEffect$7} = await importShared('vue'); -const makeVDatePickerMonthsProps = propsFactory({ - color: String, - height: [String, Number], - min: null, - max: null, - modelValue: Number, - year: Number -}, 'VDatePickerMonths'); -const VDatePickerMonths = genericComponent()({ - name: 'VDatePickerMonths', - props: makeVDatePickerMonthsProps(), - emits: { - 'update:modelValue': date => true - }, - setup(props, _ref) { - let { - emit, - slots - } = _ref; - const adapter = useDate(); - const model = useProxiedModel(props, 'modelValue'); - const months = computed$z(() => { - let date = adapter.startOfYear(adapter.date()); - if (props.year) { - date = adapter.setYear(date, props.year); - } - return createRange(12).map(i => { - const text = adapter.format(date, 'monthShort'); - const isDisabled = !!(props.min && adapter.isAfter(adapter.startOfMonth(adapter.date(props.min)), date) || props.max && adapter.isAfter(date, adapter.startOfMonth(adapter.date(props.max)))); - date = adapter.getNextMonth(date); - return { - isDisabled, - text, - value: i - }; - }); - }); - watchEffect$7(() => { - model.value = model.value ?? adapter.getMonth(adapter.date()); - }); - useRender(() => _createVNode$O("div", { - "class": "v-date-picker-months", - "style": { - height: convertToUnit(props.height) - } - }, [_createVNode$O("div", { - "class": "v-date-picker-months__content" - }, [months.value.map((month, i) => { - const btnProps = { - active: model.value === i, - color: model.value === i ? props.color : undefined, - disabled: month.isDisabled, - rounded: true, - text: month.text, - variant: model.value === month.value ? 'flat' : 'text', - onClick: () => onClick(i) - }; - function onClick(i) { - if (model.value === i) { - emit('update:modelValue', model.value); - return; - } - model.value = i; - } - return slots.month?.({ - month, - i, - props: btnProps - }) ?? _createVNode$O(VBtn, _mergeProps$p({ - "key": "month" - }, btnProps), null); - })])])); - return {}; - } -}); - -const {createVNode:_createVNode$N,mergeProps:_mergeProps$o} = await importShared('vue'); -const {computed: computed$y,nextTick: nextTick$7,onMounted: onMounted$5,watchEffect: watchEffect$6} = await importShared('vue'); -// Types -const makeVDatePickerYearsProps = propsFactory({ - color: String, - height: [String, Number], - min: null, - max: null, - modelValue: Number -}, 'VDatePickerYears'); -const VDatePickerYears = genericComponent()({ - name: 'VDatePickerYears', - props: makeVDatePickerYearsProps(), - emits: { - 'update:modelValue': year => true - }, - setup(props, _ref) { - let { - emit, - slots - } = _ref; - const adapter = useDate(); - const model = useProxiedModel(props, 'modelValue'); - const years = computed$y(() => { - const year = adapter.getYear(adapter.date()); - let min = year - 100; - let max = year + 52; - if (props.min) { - min = adapter.getYear(adapter.date(props.min)); - } - if (props.max) { - max = adapter.getYear(adapter.date(props.max)); - } - let date = adapter.startOfYear(adapter.date()); - date = adapter.setYear(date, min); - return createRange(max - min + 1, min).map(i => { - const text = adapter.format(date, 'year'); - date = adapter.setYear(date, adapter.getYear(date) + 1); - return { - text, - value: i - }; - }); - }); - watchEffect$6(() => { - model.value = model.value ?? adapter.getYear(adapter.date()); - }); - const yearRef = templateRef(); - onMounted$5(async () => { - await nextTick$7(); - yearRef.el?.scrollIntoView({ - block: 'center' - }); - }); - useRender(() => _createVNode$N("div", { - "class": "v-date-picker-years", - "style": { - height: convertToUnit(props.height) - } - }, [_createVNode$N("div", { - "class": "v-date-picker-years__content" - }, [years.value.map((year, i) => { - const btnProps = { - ref: model.value === year.value ? yearRef : undefined, - active: model.value === year.value, - color: model.value === year.value ? props.color : undefined, - rounded: true, - text: year.text, - variant: model.value === year.value ? 'flat' : 'text', - onClick: () => { - if (model.value === year.value) { - emit('update:modelValue', model.value); - return; - } - model.value = year.value; - } - }; - return slots.year?.({ - year, - i, - props: btnProps - }) ?? _createVNode$N(VBtn, _mergeProps$o({ - "key": "month" - }, btnProps), null); - })])])); - return {}; - } -}); - -// Utilities -const VPickerTitle = createSimpleFunctional('v-picker-title'); - -const {mergeProps:_mergeProps$n,createVNode:_createVNode$M} = await importShared('vue'); -const {toRef: toRef$d} = await importShared('vue'); -const makeVPickerProps = propsFactory({ - bgColor: String, - landscape: Boolean, - title: String, - hideHeader: Boolean, - ...makeVSheetProps() -}, 'VPicker'); -const VPicker = genericComponent()({ - name: 'VPicker', - props: makeVPickerProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - backgroundColorClasses, - backgroundColorStyles - } = useBackgroundColor(toRef$d(props, 'color')); - useRender(() => { - const sheetProps = VSheet.filterProps(props); - const hasTitle = !!(props.title || slots.title); - return _createVNode$M(VSheet, _mergeProps$n(sheetProps, { - "color": props.bgColor, - "class": ['v-picker', { - 'v-picker--landscape': props.landscape, - 'v-picker--with-actions': !!slots.actions - }, props.class], - "style": props.style - }), { - default: () => [!props.hideHeader && _createVNode$M("div", { - "key": "header", - "class": [backgroundColorClasses.value], - "style": [backgroundColorStyles.value] - }, [hasTitle && _createVNode$M(VPickerTitle, { - "key": "picker-title" - }, { - default: () => [slots.title?.() ?? props.title] - }), slots.header && _createVNode$M("div", { - "class": "v-picker__header" - }, [slots.header()])]), _createVNode$M("div", { - "class": "v-picker__body" - }, [slots.default?.()]), slots.actions && _createVNode$M(VDefaultsProvider, { - "defaults": { - VBtn: { - slim: true, - variant: 'text' - } - } - }, { - default: () => [_createVNode$M("div", { - "class": "v-picker__actions" - }, [slots.actions()])] - })] - }); - }); - return {}; - } -}); - -const {Fragment:_Fragment$d,mergeProps:_mergeProps$m,resolveDirective:_resolveDirective$n,createVNode:_createVNode$L} = await importShared('vue'); -const {computed: computed$x,ref: ref$h,shallowRef: shallowRef$b,watch: watch$a} = await importShared('vue'); -// Types -const makeVDatePickerProps = propsFactory({ - // TODO: implement in v3.5 - // calendarIcon: { - // type: String, - // default: '$calendar', - // }, - // keyboardIcon: { - // type: String, - // default: '$edit', - // }, - // inputMode: { - // type: String as PropType<'calendar' | 'keyboard'>, - // default: 'calendar', - // }, - // inputText: { - // type: String, - // default: '$vuetify.datePicker.input.placeholder', - // }, - // inputPlaceholder: { - // type: String, - // default: 'dd/mm/yyyy', - // }, - header: { - type: String, - default: '$vuetify.datePicker.header' - }, - ...makeVDatePickerControlsProps(), - ...makeVDatePickerMonthProps({ - weeksInMonth: 'static' - }), - ...omit(makeVDatePickerMonthsProps(), ['modelValue']), - ...omit(makeVDatePickerYearsProps(), ['modelValue']), - ...makeVPickerProps({ - title: '$vuetify.datePicker.title' - }), - modelValue: null -}, 'VDatePicker'); -const VDatePicker = genericComponent()({ - name: 'VDatePicker', - props: makeVDatePickerProps(), - emits: { - 'update:modelValue': date => true, - 'update:month': date => true, - 'update:year': date => true, - // 'update:inputMode': (date: any) => true, - 'update:viewMode': date => true - }, - setup(props, _ref) { - let { - emit, - slots - } = _ref; - const adapter = useDate(); - const { - t - } = useLocale(); - const model = useProxiedModel(props, 'modelValue', undefined, v => wrapInArray(v), v => props.multiple ? v : v[0]); - const viewMode = useProxiedModel(props, 'viewMode'); - // const inputMode = useProxiedModel(props, 'inputMode') - const internal = computed$x(() => { - const value = adapter.date(model.value?.[0]); - return value && adapter.isValid(value) ? value : adapter.date(); - }); - const month = ref$h(Number(props.month ?? adapter.getMonth(adapter.startOfMonth(internal.value)))); - const year = ref$h(Number(props.year ?? adapter.getYear(adapter.startOfYear(adapter.setMonth(internal.value, month.value))))); - const isReversing = shallowRef$b(false); - const header = computed$x(() => { - if (props.multiple && model.value.length > 1) { - return t('$vuetify.datePicker.itemsSelected', model.value.length); - } - return model.value[0] && adapter.isValid(model.value[0]) ? adapter.format(adapter.date(model.value[0]), 'normalDateWithWeekday') : t(props.header); - }); - const text = computed$x(() => { - let date = adapter.date(); - date = adapter.setDate(date, 1); - date = adapter.setMonth(date, month.value); - date = adapter.setYear(date, year.value); - return adapter.format(date, 'monthAndYear'); - }); - // const headerIcon = computed(() => props.inputMode === 'calendar' ? props.keyboardIcon : props.calendarIcon) - const headerTransition = computed$x(() => `date-picker-header${isReversing.value ? '-reverse' : ''}-transition`); - const minDate = computed$x(() => { - const date = adapter.date(props.min); - return props.min && adapter.isValid(date) ? date : null; - }); - const maxDate = computed$x(() => { - const date = adapter.date(props.max); - return props.max && adapter.isValid(date) ? date : null; - }); - const disabled = computed$x(() => { - if (props.disabled) return true; - const targets = []; - if (viewMode.value !== 'month') { - targets.push(...['prev', 'next']); - } else { - let _date = adapter.date(); - _date = adapter.setYear(_date, year.value); - _date = adapter.setMonth(_date, month.value); - if (minDate.value) { - const date = adapter.addDays(adapter.startOfMonth(_date), -1); - adapter.isAfter(minDate.value, date) && targets.push('prev'); - } - if (maxDate.value) { - const date = adapter.addDays(adapter.endOfMonth(_date), 1); - adapter.isAfter(date, maxDate.value) && targets.push('next'); - } - } - return targets; - }); - - // function onClickAppend () { - // inputMode.value = inputMode.value === 'calendar' ? 'keyboard' : 'calendar' - // } - - function onClickNext() { - if (month.value < 11) { - month.value++; - } else { - year.value++; - month.value = 0; - onUpdateYear(year.value); - } - onUpdateMonth(month.value); - } - function onClickPrev() { - if (month.value > 0) { - month.value--; - } else { - year.value--; - month.value = 11; - onUpdateYear(year.value); - } - onUpdateMonth(month.value); - } - function onClickDate() { - viewMode.value = 'month'; - } - function onClickMonth() { - viewMode.value = viewMode.value === 'months' ? 'month' : 'months'; - } - function onClickYear() { - viewMode.value = viewMode.value === 'year' ? 'month' : 'year'; - } - function onUpdateMonth(value) { - if (viewMode.value === 'months') onClickMonth(); - emit('update:month', value); - } - function onUpdateYear(value) { - if (viewMode.value === 'year') onClickYear(); - emit('update:year', value); - } - watch$a(model, (val, oldVal) => { - const arrBefore = wrapInArray(oldVal); - const arrAfter = wrapInArray(val); - if (!arrAfter.length) return; - const before = adapter.date(arrBefore[arrBefore.length - 1]); - const after = adapter.date(arrAfter[arrAfter.length - 1]); - const newMonth = adapter.getMonth(after); - const newYear = adapter.getYear(after); - if (newMonth !== month.value) { - month.value = newMonth; - onUpdateMonth(month.value); - } - if (newYear !== year.value) { - year.value = newYear; - onUpdateYear(year.value); - } - isReversing.value = adapter.isBefore(before, after); - }); - useRender(() => { - const pickerProps = VPicker.filterProps(props); - const datePickerControlsProps = VDatePickerControls.filterProps(props); - const datePickerHeaderProps = VDatePickerHeader.filterProps(props); - const datePickerMonthProps = VDatePickerMonth.filterProps(props); - const datePickerMonthsProps = omit(VDatePickerMonths.filterProps(props), ['modelValue']); - const datePickerYearsProps = omit(VDatePickerYears.filterProps(props), ['modelValue']); - const headerProps = { - header: header.value, - transition: headerTransition.value - }; - return _createVNode$L(VPicker, _mergeProps$m(pickerProps, { - "class": ['v-date-picker', `v-date-picker--${viewMode.value}`, { - 'v-date-picker--show-week': props.showWeek - }, props.class], - "style": props.style - }), { - title: () => slots.title?.() ?? _createVNode$L("div", { - "class": "v-date-picker__title" - }, [t(props.title)]), - header: () => slots.header ? _createVNode$L(VDefaultsProvider, { - "defaults": { - VDatePickerHeader: { - ...headerProps - } - } - }, { - default: () => [slots.header?.(headerProps)] - }) : _createVNode$L(VDatePickerHeader, _mergeProps$m({ - "key": "header" - }, datePickerHeaderProps, headerProps, { - "onClick": viewMode.value !== 'month' ? onClickDate : undefined - }), { - ...slots, - default: undefined - }), - default: () => _createVNode$L(_Fragment$d, null, [_createVNode$L(VDatePickerControls, _mergeProps$m(datePickerControlsProps, { - "disabled": disabled.value, - "text": text.value, - "onClick:next": onClickNext, - "onClick:prev": onClickPrev, - "onClick:month": onClickMonth, - "onClick:year": onClickYear - }), null), _createVNode$L(VFadeTransition, { - "hideOnLeave": true - }, { - default: () => [viewMode.value === 'months' ? _createVNode$L(VDatePickerMonths, _mergeProps$m({ - "key": "date-picker-months" - }, datePickerMonthsProps, { - "modelValue": month.value, - "onUpdate:modelValue": [$event => month.value = $event, onUpdateMonth], - "min": minDate.value, - "max": maxDate.value, - "year": year.value - }), null) : viewMode.value === 'year' ? _createVNode$L(VDatePickerYears, _mergeProps$m({ - "key": "date-picker-years" - }, datePickerYearsProps, { - "modelValue": year.value, - "onUpdate:modelValue": [$event => year.value = $event, onUpdateYear], - "min": minDate.value, - "max": maxDate.value - }), null) : _createVNode$L(VDatePickerMonth, _mergeProps$m({ - "key": "date-picker-month" - }, datePickerMonthProps, { - "modelValue": model.value, - "onUpdate:modelValue": $event => model.value = $event, - "month": month.value, - "onUpdate:month": [$event => month.value = $event, onUpdateMonth], - "year": year.value, - "onUpdate:year": [$event => year.value = $event, onUpdateYear], - "min": minDate.value, - "max": maxDate.value - }), null)] - })]), - actions: slots.actions - }); - }); - return {}; - } -}); - -const {createVNode:_createVNode$K,Fragment:_Fragment$c} = await importShared('vue'); -const {toRef: toRef$c} = await importShared('vue'); -// Types -const makeVEmptyStateProps = propsFactory({ - actionText: String, - bgColor: String, - color: String, - icon: IconValue, - image: String, - justify: { - type: String, - default: 'center' - }, - headline: String, - title: String, - text: String, - textWidth: { - type: [Number, String], - default: 500 - }, - href: String, - to: String, - ...makeComponentProps(), - ...makeDimensionProps(), - ...makeSizeProps({ - size: undefined - }), - ...makeThemeProps() -}, 'VEmptyState'); -const VEmptyState = genericComponent()({ - name: 'VEmptyState', - props: makeVEmptyStateProps(), - emits: { - 'click:action': e => true - }, - setup(props, _ref) { - let { - emit, - slots - } = _ref; - const { - themeClasses - } = provideTheme(props); - const { - backgroundColorClasses, - backgroundColorStyles - } = useBackgroundColor(toRef$c(props, 'bgColor')); - const { - dimensionStyles - } = useDimension(props); - const { - displayClasses - } = useDisplay(); - function onClickAction(e) { - emit('click:action', e); - } - useRender(() => { - const hasActions = !!(slots.actions || props.actionText); - const hasHeadline = !!(slots.headline || props.headline); - const hasTitle = !!(slots.title || props.title); - const hasText = !!(slots.text || props.text); - const hasMedia = !!(slots.media || props.image || props.icon); - const size = props.size || (props.image ? 200 : 96); - return _createVNode$K("div", { - "class": ['v-empty-state', { - [`v-empty-state--${props.justify}`]: true - }, themeClasses.value, backgroundColorClasses.value, displayClasses.value, props.class], - "style": [backgroundColorStyles.value, dimensionStyles.value, props.style] - }, [hasMedia && _createVNode$K("div", { - "key": "media", - "class": "v-empty-state__media" - }, [!slots.media ? _createVNode$K(_Fragment$c, null, [props.image ? _createVNode$K(VImg, { - "key": "image", - "src": props.image, - "height": size - }, null) : props.icon ? _createVNode$K(VIcon, { - "key": "icon", - "color": props.color, - "size": size, - "icon": props.icon - }, null) : undefined]) : _createVNode$K(VDefaultsProvider, { - "key": "media-defaults", - "defaults": { - VImg: { - src: props.image, - height: size - }, - VIcon: { - size, - icon: props.icon - } - } - }, { - default: () => [slots.media()] - })]), hasHeadline && _createVNode$K("div", { - "key": "headline", - "class": "v-empty-state__headline" - }, [slots.headline?.() ?? props.headline]), hasTitle && _createVNode$K("div", { - "key": "title", - "class": "v-empty-state__title" - }, [slots.title?.() ?? props.title]), hasText && _createVNode$K("div", { - "key": "text", - "class": "v-empty-state__text", - "style": { - maxWidth: convertToUnit(props.textWidth) - } - }, [slots.text?.() ?? props.text]), slots.default && _createVNode$K("div", { - "key": "content", - "class": "v-empty-state__content" - }, [slots.default()]), hasActions && _createVNode$K("div", { - "key": "actions", - "class": "v-empty-state__actions" - }, [_createVNode$K(VDefaultsProvider, { - "defaults": { - VBtn: { - class: 'v-empty-state__action-btn', - color: props.color ?? 'surface-variant', - text: props.actionText - } - } - }, { - default: () => [slots.actions?.({ - props: { - onClick: onClickAction - } - }) ?? _createVNode$K(VBtn, { - "onClick": onClickAction - }, null)] - })])]); - }); - return {}; - } -}); - -// Types - -const VExpansionPanelSymbol = Symbol.for('vuetify:v-expansion-panel'); - -const {withDirectives:_withDirectives$5,vShow:_vShow$1,createVNode:_createVNode$J} = await importShared('vue'); -const {inject: inject$4} = await importShared('vue'); -const makeVExpansionPanelTextProps = propsFactory({ - ...makeComponentProps(), - ...makeLazyProps() -}, 'VExpansionPanelText'); -const VExpansionPanelText = genericComponent()({ - name: 'VExpansionPanelText', - props: makeVExpansionPanelTextProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const expansionPanel = inject$4(VExpansionPanelSymbol); - if (!expansionPanel) throw new Error('[Vuetify] v-expansion-panel-text needs to be placed inside v-expansion-panel'); - const { - hasContent, - onAfterLeave - } = useLazy(props, expansionPanel.isSelected); - useRender(() => _createVNode$J(VExpandTransition, { - "onAfterLeave": onAfterLeave - }, { - default: () => [_withDirectives$5(_createVNode$J("div", { - "class": ['v-expansion-panel-text', props.class], - "style": props.style - }, [slots.default && hasContent.value && _createVNode$J("div", { - "class": "v-expansion-panel-text__wrapper" - }, [slots.default?.()])]), [[_vShow$1, expansionPanel.isSelected.value]])] - })); - return {}; - } -}); - -const {withDirectives:_withDirectives$4,resolveDirective:_resolveDirective$m,createVNode:_createVNode$I} = await importShared('vue'); -const {computed: computed$w,inject: inject$3} = await importShared('vue'); -const makeVExpansionPanelTitleProps = propsFactory({ - color: String, - expandIcon: { - type: IconValue, - default: '$expand' - }, - collapseIcon: { - type: IconValue, - default: '$collapse' - }, - hideActions: Boolean, - focusable: Boolean, - static: Boolean, - ripple: { - type: [Boolean, Object], - default: false - }, - readonly: Boolean, - ...makeComponentProps(), - ...makeDimensionProps() -}, 'VExpansionPanelTitle'); -const VExpansionPanelTitle = genericComponent()({ - name: 'VExpansionPanelTitle', - directives: { - Ripple - }, - props: makeVExpansionPanelTitleProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const expansionPanel = inject$3(VExpansionPanelSymbol); - if (!expansionPanel) throw new Error('[Vuetify] v-expansion-panel-title needs to be placed inside v-expansion-panel'); - const { - backgroundColorClasses, - backgroundColorStyles - } = useBackgroundColor(props, 'color'); - const { - dimensionStyles - } = useDimension(props); - const slotProps = computed$w(() => ({ - collapseIcon: props.collapseIcon, - disabled: expansionPanel.disabled.value, - expanded: expansionPanel.isSelected.value, - expandIcon: props.expandIcon, - readonly: props.readonly - })); - const icon = computed$w(() => expansionPanel.isSelected.value ? props.collapseIcon : props.expandIcon); - useRender(() => _withDirectives$4(_createVNode$I("button", { - "class": ['v-expansion-panel-title', { - 'v-expansion-panel-title--active': expansionPanel.isSelected.value, - 'v-expansion-panel-title--focusable': props.focusable, - 'v-expansion-panel-title--static': props.static - }, backgroundColorClasses.value, props.class], - "style": [backgroundColorStyles.value, dimensionStyles.value, props.style], - "type": "button", - "tabindex": expansionPanel.disabled.value ? -1 : undefined, - "disabled": expansionPanel.disabled.value, - "aria-expanded": expansionPanel.isSelected.value, - "onClick": !props.readonly ? expansionPanel.toggle : undefined - }, [_createVNode$I("span", { - "class": "v-expansion-panel-title__overlay" - }, null), slots.default?.(slotProps.value), !props.hideActions && _createVNode$I(VDefaultsProvider, { - "defaults": { - VIcon: { - icon: icon.value - } - } - }, { - default: () => [_createVNode$I("span", { - "class": "v-expansion-panel-title__icon" - }, [slots.actions?.(slotProps.value) ?? _createVNode$I(VIcon, null, null)])] - })]), [[_resolveDirective$m("ripple"), props.ripple]])); - return {}; - } -}); - -const {createVNode:_createVNode$H} = await importShared('vue'); -const {computed: computed$v,provide} = await importShared('vue'); -const makeVExpansionPanelProps = propsFactory({ - title: String, - text: String, - bgColor: String, - ...makeElevationProps(), - ...makeGroupItemProps(), - ...makeRoundedProps(), - ...makeTagProps(), - ...makeVExpansionPanelTitleProps(), - ...makeVExpansionPanelTextProps() -}, 'VExpansionPanel'); -const VExpansionPanel = genericComponent()({ - name: 'VExpansionPanel', - props: makeVExpansionPanelProps(), - emits: { - 'group:selected': val => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const groupItem = useGroupItem(props, VExpansionPanelSymbol); - const { - backgroundColorClasses, - backgroundColorStyles - } = useBackgroundColor(props, 'bgColor'); - const { - elevationClasses - } = useElevation(props); - const { - roundedClasses - } = useRounded(props); - const isDisabled = computed$v(() => groupItem?.disabled.value || props.disabled); - const selectedIndices = computed$v(() => groupItem.group.items.value.reduce((arr, item, index) => { - if (groupItem.group.selected.value.includes(item.id)) arr.push(index); - return arr; - }, [])); - const isBeforeSelected = computed$v(() => { - const index = groupItem.group.items.value.findIndex(item => item.id === groupItem.id); - return !groupItem.isSelected.value && selectedIndices.value.some(selectedIndex => selectedIndex - index === 1); - }); - const isAfterSelected = computed$v(() => { - const index = groupItem.group.items.value.findIndex(item => item.id === groupItem.id); - return !groupItem.isSelected.value && selectedIndices.value.some(selectedIndex => selectedIndex - index === -1); - }); - provide(VExpansionPanelSymbol, groupItem); - useRender(() => { - const hasText = !!(slots.text || props.text); - const hasTitle = !!(slots.title || props.title); - const expansionPanelTitleProps = VExpansionPanelTitle.filterProps(props); - const expansionPanelTextProps = VExpansionPanelText.filterProps(props); - return _createVNode$H(props.tag, { - "class": ['v-expansion-panel', { - 'v-expansion-panel--active': groupItem.isSelected.value, - 'v-expansion-panel--before-active': isBeforeSelected.value, - 'v-expansion-panel--after-active': isAfterSelected.value, - 'v-expansion-panel--disabled': isDisabled.value - }, roundedClasses.value, backgroundColorClasses.value, props.class], - "style": [backgroundColorStyles.value, props.style] - }, { - default: () => [_createVNode$H("div", { - "class": ['v-expansion-panel__shadow', ...elevationClasses.value] - }, null), _createVNode$H(VDefaultsProvider, { - "defaults": { - VExpansionPanelTitle: { - ...expansionPanelTitleProps - }, - VExpansionPanelText: { - ...expansionPanelTextProps - } - } - }, { - default: () => [hasTitle && _createVNode$H(VExpansionPanelTitle, { - "key": "title" - }, { - default: () => [slots.title ? slots.title() : props.title] - }), hasText && _createVNode$H(VExpansionPanelText, { - "key": "text" - }, { - default: () => [slots.text ? slots.text() : props.text] - }), slots.default?.()] - })] - }); - }); - return { - groupItem - }; - } -}); - -const {createVNode:_createVNode$G} = await importShared('vue'); -const {computed: computed$u,toRef: toRef$b} = await importShared('vue'); -const allowedVariants = ['default', 'accordion', 'inset', 'popout']; -const makeVExpansionPanelsProps = propsFactory({ - flat: Boolean, - ...makeGroupProps(), - ...pick(makeVExpansionPanelProps(), ['bgColor', 'collapseIcon', 'color', 'eager', 'elevation', 'expandIcon', 'focusable', 'hideActions', 'readonly', 'ripple', 'rounded', 'tile', 'static']), - ...makeThemeProps(), - ...makeComponentProps(), - ...makeTagProps(), - variant: { - type: String, - default: 'default', - validator: v => allowedVariants.includes(v) - } -}, 'VExpansionPanels'); -const VExpansionPanels = genericComponent()({ - name: 'VExpansionPanels', - props: makeVExpansionPanelsProps(), - emits: { - 'update:modelValue': val => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const { - next, - prev - } = useGroup(props, VExpansionPanelSymbol); - const { - themeClasses - } = provideTheme(props); - const variantClass = computed$u(() => props.variant && `v-expansion-panels--variant-${props.variant}`); - provideDefaults({ - VExpansionPanel: { - bgColor: toRef$b(props, 'bgColor'), - collapseIcon: toRef$b(props, 'collapseIcon'), - color: toRef$b(props, 'color'), - eager: toRef$b(props, 'eager'), - elevation: toRef$b(props, 'elevation'), - expandIcon: toRef$b(props, 'expandIcon'), - focusable: toRef$b(props, 'focusable'), - hideActions: toRef$b(props, 'hideActions'), - readonly: toRef$b(props, 'readonly'), - ripple: toRef$b(props, 'ripple'), - rounded: toRef$b(props, 'rounded'), - static: toRef$b(props, 'static') - } - }); - useRender(() => _createVNode$G(props.tag, { - "class": ['v-expansion-panels', { - 'v-expansion-panels--flat': props.flat, - 'v-expansion-panels--tile': props.tile - }, themeClasses.value, variantClass.value, props.class], - "style": props.style - }, { - default: () => [slots.default?.({ - prev, - next - })] - })); - return { - next, - prev - }; - } -}); - -const {withDirectives:_withDirectives$3,createVNode:_createVNode$F,mergeProps:_mergeProps$l,resolveDirective:_resolveDirective$l,vShow:_vShow} = await importShared('vue'); -const {computed: computed$t,ref: ref$g,shallowRef: shallowRef$a,toRef: toRef$a,watchEffect: watchEffect$5} = await importShared('vue'); -const makeVFabProps = propsFactory({ - app: Boolean, - appear: Boolean, - extended: Boolean, - layout: Boolean, - offset: Boolean, - modelValue: { - type: Boolean, - default: true - }, - ...omit(makeVBtnProps({ - active: true - }), ['location']), - ...makeLayoutItemProps(), - ...makeLocationProps(), - ...makeTransitionProps({ - transition: 'fab-transition' - }) -}, 'VFab'); -const VFab = genericComponent()({ - name: 'VFab', - props: makeVFabProps(), - emits: { - 'update:modelValue': value => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const model = useProxiedModel(props, 'modelValue'); - const height = shallowRef$a(56); - const layoutItemStyles = ref$g(); - const { - resizeRef - } = useResizeObserver(entries => { - if (!entries.length) return; - height.value = entries[0].target.clientHeight; - }); - const hasPosition = computed$t(() => props.app || props.absolute); - const position = computed$t(() => { - if (!hasPosition.value) return false; - return props.location?.split(' ').shift() ?? 'bottom'; - }); - const orientation = computed$t(() => { - if (!hasPosition.value) return false; - return props.location?.split(' ')[1] ?? 'end'; - }); - useToggleScope(() => props.app, () => { - const layout = useLayoutItem({ - id: props.name, - order: computed$t(() => parseInt(props.order, 10)), - position, - layoutSize: computed$t(() => props.layout ? height.value + 24 : 0), - elementSize: computed$t(() => height.value + 24), - active: computed$t(() => props.app && model.value), - absolute: toRef$a(props, 'absolute') - }); - watchEffect$5(() => { - layoutItemStyles.value = layout.layoutItemStyles.value; - }); - }); - const vFabRef = ref$g(); - useRender(() => { - const btnProps = VBtn.filterProps(props); - return _createVNode$F("div", { - "ref": vFabRef, - "class": ['v-fab', { - 'v-fab--absolute': props.absolute, - 'v-fab--app': !!props.app, - 'v-fab--extended': props.extended, - 'v-fab--offset': props.offset, - [`v-fab--${position.value}`]: hasPosition.value, - [`v-fab--${orientation.value}`]: hasPosition.value - }, props.class], - "style": [props.app ? { - ...layoutItemStyles.value - } : { - height: 'inherit', - width: undefined - }, props.style] - }, [_createVNode$F("div", { - "class": "v-fab__container" - }, [_createVNode$F(MaybeTransition, { - "appear": props.appear, - "transition": props.transition - }, { - default: () => [_withDirectives$3(_createVNode$F(VBtn, _mergeProps$l({ - "ref": resizeRef - }, btnProps, { - "active": undefined, - "location": undefined - }), slots), [[_vShow, props.active]])] - })])]); - }); - return {}; - } -}); - -const {resolveDirective:_resolveDirective$k,createVNode:_createVNode$E,mergeProps:_mergeProps$k,Fragment:_Fragment$b} = await importShared('vue'); -const {computed: computed$s,nextTick: nextTick$6,ref: ref$f,watch: watch$9} = await importShared('vue'); -const makeVFileInputProps = propsFactory({ - chips: Boolean, - counter: Boolean, - counterSizeString: { - type: String, - default: '$vuetify.fileInput.counterSize' - }, - counterString: { - type: String, - default: '$vuetify.fileInput.counter' - }, - hideInput: Boolean, - multiple: Boolean, - showSize: { - type: [Boolean, Number, String], - default: false, - validator: v => { - return typeof v === 'boolean' || [1000, 1024].includes(Number(v)); - } - }, - ...makeVInputProps({ - prependIcon: '$file' - }), - modelValue: { - type: [Array, Object], - default: props => props.multiple ? [] : null, - validator: val => { - return wrapInArray(val).every(v => v != null && typeof v === 'object'); - } - }, - ...makeVFieldProps({ - clearable: true - }) -}, 'VFileInput'); -const VFileInput = genericComponent()({ - name: 'VFileInput', - inheritAttrs: false, - props: makeVFileInputProps(), - emits: { - 'click:control': e => true, - 'mousedown:control': e => true, - 'update:focused': focused => true, - 'update:modelValue': files => true - }, - setup(props, _ref) { - let { - attrs, - emit, - slots - } = _ref; - const { - t - } = useLocale(); - const model = useProxiedModel(props, 'modelValue', props.modelValue, val => wrapInArray(val), val => !props.multiple && Array.isArray(val) ? val[0] : val); - const { - isFocused, - focus, - blur - } = useFocus(props); - const base = computed$s(() => typeof props.showSize !== 'boolean' ? props.showSize : undefined); - const totalBytes = computed$s(() => (model.value ?? []).reduce((bytes, _ref2) => { - let { - size = 0 - } = _ref2; - return bytes + size; - }, 0)); - const totalBytesReadable = computed$s(() => humanReadableFileSize(totalBytes.value, base.value)); - const fileNames = computed$s(() => (model.value ?? []).map(file => { - const { - name = '', - size = 0 - } = file; - return !props.showSize ? name : `${name} (${humanReadableFileSize(size, base.value)})`; - })); - const counterValue = computed$s(() => { - const fileCount = model.value?.length ?? 0; - if (props.showSize) return t(props.counterSizeString, fileCount, totalBytesReadable.value);else return t(props.counterString, fileCount); - }); - const vInputRef = ref$f(); - const vFieldRef = ref$f(); - const inputRef = ref$f(); - const isActive = computed$s(() => isFocused.value || props.active); - const isPlainOrUnderlined = computed$s(() => ['plain', 'underlined'].includes(props.variant)); - function onFocus() { - if (inputRef.value !== document.activeElement) { - inputRef.value?.focus(); - } - if (!isFocused.value) focus(); - } - function onClickPrepend(e) { - inputRef.value?.click(); - } - function onControlMousedown(e) { - emit('mousedown:control', e); - } - function onControlClick(e) { - inputRef.value?.click(); - emit('click:control', e); - } - function onClear(e) { - e.stopPropagation(); - onFocus(); - nextTick$6(() => { - model.value = []; - callEvent(props['onClick:clear'], e); - }); - } - watch$9(model, newValue => { - const hasModelReset = !Array.isArray(newValue) || !newValue.length; - if (hasModelReset && inputRef.value) { - inputRef.value.value = ''; - } - }); - useRender(() => { - const hasCounter = !!(slots.counter || props.counter); - const hasDetails = !!(hasCounter || slots.details); - const [rootAttrs, inputAttrs] = filterInputAttrs(attrs); - const { - modelValue: _, - ...inputProps - } = VInput.filterProps(props); - const fieldProps = filterFieldProps(props); - return _createVNode$E(VInput, _mergeProps$k({ - "ref": vInputRef, - "modelValue": model.value, - "onUpdate:modelValue": $event => model.value = $event, - "class": ['v-file-input', { - 'v-file-input--chips': !!props.chips, - 'v-file-input--hide': props.hideInput, - 'v-input--plain-underlined': isPlainOrUnderlined.value - }, props.class], - "style": props.style, - "onClick:prepend": onClickPrepend - }, rootAttrs, inputProps, { - "centerAffix": !isPlainOrUnderlined.value, - "focused": isFocused.value - }), { - ...slots, - default: _ref3 => { - let { - id, - isDisabled, - isDirty, - isReadonly, - isValid - } = _ref3; - return _createVNode$E(VField, _mergeProps$k({ - "ref": vFieldRef, - "prepend-icon": props.prependIcon, - "onMousedown": onControlMousedown, - "onClick": onControlClick, - "onClick:clear": onClear, - "onClick:prependInner": props['onClick:prependInner'], - "onClick:appendInner": props['onClick:appendInner'] - }, fieldProps, { - "id": id.value, - "active": isActive.value || isDirty.value, - "dirty": isDirty.value || props.dirty, - "disabled": isDisabled.value, - "focused": isFocused.value, - "error": isValid.value === false - }), { - ...slots, - default: _ref4 => { - let { - props: { - class: fieldClass, - ...slotProps - } - } = _ref4; - return _createVNode$E(_Fragment$b, null, [_createVNode$E("input", _mergeProps$k({ - "ref": inputRef, - "type": "file", - "readonly": isReadonly.value, - "disabled": isDisabled.value, - "multiple": props.multiple, - "name": props.name, - "onClick": e => { - e.stopPropagation(); - if (isReadonly.value) e.preventDefault(); - onFocus(); - }, - "onChange": e => { - if (!e.target) return; - const target = e.target; - model.value = [...(target.files ?? [])]; - }, - "onFocus": onFocus, - "onBlur": blur - }, slotProps, inputAttrs), null), _createVNode$E("div", { - "class": fieldClass - }, [!!model.value?.length && !props.hideInput && (slots.selection ? slots.selection({ - fileNames: fileNames.value, - totalBytes: totalBytes.value, - totalBytesReadable: totalBytesReadable.value - }) : props.chips ? fileNames.value.map(text => _createVNode$E(VChip, { - "key": text, - "size": "small", - "text": text - }, null)) : fileNames.value.join(', '))])]); - } - }); - }, - details: hasDetails ? slotProps => _createVNode$E(_Fragment$b, null, [slots.details?.(slotProps), hasCounter && _createVNode$E(_Fragment$b, null, [_createVNode$E("span", null, null), _createVNode$E(VCounter, { - "active": !!model.value?.length, - "value": counterValue.value, - "disabled": props.disabled - }, slots.counter)])]) : undefined - }); - }); - return forwardRefs({}, vInputRef, vFieldRef, inputRef); - } -}); - -const {createVNode:_createVNode$D,resolveDirective:_resolveDirective$j} = await importShared('vue'); -const {computed: computed$r,ref: ref$e,shallowRef: shallowRef$9,toRef: toRef$9,watchEffect: watchEffect$4} = await importShared('vue'); -const makeVFooterProps = propsFactory({ - app: Boolean, - color: String, - height: { - type: [Number, String], - default: 'auto' - }, - ...makeBorderProps(), - ...makeComponentProps(), - ...makeElevationProps(), - ...makeLayoutItemProps(), - ...makeRoundedProps(), - ...makeTagProps({ - tag: 'footer' - }), - ...makeThemeProps() -}, 'VFooter'); -const VFooter = genericComponent()({ - name: 'VFooter', - props: makeVFooterProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const layoutItemStyles = ref$e(); - const { - themeClasses - } = provideTheme(props); - const { - backgroundColorClasses, - backgroundColorStyles - } = useBackgroundColor(toRef$9(props, 'color')); - const { - borderClasses - } = useBorder(props); - const { - elevationClasses - } = useElevation(props); - const { - roundedClasses - } = useRounded(props); - const autoHeight = shallowRef$9(32); - const { - resizeRef - } = useResizeObserver(entries => { - if (!entries.length) return; - autoHeight.value = entries[0].target.clientHeight; - }); - const height = computed$r(() => props.height === 'auto' ? autoHeight.value : parseInt(props.height, 10)); - useToggleScope(() => props.app, () => { - const layout = useLayoutItem({ - id: props.name, - order: computed$r(() => parseInt(props.order, 10)), - position: computed$r(() => 'bottom'), - layoutSize: height, - elementSize: computed$r(() => props.height === 'auto' ? undefined : height.value), - active: computed$r(() => props.app), - absolute: toRef$9(props, 'absolute') - }); - watchEffect$4(() => { - layoutItemStyles.value = layout.layoutItemStyles.value; - }); - }); - useRender(() => _createVNode$D(props.tag, { - "ref": resizeRef, - "class": ['v-footer', themeClasses.value, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value, props.class], - "style": [backgroundColorStyles.value, props.app ? layoutItemStyles.value : { - height: convertToUnit(props.height) - }, props.style] - }, slots)); - return {}; - } -}); - -const {createVNode:_createVNode$C} = await importShared('vue'); -const {ref: ref$d} = await importShared('vue'); -const makeVFormProps = propsFactory({ - ...makeComponentProps(), - ...makeFormProps() -}, 'VForm'); -const VForm = genericComponent()({ - name: 'VForm', - props: makeVFormProps(), - emits: { - 'update:modelValue': val => true, - submit: e => true - }, - setup(props, _ref) { - let { - slots, - emit - } = _ref; - const form = createForm(props); - const formRef = ref$d(); - function onReset(e) { - e.preventDefault(); - form.reset(); - } - function onSubmit(_e) { - const e = _e; - const ready = form.validate(); - e.then = ready.then.bind(ready); - e.catch = ready.catch.bind(ready); - e.finally = ready.finally.bind(ready); - emit('submit', e); - if (!e.defaultPrevented) { - ready.then(_ref2 => { - let { - valid - } = _ref2; - if (valid) { - formRef.value?.submit(); - } - }); - } - e.preventDefault(); - } - useRender(() => _createVNode$C("form", { - "ref": formRef, - "class": ['v-form', props.class], - "style": props.style, - "novalidate": true, - "onReset": onReset, - "onSubmit": onSubmit - }, [slots.default?.(form)])); - return forwardRefs(form, formRef); - } -}); - -// Composables -const makeVHoverProps = propsFactory({ - disabled: Boolean, - modelValue: { - type: Boolean, - default: null - }, - ...makeDelayProps() -}, 'VHover'); -const VHover = genericComponent()({ - name: 'VHover', - props: makeVHoverProps(), - emits: { - 'update:modelValue': value => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const isHovering = useProxiedModel(props, 'modelValue'); - const { - runOpenDelay, - runCloseDelay - } = useDelay(props, value => !props.disabled && (isHovering.value = value)); - return () => slots.default?.({ - isHovering: isHovering.value, - props: { - onMouseenter: runOpenDelay, - onMouseleave: runCloseDelay - } - }); - } -}); - -const {createVNode:_createVNode$B,createTextVNode:_createTextVNode$1} = await importShared('vue'); -const {computed: computed$q,nextTick: nextTick$5,onMounted: onMounted$4,ref: ref$c,shallowRef: shallowRef$8,watch: watch$8} = await importShared('vue'); -const makeVInfiniteScrollProps = propsFactory({ - color: String, - direction: { - type: String, - default: 'vertical', - validator: v => ['vertical', 'horizontal'].includes(v) - }, - side: { - type: String, - default: 'end', - validator: v => ['start', 'end', 'both'].includes(v) - }, - mode: { - type: String, - default: 'intersect', - validator: v => ['intersect', 'manual'].includes(v) - }, - margin: [Number, String], - loadMoreText: { - type: String, - default: '$vuetify.infiniteScroll.loadMore' - }, - emptyText: { - type: String, - default: '$vuetify.infiniteScroll.empty' - }, - ...makeDimensionProps(), - ...makeTagProps() -}, 'VInfiniteScroll'); -const VInfiniteScrollIntersect = defineComponent({ - name: 'VInfiniteScrollIntersect', - props: { - side: { - type: String, - required: true - }, - rootMargin: String - }, - emits: { - intersect: (side, isIntersecting) => true - }, - setup(props, _ref) { - let { - emit - } = _ref; - const { - intersectionRef, - isIntersecting - } = useIntersectionObserver(); - watch$8(isIntersecting, async val => { - emit('intersect', props.side, val); - }); - useRender(() => _createVNode$B("div", { - "class": "v-infinite-scroll-intersect", - "style": { - '--v-infinite-margin-size': props.rootMargin - }, - "ref": intersectionRef - }, [_createTextVNode$1("\xA0")])); - return {}; - } -}); -const VInfiniteScroll = genericComponent()({ - name: 'VInfiniteScroll', - props: makeVInfiniteScrollProps(), - emits: { - load: options => true - }, - setup(props, _ref2) { - let { - slots, - emit - } = _ref2; - const rootEl = ref$c(); - const startStatus = shallowRef$8('ok'); - const endStatus = shallowRef$8('ok'); - const margin = computed$q(() => convertToUnit(props.margin)); - const isIntersecting = shallowRef$8(false); - function setScrollAmount(amount) { - if (!rootEl.value) return; - const property = props.direction === 'vertical' ? 'scrollTop' : 'scrollLeft'; - rootEl.value[property] = amount; - } - function getScrollAmount() { - if (!rootEl.value) return 0; - const property = props.direction === 'vertical' ? 'scrollTop' : 'scrollLeft'; - return rootEl.value[property]; - } - function getScrollSize() { - if (!rootEl.value) return 0; - const property = props.direction === 'vertical' ? 'scrollHeight' : 'scrollWidth'; - return rootEl.value[property]; - } - function getContainerSize() { - if (!rootEl.value) return 0; - const property = props.direction === 'vertical' ? 'clientHeight' : 'clientWidth'; - return rootEl.value[property]; - } - onMounted$4(() => { - if (!rootEl.value) return; - if (props.side === 'start') { - setScrollAmount(getScrollSize()); - } else if (props.side === 'both') { - setScrollAmount(getScrollSize() / 2 - getContainerSize() / 2); - } - }); - function setStatus(side, status) { - if (side === 'start') { - startStatus.value = status; - } else if (side === 'end') { - endStatus.value = status; - } - } - function getStatus(side) { - return side === 'start' ? startStatus.value : endStatus.value; - } - let previousScrollSize = 0; - function handleIntersect(side, _isIntersecting) { - isIntersecting.value = _isIntersecting; - if (isIntersecting.value) { - intersecting(side); - } - } - function intersecting(side) { - if (props.mode !== 'manual' && !isIntersecting.value) return; - const status = getStatus(side); - if (!rootEl.value || ['empty', 'loading'].includes(status)) return; - previousScrollSize = getScrollSize(); - setStatus(side, 'loading'); - function done(status) { - setStatus(side, status); - nextTick$5(() => { - if (status === 'empty' || status === 'error') return; - if (status === 'ok' && side === 'start') { - setScrollAmount(getScrollSize() - previousScrollSize + getScrollAmount()); - } - if (props.mode !== 'manual') { - nextTick$5(() => { - window.requestAnimationFrame(() => { - window.requestAnimationFrame(() => { - window.requestAnimationFrame(() => { - intersecting(side); - }); - }); - }); - }); - } - }); - } - emit('load', { - side, - done - }); - } - const { - t - } = useLocale(); - function renderSide(side, status) { - if (props.side !== side && props.side !== 'both') return; - const onClick = () => intersecting(side); - const slotProps = { - side, - props: { - onClick, - color: props.color - } - }; - if (status === 'error') return slots.error?.(slotProps); - if (status === 'empty') return slots.empty?.(slotProps) ?? _createVNode$B("div", null, [t(props.emptyText)]); - if (props.mode === 'manual') { - if (status === 'loading') { - return slots.loading?.(slotProps) ?? _createVNode$B(VProgressCircular, { - "indeterminate": true, - "color": props.color - }, null); - } - return slots['load-more']?.(slotProps) ?? _createVNode$B(VBtn, { - "variant": "outlined", - "color": props.color, - "onClick": onClick - }, { - default: () => [t(props.loadMoreText)] - }); - } - return slots.loading?.(slotProps) ?? _createVNode$B(VProgressCircular, { - "indeterminate": true, - "color": props.color - }, null); - } - const { - dimensionStyles - } = useDimension(props); - useRender(() => { - const Tag = props.tag; - const hasStartIntersect = props.side === 'start' || props.side === 'both'; - const hasEndIntersect = props.side === 'end' || props.side === 'both'; - const intersectMode = props.mode === 'intersect'; - return _createVNode$B(Tag, { - "ref": rootEl, - "class": ['v-infinite-scroll', `v-infinite-scroll--${props.direction}`, { - 'v-infinite-scroll--start': hasStartIntersect, - 'v-infinite-scroll--end': hasEndIntersect - }], - "style": dimensionStyles.value - }, { - default: () => [_createVNode$B("div", { - "class": "v-infinite-scroll__side" - }, [renderSide('start', startStatus.value)]), hasStartIntersect && intersectMode && _createVNode$B(VInfiniteScrollIntersect, { - "key": "start", - "side": "start", - "onIntersect": handleIntersect, - "rootMargin": margin.value - }, null), slots.default?.(), hasEndIntersect && intersectMode && _createVNode$B(VInfiniteScrollIntersect, { - "key": "end", - "side": "end", - "onIntersect": handleIntersect, - "rootMargin": margin.value - }, null), _createVNode$B("div", { - "class": "v-infinite-scroll__side" - }, [renderSide('end', endStatus.value)])] - }); - }); - } -}); - -const {createVNode:_createVNode$A} = await importShared('vue'); -const VItemGroupSymbol = Symbol.for('vuetify:v-item-group'); -const makeVItemGroupProps = propsFactory({ - ...makeComponentProps(), - ...makeGroupProps({ - selectedClass: 'v-item--selected' - }), - ...makeTagProps(), - ...makeThemeProps() -}, 'VItemGroup'); -const VItemGroup = genericComponent()({ - name: 'VItemGroup', - props: makeVItemGroupProps(), - emits: { - 'update:modelValue': value => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const { - themeClasses - } = provideTheme(props); - const { - isSelected, - select, - next, - prev, - selected - } = useGroup(props, VItemGroupSymbol); - return () => _createVNode$A(props.tag, { - "class": ['v-item-group', themeClasses.value, props.class], - "style": props.style - }, { - default: () => [slots.default?.({ - isSelected, - select, - next, - prev, - selected: selected.value - })] - }); - } -}); - -// Composables -const VItem = genericComponent()({ - name: 'VItem', - props: makeGroupItemProps(), - emits: { - 'group:selected': val => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const { - isSelected, - select, - toggle, - selectedClass, - value, - disabled - } = useGroupItem(props, VItemGroupSymbol); - return () => slots.default?.({ - isSelected: isSelected.value, - selectedClass: selectedClass.value, - select, - toggle, - value: value.value, - disabled: disabled.value - }); - } -}); - -// Styles -const VKbd = createSimpleFunctional('v-kbd'); - -const {createVNode:_createVNode$z} = await importShared('vue'); -const makeVLayoutProps = propsFactory({ - ...makeComponentProps(), - ...makeDimensionProps(), - ...makeLayoutProps() -}, 'VLayout'); -const VLayout = genericComponent()({ - name: 'VLayout', - props: makeVLayoutProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - layoutClasses, - layoutStyles, - getLayoutItem, - items, - layoutRef - } = createLayout(props); - const { - dimensionStyles - } = useDimension(props); - useRender(() => _createVNode$z("div", { - "ref": layoutRef, - "class": [layoutClasses.value, props.class], - "style": [dimensionStyles.value, layoutStyles.value, props.style] - }, [slots.default?.()])); - return { - getLayoutItem, - items - }; - } -}); - -const {createVNode:_createVNode$y} = await importShared('vue'); -const {computed: computed$p,toRef: toRef$8} = await importShared('vue'); -const makeVLayoutItemProps = propsFactory({ - position: { - type: String, - required: true - }, - size: { - type: [Number, String], - default: 300 - }, - modelValue: Boolean, - ...makeComponentProps(), - ...makeLayoutItemProps() -}, 'VLayoutItem'); -const VLayoutItem = genericComponent()({ - name: 'VLayoutItem', - props: makeVLayoutItemProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - layoutItemStyles - } = useLayoutItem({ - id: props.name, - order: computed$p(() => parseInt(props.order, 10)), - position: toRef$8(props, 'position'), - elementSize: toRef$8(props, 'size'), - layoutSize: toRef$8(props, 'size'), - active: toRef$8(props, 'modelValue'), - absolute: toRef$8(props, 'absolute') - }); - return () => _createVNode$y("div", { - "class": ['v-layout-item', props.class], - "style": [layoutItemStyles.value, props.style] - }, [slots.default?.()]); - } -}); - -const {withDirectives:_withDirectives$2,resolveDirective:_resolveDirective$i,createVNode:_createVNode$x} = await importShared('vue'); -const makeVLazyProps = propsFactory({ - modelValue: Boolean, - options: { - type: Object, - // For more information on types, navigate to: - // https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API - default: () => ({ - root: undefined, - rootMargin: undefined, - threshold: undefined - }) - }, - ...makeComponentProps(), - ...makeDimensionProps(), - ...makeTagProps(), - ...makeTransitionProps({ - transition: 'fade-transition' - }) -}, 'VLazy'); -const VLazy = genericComponent()({ - name: 'VLazy', - directives: { - intersect: Intersect - }, - props: makeVLazyProps(), - emits: { - 'update:modelValue': value => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const { - dimensionStyles - } = useDimension(props); - const isActive = useProxiedModel(props, 'modelValue'); - function onIntersect(isIntersecting) { - if (isActive.value) return; - isActive.value = isIntersecting; - } - useRender(() => _withDirectives$2(_createVNode$x(props.tag, { - "class": ['v-lazy', props.class], - "style": [dimensionStyles.value, props.style] - }, { - default: () => [isActive.value && _createVNode$x(MaybeTransition, { - "transition": props.transition, - "appear": true - }, { - default: () => [slots.default?.()] - })] - }), [[_resolveDirective$i("intersect"), { - handler: onIntersect, - options: props.options - }, null]])); - return {}; - } -}); - -const {createVNode:_createVNode$w} = await importShared('vue'); -const makeVLocaleProviderProps = propsFactory({ - locale: String, - fallbackLocale: String, - messages: Object, - rtl: { - type: Boolean, - default: undefined - }, - ...makeComponentProps() -}, 'VLocaleProvider'); -const VLocaleProvider = genericComponent()({ - name: 'VLocaleProvider', - props: makeVLocaleProviderProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - rtlClasses - } = provideLocale(props); - useRender(() => _createVNode$w("div", { - "class": ['v-locale-provider', rtlClasses.value, props.class], - "style": props.style - }, [slots.default?.()])); - return {}; - } -}); - -const {createVNode:_createVNode$v} = await importShared('vue'); -const makeVMainProps = propsFactory({ - scrollable: Boolean, - ...makeComponentProps(), - ...makeDimensionProps(), - ...makeTagProps({ - tag: 'main' - }) -}, 'VMain'); -const VMain = genericComponent()({ - name: 'VMain', - props: makeVMainProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - dimensionStyles - } = useDimension(props); - const { - mainStyles - } = useLayout(); - const { - ssrBootStyles - } = useSsrBoot(); - useRender(() => _createVNode$v(props.tag, { - "class": ['v-main', { - 'v-main--scrollable': props.scrollable - }, props.class], - "style": [mainStyles.value, ssrBootStyles.value, dimensionStyles.value, props.style] - }, { - default: () => [props.scrollable ? _createVNode$v("div", { - "class": "v-main__scroller" - }, [slots.default?.()]) : slots.default?.()] - })); - return {}; - } -}); - -// Utilities -const {computed: computed$o,onBeforeUnmount: onBeforeUnmount$3,onMounted: onMounted$3,shallowRef: shallowRef$7,watch: watch$7} = await importShared('vue'); -function useSticky(_ref) { - let { - rootEl, - isSticky, - layoutItemStyles - } = _ref; - const isStuck = shallowRef$7(false); - const stuckPosition = shallowRef$7(0); - const stickyStyles = computed$o(() => { - const side = typeof isStuck.value === 'boolean' ? 'top' : isStuck.value; - return [isSticky.value ? { - top: 'auto', - bottom: 'auto', - height: undefined - } : undefined, isStuck.value ? { - [side]: convertToUnit(stuckPosition.value) - } : { - top: layoutItemStyles.value.top - }]; - }); - onMounted$3(() => { - watch$7(isSticky, val => { - if (val) { - window.addEventListener('scroll', onScroll, { - passive: true - }); - } else { - window.removeEventListener('scroll', onScroll); - } - }, { - immediate: true - }); - }); - onBeforeUnmount$3(() => { - window.removeEventListener('scroll', onScroll); - }); - let lastScrollTop = 0; - function onScroll() { - const direction = lastScrollTop > window.scrollY ? 'up' : 'down'; - const rect = rootEl.value.getBoundingClientRect(); - const layoutTop = parseFloat(layoutItemStyles.value.top ?? 0); - const top = window.scrollY - Math.max(0, stuckPosition.value - layoutTop); - const bottom = rect.height + Math.max(stuckPosition.value, layoutTop) - window.scrollY - window.innerHeight; - const bodyScroll = parseFloat(getComputedStyle(rootEl.value).getPropertyValue('--v-body-scroll-y')) || 0; - if (rect.height < window.innerHeight - layoutTop) { - isStuck.value = 'top'; - stuckPosition.value = layoutTop; - } else if (direction === 'up' && isStuck.value === 'bottom' || direction === 'down' && isStuck.value === 'top') { - stuckPosition.value = window.scrollY + rect.top - bodyScroll; - isStuck.value = true; - } else if (direction === 'down' && bottom <= 0) { - stuckPosition.value = 0; - isStuck.value = 'bottom'; - } else if (direction === 'up' && top <= 0) { - if (!bodyScroll) { - stuckPosition.value = rect.top + top; - isStuck.value = 'top'; - } else if (isStuck.value !== 'top') { - stuckPosition.value = -top + bodyScroll + layoutTop; - isStuck.value = 'top'; - } - } - lastScrollTop = window.scrollY; - } - return { - isStuck, - stickyStyles - }; -} - -// Utilities -const HORIZON = 100; // ms -const HISTORY = 20; // number of samples to keep - -/** @see https://android.googlesource.com/platform/frameworks/native/+/master/libs/input/VelocityTracker.cpp */ -function kineticEnergyToVelocity(work) { - const sqrt2 = 1.41421356237; - return (work < 0 ? -1 : 1.0) * Math.sqrt(Math.abs(work)) * sqrt2; -} - -/** - * Returns pointer velocity in px/s - */ -function calculateImpulseVelocity(samples) { - // The input should be in reversed time order (most recent sample at index i=0) - if (samples.length < 2) { - // if 0 or 1 points, velocity is zero - return 0; - } - // if (samples[1].t > samples[0].t) { - // // Algorithm will still work, but not perfectly - // consoleWarn('Samples provided to calculateImpulseVelocity in the wrong order') - // } - if (samples.length === 2) { - // if 2 points, basic linear calculation - if (samples[1].t === samples[0].t) { - // consoleWarn(`Events have identical time stamps t=${samples[0].t}, setting velocity = 0`) - return 0; - } - return (samples[1].d - samples[0].d) / (samples[1].t - samples[0].t); - } - // Guaranteed to have at least 3 points here - // start with the oldest sample and go forward in time - let work = 0; - for (let i = samples.length - 1; i > 0; i--) { - if (samples[i].t === samples[i - 1].t) { - // consoleWarn(`Events have identical time stamps t=${samples[i].t}, skipping sample`) - continue; - } - const vprev = kineticEnergyToVelocity(work); // v[i-1] - const vcurr = (samples[i].d - samples[i - 1].d) / (samples[i].t - samples[i - 1].t); // v[i] - work += (vcurr - vprev) * Math.abs(vcurr); - if (i === samples.length - 1) { - work *= 0.5; - } - } - return kineticEnergyToVelocity(work) * 1000; -} -function useVelocity() { - const touches = {}; - function addMovement(e) { - Array.from(e.changedTouches).forEach(touch => { - const samples = touches[touch.identifier] ?? (touches[touch.identifier] = new CircularBuffer(HISTORY)); - samples.push([e.timeStamp, touch]); - }); - } - function endTouch(e) { - Array.from(e.changedTouches).forEach(touch => { - delete touches[touch.identifier]; - }); - } - function getVelocity(id) { - const samples = touches[id]?.values().reverse(); - if (!samples) { - throw new Error(`No samples for touch id ${id}`); - } - const newest = samples[0]; - const x = []; - const y = []; - for (const val of samples) { - if (newest[0] - val[0] > HORIZON) break; - x.push({ - t: val[0], - d: val[1].clientX - }); - y.push({ - t: val[0], - d: val[1].clientY - }); - } - return { - x: calculateImpulseVelocity(x), - y: calculateImpulseVelocity(y), - get direction() { - const { - x, - y - } = this; - const [absX, absY] = [Math.abs(x), Math.abs(y)]; - return absX > absY && x >= 0 ? 'right' : absX > absY && x <= 0 ? 'left' : absY > absX && y >= 0 ? 'down' : absY > absX && y <= 0 ? 'up' : oops$1(); - } - }; - } - return { - addMovement, - endTouch, - getVelocity - }; -} -function oops$1() { - throw new Error(); -} - -const {computed: computed$n,onBeforeUnmount: onBeforeUnmount$2,onMounted: onMounted$2,onScopeDispose: onScopeDispose$1,shallowRef: shallowRef$6,watchEffect: watchEffect$3} = await importShared('vue'); - - -// Types - -function useTouch(_ref) { - let { - el, - isActive, - isTemporary, - width, - touchless, - position - } = _ref; - onMounted$2(() => { - window.addEventListener('touchstart', onTouchstart, { - passive: true - }); - window.addEventListener('touchmove', onTouchmove, { - passive: false - }); - window.addEventListener('touchend', onTouchend, { - passive: true - }); - }); - onBeforeUnmount$2(() => { - window.removeEventListener('touchstart', onTouchstart); - window.removeEventListener('touchmove', onTouchmove); - window.removeEventListener('touchend', onTouchend); - }); - const isHorizontal = computed$n(() => ['left', 'right'].includes(position.value)); - const { - addMovement, - endTouch, - getVelocity - } = useVelocity(); - let maybeDragging = false; - const isDragging = shallowRef$6(false); - const dragProgress = shallowRef$6(0); - const offset = shallowRef$6(0); - let start; - function getOffset(pos, active) { - return (position.value === 'left' ? pos : position.value === 'right' ? document.documentElement.clientWidth - pos : position.value === 'top' ? pos : position.value === 'bottom' ? document.documentElement.clientHeight - pos : oops()) - (active ? width.value : 0); - } - function getProgress(pos) { - let limit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - const progress = position.value === 'left' ? (pos - offset.value) / width.value : position.value === 'right' ? (document.documentElement.clientWidth - pos - offset.value) / width.value : position.value === 'top' ? (pos - offset.value) / width.value : position.value === 'bottom' ? (document.documentElement.clientHeight - pos - offset.value) / width.value : oops(); - return limit ? Math.max(0, Math.min(1, progress)) : progress; - } - function onTouchstart(e) { - if (touchless.value) return; - const touchX = e.changedTouches[0].clientX; - const touchY = e.changedTouches[0].clientY; - const touchZone = 25; - const inTouchZone = position.value === 'left' ? touchX < touchZone : position.value === 'right' ? touchX > document.documentElement.clientWidth - touchZone : position.value === 'top' ? touchY < touchZone : position.value === 'bottom' ? touchY > document.documentElement.clientHeight - touchZone : oops(); - const inElement = isActive.value && (position.value === 'left' ? touchX < width.value : position.value === 'right' ? touchX > document.documentElement.clientWidth - width.value : position.value === 'top' ? touchY < width.value : position.value === 'bottom' ? touchY > document.documentElement.clientHeight - width.value : oops()); - if (inTouchZone || inElement || isActive.value && isTemporary.value) { - start = [touchX, touchY]; - offset.value = getOffset(isHorizontal.value ? touchX : touchY, isActive.value); - dragProgress.value = getProgress(isHorizontal.value ? touchX : touchY); - maybeDragging = offset.value > -20 && offset.value < 80; - endTouch(e); - addMovement(e); - } - } - function onTouchmove(e) { - const touchX = e.changedTouches[0].clientX; - const touchY = e.changedTouches[0].clientY; - if (maybeDragging) { - if (!e.cancelable) { - maybeDragging = false; - return; - } - const dx = Math.abs(touchX - start[0]); - const dy = Math.abs(touchY - start[1]); - const thresholdMet = isHorizontal.value ? dx > dy && dx > 3 : dy > dx && dy > 3; - if (thresholdMet) { - isDragging.value = true; - maybeDragging = false; - } else if ((isHorizontal.value ? dy : dx) > 3) { - maybeDragging = false; - } - } - if (!isDragging.value) return; - e.preventDefault(); - addMovement(e); - const progress = getProgress(isHorizontal.value ? touchX : touchY, false); - dragProgress.value = Math.max(0, Math.min(1, progress)); - if (progress > 1) { - offset.value = getOffset(isHorizontal.value ? touchX : touchY, true); - } else if (progress < 0) { - offset.value = getOffset(isHorizontal.value ? touchX : touchY, false); - } - } - function onTouchend(e) { - maybeDragging = false; - if (!isDragging.value) return; - addMovement(e); - isDragging.value = false; - const velocity = getVelocity(e.changedTouches[0].identifier); - const vx = Math.abs(velocity.x); - const vy = Math.abs(velocity.y); - const thresholdMet = isHorizontal.value ? vx > vy && vx > 400 : vy > vx && vy > 3; - if (thresholdMet) { - isActive.value = velocity.direction === ({ - left: 'right', - right: 'left', - top: 'down', - bottom: 'up' - }[position.value] || oops()); - } else { - isActive.value = dragProgress.value > 0.5; - } - } - const dragStyles = computed$n(() => { - return isDragging.value ? { - transform: position.value === 'left' ? `translateX(calc(-100% + ${dragProgress.value * width.value}px))` : position.value === 'right' ? `translateX(calc(100% - ${dragProgress.value * width.value}px))` : position.value === 'top' ? `translateY(calc(-100% + ${dragProgress.value * width.value}px))` : position.value === 'bottom' ? `translateY(calc(100% - ${dragProgress.value * width.value}px))` : oops(), - transition: 'none' - } : undefined; - }); - useToggleScope(isDragging, () => { - const transform = el.value?.style.transform ?? null; - const transition = el.value?.style.transition ?? null; - watchEffect$3(() => { - el.value?.style.setProperty('transform', dragStyles.value?.transform || 'none'); - el.value?.style.setProperty('transition', dragStyles.value?.transition || null); - }); - onScopeDispose$1(() => { - el.value?.style.setProperty('transform', transform); - el.value?.style.setProperty('transition', transition); - }); - }); - return { - isDragging, - dragProgress, - dragStyles - }; -} -function oops() { - throw new Error(); -} - -const {mergeProps:_mergeProps$j,resolveDirective:_resolveDirective$h,createVNode:_createVNode$u,Fragment:_Fragment$a} = await importShared('vue'); -const {computed: computed$m,nextTick: nextTick$4,ref: ref$b,shallowRef: shallowRef$5,toRef: toRef$7,Transition,watch: watch$6} = await importShared('vue'); -const locations = ['start', 'end', 'left', 'right', 'top', 'bottom']; -const makeVNavigationDrawerProps = propsFactory({ - color: String, - disableResizeWatcher: Boolean, - disableRouteWatcher: Boolean, - expandOnHover: Boolean, - floating: Boolean, - modelValue: { - type: Boolean, - default: null - }, - permanent: Boolean, - rail: { - type: Boolean, - default: null - }, - railWidth: { - type: [Number, String], - default: 56 - }, - scrim: { - type: [Boolean, String], - default: true - }, - image: String, - temporary: Boolean, - persistent: Boolean, - touchless: Boolean, - width: { - type: [Number, String], - default: 256 - }, - location: { - type: String, - default: 'start', - validator: value => locations.includes(value) - }, - sticky: Boolean, - ...makeBorderProps(), - ...makeComponentProps(), - ...makeDelayProps(), - ...makeDisplayProps({ - mobile: null - }), - ...makeElevationProps(), - ...makeLayoutItemProps(), - ...makeRoundedProps(), - ...makeTagProps({ - tag: 'nav' - }), - ...makeThemeProps() -}, 'VNavigationDrawer'); -const VNavigationDrawer = genericComponent()({ - name: 'VNavigationDrawer', - props: makeVNavigationDrawerProps(), - emits: { - 'update:modelValue': val => true, - 'update:rail': val => true - }, - setup(props, _ref) { - let { - attrs, - emit, - slots - } = _ref; - const { - isRtl - } = useRtl(); - const { - themeClasses - } = provideTheme(props); - const { - borderClasses - } = useBorder(props); - const { - backgroundColorClasses, - backgroundColorStyles - } = useBackgroundColor(toRef$7(props, 'color')); - const { - elevationClasses - } = useElevation(props); - const { - displayClasses, - mobile - } = useDisplay(props); - const { - roundedClasses - } = useRounded(props); - const router = useRouter(); - const isActive = useProxiedModel(props, 'modelValue', null, v => !!v); - const { - ssrBootStyles - } = useSsrBoot(); - const { - scopeId - } = useScopeId(); - const rootEl = ref$b(); - const isHovering = shallowRef$5(false); - const { - runOpenDelay, - runCloseDelay - } = useDelay(props, value => { - isHovering.value = value; - }); - const width = computed$m(() => { - return props.rail && props.expandOnHover && isHovering.value ? Number(props.width) : Number(props.rail ? props.railWidth : props.width); - }); - const location = computed$m(() => { - return toPhysical(props.location, isRtl.value); - }); - const isPersistent = computed$m(() => props.persistent); - const isTemporary = computed$m(() => !props.permanent && (mobile.value || props.temporary)); - const isSticky = computed$m(() => props.sticky && !isTemporary.value && location.value !== 'bottom'); - useToggleScope(() => props.expandOnHover && props.rail != null, () => { - watch$6(isHovering, val => emit('update:rail', !val)); - }); - useToggleScope(() => !props.disableResizeWatcher, () => { - watch$6(isTemporary, val => !props.permanent && nextTick$4(() => isActive.value = !val)); - }); - useToggleScope(() => !props.disableRouteWatcher && !!router, () => { - watch$6(router.currentRoute, () => isTemporary.value && (isActive.value = false)); - }); - watch$6(() => props.permanent, val => { - if (val) isActive.value = true; - }); - if (props.modelValue == null && !isTemporary.value) { - isActive.value = props.permanent || !mobile.value; - } - const { - isDragging, - dragProgress - } = useTouch({ - el: rootEl, - isActive, - isTemporary, - width, - touchless: toRef$7(props, 'touchless'), - position: location - }); - const layoutSize = computed$m(() => { - const size = isTemporary.value ? 0 : props.rail && props.expandOnHover ? Number(props.railWidth) : width.value; - return isDragging.value ? size * dragProgress.value : size; - }); - const elementSize = computed$m(() => ['top', 'bottom'].includes(props.location) ? 0 : width.value); - const { - layoutItemStyles, - layoutItemScrimStyles - } = useLayoutItem({ - id: props.name, - order: computed$m(() => parseInt(props.order, 10)), - position: location, - layoutSize, - elementSize, - active: computed$m(() => isActive.value || isDragging.value), - disableTransitions: computed$m(() => isDragging.value), - absolute: computed$m(() => - // eslint-disable-next-line @typescript-eslint/no-use-before-define - props.absolute || isSticky.value && typeof isStuck.value !== 'string') - }); - const { - isStuck, - stickyStyles - } = useSticky({ - rootEl, - isSticky, - layoutItemStyles - }); - const scrimColor = useBackgroundColor(computed$m(() => { - return typeof props.scrim === 'string' ? props.scrim : null; - })); - const scrimStyles = computed$m(() => ({ - ...(isDragging.value ? { - opacity: dragProgress.value * 0.2, - transition: 'none' - } : undefined), - ...layoutItemScrimStyles.value - })); - provideDefaults({ - VList: { - bgColor: 'transparent' - } - }); - useRender(() => { - const hasImage = slots.image || props.image; - return _createVNode$u(_Fragment$a, null, [_createVNode$u(props.tag, _mergeProps$j({ - "ref": rootEl, - "onMouseenter": runOpenDelay, - "onMouseleave": runCloseDelay, - "class": ['v-navigation-drawer', `v-navigation-drawer--${location.value}`, { - 'v-navigation-drawer--expand-on-hover': props.expandOnHover, - 'v-navigation-drawer--floating': props.floating, - 'v-navigation-drawer--is-hovering': isHovering.value, - 'v-navigation-drawer--rail': props.rail, - 'v-navigation-drawer--temporary': isTemporary.value, - 'v-navigation-drawer--persistent': isPersistent.value, - 'v-navigation-drawer--active': isActive.value, - 'v-navigation-drawer--sticky': isSticky.value - }, themeClasses.value, backgroundColorClasses.value, borderClasses.value, displayClasses.value, elevationClasses.value, roundedClasses.value, props.class], - "style": [backgroundColorStyles.value, layoutItemStyles.value, ssrBootStyles.value, stickyStyles.value, props.style, ['top', 'bottom'].includes(location.value) ? { - height: 'auto' - } : {}] - }, scopeId, attrs), { - default: () => [hasImage && _createVNode$u("div", { - "key": "image", - "class": "v-navigation-drawer__img" - }, [!slots.image ? _createVNode$u(VImg, { - "key": "image-img", - "alt": "", - "cover": true, - "height": "inherit", - "src": props.image - }, null) : _createVNode$u(VDefaultsProvider, { - "key": "image-defaults", - "disabled": !props.image, - "defaults": { - VImg: { - alt: '', - cover: true, - height: 'inherit', - src: props.image - } - } - }, slots.image)]), slots.prepend && _createVNode$u("div", { - "class": "v-navigation-drawer__prepend" - }, [slots.prepend?.()]), _createVNode$u("div", { - "class": "v-navigation-drawer__content" - }, [slots.default?.()]), slots.append && _createVNode$u("div", { - "class": "v-navigation-drawer__append" - }, [slots.append?.()])] - }), _createVNode$u(Transition, { - "name": "fade-transition" - }, { - default: () => [isTemporary.value && (isDragging.value || isActive.value) && !!props.scrim && _createVNode$u("div", _mergeProps$j({ - "class": ['v-navigation-drawer__scrim', scrimColor.backgroundColorClasses.value], - "style": [scrimStyles.value, scrimColor.backgroundColorStyles.value], - "onClick": () => { - if (isPersistent.value) return; - isActive.value = false; - } - }, scopeId), null)] - })]); - }); - return { - isStuck - }; - } -}); - -// Composables -const VNoSsr = defineComponent({ - name: 'VNoSsr', - setup(_, _ref) { - let { - slots - } = _ref; - const show = useHydration(); - return () => show.value && slots.default?.(); - } -}); - -const {mergeProps:_mergeProps$i,createVNode:_createVNode$t,Fragment:_Fragment$9} = await importShared('vue'); -const {computed: computed$l,nextTick: nextTick$3,ref: ref$a,watch: watch$5} = await importShared('vue'); -// Types -const makeVOtpInputProps = propsFactory({ - autofocus: Boolean, - divider: String, - focusAll: Boolean, - label: { - type: String, - default: '$vuetify.input.otp' - }, - length: { - type: [Number, String], - default: 6 - }, - modelValue: { - type: [Number, String], - default: undefined - }, - placeholder: String, - type: { - type: String, - default: 'number' - }, - ...makeDimensionProps(), - ...makeFocusProps(), - ...only(makeVFieldProps({ - variant: 'outlined' - }), ['baseColor', 'bgColor', 'class', 'color', 'disabled', 'error', 'loading', 'rounded', 'style', 'theme', 'variant']) -}, 'VOtpInput'); -const VOtpInput = genericComponent()({ - name: 'VOtpInput', - props: makeVOtpInputProps(), - emits: { - finish: val => true, - 'update:focused': val => true, - 'update:modelValue': val => true - }, - setup(props, _ref) { - let { - attrs, - emit, - slots - } = _ref; - const { - dimensionStyles - } = useDimension(props); - const { - isFocused, - focus, - blur - } = useFocus(props); - const model = useProxiedModel(props, 'modelValue', '', val => val == null ? [] : String(val).split(''), val => val.join('')); - const { - t - } = useLocale(); - const length = computed$l(() => Number(props.length)); - const fields = computed$l(() => Array(length.value).fill(0)); - const focusIndex = ref$a(-1); - const contentRef = ref$a(); - const inputRef = ref$a([]); - const current = computed$l(() => inputRef.value[focusIndex.value]); - function onInput() { - // The maxlength attribute doesn't work for the number type input, so the text type is used. - // The following logic simulates the behavior of a number input. - if (isValidNumber(current.value.value)) { - current.value.value = ''; - return; - } - const array = model.value.slice(); - const value = current.value.value; - array[focusIndex.value] = value; - let target = null; - if (focusIndex.value > model.value.length) { - target = model.value.length + 1; - } else if (focusIndex.value + 1 !== length.value) { - target = 'next'; - } - model.value = array; - if (target) focusChild(contentRef.value, target); - } - function onKeydown(e) { - const array = model.value.slice(); - const index = focusIndex.value; - let target = null; - if (!['ArrowLeft', 'ArrowRight', 'Backspace', 'Delete'].includes(e.key)) return; - e.preventDefault(); - if (e.key === 'ArrowLeft') { - target = 'prev'; - } else if (e.key === 'ArrowRight') { - target = 'next'; - } else if (['Backspace', 'Delete'].includes(e.key)) { - array[focusIndex.value] = ''; - model.value = array; - if (focusIndex.value > 0 && e.key === 'Backspace') { - target = 'prev'; - } else { - requestAnimationFrame(() => { - inputRef.value[index]?.select(); - }); - } - } - requestAnimationFrame(() => { - if (target != null) { - focusChild(contentRef.value, target); - } - }); - } - function onPaste(index, e) { - e.preventDefault(); - e.stopPropagation(); - const clipboardText = e?.clipboardData?.getData('Text').slice(0, length.value) ?? ''; - if (isValidNumber(clipboardText)) return; - model.value = clipboardText.split(''); - inputRef.value?.[index].blur(); - } - function reset() { - model.value = []; - } - function onFocus(e, index) { - focus(); - focusIndex.value = index; - } - function onBlur() { - blur(); - focusIndex.value = -1; - } - function isValidNumber(value) { - return props.type === 'number' && /[^0-9]/g.test(value); - } - provideDefaults({ - VField: { - color: computed$l(() => props.color), - bgColor: computed$l(() => props.color), - baseColor: computed$l(() => props.baseColor), - disabled: computed$l(() => props.disabled), - error: computed$l(() => props.error), - variant: computed$l(() => props.variant) - } - }, { - scoped: true - }); - watch$5(model, val => { - if (val.length === length.value) emit('finish', val.join('')); - }, { - deep: true - }); - watch$5(focusIndex, val => { - if (val < 0) return; - nextTick$3(() => { - inputRef.value[val]?.select(); - }); - }); - useRender(() => { - const [rootAttrs, inputAttrs] = filterInputAttrs(attrs); - return _createVNode$t("div", _mergeProps$i({ - "class": ['v-otp-input', { - 'v-otp-input--divided': !!props.divider - }, props.class], - "style": [props.style] - }, rootAttrs), [_createVNode$t("div", { - "ref": contentRef, - "class": "v-otp-input__content", - "style": [dimensionStyles.value] - }, [fields.value.map((_, i) => _createVNode$t(_Fragment$9, null, [props.divider && i !== 0 && _createVNode$t("span", { - "class": "v-otp-input__divider" - }, [props.divider]), _createVNode$t(VField, { - "focused": isFocused.value && props.focusAll || focusIndex.value === i, - "key": i - }, { - ...slots, - loader: undefined, - default: () => { - return _createVNode$t("input", { - "ref": val => inputRef.value[i] = val, - "aria-label": t(props.label, i + 1), - "autofocus": i === 0 && props.autofocus, - "autocomplete": "one-time-code", - "class": ['v-otp-input__field'], - "disabled": props.disabled, - "inputmode": props.type === 'number' ? 'numeric' : 'text', - "min": props.type === 'number' ? 0 : undefined, - "maxlength": "1", - "placeholder": props.placeholder, - "type": props.type === 'number' ? 'text' : props.type, - "value": model.value[i], - "onInput": onInput, - "onFocus": e => onFocus(e, i), - "onBlur": onBlur, - "onKeydown": onKeydown, - "onPaste": event => onPaste(i, event) - }, null); - } - })])), _createVNode$t("input", _mergeProps$i({ - "class": "v-otp-input-input", - "type": "hidden" - }, inputAttrs, { - "value": model.value.join('') - }), null), _createVNode$t(VOverlay, { - "contained": true, - "content-class": "v-otp-input__loader", - "model-value": !!props.loading, - "persistent": true - }, { - default: () => [slots.loader?.() ?? _createVNode$t(VProgressCircular, { - "color": typeof props.loading === 'boolean' ? undefined : props.loading, - "indeterminate": true, - "size": "24", - "width": "2" - }, null)] - }), slots.default?.()])]); - }); - return { - blur: () => { - inputRef.value?.some(input => input.blur()); - }, - focus: () => { - inputRef.value?.[0].focus(); - }, - reset, - isFocused - }; - } -}); - -const {createVNode:_createVNode$s,resolveDirective:_resolveDirective$g} = await importShared('vue'); -const {computed: computed$k,onBeforeUnmount: onBeforeUnmount$1,ref: ref$9,watch: watch$4,watchEffect: watchEffect$2} = await importShared('vue'); -function floor(val) { - return Math.floor(Math.abs(val)) * Math.sign(val); -} -const makeVParallaxProps = propsFactory({ - scale: { - type: [Number, String], - default: 0.5 - }, - ...makeComponentProps() -}, 'VParallax'); -const VParallax = genericComponent()({ - name: 'VParallax', - props: makeVParallaxProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - intersectionRef, - isIntersecting - } = useIntersectionObserver(); - const { - resizeRef, - contentRect - } = useResizeObserver(); - const { - height: displayHeight - } = useDisplay(); - const root = ref$9(); - watchEffect$2(() => { - intersectionRef.value = resizeRef.value = root.value?.$el; - }); - let scrollParent; - watch$4(isIntersecting, val => { - if (val) { - scrollParent = getScrollParent(intersectionRef.value); - scrollParent = scrollParent === document.scrollingElement ? document : scrollParent; - scrollParent.addEventListener('scroll', onScroll, { - passive: true - }); - onScroll(); - } else { - scrollParent.removeEventListener('scroll', onScroll); - } - }); - onBeforeUnmount$1(() => { - scrollParent?.removeEventListener('scroll', onScroll); - }); - watch$4(displayHeight, onScroll); - watch$4(() => contentRect.value?.height, onScroll); - const scale = computed$k(() => { - return 1 - clamp(+props.scale); - }); - let frame = -1; - function onScroll() { - if (!isIntersecting.value) return; - cancelAnimationFrame(frame); - frame = requestAnimationFrame(() => { - const el = (root.value?.$el).querySelector('.v-img__img'); - if (!el) return; - const scrollHeight = scrollParent instanceof Document ? document.documentElement.clientHeight : scrollParent.clientHeight; - const scrollPos = scrollParent instanceof Document ? window.scrollY : scrollParent.scrollTop; - const top = intersectionRef.value.getBoundingClientRect().top + scrollPos; - const height = contentRect.value.height; - const center = top + (height - scrollHeight) / 2; - const translate = floor((scrollPos - center) * scale.value); - const sizeScale = Math.max(1, (scale.value * (scrollHeight - height) + height) / height); - el.style.setProperty('transform', `translateY(${translate}px) scale(${sizeScale})`); - }); - } - useRender(() => _createVNode$s(VImg, { - "class": ['v-parallax', { - 'v-parallax--active': isIntersecting.value - }, props.class], - "style": props.style, - "ref": root, - "cover": true, - "onLoadstart": onScroll, - "onLoad": onScroll - }, slots)); - return {}; - } -}); - -const {createVNode:_createVNode$r,mergeProps:_mergeProps$h,resolveDirective:_resolveDirective$f} = await importShared('vue'); -const makeVRadioProps = propsFactory({ - ...makeVSelectionControlProps({ - falseIcon: '$radioOff', - trueIcon: '$radioOn' - }) -}, 'VRadio'); -const VRadio = genericComponent()({ - name: 'VRadio', - props: makeVRadioProps(), - setup(props, _ref) { - let { - slots - } = _ref; - useRender(() => { - const controlProps = VSelectionControl.filterProps(props); - return _createVNode$r(VSelectionControl, _mergeProps$h(controlProps, { - "class": ['v-radio', props.class], - "style": props.style, - "type": "radio" - }), slots); - }); - return {}; - } -}); - -const {mergeProps:_mergeProps$g,resolveDirective:_resolveDirective$e,createVNode:_createVNode$q,Fragment:_Fragment$8} = await importShared('vue'); -const {computed: computed$j} = await importShared('vue'); -const makeVRadioGroupProps = propsFactory({ - height: { - type: [Number, String], - default: 'auto' - }, - ...makeVInputProps(), - ...omit(makeSelectionControlGroupProps(), ['multiple']), - trueIcon: { - type: IconValue, - default: '$radioOn' - }, - falseIcon: { - type: IconValue, - default: '$radioOff' - }, - type: { - type: String, - default: 'radio' - } -}, 'VRadioGroup'); -const VRadioGroup = genericComponent()({ - name: 'VRadioGroup', - inheritAttrs: false, - props: makeVRadioGroupProps(), - emits: { - 'update:modelValue': value => true - }, - setup(props, _ref) { - let { - attrs, - slots - } = _ref; - const uid = getUid(); - const id = computed$j(() => props.id || `radio-group-${uid}`); - const model = useProxiedModel(props, 'modelValue'); - useRender(() => { - const [rootAttrs, controlAttrs] = filterInputAttrs(attrs); - const inputProps = VInput.filterProps(props); - const controlProps = VSelectionControl.filterProps(props); - const label = slots.label ? slots.label({ - label: props.label, - props: { - for: id.value - } - }) : props.label; - return _createVNode$q(VInput, _mergeProps$g({ - "class": ['v-radio-group', props.class], - "style": props.style - }, rootAttrs, inputProps, { - "modelValue": model.value, - "onUpdate:modelValue": $event => model.value = $event, - "id": id.value - }), { - ...slots, - default: _ref2 => { - let { - id, - messagesId, - isDisabled, - isReadonly - } = _ref2; - return _createVNode$q(_Fragment$8, null, [label && _createVNode$q(VLabel, { - "id": id.value - }, { - default: () => [label] - }), _createVNode$q(VSelectionControlGroup, _mergeProps$g(controlProps, { - "id": id.value, - "aria-describedby": messagesId.value, - "defaultsTarget": "VRadio", - "trueIcon": props.trueIcon, - "falseIcon": props.falseIcon, - "type": props.type, - "disabled": isDisabled.value, - "readonly": isReadonly.value, - "aria-labelledby": label ? id.value : undefined, - "multiple": false - }, controlAttrs, { - "modelValue": model.value, - "onUpdate:modelValue": $event => model.value = $event - }), slots)]); - } - }); - }); - return {}; - } -}); - -const {mergeProps:_mergeProps$f,createVNode:_createVNode$p,Fragment:_Fragment$7} = await importShared('vue'); -const {computed: computed$i,ref: ref$8} = await importShared('vue'); -const makeVRangeSliderProps = propsFactory({ - ...makeFocusProps(), - ...makeVInputProps(), - ...makeSliderProps(), - strict: Boolean, - modelValue: { - type: Array, - default: () => [0, 0] - } -}, 'VRangeSlider'); -const VRangeSlider = genericComponent()({ - name: 'VRangeSlider', - props: makeVRangeSliderProps(), - emits: { - 'update:focused': value => true, - 'update:modelValue': value => true, - end: value => true, - start: value => true - }, - setup(props, _ref) { - let { - slots, - emit - } = _ref; - const startThumbRef = ref$8(); - const stopThumbRef = ref$8(); - const inputRef = ref$8(); - const { - rtlClasses - } = useRtl(); - function getActiveThumb(e) { - if (!startThumbRef.value || !stopThumbRef.value) return; - const startOffset = getOffset(e, startThumbRef.value.$el, props.direction); - const stopOffset = getOffset(e, stopThumbRef.value.$el, props.direction); - const a = Math.abs(startOffset); - const b = Math.abs(stopOffset); - return a < b || a === b && startOffset < 0 ? startThumbRef.value.$el : stopThumbRef.value.$el; - } - const steps = useSteps(props); - const model = useProxiedModel(props, 'modelValue', undefined, arr => { - if (!arr?.length) return [0, 0]; - return arr.map(value => steps.roundValue(value)); - }); - const { - activeThumbRef, - hasLabels, - max, - min, - mousePressed, - onSliderMousedown, - onSliderTouchstart, - position, - trackContainerRef, - readonly - } = useSlider({ - props, - steps, - onSliderStart: () => { - emit('start', model.value); - }, - onSliderEnd: _ref2 => { - let { - value - } = _ref2; - const newValue = activeThumbRef.value === startThumbRef.value?.$el ? [value, model.value[1]] : [model.value[0], value]; - if (!props.strict && newValue[0] < newValue[1]) { - model.value = newValue; - } - emit('end', model.value); - }, - onSliderMove: _ref3 => { - let { - value - } = _ref3; - const [start, stop] = model.value; - if (!props.strict && start === stop && start !== min.value) { - activeThumbRef.value = value > start ? stopThumbRef.value?.$el : startThumbRef.value?.$el; - activeThumbRef.value?.focus(); - } - if (activeThumbRef.value === startThumbRef.value?.$el) { - model.value = [Math.min(value, stop), stop]; - } else { - model.value = [start, Math.max(start, value)]; - } - }, - getActiveThumb - }); - const { - isFocused, - focus, - blur - } = useFocus(props); - const trackStart = computed$i(() => position(model.value[0])); - const trackStop = computed$i(() => position(model.value[1])); - useRender(() => { - const inputProps = VInput.filterProps(props); - const hasPrepend = !!(props.label || slots.label || slots.prepend); - return _createVNode$p(VInput, _mergeProps$f({ - "class": ['v-slider', 'v-range-slider', { - 'v-slider--has-labels': !!slots['tick-label'] || hasLabels.value, - 'v-slider--focused': isFocused.value, - 'v-slider--pressed': mousePressed.value, - 'v-slider--disabled': props.disabled - }, rtlClasses.value, props.class], - "style": props.style, - "ref": inputRef - }, inputProps, { - "focused": isFocused.value - }), { - ...slots, - prepend: hasPrepend ? slotProps => _createVNode$p(_Fragment$7, null, [slots.label?.(slotProps) ?? (props.label ? _createVNode$p(VLabel, { - "class": "v-slider__label", - "text": props.label - }, null) : undefined), slots.prepend?.(slotProps)]) : undefined, - default: _ref4 => { - let { - id, - messagesId - } = _ref4; - return _createVNode$p("div", { - "class": "v-slider__container", - "onMousedown": !readonly.value ? onSliderMousedown : undefined, - "onTouchstartPassive": !readonly.value ? onSliderTouchstart : undefined - }, [_createVNode$p("input", { - "id": `${id.value}_start`, - "name": props.name || id.value, - "disabled": !!props.disabled, - "readonly": !!props.readonly, - "tabindex": "-1", - "value": model.value[0] - }, null), _createVNode$p("input", { - "id": `${id.value}_stop`, - "name": props.name || id.value, - "disabled": !!props.disabled, - "readonly": !!props.readonly, - "tabindex": "-1", - "value": model.value[1] - }, null), _createVNode$p(VSliderTrack, { - "ref": trackContainerRef, - "start": trackStart.value, - "stop": trackStop.value - }, { - 'tick-label': slots['tick-label'] - }), _createVNode$p(VSliderThumb, { - "ref": startThumbRef, - "aria-describedby": messagesId.value, - "focused": isFocused && activeThumbRef.value === startThumbRef.value?.$el, - "modelValue": model.value[0], - "onUpdate:modelValue": v => model.value = [v, model.value[1]], - "onFocus": e => { - focus(); - activeThumbRef.value = startThumbRef.value?.$el; - - // Make sure second thumb is focused if - // the thumbs are on top of each other - // and they are both at minimum value - // but only if focused from outside. - if (model.value[0] === model.value[1] && model.value[1] === min.value && e.relatedTarget !== stopThumbRef.value?.$el) { - startThumbRef.value?.$el.blur(); - stopThumbRef.value?.$el.focus(); - } - }, - "onBlur": () => { - blur(); - activeThumbRef.value = undefined; - }, - "min": min.value, - "max": model.value[1], - "position": trackStart.value, - "ripple": props.ripple - }, { - 'thumb-label': slots['thumb-label'] - }), _createVNode$p(VSliderThumb, { - "ref": stopThumbRef, - "aria-describedby": messagesId.value, - "focused": isFocused && activeThumbRef.value === stopThumbRef.value?.$el, - "modelValue": model.value[1], - "onUpdate:modelValue": v => model.value = [model.value[0], v], - "onFocus": e => { - focus(); - activeThumbRef.value = stopThumbRef.value?.$el; - - // Make sure first thumb is focused if - // the thumbs are on top of each other - // and they are both at maximum value - // but only if focused from outside. - if (model.value[0] === model.value[1] && model.value[0] === max.value && e.relatedTarget !== startThumbRef.value?.$el) { - stopThumbRef.value?.$el.blur(); - startThumbRef.value?.$el.focus(); - } - }, - "onBlur": () => { - blur(); - activeThumbRef.value = undefined; - }, - "min": model.value[0], - "max": max.value, - "position": trackStop.value, - "ripple": props.ripple - }, { - 'thumb-label': slots['thumb-label'] - })]); - } - }); - }); - return {}; - } -}); - -const {createTextVNode:_createTextVNode,mergeProps:_mergeProps$e,createVNode:_createVNode$o,Fragment:_Fragment$6} = await importShared('vue'); -const {computed: computed$h,shallowRef: shallowRef$4} = await importShared('vue'); -const makeVRatingProps = propsFactory({ - name: String, - itemAriaLabel: { - type: String, - default: '$vuetify.rating.ariaLabel.item' - }, - activeColor: String, - color: String, - clearable: Boolean, - disabled: Boolean, - emptyIcon: { - type: IconValue, - default: '$ratingEmpty' - }, - fullIcon: { - type: IconValue, - default: '$ratingFull' - }, - halfIncrements: Boolean, - hover: Boolean, - length: { - type: [Number, String], - default: 5 - }, - readonly: Boolean, - modelValue: { - type: [Number, String], - default: 0 - }, - itemLabels: Array, - itemLabelPosition: { - type: String, - default: 'top', - validator: v => ['top', 'bottom'].includes(v) - }, - ripple: Boolean, - ...makeComponentProps(), - ...makeDensityProps(), - ...makeSizeProps(), - ...makeTagProps(), - ...makeThemeProps() -}, 'VRating'); -const VRating = genericComponent()({ - name: 'VRating', - props: makeVRatingProps(), - emits: { - 'update:modelValue': value => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const { - t - } = useLocale(); - const { - themeClasses - } = provideTheme(props); - const rating = useProxiedModel(props, 'modelValue'); - const normalizedValue = computed$h(() => clamp(parseFloat(rating.value), 0, +props.length)); - const range = computed$h(() => createRange(Number(props.length), 1)); - const increments = computed$h(() => range.value.flatMap(v => props.halfIncrements ? [v - 0.5, v] : [v])); - const hoverIndex = shallowRef$4(-1); - const itemState = computed$h(() => increments.value.map(value => { - const isHovering = props.hover && hoverIndex.value > -1; - const isFilled = normalizedValue.value >= value; - const isHovered = hoverIndex.value >= value; - const isFullIcon = isHovering ? isHovered : isFilled; - const icon = isFullIcon ? props.fullIcon : props.emptyIcon; - const activeColor = props.activeColor ?? props.color; - const color = isFilled || isHovered ? activeColor : props.color; - return { - isFilled, - isHovered, - icon, - color - }; - })); - const eventState = computed$h(() => [0, ...increments.value].map(value => { - function onMouseenter() { - hoverIndex.value = value; - } - function onMouseleave() { - hoverIndex.value = -1; - } - function onClick() { - if (props.disabled || props.readonly) return; - rating.value = normalizedValue.value === value && props.clearable ? 0 : value; - } - return { - onMouseenter: props.hover ? onMouseenter : undefined, - onMouseleave: props.hover ? onMouseleave : undefined, - onClick - }; - })); - const name = computed$h(() => props.name ?? `v-rating-${getUid()}`); - function VRatingItem(_ref2) { - let { - value, - index, - showStar = true - } = _ref2; - const { - onMouseenter, - onMouseleave, - onClick - } = eventState.value[index + 1]; - const id = `${name.value}-${String(value).replace('.', '-')}`; - const btnProps = { - color: itemState.value[index]?.color, - density: props.density, - disabled: props.disabled, - icon: itemState.value[index]?.icon, - ripple: props.ripple, - size: props.size, - variant: 'plain' - }; - return _createVNode$o(_Fragment$6, null, [_createVNode$o("label", { - "for": id, - "class": { - 'v-rating__item--half': props.halfIncrements && value % 1 > 0, - 'v-rating__item--full': props.halfIncrements && value % 1 === 0 - }, - "onMouseenter": onMouseenter, - "onMouseleave": onMouseleave, - "onClick": onClick - }, [_createVNode$o("span", { - "class": "v-rating__hidden" - }, [t(props.itemAriaLabel, value, props.length)]), !showStar ? undefined : slots.item ? slots.item({ - ...itemState.value[index], - props: btnProps, - value, - index, - rating: normalizedValue.value - }) : _createVNode$o(VBtn, _mergeProps$e({ - "aria-label": t(props.itemAriaLabel, value, props.length) - }, btnProps), null)]), _createVNode$o("input", { - "class": "v-rating__hidden", - "name": name.value, - "id": id, - "type": "radio", - "value": value, - "checked": normalizedValue.value === value, - "tabindex": -1, - "readonly": props.readonly, - "disabled": props.disabled - }, null)]); - } - function createLabel(labelProps) { - if (slots['item-label']) return slots['item-label'](labelProps); - if (labelProps.label) return _createVNode$o("span", null, [labelProps.label]); - return _createVNode$o("span", null, [_createTextVNode("\xA0")]); - } - useRender(() => { - const hasLabels = !!props.itemLabels?.length || slots['item-label']; - return _createVNode$o(props.tag, { - "class": ['v-rating', { - 'v-rating--hover': props.hover, - 'v-rating--readonly': props.readonly - }, themeClasses.value, props.class], - "style": props.style - }, { - default: () => [_createVNode$o(VRatingItem, { - "value": 0, - "index": -1, - "showStar": false - }, null), range.value.map((value, i) => _createVNode$o("div", { - "class": "v-rating__wrapper" - }, [hasLabels && props.itemLabelPosition === 'top' ? createLabel({ - value, - index: i, - label: props.itemLabels?.[i] - }) : undefined, _createVNode$o("div", { - "class": "v-rating__item" - }, [props.halfIncrements ? _createVNode$o(_Fragment$6, null, [_createVNode$o(VRatingItem, { - "value": value - 0.5, - "index": i * 2 - }, null), _createVNode$o(VRatingItem, { - "value": value, - "index": i * 2 + 1 - }, null)]) : _createVNode$o(VRatingItem, { - "value": value, - "index": i - }, null)]), hasLabels && props.itemLabelPosition === 'bottom' ? createLabel({ - value, - index: i, - label: props.itemLabels?.[i] - }) : undefined]))] - }); - }); - return {}; - } -}); - -const {mergeProps:_mergeProps$d,createVNode:_createVNode$n} = await importShared('vue'); -const {computed: computed$g,toRef: toRef$6} = await importShared('vue'); -const rootTypes = { - actions: 'button@2', - article: 'heading, paragraph', - avatar: 'avatar', - button: 'button', - card: 'image, heading', - 'card-avatar': 'image, list-item-avatar', - chip: 'chip', - 'date-picker': 'list-item, heading, divider, date-picker-options, date-picker-days, actions', - 'date-picker-options': 'text, avatar@2', - 'date-picker-days': 'avatar@28', - divider: 'divider', - heading: 'heading', - image: 'image', - 'list-item': 'text', - 'list-item-avatar': 'avatar, text', - 'list-item-two-line': 'sentences', - 'list-item-avatar-two-line': 'avatar, sentences', - 'list-item-three-line': 'paragraph', - 'list-item-avatar-three-line': 'avatar, paragraph', - ossein: 'ossein', - paragraph: 'text@3', - sentences: 'text@2', - subtitle: 'text', - table: 'table-heading, table-thead, table-tbody, table-tfoot', - 'table-heading': 'chip, text', - 'table-thead': 'heading@6', - 'table-tbody': 'table-row-divider@6', - 'table-row-divider': 'table-row, divider', - 'table-row': 'text@6', - 'table-tfoot': 'text@2, avatar@2', - text: 'text' -}; -function genBone(type) { - let children = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; - return _createVNode$n("div", { - "class": ['v-skeleton-loader__bone', `v-skeleton-loader__${type}`] - }, [children]); -} -function genBones(bone) { - // e.g. 'text@3' - const [type, length] = bone.split('@'); - - // Generate a length array based upon - // value after @ in the bone string - return Array.from({ - length - }).map(() => genStructure(type)); -} -function genStructure(type) { - let children = []; - if (!type) return children; - - // TODO: figure out a better way to type this - const bone = rootTypes[type]; - - // End of recursion, do nothing - /* eslint-disable-next-line no-empty, brace-style */ - if (type === bone) ; - // Array of values - e.g. 'heading, paragraph, text@2' - else if (type.includes(',')) return mapBones(type); - // Array of values - e.g. 'paragraph@4' - else if (type.includes('@')) return genBones(type); - // Array of values - e.g. 'card@2' - else if (bone.includes(',')) children = mapBones(bone); - // Array of values - e.g. 'list-item@2' - else if (bone.includes('@')) children = genBones(bone); - // Single value - e.g. 'card-heading' - else if (bone) children.push(genStructure(bone)); - return [genBone(type, children)]; -} -function mapBones(bones) { - // Remove spaces and return array of structures - return bones.replace(/\s/g, '').split(',').map(genStructure); -} -const makeVSkeletonLoaderProps = propsFactory({ - boilerplate: Boolean, - color: String, - loading: Boolean, - loadingText: { - type: String, - default: '$vuetify.loading' - }, - type: { - type: [String, Array], - default: 'ossein' - }, - ...makeDimensionProps(), - ...makeElevationProps(), - ...makeThemeProps() -}, 'VSkeletonLoader'); -const VSkeletonLoader = genericComponent()({ - name: 'VSkeletonLoader', - props: makeVSkeletonLoaderProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - backgroundColorClasses, - backgroundColorStyles - } = useBackgroundColor(toRef$6(props, 'color')); - const { - dimensionStyles - } = useDimension(props); - const { - elevationClasses - } = useElevation(props); - const { - themeClasses - } = provideTheme(props); - const { - t - } = useLocale(); - const items = computed$g(() => genStructure(wrapInArray(props.type).join(','))); - useRender(() => { - const isLoading = !slots.default || props.loading; - const loadingProps = props.boilerplate || !isLoading ? {} : { - ariaLive: 'polite', - ariaLabel: t(props.loadingText), - role: 'alert' - }; - return _createVNode$n("div", _mergeProps$d({ - "class": ['v-skeleton-loader', { - 'v-skeleton-loader--boilerplate': props.boilerplate - }, themeClasses.value, backgroundColorClasses.value, elevationClasses.value], - "style": [backgroundColorStyles.value, isLoading ? dimensionStyles.value : {}] - }, loadingProps), [isLoading ? items.value : slots.default?.()]); - }); - return {}; - } -}); - -// Composables -const VSlideGroupItem = genericComponent()({ - name: 'VSlideGroupItem', - props: makeGroupItemProps(), - emits: { - 'group:selected': val => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const slideGroupItem = useGroupItem(props, VSlideGroupSymbol); - return () => slots.default?.({ - isSelected: slideGroupItem.isSelected.value, - select: slideGroupItem.select, - toggle: slideGroupItem.toggle, - selectedClass: slideGroupItem.selectedClass.value - }); - } -}); - -const {mergeProps:_mergeProps$c,resolveDirective:_resolveDirective$d,createVNode:_createVNode$m} = await importShared('vue'); -const {computed: computed$f,inject: inject$2,mergeProps: mergeProps$2,nextTick: nextTick$2,onMounted: onMounted$1,onScopeDispose,ref: ref$7,shallowRef: shallowRef$3,watch: watch$3,watchEffect: watchEffect$1} = await importShared('vue'); -function useCountdown(milliseconds) { - const time = shallowRef$3(milliseconds()); - let timer = -1; - function clear() { - clearInterval(timer); - } - function reset() { - clear(); - nextTick$2(() => time.value = milliseconds()); - } - function start(el) { - const style = el ? getComputedStyle(el) : { - transitionDuration: 0.2 - }; - const interval = parseFloat(style.transitionDuration) * 1000 || 200; - clear(); - if (time.value <= 0) return; - const startTime = performance.now(); - timer = window.setInterval(() => { - const elapsed = performance.now() - startTime + interval; - time.value = Math.max(milliseconds() - elapsed, 0); - if (time.value <= 0) clear(); - }, interval); - } - onScopeDispose(clear); - return { - clear, - time, - start, - reset - }; -} -const makeVSnackbarProps = propsFactory({ - multiLine: Boolean, - text: String, - timer: [Boolean, String], - timeout: { - type: [Number, String], - default: 5000 - }, - vertical: Boolean, - ...makeLocationProps({ - location: 'bottom' - }), - ...makePositionProps(), - ...makeRoundedProps(), - ...makeVariantProps(), - ...makeThemeProps(), - ...omit(makeVOverlayProps({ - transition: 'v-snackbar-transition' - }), ['persistent', 'noClickAnimation', 'scrim', 'scrollStrategy']) -}, 'VSnackbar'); -const VSnackbar = genericComponent()({ - name: 'VSnackbar', - props: makeVSnackbarProps(), - emits: { - 'update:modelValue': v => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const isActive = useProxiedModel(props, 'modelValue'); - const { - positionClasses - } = usePosition(props); - const { - scopeId - } = useScopeId(); - const { - themeClasses - } = provideTheme(props); - const { - colorClasses, - colorStyles, - variantClasses - } = useVariant(props); - const { - roundedClasses - } = useRounded(props); - const countdown = useCountdown(() => Number(props.timeout)); - const overlay = ref$7(); - const timerRef = ref$7(); - const isHovering = shallowRef$3(false); - const startY = shallowRef$3(0); - const mainStyles = ref$7(); - const hasLayout = inject$2(VuetifyLayoutKey, undefined); - useToggleScope(() => !!hasLayout, () => { - const layout = useLayout(); - watchEffect$1(() => { - mainStyles.value = layout.mainStyles.value; - }); - }); - watch$3(isActive, startTimeout); - watch$3(() => props.timeout, startTimeout); - onMounted$1(() => { - if (isActive.value) startTimeout(); - }); - let activeTimeout = -1; - function startTimeout() { - countdown.reset(); - window.clearTimeout(activeTimeout); - const timeout = Number(props.timeout); - if (!isActive.value || timeout === -1) return; - const element = refElement(timerRef.value); - countdown.start(element); - activeTimeout = window.setTimeout(() => { - isActive.value = false; - }, timeout); - } - function clearTimeout() { - countdown.reset(); - window.clearTimeout(activeTimeout); - } - function onPointerenter() { - isHovering.value = true; - clearTimeout(); - } - function onPointerleave() { - isHovering.value = false; - startTimeout(); - } - function onTouchstart(event) { - startY.value = event.touches[0].clientY; - } - function onTouchend(event) { - if (Math.abs(startY.value - event.changedTouches[0].clientY) > 50) { - isActive.value = false; - } - } - function onAfterLeave() { - if (isHovering.value) onPointerleave(); - } - const locationClasses = computed$f(() => { - return props.location.split(' ').reduce((acc, loc) => { - acc[`v-snackbar--${loc}`] = true; - return acc; - }, {}); - }); - useRender(() => { - const overlayProps = VOverlay.filterProps(props); - const hasContent = !!(slots.default || slots.text || props.text); - return _createVNode$m(VOverlay, _mergeProps$c({ - "ref": overlay, - "class": ['v-snackbar', { - 'v-snackbar--active': isActive.value, - 'v-snackbar--multi-line': props.multiLine && !props.vertical, - 'v-snackbar--timer': !!props.timer, - 'v-snackbar--vertical': props.vertical - }, locationClasses.value, positionClasses.value, props.class], - "style": [mainStyles.value, props.style] - }, overlayProps, { - "modelValue": isActive.value, - "onUpdate:modelValue": $event => isActive.value = $event, - "contentProps": mergeProps$2({ - class: ['v-snackbar__wrapper', themeClasses.value, colorClasses.value, roundedClasses.value, variantClasses.value], - style: [colorStyles.value], - onPointerenter, - onPointerleave - }, overlayProps.contentProps), - "persistent": true, - "noClickAnimation": true, - "scrim": false, - "scrollStrategy": "none", - "_disableGlobalStack": true, - "onTouchstartPassive": onTouchstart, - "onTouchend": onTouchend, - "onAfterLeave": onAfterLeave - }, scopeId), { - default: () => [genOverlays(false, 'v-snackbar'), props.timer && !isHovering.value && _createVNode$m("div", { - "key": "timer", - "class": "v-snackbar__timer" - }, [_createVNode$m(VProgressLinear, { - "ref": timerRef, - "color": typeof props.timer === 'string' ? props.timer : 'info', - "max": props.timeout, - "model-value": countdown.time.value - }, null)]), hasContent && _createVNode$m("div", { - "key": "content", - "class": "v-snackbar__content", - "role": "status", - "aria-live": "polite" - }, [slots.text?.() ?? props.text, slots.default?.()]), slots.actions && _createVNode$m(VDefaultsProvider, { - "defaults": { - VBtn: { - variant: 'text', - ripple: false, - slim: true - } - } - }, { - default: () => [_createVNode$m("div", { - "class": "v-snackbar__actions" - }, [slots.actions({ - isActive - })])] - })], - activator: slots.activator - }); - }); - return forwardRefs({}, overlay); - } -}); - -// Utilities -const makeLineProps = propsFactory({ - autoDraw: Boolean, - autoDrawDuration: [Number, String], - autoDrawEasing: { - type: String, - default: 'ease' - }, - color: String, - gradient: { - type: Array, - default: () => [] - }, - gradientDirection: { - type: String, - validator: val => ['top', 'bottom', 'left', 'right'].includes(val), - default: 'top' - }, - height: { - type: [String, Number], - default: 75 - }, - labels: { - type: Array, - default: () => [] - }, - labelSize: { - type: [Number, String], - default: 7 - }, - lineWidth: { - type: [String, Number], - default: 4 - }, - id: String, - itemValue: { - type: String, - default: 'value' - }, - modelValue: { - type: Array, - default: () => [] - }, - min: [String, Number], - max: [String, Number], - padding: { - type: [String, Number], - default: 8 - }, - showLabels: Boolean, - smooth: Boolean, - width: { - type: [Number, String], - default: 300 - } -}, 'Line'); - -const {Fragment:_Fragment$5,createVNode:_createVNode$l} = await importShared('vue'); - -// Utilities -const {computed: computed$e} = await importShared('vue'); -const makeVBarlineProps = propsFactory({ - autoLineWidth: Boolean, - ...makeLineProps() -}, 'VBarline'); -const VBarline = genericComponent()({ - name: 'VBarline', - props: makeVBarlineProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const uid = getUid(); - const id = computed$e(() => props.id || `barline-${uid}`); - const autoDrawDuration = computed$e(() => Number(props.autoDrawDuration) || 500); - const hasLabels = computed$e(() => { - return Boolean(props.showLabels || props.labels.length > 0 || !!slots?.label); - }); - const lineWidth = computed$e(() => parseFloat(props.lineWidth) || 4); - const totalWidth = computed$e(() => Math.max(props.modelValue.length * lineWidth.value, Number(props.width))); - const boundary = computed$e(() => { - return { - minX: 0, - maxX: totalWidth.value, - minY: 0, - maxY: parseInt(props.height, 10) - }; - }); - const items = computed$e(() => props.modelValue.map(item => getPropertyFromItem(item, props.itemValue, item))); - function genBars(values, boundary) { - const { - minX, - maxX, - minY, - maxY - } = boundary; - const totalValues = values.length; - let maxValue = props.max != null ? Number(props.max) : Math.max(...values); - let minValue = props.min != null ? Number(props.min) : Math.min(...values); - if (minValue > 0 && props.min == null) minValue = 0; - if (maxValue < 0 && props.max == null) maxValue = 0; - const gridX = maxX / totalValues; - const gridY = (maxY - minY) / (maxValue - minValue || 1); - const horizonY = maxY - Math.abs(minValue * gridY); - return values.map((value, index) => { - const height = Math.abs(gridY * value); - return { - x: minX + index * gridX, - y: horizonY - height + +(value < 0) * height, - height, - value - }; - }); - } - const parsedLabels = computed$e(() => { - const labels = []; - const points = genBars(items.value, boundary.value); - const len = points.length; - for (let i = 0; labels.length < len; i++) { - const item = points[i]; - let value = props.labels[i]; - if (!value) { - value = typeof item === 'object' ? item.value : item; - } - labels.push({ - x: item.x, - value: String(value) - }); - } - return labels; - }); - const bars = computed$e(() => genBars(items.value, boundary.value)); - const offsetX = computed$e(() => (Math.abs(bars.value[0].x - bars.value[1].x) - lineWidth.value) / 2); - useRender(() => { - const gradientData = !props.gradient.slice().length ? [''] : props.gradient.slice().reverse(); - return _createVNode$l("svg", { - "display": "block" - }, [_createVNode$l("defs", null, [_createVNode$l("linearGradient", { - "id": id.value, - "gradientUnits": "userSpaceOnUse", - "x1": props.gradientDirection === 'left' ? '100%' : '0', - "y1": props.gradientDirection === 'top' ? '100%' : '0', - "x2": props.gradientDirection === 'right' ? '100%' : '0', - "y2": props.gradientDirection === 'bottom' ? '100%' : '0' - }, [gradientData.map((color, index) => _createVNode$l("stop", { - "offset": index / Math.max(gradientData.length - 1, 1), - "stop-color": color || 'currentColor' - }, null))])]), _createVNode$l("clipPath", { - "id": `${id.value}-clip` - }, [bars.value.map(item => _createVNode$l("rect", { - "x": item.x + offsetX.value, - "y": item.y, - "width": lineWidth.value, - "height": item.height, - "rx": typeof props.smooth === 'number' ? props.smooth : props.smooth ? 2 : 0, - "ry": typeof props.smooth === 'number' ? props.smooth : props.smooth ? 2 : 0 - }, [props.autoDraw && _createVNode$l(_Fragment$5, null, [_createVNode$l("animate", { - "attributeName": "y", - "from": item.y + item.height, - "to": item.y, - "dur": `${autoDrawDuration.value}ms`, - "fill": "freeze" - }, null), _createVNode$l("animate", { - "attributeName": "height", - "from": "0", - "to": item.height, - "dur": `${autoDrawDuration.value}ms`, - "fill": "freeze" - }, null)])]))]), hasLabels.value && _createVNode$l("g", { - "key": "labels", - "style": { - textAnchor: 'middle', - dominantBaseline: 'mathematical', - fill: 'currentColor' - } - }, [parsedLabels.value.map((item, i) => _createVNode$l("text", { - "x": item.x + offsetX.value + lineWidth.value / 2, - "y": parseInt(props.height, 10) - 2 + (parseInt(props.labelSize, 10) || 7 * 0.75), - "font-size": Number(props.labelSize) || 7 - }, [slots.label?.({ - index: i, - value: item.value - }) ?? item.value]))]), _createVNode$l("g", { - "clip-path": `url(#${id.value}-clip)`, - "fill": `url(#${id.value})` - }, [_createVNode$l("rect", { - "x": 0, - "y": 0, - "width": Math.max(props.modelValue.length * lineWidth.value, Number(props.width)), - "height": props.height - }, null)])]); - }); - } -}); - -// @ts-nocheck -/* eslint-disable */ - -// import { checkCollinear, getDistance, moveTo } from './math' - -/** - * From https://github.com/unsplash/react-trend/blob/master/src/helpers/DOM.helpers.js#L18 - */ -function genPath(points, radius) { - let fill = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let height = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 75; - if (points.length === 0) return ''; - const start = points.shift(); - const end = points[points.length - 1]; - return (fill ? `M${start.x} ${height - start.x + 2} L${start.x} ${start.y}` : `M${start.x} ${start.y}`) + points.map((point, index) => { - const next = points[index + 1]; - const prev = points[index - 1] || start; - const isCollinear = next && checkCollinear(next, point, prev); - if (!next || isCollinear) { - return `L${point.x} ${point.y}`; - } - const threshold = Math.min(getDistance(prev, point), getDistance(next, point)); - const isTooCloseForRadius = threshold / 2 < radius; - const radiusForPoint = isTooCloseForRadius ? threshold / 2 : radius; - const before = moveTo(prev, point, radiusForPoint); - const after = moveTo(next, point, radiusForPoint); - return `L${before.x} ${before.y}S${point.x} ${point.y} ${after.x} ${after.y}`; - }).join('') + (fill ? `L${end.x} ${height - start.x + 2} Z` : ''); -} -function int(value) { - return parseInt(value, 10); -} - -/** - * https://en.wikipedia.org/wiki/Collinearity - * x=(x1+x2)/2 - * y=(y1+y2)/2 - */ -function checkCollinear(p0, p1, p2) { - return int(p0.x + p2.x) === int(2 * p1.x) && int(p0.y + p2.y) === int(2 * p1.y); -} -function getDistance(p1, p2) { - return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2)); -} -function moveTo(to, from, radius) { - const vector = { - x: to.x - from.x, - y: to.y - from.y - }; - const length = Math.sqrt(vector.x * vector.x + vector.y * vector.y); - const unitVector = { - x: vector.x / length, - y: vector.y / length - }; - return { - x: from.x + unitVector.x * radius, - y: from.y + unitVector.y * radius - }; -} - -const {createVNode:_createVNode$k} = await importShared('vue'); - -// Utilities -const {computed: computed$d,nextTick: nextTick$1,ref: ref$6,watch: watch$2} = await importShared('vue'); -const makeVTrendlineProps = propsFactory({ - fill: Boolean, - ...makeLineProps() -}, 'VTrendline'); -const VTrendline = genericComponent()({ - name: 'VTrendline', - props: makeVTrendlineProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const uid = getUid(); - const id = computed$d(() => props.id || `trendline-${uid}`); - const autoDrawDuration = computed$d(() => Number(props.autoDrawDuration) || (props.fill ? 500 : 2000)); - const lastLength = ref$6(0); - const path = ref$6(null); - function genPoints(values, boundary) { - const { - minX, - maxX, - minY, - maxY - } = boundary; - const totalValues = values.length; - const maxValue = props.max != null ? Number(props.max) : Math.max(...values); - const minValue = props.min != null ? Number(props.min) : Math.min(...values); - const gridX = (maxX - minX) / (totalValues - 1); - const gridY = (maxY - minY) / (maxValue - minValue || 1); - return values.map((value, index) => { - return { - x: minX + index * gridX, - y: maxY - (value - minValue) * gridY, - value - }; - }); - } - const hasLabels = computed$d(() => { - return Boolean(props.showLabels || props.labels.length > 0 || !!slots?.label); - }); - const lineWidth = computed$d(() => { - return parseFloat(props.lineWidth) || 4; - }); - const totalWidth = computed$d(() => Number(props.width)); - const boundary = computed$d(() => { - const padding = Number(props.padding); - return { - minX: padding, - maxX: totalWidth.value - padding, - minY: padding, - maxY: parseInt(props.height, 10) - padding - }; - }); - const items = computed$d(() => props.modelValue.map(item => getPropertyFromItem(item, props.itemValue, item))); - const parsedLabels = computed$d(() => { - const labels = []; - const points = genPoints(items.value, boundary.value); - const len = points.length; - for (let i = 0; labels.length < len; i++) { - const item = points[i]; - let value = props.labels[i]; - if (!value) { - value = typeof item === 'object' ? item.value : item; - } - labels.push({ - x: item.x, - value: String(value) - }); - } - return labels; - }); - watch$2(() => props.modelValue, async () => { - await nextTick$1(); - if (!props.autoDraw || !path.value) return; - const pathRef = path.value; - const length = pathRef.getTotalLength(); - if (!props.fill) { - // Initial setup to "hide" the line by using the stroke dash array - pathRef.style.strokeDasharray = `${length}`; - pathRef.style.strokeDashoffset = `${length}`; - - // Force reflow to ensure the transition starts from this state - pathRef.getBoundingClientRect(); - - // Animate the stroke dash offset to "draw" the line - pathRef.style.transition = `stroke-dashoffset ${autoDrawDuration.value}ms ${props.autoDrawEasing}`; - pathRef.style.strokeDashoffset = '0'; - } else { - // Your existing logic for filled paths remains the same - pathRef.style.transformOrigin = 'bottom center'; - pathRef.style.transition = 'none'; - pathRef.style.transform = `scaleY(0)`; - pathRef.getBoundingClientRect(); - pathRef.style.transition = `transform ${autoDrawDuration.value}ms ${props.autoDrawEasing}`; - pathRef.style.transform = `scaleY(1)`; - } - lastLength.value = length; - }, { - immediate: true - }); - function genPath$1(fill) { - return genPath(genPoints(items.value, boundary.value), props.smooth ? 8 : Number(props.smooth), fill, parseInt(props.height, 10)); - } - useRender(() => { - const gradientData = !props.gradient.slice().length ? [''] : props.gradient.slice().reverse(); - return _createVNode$k("svg", { - "display": "block", - "stroke-width": parseFloat(props.lineWidth) ?? 4 - }, [_createVNode$k("defs", null, [_createVNode$k("linearGradient", { - "id": id.value, - "gradientUnits": "userSpaceOnUse", - "x1": props.gradientDirection === 'left' ? '100%' : '0', - "y1": props.gradientDirection === 'top' ? '100%' : '0', - "x2": props.gradientDirection === 'right' ? '100%' : '0', - "y2": props.gradientDirection === 'bottom' ? '100%' : '0' - }, [gradientData.map((color, index) => _createVNode$k("stop", { - "offset": index / Math.max(gradientData.length - 1, 1), - "stop-color": color || 'currentColor' - }, null))])]), hasLabels.value && _createVNode$k("g", { - "key": "labels", - "style": { - textAnchor: 'middle', - dominantBaseline: 'mathematical', - fill: 'currentColor' - } - }, [parsedLabels.value.map((item, i) => _createVNode$k("text", { - "x": item.x + lineWidth.value / 2 + lineWidth.value / 2, - "y": parseInt(props.height, 10) - 4 + (parseInt(props.labelSize, 10) || 7 * 0.75), - "font-size": Number(props.labelSize) || 7 - }, [slots.label?.({ - index: i, - value: item.value - }) ?? item.value]))]), _createVNode$k("path", { - "ref": path, - "d": genPath$1(props.fill), - "fill": props.fill ? `url(#${id.value})` : 'none', - "stroke": props.fill ? 'none' : `url(#${id.value})` - }, null), props.fill && _createVNode$k("path", { - "d": genPath$1(false), - "fill": "none", - "stroke": props.color ?? props.gradient?.[0] - }, null)]); - }); - } -}); - -const {createVNode:_createVNode$j,mergeProps:_mergeProps$b,resolveDirective:_resolveDirective$c} = await importShared('vue'); -const {computed: computed$c,toRef: toRef$5} = await importShared('vue'); -// Types - -const makeVSparklineProps = propsFactory({ - type: { - type: String, - default: 'trend' - }, - ...makeVBarlineProps(), - ...makeVTrendlineProps() -}, 'VSparkline'); -const VSparkline = genericComponent()({ - name: 'VSparkline', - props: makeVSparklineProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - textColorClasses, - textColorStyles - } = useTextColor(toRef$5(props, 'color')); - const hasLabels = computed$c(() => { - return Boolean(props.showLabels || props.labels.length > 0 || !!slots?.label); - }); - const totalHeight = computed$c(() => { - let height = parseInt(props.height, 10); - if (hasLabels.value) height += parseInt(props.labelSize, 10) * 1.5; - return height; - }); - useRender(() => { - const Tag = props.type === 'trend' ? VTrendline : VBarline; - const lineProps = props.type === 'trend' ? VTrendline.filterProps(props) : VBarline.filterProps(props); - return _createVNode$j(Tag, _mergeProps$b({ - "key": props.type, - "class": textColorClasses.value, - "style": textColorStyles.value, - "viewBox": `0 0 ${props.width} ${parseInt(totalHeight.value, 10)}` - }, lineProps), slots); - }); - } -}); - -const {mergeProps:_mergeProps$a,createVNode:_createVNode$i} = await importShared('vue'); -const {computed: computed$b,ref: ref$5} = await importShared('vue'); -const makeVSpeedDialProps = propsFactory({ - ...makeComponentProps(), - ...makeVMenuProps({ - offset: 8, - minWidth: 0, - openDelay: 0, - closeDelay: 100, - location: 'top center', - transition: 'scale-transition' - }) -}, 'VSpeedDial'); -const VSpeedDial = genericComponent()({ - name: 'VSpeedDial', - props: makeVSpeedDialProps(), - emits: { - 'update:modelValue': value => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const model = useProxiedModel(props, 'modelValue'); - const menuRef = ref$5(); - const location = computed$b(() => { - const [y, x = 'center'] = props.location?.split(' ') ?? []; - return `${y} ${x}`; - }); - const locationClasses = computed$b(() => ({ - [`v-speed-dial__content--${location.value.replace(' ', '-')}`]: true - })); - useRender(() => { - const menuProps = VMenu.filterProps(props); - return _createVNode$i(VMenu, _mergeProps$a(menuProps, { - "modelValue": model.value, - "onUpdate:modelValue": $event => model.value = $event, - "class": props.class, - "style": props.style, - "contentClass": ['v-speed-dial__content', locationClasses.value, props.contentClass], - "location": location.value, - "ref": menuRef, - "transition": "fade-transition" - }), { - ...slots, - default: slotProps => _createVNode$i(VDefaultsProvider, { - "defaults": { - VBtn: { - size: 'small' - } - } - }, { - default: () => [_createVNode$i(MaybeTransition, { - "appear": true, - "group": true, - "transition": props.transition - }, { - default: () => [slots.default?.(slotProps)] - })] - }) - }); - }); - return {}; - } -}); - -// Types - -const VStepperSymbol = Symbol.for('vuetify:v-stepper'); - -const {createVNode:_createVNode$h} = await importShared('vue'); -const makeVStepperActionsProps = propsFactory({ - color: String, - disabled: { - type: [Boolean, String], - default: false - }, - prevText: { - type: String, - default: '$vuetify.stepper.prev' - }, - nextText: { - type: String, - default: '$vuetify.stepper.next' - } -}, 'VStepperActions'); -const VStepperActions = genericComponent()({ - name: 'VStepperActions', - props: makeVStepperActionsProps(), - emits: { - 'click:prev': () => true, - 'click:next': () => true - }, - setup(props, _ref) { - let { - emit, - slots - } = _ref; - const { - t - } = useLocale(); - function onClickPrev() { - emit('click:prev'); - } - function onClickNext() { - emit('click:next'); - } - useRender(() => { - const prevSlotProps = { - onClick: onClickPrev - }; - const nextSlotProps = { - onClick: onClickNext - }; - return _createVNode$h("div", { - "class": "v-stepper-actions" - }, [_createVNode$h(VDefaultsProvider, { - "defaults": { - VBtn: { - disabled: ['prev', true].includes(props.disabled), - text: t(props.prevText), - variant: 'text' - } - } - }, { - default: () => [slots.prev?.({ - props: prevSlotProps - }) ?? _createVNode$h(VBtn, prevSlotProps, null)] - }), _createVNode$h(VDefaultsProvider, { - "defaults": { - VBtn: { - color: props.color, - disabled: ['next', true].includes(props.disabled), - text: t(props.nextText), - variant: 'tonal' - } - } - }, { - default: () => [slots.next?.({ - props: nextSlotProps - }) ?? _createVNode$h(VBtn, nextSlotProps, null)] - })]); - }); - return {}; - } -}); - -// Utilities -const VStepperHeader = createSimpleFunctional('v-stepper-header'); - -const {withDirectives:_withDirectives$1,resolveDirective:_resolveDirective$b,createVNode:_createVNode$g} = await importShared('vue'); -const {computed: computed$a} = await importShared('vue'); -const makeStepperItemProps = propsFactory({ - color: String, - title: String, - subtitle: String, - complete: Boolean, - completeIcon: { - type: String, - default: '$complete' - }, - editable: Boolean, - editIcon: { - type: String, - default: '$edit' - }, - error: Boolean, - errorIcon: { - type: String, - default: '$error' - }, - icon: String, - ripple: { - type: [Boolean, Object], - default: true - }, - rules: { - type: Array, - default: () => [] - } -}, 'StepperItem'); -const makeVStepperItemProps = propsFactory({ - ...makeStepperItemProps(), - ...makeGroupItemProps() -}, 'VStepperItem'); -const VStepperItem = genericComponent()({ - name: 'VStepperItem', - directives: { - Ripple - }, - props: makeVStepperItemProps(), - emits: { - 'group:selected': val => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const group = useGroupItem(props, VStepperSymbol, true); - const step = computed$a(() => group?.value.value ?? props.value); - const isValid = computed$a(() => props.rules.every(handler => handler() === true)); - const isClickable = computed$a(() => !props.disabled && props.editable); - const canEdit = computed$a(() => !props.disabled && props.editable); - const hasError = computed$a(() => props.error || !isValid.value); - const hasCompleted = computed$a(() => props.complete || props.rules.length > 0 && isValid.value); - const icon = computed$a(() => { - if (hasError.value) return props.errorIcon; - if (hasCompleted.value) return props.completeIcon; - if (group.isSelected.value && props.editable) return props.editIcon; - return props.icon; - }); - const slotProps = computed$a(() => ({ - canEdit: canEdit.value, - hasError: hasError.value, - hasCompleted: hasCompleted.value, - title: props.title, - subtitle: props.subtitle, - step: step.value, - value: props.value - })); - useRender(() => { - const hasColor = (!group || group.isSelected.value || hasCompleted.value || canEdit.value) && !hasError.value && !props.disabled; - const hasTitle = !!(props.title != null || slots.title); - const hasSubtitle = !!(props.subtitle != null || slots.subtitle); - function onClick() { - group?.toggle(); - } - return _withDirectives$1(_createVNode$g("button", { - "class": ['v-stepper-item', { - 'v-stepper-item--complete': hasCompleted.value, - 'v-stepper-item--disabled': props.disabled, - 'v-stepper-item--error': hasError.value - }, group?.selectedClass.value], - "disabled": !props.editable, - "onClick": onClick - }, [isClickable.value && genOverlays(true, 'v-stepper-item'), _createVNode$g(VAvatar, { - "key": "stepper-avatar", - "class": "v-stepper-item__avatar", - "color": hasColor ? props.color : undefined, - "size": 24 - }, { - default: () => [slots.icon?.(slotProps.value) ?? (icon.value ? _createVNode$g(VIcon, { - "icon": icon.value - }, null) : step.value)] - }), _createVNode$g("div", { - "class": "v-stepper-item__content" - }, [hasTitle && _createVNode$g("div", { - "key": "title", - "class": "v-stepper-item__title" - }, [slots.title?.(slotProps.value) ?? props.title]), hasSubtitle && _createVNode$g("div", { - "key": "subtitle", - "class": "v-stepper-item__subtitle" - }, [slots.subtitle?.(slotProps.value) ?? props.subtitle]), slots.default?.(slotProps.value)])]), [[_resolveDirective$b("ripple"), props.ripple && props.editable, null]]); - }); - return {}; - } -}); - -const {createVNode:_createVNode$f,mergeProps:_mergeProps$9,resolveDirective:_resolveDirective$a} = await importShared('vue'); -const {computed: computed$9,inject: inject$1} = await importShared('vue'); -const makeVStepperWindowProps = propsFactory({ - ...omit(makeVWindowProps(), ['continuous', 'nextIcon', 'prevIcon', 'showArrows', 'touch', 'mandatory']) -}, 'VStepperWindow'); -const VStepperWindow = genericComponent()({ - name: 'VStepperWindow', - props: makeVStepperWindowProps(), - emits: { - 'update:modelValue': v => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const group = inject$1(VStepperSymbol, null); - const _model = useProxiedModel(props, 'modelValue'); - const model = computed$9({ - get() { - // Always return modelValue if defined - // or if not within a VStepper group - if (_model.value != null || !group) return _model.value; - - // If inside of a VStepper, find the currently selected - // item by id. Item value may be assigned by its index - return group.items.value.find(item => group.selected.value.includes(item.id))?.value; - }, - set(val) { - _model.value = val; - } - }); - useRender(() => { - const windowProps = VWindow.filterProps(props); - return _createVNode$f(VWindow, _mergeProps$9({ - "_as": "VStepperWindow" - }, windowProps, { - "modelValue": model.value, - "onUpdate:modelValue": $event => model.value = $event, - "class": ['v-stepper-window', props.class], - "style": props.style, - "mandatory": false, - "touch": false - }), slots); - }); - return {}; - } -}); - -const {createVNode:_createVNode$e,mergeProps:_mergeProps$8,resolveDirective:_resolveDirective$9} = await importShared('vue'); -const makeVStepperWindowItemProps = propsFactory({ - ...makeVWindowItemProps() -}, 'VStepperWindowItem'); -const VStepperWindowItem = genericComponent()({ - name: 'VStepperWindowItem', - props: makeVStepperWindowItemProps(), - setup(props, _ref) { - let { - slots - } = _ref; - useRender(() => { - const windowItemProps = VWindowItem.filterProps(props); - return _createVNode$e(VWindowItem, _mergeProps$8({ - "_as": "VStepperWindowItem" - }, windowItemProps, { - "class": ['v-stepper-window-item', props.class], - "style": props.style - }), slots); - }); - return {}; - } -}); - -const {mergeProps:_mergeProps$7,resolveDirective:_resolveDirective$8,createVNode:_createVNode$d,Fragment:_Fragment$4} = await importShared('vue'); -const {computed: computed$8,toRefs} = await importShared('vue'); -const makeStepperProps = propsFactory({ - altLabels: Boolean, - bgColor: String, - completeIcon: String, - editIcon: String, - editable: Boolean, - errorIcon: String, - hideActions: Boolean, - items: { - type: Array, - default: () => [] - }, - itemTitle: { - type: String, - default: 'title' - }, - itemValue: { - type: String, - default: 'value' - }, - nonLinear: Boolean, - flat: Boolean, - ...makeDisplayProps() -}, 'Stepper'); -const makeVStepperProps = propsFactory({ - ...makeStepperProps(), - ...makeGroupProps({ - mandatory: 'force', - selectedClass: 'v-stepper-item--selected' - }), - ...makeVSheetProps(), - ...only(makeVStepperActionsProps(), ['prevText', 'nextText']) -}, 'VStepper'); -const VStepper = genericComponent()({ - name: 'VStepper', - props: makeVStepperProps(), - emits: { - 'update:modelValue': v => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const { - items: _items, - next, - prev, - selected - } = useGroup(props, VStepperSymbol); - const { - displayClasses, - mobile - } = useDisplay(props); - const { - completeIcon, - editIcon, - errorIcon, - color, - editable, - prevText, - nextText - } = toRefs(props); - const items = computed$8(() => props.items.map((item, index) => { - const title = getPropertyFromItem(item, props.itemTitle, item); - const value = getPropertyFromItem(item, props.itemValue, index + 1); - return { - title, - value, - raw: item - }; - })); - const activeIndex = computed$8(() => { - return _items.value.findIndex(item => selected.value.includes(item.id)); - }); - const disabled = computed$8(() => { - if (props.disabled) return props.disabled; - if (activeIndex.value === 0) return 'prev'; - if (activeIndex.value === _items.value.length - 1) return 'next'; - return false; - }); - provideDefaults({ - VStepperItem: { - editable, - errorIcon, - completeIcon, - editIcon, - prevText, - nextText - }, - VStepperActions: { - color, - disabled, - prevText, - nextText - } - }); - useRender(() => { - const sheetProps = VSheet.filterProps(props); - const hasHeader = !!(slots.header || props.items.length); - const hasWindow = props.items.length > 0; - const hasActions = !props.hideActions && !!(hasWindow || slots.actions); - return _createVNode$d(VSheet, _mergeProps$7(sheetProps, { - "color": props.bgColor, - "class": ['v-stepper', { - 'v-stepper--alt-labels': props.altLabels, - 'v-stepper--flat': props.flat, - 'v-stepper--non-linear': props.nonLinear, - 'v-stepper--mobile': mobile.value - }, displayClasses.value, props.class], - "style": props.style - }), { - default: () => [hasHeader && _createVNode$d(VStepperHeader, { - "key": "stepper-header" - }, { - default: () => [items.value.map((_ref2, index) => { - let { - raw, - ...item - } = _ref2; - return _createVNode$d(_Fragment$4, null, [!!index && _createVNode$d(VDivider, null, null), _createVNode$d(VStepperItem, item, { - default: slots[`header-item.${item.value}`] ?? slots.header, - icon: slots.icon, - title: slots.title, - subtitle: slots.subtitle - })]); - })] - }), hasWindow && _createVNode$d(VStepperWindow, { - "key": "stepper-window" - }, { - default: () => [items.value.map(item => _createVNode$d(VStepperWindowItem, { - "value": item.value - }, { - default: () => slots[`item.${item.value}`]?.(item) ?? slots.item?.(item) - }))] - }), slots.default?.({ - prev, - next - }), hasActions && (slots.actions?.({ - next, - prev - }) ?? _createVNode$d(VStepperActions, { - "key": "stepper-actions", - "onClick:prev": prev, - "onClick:next": next - }, slots))] - }); - }); - return { - prev, - next - }; - } -}); - -const {mergeProps:_mergeProps$6,Fragment:_Fragment$3,createVNode:_createVNode$c} = await importShared('vue'); -const {computed: computed$7,ref: ref$4} = await importShared('vue'); -const makeVSwitchProps = propsFactory({ - indeterminate: Boolean, - inset: Boolean, - flat: Boolean, - loading: { - type: [Boolean, String], - default: false - }, - ...makeVInputProps(), - ...makeVSelectionControlProps() -}, 'VSwitch'); -const VSwitch = genericComponent()({ - name: 'VSwitch', - inheritAttrs: false, - props: makeVSwitchProps(), - emits: { - 'update:focused': focused => true, - 'update:modelValue': value => true, - 'update:indeterminate': value => true - }, - setup(props, _ref) { - let { - attrs, - slots - } = _ref; - const indeterminate = useProxiedModel(props, 'indeterminate'); - const model = useProxiedModel(props, 'modelValue'); - const { - loaderClasses - } = useLoader(props); - const { - isFocused, - focus, - blur - } = useFocus(props); - const control = ref$4(); - const isForcedColorsModeActive = IN_BROWSER && window.matchMedia('(forced-colors: active)').matches; - const loaderColor = computed$7(() => { - return typeof props.loading === 'string' && props.loading !== '' ? props.loading : props.color; - }); - const uid = getUid(); - const id = computed$7(() => props.id || `switch-${uid}`); - function onChange() { - if (indeterminate.value) { - indeterminate.value = false; - } - } - function onTrackClick(e) { - e.stopPropagation(); - e.preventDefault(); - control.value?.input?.click(); - } - useRender(() => { - const [rootAttrs, controlAttrs] = filterInputAttrs(attrs); - const inputProps = VInput.filterProps(props); - const controlProps = VSelectionControl.filterProps(props); - return _createVNode$c(VInput, _mergeProps$6({ - "class": ['v-switch', { - 'v-switch--flat': props.flat - }, { - 'v-switch--inset': props.inset - }, { - 'v-switch--indeterminate': indeterminate.value - }, loaderClasses.value, props.class] - }, rootAttrs, inputProps, { - "modelValue": model.value, - "onUpdate:modelValue": $event => model.value = $event, - "id": id.value, - "focused": isFocused.value, - "style": props.style - }), { - ...slots, - default: _ref2 => { - let { - id, - messagesId, - isDisabled, - isReadonly, - isValid - } = _ref2; - const slotProps = { - model, - isValid - }; - return _createVNode$c(VSelectionControl, _mergeProps$6({ - "ref": control - }, controlProps, { - "modelValue": model.value, - "onUpdate:modelValue": [$event => model.value = $event, onChange], - "id": id.value, - "aria-describedby": messagesId.value, - "type": "checkbox", - "aria-checked": indeterminate.value ? 'mixed' : undefined, - "disabled": isDisabled.value, - "readonly": isReadonly.value, - "onFocus": focus, - "onBlur": blur - }, controlAttrs), { - ...slots, - default: _ref3 => { - let { - backgroundColorClasses, - backgroundColorStyles - } = _ref3; - return _createVNode$c("div", { - "class": ['v-switch__track', !isForcedColorsModeActive ? backgroundColorClasses.value : undefined], - "style": backgroundColorStyles.value, - "onClick": onTrackClick - }, [slots['track-true'] && _createVNode$c("div", { - "key": "prepend", - "class": "v-switch__track-true" - }, [slots['track-true'](slotProps)]), slots['track-false'] && _createVNode$c("div", { - "key": "append", - "class": "v-switch__track-false" - }, [slots['track-false'](slotProps)])]); - }, - input: _ref4 => { - let { - inputNode, - icon, - backgroundColorClasses, - backgroundColorStyles - } = _ref4; - return _createVNode$c(_Fragment$3, null, [inputNode, _createVNode$c("div", { - "class": ['v-switch__thumb', { - 'v-switch__thumb--filled': icon || props.loading - }, props.inset || isForcedColorsModeActive ? undefined : backgroundColorClasses.value], - "style": props.inset ? undefined : backgroundColorStyles.value - }, [slots.thumb ? _createVNode$c(VDefaultsProvider, { - "defaults": { - VIcon: { - icon, - size: 'x-small' - } - } - }, { - default: () => [slots.thumb({ - ...slotProps, - icon - })] - }) : _createVNode$c(VScaleTransition, null, { - default: () => [!props.loading ? icon && _createVNode$c(VIcon, { - "key": String(icon), - "icon": icon, - "size": "x-small" - }, null) : _createVNode$c(LoaderSlot, { - "name": "v-switch", - "active": true, - "color": isValid.value === false ? undefined : loaderColor.value - }, { - default: slotProps => slots.loader ? slots.loader(slotProps) : _createVNode$c(VProgressCircular, { - "active": slotProps.isActive, - "color": slotProps.color, - "indeterminate": true, - "size": "16", - "width": "2" - }, null) - })] - })])]); - } - }); - } - }); - }); - return {}; - } -}); - -const {createVNode:_createVNode$b,resolveDirective:_resolveDirective$7} = await importShared('vue'); -const {computed: computed$6,shallowRef: shallowRef$2,toRef: toRef$4} = await importShared('vue'); -const makeVSystemBarProps = propsFactory({ - color: String, - height: [Number, String], - window: Boolean, - ...makeComponentProps(), - ...makeElevationProps(), - ...makeLayoutItemProps(), - ...makeRoundedProps(), - ...makeTagProps(), - ...makeThemeProps() -}, 'VSystemBar'); -const VSystemBar = genericComponent()({ - name: 'VSystemBar', - props: makeVSystemBarProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - themeClasses - } = provideTheme(props); - const { - backgroundColorClasses, - backgroundColorStyles - } = useBackgroundColor(toRef$4(props, 'color')); - const { - elevationClasses - } = useElevation(props); - const { - roundedClasses - } = useRounded(props); - const { - ssrBootStyles - } = useSsrBoot(); - const height = computed$6(() => props.height ?? (props.window ? 32 : 24)); - const { - layoutItemStyles - } = useLayoutItem({ - id: props.name, - order: computed$6(() => parseInt(props.order, 10)), - position: shallowRef$2('top'), - layoutSize: height, - elementSize: height, - active: computed$6(() => true), - absolute: toRef$4(props, 'absolute') - }); - useRender(() => _createVNode$b(props.tag, { - "class": ['v-system-bar', { - 'v-system-bar--window': props.window - }, themeClasses.value, backgroundColorClasses.value, elevationClasses.value, roundedClasses.value, props.class], - "style": [backgroundColorStyles.value, layoutItemStyles.value, ssrBootStyles.value, props.style] - }, slots)); - return {}; - } -}); - -// Types - -const VTabsSymbol = Symbol.for('vuetify:v-tabs'); - -const {mergeProps:_mergeProps$5,createVNode:_createVNode$a,Fragment:_Fragment$2} = await importShared('vue'); -const {computed: computed$5,ref: ref$3} = await importShared('vue'); -const makeVTabProps = propsFactory({ - fixed: Boolean, - sliderColor: String, - hideSlider: Boolean, - direction: { - type: String, - default: 'horizontal' - }, - ...omit(makeVBtnProps({ - selectedClass: 'v-tab--selected', - variant: 'text' - }), ['active', 'block', 'flat', 'location', 'position', 'symbol']) -}, 'VTab'); -const VTab = genericComponent()({ - name: 'VTab', - props: makeVTabProps(), - setup(props, _ref) { - let { - slots, - attrs - } = _ref; - const { - textColorClasses: sliderColorClasses, - textColorStyles: sliderColorStyles - } = useTextColor(props, 'sliderColor'); - const rootEl = ref$3(); - const sliderEl = ref$3(); - const isHorizontal = computed$5(() => props.direction === 'horizontal'); - const isSelected = computed$5(() => rootEl.value?.group?.isSelected.value ?? false); - function updateSlider(_ref2) { - let { - value - } = _ref2; - if (value) { - const prevEl = rootEl.value?.$el.parentElement?.querySelector('.v-tab--selected .v-tab__slider'); - const nextEl = sliderEl.value; - if (!prevEl || !nextEl) return; - const color = getComputedStyle(prevEl).color; - const prevBox = prevEl.getBoundingClientRect(); - const nextBox = nextEl.getBoundingClientRect(); - const xy = isHorizontal.value ? 'x' : 'y'; - const XY = isHorizontal.value ? 'X' : 'Y'; - const rightBottom = isHorizontal.value ? 'right' : 'bottom'; - const widthHeight = isHorizontal.value ? 'width' : 'height'; - const prevPos = prevBox[xy]; - const nextPos = nextBox[xy]; - const delta = prevPos > nextPos ? prevBox[rightBottom] - nextBox[rightBottom] : prevBox[xy] - nextBox[xy]; - const origin = Math.sign(delta) > 0 ? isHorizontal.value ? 'right' : 'bottom' : Math.sign(delta) < 0 ? isHorizontal.value ? 'left' : 'top' : 'center'; - const size = Math.abs(delta) + (Math.sign(delta) < 0 ? prevBox[widthHeight] : nextBox[widthHeight]); - const scale = size / Math.max(prevBox[widthHeight], nextBox[widthHeight]) || 0; - const initialScale = prevBox[widthHeight] / nextBox[widthHeight] || 0; - const sigma = 1.5; - animate(nextEl, { - backgroundColor: [color, 'currentcolor'], - transform: [`translate${XY}(${delta}px) scale${XY}(${initialScale})`, `translate${XY}(${delta / sigma}px) scale${XY}(${(scale - 1) / sigma + 1})`, 'none'], - transformOrigin: Array(3).fill(origin) - }, { - duration: 225, - easing: standardEasing - }); - } - } - useRender(() => { - const btnProps = VBtn.filterProps(props); - return _createVNode$a(VBtn, _mergeProps$5({ - "symbol": VTabsSymbol, - "ref": rootEl, - "class": ['v-tab', props.class], - "style": props.style, - "tabindex": isSelected.value ? 0 : -1, - "role": "tab", - "aria-selected": String(isSelected.value), - "active": false - }, btnProps, attrs, { - "block": props.fixed, - "maxWidth": props.fixed ? 300 : undefined, - "onGroup:selected": updateSlider - }), { - ...slots, - default: () => _createVNode$a(_Fragment$2, null, [slots.default?.() ?? props.text, !props.hideSlider && _createVNode$a("div", { - "ref": sliderEl, - "class": ['v-tab__slider', sliderColorClasses.value], - "style": sliderColorStyles.value - }, null)]) - }); - }); - return forwardRefs({}, rootEl); - } -}); - -const {createVNode:_createVNode$9,mergeProps:_mergeProps$4,resolveDirective:_resolveDirective$6} = await importShared('vue'); -const {computed: computed$4,inject} = await importShared('vue'); -const makeVTabsWindowProps = propsFactory({ - ...omit(makeVWindowProps(), ['continuous', 'nextIcon', 'prevIcon', 'showArrows', 'touch', 'mandatory']) -}, 'VTabsWindow'); -const VTabsWindow = genericComponent()({ - name: 'VTabsWindow', - props: makeVTabsWindowProps(), - emits: { - 'update:modelValue': v => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const group = inject(VTabsSymbol, null); - const _model = useProxiedModel(props, 'modelValue'); - const model = computed$4({ - get() { - // Always return modelValue if defined - // or if not within a VTabs group - if (_model.value != null || !group) return _model.value; - - // If inside of a VTabs, find the currently selected - // item by id. Item value may be assigned by its index - return group.items.value.find(item => group.selected.value.includes(item.id))?.value; - }, - set(val) { - _model.value = val; - } - }); - useRender(() => { - const windowProps = VWindow.filterProps(props); - return _createVNode$9(VWindow, _mergeProps$4({ - "_as": "VTabsWindow" - }, windowProps, { - "modelValue": model.value, - "onUpdate:modelValue": $event => model.value = $event, - "class": ['v-tabs-window', props.class], - "style": props.style, - "mandatory": false, - "touch": false - }), slots); - }); - return {}; - } -}); - -const {createVNode:_createVNode$8,mergeProps:_mergeProps$3,resolveDirective:_resolveDirective$5} = await importShared('vue'); -const makeVTabsWindowItemProps = propsFactory({ - ...makeVWindowItemProps() -}, 'VTabsWindowItem'); -const VTabsWindowItem = genericComponent()({ - name: 'VTabsWindowItem', - props: makeVTabsWindowItemProps(), - setup(props, _ref) { - let { - slots - } = _ref; - useRender(() => { - const windowItemProps = VWindowItem.filterProps(props); - return _createVNode$8(VWindowItem, _mergeProps$3({ - "_as": "VTabsWindowItem" - }, windowItemProps, { - "class": ['v-tabs-window-item', props.class], - "style": props.style - }), slots); - }); - return {}; - } -}); - -const {createVNode:_createVNode$7,mergeProps:_mergeProps$2,resolveDirective:_resolveDirective$4,Fragment:_Fragment$1} = await importShared('vue'); -const {computed: computed$3,toRef: toRef$3} = await importShared('vue'); -function parseItems(items) { - if (!items) return []; - return items.map(item => { - if (!isObject(item)) return { - text: item, - value: item - }; - return item; - }); -} -const makeVTabsProps = propsFactory({ - alignTabs: { - type: String, - default: 'start' - }, - color: String, - fixedTabs: Boolean, - items: { - type: Array, - default: () => [] - }, - stacked: Boolean, - bgColor: String, - grow: Boolean, - height: { - type: [Number, String], - default: undefined - }, - hideSlider: Boolean, - sliderColor: String, - ...makeVSlideGroupProps({ - mandatory: 'force', - selectedClass: 'v-tab-item--selected' - }), - ...makeDensityProps(), - ...makeTagProps() -}, 'VTabs'); -const VTabs = genericComponent()({ - name: 'VTabs', - props: makeVTabsProps(), - emits: { - 'update:modelValue': v => true - }, - setup(props, _ref) { - let { - attrs, - slots - } = _ref; - const model = useProxiedModel(props, 'modelValue'); - const items = computed$3(() => parseItems(props.items)); - const { - densityClasses - } = useDensity(props); - const { - backgroundColorClasses, - backgroundColorStyles - } = useBackgroundColor(toRef$3(props, 'bgColor')); - const { - scopeId - } = useScopeId(); - provideDefaults({ - VTab: { - color: toRef$3(props, 'color'), - direction: toRef$3(props, 'direction'), - stacked: toRef$3(props, 'stacked'), - fixed: toRef$3(props, 'fixedTabs'), - sliderColor: toRef$3(props, 'sliderColor'), - hideSlider: toRef$3(props, 'hideSlider') - } - }); - useRender(() => { - const slideGroupProps = VSlideGroup.filterProps(props); - const hasWindow = !!(slots.window || props.items.length > 0); - return _createVNode$7(_Fragment$1, null, [_createVNode$7(VSlideGroup, _mergeProps$2(slideGroupProps, { - "modelValue": model.value, - "onUpdate:modelValue": $event => model.value = $event, - "class": ['v-tabs', `v-tabs--${props.direction}`, `v-tabs--align-tabs-${props.alignTabs}`, { - 'v-tabs--fixed-tabs': props.fixedTabs, - 'v-tabs--grow': props.grow, - 'v-tabs--stacked': props.stacked - }, densityClasses.value, backgroundColorClasses.value, props.class], - "style": [{ - '--v-tabs-height': convertToUnit(props.height) - }, backgroundColorStyles.value, props.style], - "role": "tablist", - "symbol": VTabsSymbol - }, scopeId, attrs), { - default: () => [slots.default?.() ?? items.value.map(item => slots.tab?.({ - item - }) ?? _createVNode$7(VTab, _mergeProps$2(item, { - "key": item.text, - "value": item.value - }), { - default: slots[`tab.${item.value}`] ? () => slots[`tab.${item.value}`]?.({ - item - }) : undefined - }))] - }), hasWindow && _createVNode$7(VTabsWindow, _mergeProps$2({ - "modelValue": model.value, - "onUpdate:modelValue": $event => model.value = $event, - "key": "tabs-window" - }, scopeId), { - default: () => [items.value.map(item => slots.item?.({ - item - }) ?? _createVNode$7(VTabsWindowItem, { - "value": item.value - }, { - default: () => slots[`item.${item.value}`]?.({ - item - }) - })), slots.window?.()] - })]); - }); - return {}; - } -}); - -const {vModelText:_vModelText,withDirectives:_withDirectives,mergeProps:_mergeProps$1,resolveDirective:_resolveDirective$3,createVNode:_createVNode$6,Fragment:_Fragment} = await importShared('vue'); -const {computed: computed$2,nextTick,onBeforeUnmount,onMounted,ref: ref$2,shallowRef: shallowRef$1,watch: watch$1,watchEffect} = await importShared('vue'); -const makeVTextareaProps = propsFactory({ - autoGrow: Boolean, - autofocus: Boolean, - counter: [Boolean, Number, String], - counterValue: Function, - prefix: String, - placeholder: String, - persistentPlaceholder: Boolean, - persistentCounter: Boolean, - noResize: Boolean, - rows: { - type: [Number, String], - default: 5, - validator: v => !isNaN(parseFloat(v)) - }, - maxRows: { - type: [Number, String], - validator: v => !isNaN(parseFloat(v)) - }, - suffix: String, - modelModifiers: Object, - ...makeVInputProps(), - ...makeVFieldProps() -}, 'VTextarea'); -const VTextarea = genericComponent()({ - name: 'VTextarea', - directives: { - Intersect - }, - inheritAttrs: false, - props: makeVTextareaProps(), - emits: { - 'click:control': e => true, - 'mousedown:control': e => true, - 'update:focused': focused => true, - 'update:modelValue': val => true - }, - setup(props, _ref) { - let { - attrs, - emit, - slots - } = _ref; - const model = useProxiedModel(props, 'modelValue'); - const { - isFocused, - focus, - blur - } = useFocus(props); - const counterValue = computed$2(() => { - return typeof props.counterValue === 'function' ? props.counterValue(model.value) : (model.value || '').toString().length; - }); - const max = computed$2(() => { - if (attrs.maxlength) return attrs.maxlength; - if (!props.counter || typeof props.counter !== 'number' && typeof props.counter !== 'string') return undefined; - return props.counter; - }); - function onIntersect(isIntersecting, entries) { - if (!props.autofocus || !isIntersecting) return; - entries[0].target?.focus?.(); - } - const vInputRef = ref$2(); - const vFieldRef = ref$2(); - const controlHeight = shallowRef$1(''); - const textareaRef = ref$2(); - const isActive = computed$2(() => props.persistentPlaceholder || isFocused.value || props.active); - function onFocus() { - if (textareaRef.value !== document.activeElement) { - textareaRef.value?.focus(); - } - if (!isFocused.value) focus(); - } - function onControlClick(e) { - onFocus(); - emit('click:control', e); - } - function onControlMousedown(e) { - emit('mousedown:control', e); - } - function onClear(e) { - e.stopPropagation(); - onFocus(); - nextTick(() => { - model.value = ''; - callEvent(props['onClick:clear'], e); - }); - } - function onInput(e) { - const el = e.target; - model.value = el.value; - if (props.modelModifiers?.trim) { - const caretPosition = [el.selectionStart, el.selectionEnd]; - nextTick(() => { - el.selectionStart = caretPosition[0]; - el.selectionEnd = caretPosition[1]; - }); - } - } - const sizerRef = ref$2(); - const rows = ref$2(+props.rows); - const isPlainOrUnderlined = computed$2(() => ['plain', 'underlined'].includes(props.variant)); - watchEffect(() => { - if (!props.autoGrow) rows.value = +props.rows; - }); - function calculateInputHeight() { - if (!props.autoGrow) return; - nextTick(() => { - if (!sizerRef.value || !vFieldRef.value) return; - const style = getComputedStyle(sizerRef.value); - const fieldStyle = getComputedStyle(vFieldRef.value.$el); - const padding = parseFloat(style.getPropertyValue('--v-field-padding-top')) + parseFloat(style.getPropertyValue('--v-input-padding-top')) + parseFloat(style.getPropertyValue('--v-field-padding-bottom')); - const height = sizerRef.value.scrollHeight; - const lineHeight = parseFloat(style.lineHeight); - const minHeight = Math.max(parseFloat(props.rows) * lineHeight + padding, parseFloat(fieldStyle.getPropertyValue('--v-input-control-height'))); - const maxHeight = parseFloat(props.maxRows) * lineHeight + padding || Infinity; - const newHeight = clamp(height ?? 0, minHeight, maxHeight); - rows.value = Math.floor((newHeight - padding) / lineHeight); - controlHeight.value = convertToUnit(newHeight); - }); - } - onMounted(calculateInputHeight); - watch$1(model, calculateInputHeight); - watch$1(() => props.rows, calculateInputHeight); - watch$1(() => props.maxRows, calculateInputHeight); - watch$1(() => props.density, calculateInputHeight); - let observer; - watch$1(sizerRef, val => { - if (val) { - observer = new ResizeObserver(calculateInputHeight); - observer.observe(sizerRef.value); - } else { - observer?.disconnect(); - } - }); - onBeforeUnmount(() => { - observer?.disconnect(); - }); - useRender(() => { - const hasCounter = !!(slots.counter || props.counter || props.counterValue); - const hasDetails = !!(hasCounter || slots.details); - const [rootAttrs, inputAttrs] = filterInputAttrs(attrs); - const { - modelValue: _, - ...inputProps - } = VInput.filterProps(props); - const fieldProps = filterFieldProps(props); - return _createVNode$6(VInput, _mergeProps$1({ - "ref": vInputRef, - "modelValue": model.value, - "onUpdate:modelValue": $event => model.value = $event, - "class": ['v-textarea v-text-field', { - 'v-textarea--prefixed': props.prefix, - 'v-textarea--suffixed': props.suffix, - 'v-text-field--prefixed': props.prefix, - 'v-text-field--suffixed': props.suffix, - 'v-textarea--auto-grow': props.autoGrow, - 'v-textarea--no-resize': props.noResize || props.autoGrow, - 'v-input--plain-underlined': isPlainOrUnderlined.value - }, props.class], - "style": props.style - }, rootAttrs, inputProps, { - "centerAffix": rows.value === 1 && !isPlainOrUnderlined.value, - "focused": isFocused.value - }), { - ...slots, - default: _ref2 => { - let { - id, - isDisabled, - isDirty, - isReadonly, - isValid - } = _ref2; - return _createVNode$6(VField, _mergeProps$1({ - "ref": vFieldRef, - "style": { - '--v-textarea-control-height': controlHeight.value - }, - "onClick": onControlClick, - "onMousedown": onControlMousedown, - "onClick:clear": onClear, - "onClick:prependInner": props['onClick:prependInner'], - "onClick:appendInner": props['onClick:appendInner'] - }, fieldProps, { - "id": id.value, - "active": isActive.value || isDirty.value, - "centerAffix": rows.value === 1 && !isPlainOrUnderlined.value, - "dirty": isDirty.value || props.dirty, - "disabled": isDisabled.value, - "focused": isFocused.value, - "error": isValid.value === false - }), { - ...slots, - default: _ref3 => { - let { - props: { - class: fieldClass, - ...slotProps - } - } = _ref3; - return _createVNode$6(_Fragment, null, [props.prefix && _createVNode$6("span", { - "class": "v-text-field__prefix" - }, [props.prefix]), _withDirectives(_createVNode$6("textarea", _mergeProps$1({ - "ref": textareaRef, - "class": fieldClass, - "value": model.value, - "onInput": onInput, - "autofocus": props.autofocus, - "readonly": isReadonly.value, - "disabled": isDisabled.value, - "placeholder": props.placeholder, - "rows": props.rows, - "name": props.name, - "onFocus": onFocus, - "onBlur": blur - }, slotProps, inputAttrs), null), [[_resolveDirective$3("intersect"), { - handler: onIntersect - }, null, { - once: true - }]]), props.autoGrow && _withDirectives(_createVNode$6("textarea", { - "class": [fieldClass, 'v-textarea__sizer'], - "id": `${slotProps.id}-sizer`, - "onUpdate:modelValue": $event => model.value = $event, - "ref": sizerRef, - "readonly": true, - "aria-hidden": "true" - }, null), [[_vModelText, model.value]]), props.suffix && _createVNode$6("span", { - "class": "v-text-field__suffix" - }, [props.suffix])]); - } - }); - }, - details: hasDetails ? slotProps => _createVNode$6(_Fragment, null, [slots.details?.(slotProps), hasCounter && _createVNode$6(_Fragment, null, [_createVNode$6("span", null, null), _createVNode$6(VCounter, { - "active": props.persistentCounter || isFocused.value, - "value": counterValue.value, - "max": max.value, - "disabled": props.disabled - }, slots.counter)])]) : undefined - }); - }); - return forwardRefs({}, vInputRef, vFieldRef, textareaRef); - } -}); - -const {createVNode:_createVNode$5} = await importShared('vue'); -const makeVThemeProviderProps = propsFactory({ - withBackground: Boolean, - ...makeComponentProps(), - ...makeThemeProps(), - ...makeTagProps() -}, 'VThemeProvider'); -const VThemeProvider = genericComponent()({ - name: 'VThemeProvider', - props: makeVThemeProviderProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - themeClasses - } = provideTheme(props); - return () => { - if (!props.withBackground) return slots.default?.(); - return _createVNode$5(props.tag, { - "class": ['v-theme-provider', themeClasses.value, props.class], - "style": props.style - }, { - default: () => [slots.default?.()] - }); - }; - } -}); - -const {resolveDirective:_resolveDirective$2,createVNode:_createVNode$4} = await importShared('vue'); -const {toRef: toRef$2} = await importShared('vue'); -const makeVTimelineDividerProps = propsFactory({ - dotColor: String, - fillDot: Boolean, - hideDot: Boolean, - icon: IconValue, - iconColor: String, - lineColor: String, - ...makeComponentProps(), - ...makeRoundedProps(), - ...makeSizeProps(), - ...makeElevationProps() -}, 'VTimelineDivider'); -const VTimelineDivider = genericComponent()({ - name: 'VTimelineDivider', - props: makeVTimelineDividerProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - sizeClasses, - sizeStyles - } = useSize(props, 'v-timeline-divider__dot'); - const { - backgroundColorStyles, - backgroundColorClasses - } = useBackgroundColor(toRef$2(props, 'dotColor')); - const { - roundedClasses - } = useRounded(props, 'v-timeline-divider__dot'); - const { - elevationClasses - } = useElevation(props); - const { - backgroundColorClasses: lineColorClasses, - backgroundColorStyles: lineColorStyles - } = useBackgroundColor(toRef$2(props, 'lineColor')); - useRender(() => _createVNode$4("div", { - "class": ['v-timeline-divider', { - 'v-timeline-divider--fill-dot': props.fillDot - }, props.class], - "style": props.style - }, [_createVNode$4("div", { - "class": ['v-timeline-divider__before', lineColorClasses.value], - "style": lineColorStyles.value - }, null), !props.hideDot && _createVNode$4("div", { - "key": "dot", - "class": ['v-timeline-divider__dot', elevationClasses.value, roundedClasses.value, sizeClasses.value], - "style": sizeStyles.value - }, [_createVNode$4("div", { - "class": ['v-timeline-divider__inner-dot', backgroundColorClasses.value, roundedClasses.value], - "style": backgroundColorStyles.value - }, [!slots.default ? _createVNode$4(VIcon, { - "key": "icon", - "color": props.iconColor, - "icon": props.icon, - "size": props.size - }, null) : _createVNode$4(VDefaultsProvider, { - "key": "icon-defaults", - "disabled": !props.icon, - "defaults": { - VIcon: { - color: props.iconColor, - icon: props.icon, - size: props.size - } - } - }, slots.default)])]), _createVNode$4("div", { - "class": ['v-timeline-divider__after', lineColorClasses.value], - "style": lineColorStyles.value - }, null)])); - return {}; - } -}); - -const {resolveDirective:_resolveDirective$1,createVNode:_createVNode$3} = await importShared('vue'); -const {ref: ref$1,shallowRef,watch} = await importShared('vue'); -// Types -const makeVTimelineItemProps = propsFactory({ - density: String, - dotColor: String, - fillDot: Boolean, - hideDot: Boolean, - hideOpposite: { - type: Boolean, - default: undefined - }, - icon: IconValue, - iconColor: String, - lineInset: [Number, String], - ...makeComponentProps(), - ...makeDimensionProps(), - ...makeElevationProps(), - ...makeRoundedProps(), - ...makeSizeProps(), - ...makeTagProps() -}, 'VTimelineItem'); -const VTimelineItem = genericComponent()({ - name: 'VTimelineItem', - props: makeVTimelineItemProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - dimensionStyles - } = useDimension(props); - const dotSize = shallowRef(0); - const dotRef = ref$1(); - watch(dotRef, newValue => { - if (!newValue) return; - dotSize.value = newValue.$el.querySelector('.v-timeline-divider__dot')?.getBoundingClientRect().width ?? 0; - }, { - flush: 'post' - }); - useRender(() => _createVNode$3("div", { - "class": ['v-timeline-item', { - 'v-timeline-item--fill-dot': props.fillDot - }, props.class], - "style": [{ - '--v-timeline-dot-size': convertToUnit(dotSize.value), - '--v-timeline-line-inset': props.lineInset ? `calc(var(--v-timeline-dot-size) / 2 + ${convertToUnit(props.lineInset)})` : convertToUnit(0) - }, props.style] - }, [_createVNode$3("div", { - "class": "v-timeline-item__body", - "style": dimensionStyles.value - }, [slots.default?.()]), _createVNode$3(VTimelineDivider, { - "ref": dotRef, - "hideDot": props.hideDot, - "icon": props.icon, - "iconColor": props.iconColor, - "size": props.size, - "elevation": props.elevation, - "dotColor": props.dotColor, - "fillDot": props.fillDot, - "rounded": props.rounded - }, { - default: slots.icon - }), props.density !== 'compact' && _createVNode$3("div", { - "class": "v-timeline-item__opposite" - }, [!props.hideOpposite && slots.opposite?.()])])); - return {}; - } -}); - -const {createVNode:_createVNode$2,resolveDirective:_resolveDirective} = await importShared('vue'); -const {computed: computed$1,toRef: toRef$1} = await importShared('vue'); -const makeVTimelineProps = propsFactory({ - align: { - type: String, - default: 'center', - validator: v => ['center', 'start'].includes(v) - }, - direction: { - type: String, - default: 'vertical', - validator: v => ['vertical', 'horizontal'].includes(v) - }, - justify: { - type: String, - default: 'auto', - validator: v => ['auto', 'center'].includes(v) - }, - side: { - type: String, - validator: v => v == null || ['start', 'end'].includes(v) - }, - lineThickness: { - type: [String, Number], - default: 2 - }, - lineColor: String, - truncateLine: { - type: String, - validator: v => ['start', 'end', 'both'].includes(v) - }, - ...only(makeVTimelineItemProps({ - lineInset: 0 - }), ['dotColor', 'fillDot', 'hideOpposite', 'iconColor', 'lineInset', 'size']), - ...makeComponentProps(), - ...makeDensityProps(), - ...makeTagProps(), - ...makeThemeProps() -}, 'VTimeline'); -const VTimeline = genericComponent()({ - name: 'VTimeline', - props: makeVTimelineProps(), - setup(props, _ref) { - let { - slots - } = _ref; - const { - themeClasses - } = provideTheme(props); - const { - densityClasses - } = useDensity(props); - const { - rtlClasses - } = useRtl(); - provideDefaults({ - VTimelineDivider: { - lineColor: toRef$1(props, 'lineColor') - }, - VTimelineItem: { - density: toRef$1(props, 'density'), - dotColor: toRef$1(props, 'dotColor'), - fillDot: toRef$1(props, 'fillDot'), - hideOpposite: toRef$1(props, 'hideOpposite'), - iconColor: toRef$1(props, 'iconColor'), - lineColor: toRef$1(props, 'lineColor'), - lineInset: toRef$1(props, 'lineInset'), - size: toRef$1(props, 'size') - } - }); - const sideClasses = computed$1(() => { - const side = props.side ? props.side : props.density !== 'default' ? 'end' : null; - return side && `v-timeline--side-${side}`; - }); - const truncateClasses = computed$1(() => { - const classes = ['v-timeline--truncate-line-start', 'v-timeline--truncate-line-end']; - switch (props.truncateLine) { - case 'both': - return classes; - case 'start': - return classes[0]; - case 'end': - return classes[1]; - default: - return null; - } - }); - useRender(() => _createVNode$2(props.tag, { - "class": ['v-timeline', `v-timeline--${props.direction}`, `v-timeline--align-${props.align}`, `v-timeline--justify-${props.justify}`, truncateClasses.value, { - 'v-timeline--inset-line': !!props.lineInset - }, themeClasses.value, densityClasses.value, sideClasses.value, rtlClasses.value, props.class], - "style": [{ - '--v-timeline-line-thickness': convertToUnit(props.lineThickness) - }, props.style] - }, slots)); - return {}; - } -}); - -const {createVNode:_createVNode$1} = await importShared('vue'); -const {toRef} = await importShared('vue'); -const makeVToolbarItemsProps = propsFactory({ - ...makeComponentProps(), - ...makeVariantProps({ - variant: 'text' - }) -}, 'VToolbarItems'); -const VToolbarItems = genericComponent()({ - name: 'VToolbarItems', - props: makeVToolbarItemsProps(), - setup(props, _ref) { - let { - slots - } = _ref; - provideDefaults({ - VBtn: { - color: toRef(props, 'color'), - height: 'inherit', - variant: toRef(props, 'variant') - } - }); - useRender(() => _createVNode$1("div", { - "class": ['v-toolbar-items', props.class], - "style": props.style - }, [slots.default?.()])); - return {}; - } -}); - -const {createVNode:_createVNode,mergeProps:_mergeProps} = await importShared('vue'); -const {computed,mergeProps: mergeProps$1,ref} = await importShared('vue'); -const makeVTooltipProps = propsFactory({ - id: String, - text: String, - ...omit(makeVOverlayProps({ - closeOnBack: false, - location: 'end', - locationStrategy: 'connected', - eager: true, - minWidth: 0, - offset: 10, - openOnClick: false, - openOnHover: true, - origin: 'auto', - scrim: false, - scrollStrategy: 'reposition', - transition: false - }), ['absolute', 'persistent']) -}, 'VTooltip'); -const VTooltip = genericComponent()({ - name: 'VTooltip', - props: makeVTooltipProps(), - emits: { - 'update:modelValue': value => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const isActive = useProxiedModel(props, 'modelValue'); - const { - scopeId - } = useScopeId(); - const uid = getUid(); - const id = computed(() => props.id || `v-tooltip-${uid}`); - const overlay = ref(); - const location = computed(() => { - return props.location.split(' ').length > 1 ? props.location : props.location + ' center'; - }); - const origin = computed(() => { - return props.origin === 'auto' || props.origin === 'overlap' || props.origin.split(' ').length > 1 || props.location.split(' ').length > 1 ? props.origin : props.origin + ' center'; - }); - const transition = computed(() => { - if (props.transition) return props.transition; - return isActive.value ? 'scale-transition' : 'fade-transition'; - }); - const activatorProps = computed(() => mergeProps$1({ - 'aria-describedby': id.value - }, props.activatorProps)); - useRender(() => { - const overlayProps = VOverlay.filterProps(props); - return _createVNode(VOverlay, _mergeProps({ - "ref": overlay, - "class": ['v-tooltip', props.class], - "style": props.style, - "id": id.value - }, overlayProps, { - "modelValue": isActive.value, - "onUpdate:modelValue": $event => isActive.value = $event, - "transition": transition.value, - "absolute": true, - "location": location.value, - "origin": origin.value, - "persistent": true, - "role": "tooltip", - "activatorProps": activatorProps.value, - "_disableGlobalStack": true - }, scopeId), { - activator: slots.activator, - default: function () { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - return slots.default?.(...args) ?? props.text; - } - }); - }); - return forwardRefs({}, overlay); - } -}); - -// Composables -const VValidation = genericComponent()({ - name: 'VValidation', - props: makeValidationProps(), - emits: { - 'update:modelValue': value => true - }, - setup(props, _ref) { - let { - slots - } = _ref; - const validation = useValidation(props, 'validation'); - return () => slots.default?.(validation); - } -}); - -const components = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({ - __proto__: null, - VAlert, - VAlertTitle, - VApp, - VAppBar, - VAppBarNavIcon, - VAppBarTitle, - VAutocomplete, - VAvatar, - VBadge, - VBanner, - VBannerActions, - VBannerText, - VBottomNavigation, - VBottomSheet, - VBreadcrumbs, - VBreadcrumbsDivider, - VBreadcrumbsItem, - VBtn, - VBtnGroup, - VBtnToggle, - VCard, - VCardActions, - VCardItem, - VCardSubtitle, - VCardText, - VCardTitle, - VCarousel, - VCarouselItem, - VCheckbox, - VCheckboxBtn, - VChip, - VChipGroup, - VClassIcon, - VCode, - VCol, - VColorPicker, - VCombobox, - VComponentIcon, - VConfirmEdit, - VContainer, - VCounter, - VDataIterator, - VDataTable, - VDataTableFooter, - VDataTableHeaders, - VDataTableRow, - VDataTableRows, - VDataTableServer, - VDataTableVirtual, - VDatePicker, - VDatePickerControls, - VDatePickerHeader, - VDatePickerMonth, - VDatePickerMonths, - VDatePickerYears, - VDefaultsProvider, - VDialog, - VDialogBottomTransition, - VDialogTopTransition, - VDialogTransition, - VDivider, - VEmptyState, - VExpandTransition, - VExpandXTransition, - VExpansionPanel, - VExpansionPanelText, - VExpansionPanelTitle, - VExpansionPanels, - VFab, - VFabTransition, - VFadeTransition, - VField, - VFieldLabel, - VFileInput, - VFooter, - VForm, - VHover, - VIcon, - VImg, - VInfiniteScroll, - VInput, - VItem, - VItemGroup, - VKbd, - VLabel, - VLayout, - VLayoutItem, - VLazy, - VLigatureIcon, - VList, - VListGroup, - VListImg, - VListItem, - VListItemAction, - VListItemMedia, - VListItemSubtitle, - VListItemTitle, - VListSubheader, - VLocaleProvider, - VMain, - VMenu, - VMessages, - VNavigationDrawer, - VNoSsr, - VOtpInput, - VOverlay, - VPagination, - VParallax, - VProgressCircular, - VProgressLinear, - VRadio, - VRadioGroup, - VRangeSlider, - VRating, - VResponsive, - VRow, - VScaleTransition, - VScrollXReverseTransition, - VScrollXTransition, - VScrollYReverseTransition, - VScrollYTransition, - VSelect, - VSelectionControl, - VSelectionControlGroup, - VSheet, - VSkeletonLoader, - VSlideGroup, - VSlideGroupItem, - VSlideXReverseTransition, - VSlideXTransition, - VSlideYReverseTransition, - VSlideYTransition, - VSlider, - VSnackbar, - VSpacer, - VSparkline, - VSpeedDial, - VStepper, - VStepperActions, - VStepperHeader, - VStepperItem, - VStepperWindow, - VStepperWindowItem, - VSvgIcon, - VSwitch, - VSystemBar, - VTab, - VTable, - VTabs, - VTabsWindow, - VTabsWindowItem, - VTextField, - VTextarea, - VThemeProvider, - VTimeline, - VTimelineItem, - VToolbar, - VToolbarItems, - VToolbarTitle, - VTooltip, - VValidation, - VVirtualScroll, - VWindow, - VWindowItem -}, Symbol.toStringTag, { value: 'Module' })); - -// Types - -function mounted$2(el, binding) { - const modifiers = binding.modifiers || {}; - const value = binding.value; - const { - once, - immediate, - ...modifierKeys - } = modifiers; - const defaultValue = !Object.keys(modifierKeys).length; - const { - handler, - options - } = typeof value === 'object' ? value : { - handler: value, - options: { - attributes: modifierKeys?.attr ?? defaultValue, - characterData: modifierKeys?.char ?? defaultValue, - childList: modifierKeys?.child ?? defaultValue, - subtree: modifierKeys?.sub ?? defaultValue - } - }; - const observer = new MutationObserver(function () { - let mutations = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - let observer = arguments.length > 1 ? arguments[1] : undefined; - handler?.(mutations, observer); - if (once) unmounted$2(el, binding); - }); - if (immediate) handler?.([], observer); - el._mutate = Object(el._mutate); - el._mutate[binding.instance.$.uid] = { - observer - }; - observer.observe(el, options); -} -function unmounted$2(el, binding) { - if (!el._mutate?.[binding.instance.$.uid]) return; - el._mutate[binding.instance.$.uid].observer.disconnect(); - delete el._mutate[binding.instance.$.uid]; -} -const Mutate = { - mounted: mounted$2, - unmounted: unmounted$2 -}; - -// Types - -function mounted$1(el, binding) { - const handler = binding.value; - const options = { - passive: !binding.modifiers?.active - }; - window.addEventListener('resize', handler, options); - el._onResize = Object(el._onResize); - el._onResize[binding.instance.$.uid] = { - handler, - options - }; - if (!binding.modifiers?.quiet) { - handler(); - } -} -function unmounted$1(el, binding) { - if (!el._onResize?.[binding.instance.$.uid]) return; - const { - handler, - options - } = el._onResize[binding.instance.$.uid]; - window.removeEventListener('resize', handler, options); - delete el._onResize[binding.instance.$.uid]; -} -const Resize = { - mounted: mounted$1, - unmounted: unmounted$1 -}; - -// Types - -function mounted(el, binding) { - const { - self = false - } = binding.modifiers ?? {}; - const value = binding.value; - const options = typeof value === 'object' && value.options || { - passive: true - }; - const handler = typeof value === 'function' || 'handleEvent' in value ? value : value.handler; - const target = self ? el : binding.arg ? document.querySelector(binding.arg) : window; - if (!target) return; - target.addEventListener('scroll', handler, options); - el._onScroll = Object(el._onScroll); - el._onScroll[binding.instance.$.uid] = { - handler, - options, - // Don't reference self - target: self ? undefined : target - }; -} -function unmounted(el, binding) { - if (!el._onScroll?.[binding.instance.$.uid]) return; - const { - handler, - options, - target = el - } = el._onScroll[binding.instance.$.uid]; - target.removeEventListener('scroll', handler, options); - delete el._onScroll[binding.instance.$.uid]; -} -function updated(el, binding) { - if (binding.value === binding.oldValue) return; - unmounted(el, binding); - mounted(el, binding); -} -const Scroll = { - mounted, - unmounted, - updated -}; - -// Utilities -const {h,mergeProps,render,resolveComponent} = await importShared('vue'); -function useDirectiveComponent(component, props) { - const concreteComponent = typeof component === 'string' ? resolveComponent(component) : component; - const hook = mountComponent(concreteComponent, props); - return { - mounted: hook, - updated: hook, - unmounted(el) { - render(null, el); - } - }; -} -function mountComponent(component, props) { - return function (el, binding, vnode) { - const _props = typeof props === 'function' ? props(binding) : props; - const text = binding.value?.text ?? binding.value ?? _props?.text; - const value = isObject(binding.value) ? binding.value : {}; - - // Get the children from the props or directive value, or the element's children - const children = () => text ?? el.textContent; - - // If vnode.ctx is the same as the instance, then we're bound to a plain element - // and need to find the nearest parent component instance to inherit provides from - const provides = (vnode.ctx === binding.instance.$ ? findComponentParent(vnode, binding.instance.$)?.provides : vnode.ctx?.provides) ?? binding.instance.$.provides; - const node = h(component, mergeProps(_props, value), children); - node.appContext = Object.assign(Object.create(null), binding.instance.$.appContext, { - provides - }); - render(node, el); - }; -} -function findComponentParent(vnode, root) { - // Walk the tree from root until we find the child vnode - const stack = new Set(); - const walk = children => { - for (const child of children) { - if (!child) continue; - if (child === vnode || child.el && vnode.el && child.el === vnode.el) { - return true; - } - stack.add(child); - let result; - if (child.suspense) { - result = walk([child.ssContent]); - } else if (Array.isArray(child.children)) { - result = walk(child.children); - } else if (child.component?.vnode) { - result = walk([child.component?.subTree]); - } - if (result) { - return result; - } - stack.delete(child); - } - return false; - }; - if (!walk([root.subTree])) { - consoleError('Could not find original vnode, component will not inherit provides'); - return root; - } - - // Return the first component parent - const result = Array.from(stack).reverse(); - for (const child of result) { - if (child.component) { - return child.component; - } - } - return root; -} - -// Components -const Tooltip = useDirectiveComponent(VTooltip, binding => { - return { - activator: 'parent', - location: binding.arg?.replace('-', ' '), - text: typeof binding.value === 'boolean' ? undefined : binding.value - }; -}); - -const directives = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({ - __proto__: null, - ClickOutside, - Intersect, - Mutate, - Resize, - Ripple, - Scroll, - Tooltip, - Touch -}, Symbol.toStringTag, { value: 'Module' })); - -const defaults = { - IconBtn: { - icon: true, - color: "default", - variant: "text", - VIcon: { - size: 24 - } - }, - VAlert: { - VBtn: { - color: void 0 - } - }, - VAvatar: { - // ℹ️ Remove after next release - variant: "flat", - VIcon: { - size: 24 - } - }, - VBadge: { - // set v-badge default color to primary - color: "primary" - }, - VBtn: { - // set v-btn default color to primary - color: "primary", - elevation: 0 - }, - VCard: { - elevation: 0, - rounded: "lg" - }, - VMenu: { - elevation: 0 - }, - VChip: { - elevation: 0 - }, - VBottomSheet: { - elevation: 0 - }, - VDialog: { - elevation: 0, - rounded: "lg" - }, - VExpansionPanels: { - elevation: 0 - }, - VList: { - color: "primary", - elevation: 0 - }, - VListItem: { - rounded: "md" - }, - VPagination: { - activeColor: "primary" - }, - VTabs: { - // set v-tabs default color to primary - color: "primary", - VSlideGroup: { - showArrows: true - } - }, - VTooltip: { - // set v-tooltip default location to top - location: "top" - }, - VCheckboxBtn: { - color: "primary", - hideDetails: "auto" - }, - VCheckbox: { - // set v-checkbox default color to primary - color: "primary", - hideDetails: "auto" - }, - VRadioGroup: { - color: "primary", - hideDetails: "auto" - }, - VRadio: { - color: "primary", - hideDetails: "auto" - }, - VSelect: { - variant: "outlined", - color: "primary", - hideDetails: "auto", - menuProps: { elevation: 0 } - }, - VRangeSlider: { - // set v-range-slider default color to primary - color: "primary", - density: "comfortable", - thumbLabel: true, - hideDetails: "auto" - }, - VRating: { - // set v-rating default color to primary - color: "rgba(var(--v-theme-on-background),0.23)", - activeColor: "warning", - halfIncrements: true - }, - VProgressCircular: { - // set v-progress-circular default color to primary - color: "primary" - }, - VSlider: { - // set v-slider default color to primary - color: "primary", - hideDetails: "auto" - }, - VTextField: { - variant: "outlined", - color: "primary", - hideDetails: "auto" - }, - VAutocomplete: { - variant: "outlined", - color: "primary", - hideDetails: "auto" - }, - VCombobox: { - variant: "outlined", - color: "primary", - hideDetails: "auto", - menuProps: { elevation: 0 } - }, - VFileInput: { - variant: "outlined", - color: "primary", - hideDetails: "auto" - }, - VTextarea: { - variant: "outlined", - color: "primary", - hideDetails: "auto" - }, - VSwitch: { - // set v-switch default color to primary - color: "primary", - hideDetails: "auto" - } -}; - -const theme = { - defaultTheme: "light", - themes: { - light: { - dark: false, - colors: { - "primary": "#9155FD", - "secondary": "#8A8D93", - "on-secondary": "#FFFFFF", - "success": "#56CA00", - "info": "#16B1FF", - "warning": "#FFB400", - "error": "#FF4C51", - "on-primary": "#FFFFFF", - "on-success": "#FFFFFF", - "on-warning": "#FFFFFF", - "background": "#F4F5FA", - "on-background": "#3A3541", - "on-surface": "#3A3541", - "grey-50": "#FAFAFA", - "grey-100": "#F0F2F8", - "grey-200": "#EEEEEE", - "grey-300": "#E0E0E0", - "grey-400": "#BDBDBD", - "grey-500": "#9E9E9E", - "grey-600": "#757575", - "grey-700": "#616161", - "grey-800": "#424242", - "grey-900": "#212121", - "perfect-scrollbar-thumb": "#DBDADE", - "skin-bordered-background": "#FFFFFF", - "skin-bordered-surface": "#FFFFFF" - }, - variables: { - "code-color": "#D400FF", - "overlay-scrim-background": "#3A3541", - "overlay-scrim-opacity": 0.5, - "hover-opacity": 0.04, - "focus-opacity": 0.1, - "selected-opacity": 0.12, - "activated-opacity": 0.1, - "pressed-opacity": 0.14, - "dragged-opacity": 0.1, - "border-color": "#3A3541", - "table-header-background": "#F9FAFC", - "custom-background": "#F9F8F9", - // Shadows - "shadow-key-umbra-opacity": "rgba(var(--v-theme-on-surface), 0.08)", - "shadow-key-penumbra-opacity": "rgba(var(--v-theme-on-surface), 0.12)", - "shadow-key-ambient-opacity": "rgba(var(--v-theme-on-surface), 0.04)" - } - }, - dark: { - dark: true, - colors: { - "primary": "#6E66ED", - "secondary": "#8A8D93", - "on-secondary": "#FFFFFF", - "success": "#56CA00", - "info": "#16B1FF", - "warning": "#FFB400", - "error": "#FF4C51", - "on-primary": "#FFFFFF", - "on-success": "#FFFFFF", - "on-warning": "#FFFFFF", - "background": "#0E1116", - "on-background": "#E7E3FC", - "surface": "#14161F", - "on-surface": "#E7E3FC", - "grey-50": "#2A2E42", - "grey-100": "#474360", - "grey-200": "#4A5072", - "grey-300": "#5E6692", - "grey-400": "#7983BB", - "grey-500": "#8692D0", - "grey-600": "#AAB3DE", - "grey-700": "#B6BEE3", - "grey-800": "#CFD3EC", - "grey-900": "#E7E9F6", - "perfect-scrollbar-thumb": "#4A5072", - "skin-bordered-background": "#312d4b", - "skin-bordered-surface": "#312d4b" - }, - variables: { - "code-color": "#d400ff", - "overlay-scrim-background": "#191D21", - "overlay-scrim-opacity": 0.6, - "hover-opacity": 0.04, - "focus-opacity": 0.1, - "selected-opacity": 0.12, - "activated-opacity": 0.1, - "pressed-opacity": 0.14, - "dragged-opacity": 0.1, - "border-color": "#E7E3FC", - "table-header-background": "#14161F", - "custom-background": "#373452", - // Shadows - "shadow-key-umbra-opacity": "rgba(20, 18, 33, 0.08)", - "shadow-key-penumbra-opacity": "rgba(20, 18, 33, 0.12)", - "shadow-key-ambient-opacity": "rgba(20, 18, 33, 0.04)" - } - }, - purple: { - dark: true, - colors: { - "primary": "#9155FD", - "secondary": "#8A8D93", - "on-secondary": "#FFFFFF", - "success": "#56CA00", - "info": "#16B1FF", - "warning": "#FFB400", - "error": "#FF4C51", - "on-primary": "#FFFFFF", - "on-success": "#FFFFFF", - "on-warning": "#FFFFFF", - "background": "#28243D", - "on-background": "#E7E3FC", - "surface": "#312D4B", - "on-surface": "#E7E3FC", - "grey-50": "#2A2E42", - "grey-100": "#474360", - "grey-200": "#4A5072", - "grey-300": "#5E6692", - "grey-400": "#7983BB", - "grey-500": "#8692D0", - "grey-600": "#AAB3DE", - "grey-700": "#B6BEE3", - "grey-800": "#CFD3EC", - "grey-900": "#E7E9F6", - "perfect-scrollbar-thumb": "#4A5072", - "skin-bordered-background": "#312d4b", - "skin-bordered-surface": "#312d4b" - }, - variables: { - "code-color": "#d400ff", - "overlay-scrim-background": "#2C2942", - "overlay-scrim-opacity": 0.6, - "hover-opacity": 0.04, - "focus-opacity": 0.1, - "selected-opacity": 0.12, - "activated-opacity": 0.1, - "pressed-opacity": 0.14, - "dragged-opacity": 0.1, - "border-color": "#E7E3FC", - "table-header-background": "#3D3759", - "custom-background": "#373452", - // Shadows - "shadow-key-umbra-opacity": "rgba(20, 18, 33, 0.08)", - "shadow-key-penumbra-opacity": "rgba(20, 18, 33, 0.12)", - "shadow-key-ambient-opacity": "rgba(20, 18, 33, 0.04)" - } - }, - transparent: { - dark: true, - colors: { - "primary": "#A370F7", - "secondary": "#8A8D93", - "on-secondary": "#FFFFFF", - "success": "#66BB6A", - "info": "#42A5F5", - "warning": "#FFA726", - "error": "#EF5350", - "on-primary": "#FFFFFF", - "on-success": "#FFFFFF", - "on-warning": "#FFFFFF", - "background": "#000000", - "on-background": "#E7E3FC", - "surface": "rgba(30, 30, 30, 0.3)", - "on-surface": "#E7E3FC", - "surface-variant": "rgba(30, 30, 30, 0.2)", - "on-surface-variant": "rgba(255, 255, 255, 0.65)", - "grey-50": "rgba(42, 46, 66, 0.15)", - "grey-100": "rgba(71, 67, 96, 0.15)", - "grey-200": "rgba(74, 80, 114, 0.15)", - "grey-300": "rgba(94, 102, 146, 0.15)", - "grey-400": "rgba(121, 131, 187, 0.15)", - "grey-500": "rgba(134, 146, 208, 0.15)", - "grey-600": "rgba(170, 179, 222, 0.15)", - "grey-700": "rgba(182, 190, 227, 0.15)", - "grey-800": "rgba(207, 211, 236, 0.15)", - "grey-900": "rgba(231, 233, 246, 0.15)", - "perfect-scrollbar-thumb": "rgba(158, 158, 190, 0.4)", - "skin-bordered-background": "rgba(30, 30, 30, 0.3)", - "skin-bordered-surface": "rgba(30, 30, 30, 0.3)", - "card-background": "rgba(30, 30, 30, 0.3)" - }, - variables: { - "code-color": "#6D9EEB", - "overlay-scrim-background": "0, 0, 0", - "overlay-scrim-opacity": 0.7, - "hover-opacity": 0.1, - "focus-opacity": 0.15, - "selected-opacity": 0.2, - "activated-opacity": 0.15, - "pressed-opacity": 0.2, - "dragged-opacity": 0.15, - "border-color": "#E7E3FC", - "table-header-background": "rgba(30, 30, 30, 0.3)", - "custom-background": "rgba(30, 30, 30, 0.3)", - "card-background": "rgba(30, 30, 30, 0.3)", - // Shadows - "shadow-key-umbra-opacity": "rgba(0, 0, 0, 0.07)", - "shadow-key-penumbra-opacity": "rgba(0, 0, 0, 0.1)", - "shadow-key-ambient-opacity": "rgba(0, 0, 0, 0.05)" - } - } - } -}; - -const {createApp} = await importShared('vue'); -const {createVuetify} = await importShared('vuetify'); - - -// 创建Vuetify实例 -const vuetify = createVuetify({ - components, - directives, - theme, - defaults -}); - -// 创建应用 -const app = createApp(App); - -// 使用插件 -app.use(vuetify); - -// 挂载应用 -app.mount('#app');