/*! Element Plus v2.14.0 */ import { Comment, Fragment, Teleport, Text, Transition, TransitionGroup, cloneVNode, computed, createApp, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createTextVNode, createVNode, defineComponent, effectScope, getCurrentInstance, getCurrentScope, guardReactiveProps, h, hasInjectionContext, inject, isRef, isVNode, markRaw, mergeProps, nextTick, normalizeClass, normalizeProps, normalizeStyle, onActivated, onBeforeMount, onBeforeUnmount, onBeforeUpdate, onDeactivated, onMounted, onScopeDispose, onUnmounted, onUpdated, openBlock, provide, reactive, readonly, ref, render, renderList, renderSlot, resolveComponent, resolveDirective, resolveDynamicComponent, shallowReactive, shallowReadonly, shallowRef, toDisplayString, toHandlerKey, toHandlers, toRaw, toRef, toRefs, toValue, triggerRef, unref, useAttrs as useAttrs$1, useSlots, vModelCheckbox, vModelRadio, vModelText, vShow, warn, watch, watchEffect, withCtx, withDirectives, withKeys, withModifiers } from "vue"; //#region \0rolldown/runtime.js var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports); var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) { key = keys[i]; if (!__hasOwnProp.call(to, key) && key !== except) { __defProp(to, key, { get: ((k) => from[k]).bind(null, key), enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } } } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod)); //#endregion //#region ../../packages/utils/dom/aria.ts const FOCUSABLE_ELEMENT_SELECTORS = `a[href],button:not([disabled]),button:not([hidden]),:not([tabindex="-1"]),input:not([disabled]),input:not([type="hidden"]),select:not([disabled]),textarea:not([disabled])`; const isShadowRoot$1 = (e) => { if (typeof ShadowRoot === "undefined") return false; return e instanceof ShadowRoot; }; const isHTMLElement$1 = (e) => { if (typeof Element === "undefined") return false; return e instanceof Element; }; /** * Determine if the testing element is visible on screen no matter if its on the viewport or not */ const isVisible = (element) => { return getComputedStyle(element).position === "fixed" ? false : element.offsetParent !== null; }; const obtainAllFocusableElements$1 = (element) => { return Array.from(element.querySelectorAll(FOCUSABLE_ELEMENT_SELECTORS)).filter((item) => isFocusable(item) && isVisible(item)); }; /** * @desc Determine if target element is focusable * @param element {HTMLElement} * @returns {Boolean} true if it is focusable */ const isFocusable = (element) => { if (element.tabIndex > 0 || element.tabIndex === 0 && element.getAttribute("tabIndex") !== null) return true; if (element.tabIndex < 0 || element.hasAttribute("disabled") || element.getAttribute("aria-disabled") === "true") return false; switch (element.nodeName) { case "A": return !!element.href && element.rel !== "ignore"; case "INPUT": return !(element.type === "hidden" || element.type === "file"); case "BUTTON": case "SELECT": case "TEXTAREA": return true; default: return false; } }; /** * Trigger an event * mouseenter, mouseleave, mouseover, keyup, change, click, etc. * @param {HTMLElement} elm * @param {String} name * @param {*} opts */ const triggerEvent = function(elm, name, ...opts) { let eventName; if (name.includes("mouse") || name.includes("click")) eventName = "MouseEvents"; else if (name.includes("key")) eventName = "KeyboardEvent"; else eventName = "HTMLEvents"; const evt = document.createEvent(eventName); evt.initEvent(name, ...opts); elm.dispatchEvent(evt); return elm; }; const isLeaf = (el) => !el.getAttribute("aria-owns"); const getSibling = (el, distance, elClass) => { const { parentNode } = el; if (!parentNode) return null; const siblings = parentNode.querySelectorAll(elClass); return siblings[Array.prototype.indexOf.call(siblings, el) + distance] || null; }; const focusElement = (el, options) => { if (!el || !el.focus) return; let cleanup = false; if (isHTMLElement$1(el) && !isFocusable(el) && !el.getAttribute("tabindex")) { el.setAttribute("tabindex", "-1"); cleanup = true; } el.focus(options); if (isHTMLElement$1(el) && cleanup) el.removeAttribute("tabindex"); }; const focusNode = (el) => { if (!el) return; focusElement(el); !isLeaf(el) && el.click(); }; //#endregion //#region ../../packages/constants/aria.ts const EVENT_CODE = { tab: "Tab", enter: "Enter", space: "Space", left: "ArrowLeft", up: "ArrowUp", right: "ArrowRight", down: "ArrowDown", esc: "Escape", delete: "Delete", backspace: "Backspace", numpadEnter: "NumpadEnter", pageUp: "PageUp", pageDown: "PageDown", home: "Home", end: "End" }; //#endregion //#region ../../packages/constants/date.ts const datePickTypes = [ "year", "years", "month", "months", "date", "dates", "week", "datetime", "datetimerange", "daterange", "monthrange", "yearrange" ]; const WEEK_DAYS = [ "sun", "mon", "tue", "wed", "thu", "fri", "sat" ]; //#endregion //#region ../../packages/constants/event.ts const UPDATE_MODEL_EVENT = "update:modelValue"; const CHANGE_EVENT = "change"; const INPUT_EVENT = "input"; //#endregion //#region ../../packages/constants/key.ts const INSTALLED_KEY = Symbol("INSTALLED_KEY"); //#endregion //#region ../../packages/constants/size.ts const componentSizes = [ "", "default", "small", "large" ]; const componentSizeMap = { large: 40, default: 32, small: 24 }; //#endregion //#region ../../packages/constants/column-alignment.ts const columnAlignment = [ "left", "center", "right" ]; //#endregion //#region ../../packages/constants/form.ts const MINIMUM_INPUT_WIDTH = 11; const BORDER_HORIZONTAL_WIDTH = 2; //#endregion //#region ../../node_modules/.pnpm/@vueuse+shared@14.3.0_vue@3.5.25/node_modules/@vueuse/shared/dist/index.js /** * * @deprecated This function will be removed in future version. * * Note: If you are using Vue 3.4+, you can straight use computed instead. * Because in Vue 3.4+, if computed new value does not change, * computed, effect, watch, watchEffect, render dependencies will not be triggered. * refer: https://github.com/vuejs/core/pull/5912 * * @param fn effect function * @param options WatchOptionsBase * @returns readonly shallowRef */ function computedEager(fn, options) { var _options$flush; const result = shallowRef(); watchEffect(() => { result.value = fn(); }, { ...options, flush: (_options$flush = options === null || options === void 0 ? void 0 : options.flush) !== null && _options$flush !== void 0 ? _options$flush : "sync" }); return readonly(result); } /** * Call onScopeDispose() if it's inside an effect scope lifecycle, if not, do nothing * * @param fn */ function tryOnScopeDispose(fn, failSilently) { if (getCurrentScope()) { onScopeDispose(fn, failSilently); return true; } return false; } const localProvidedStateMap = /* @__PURE__ */ new WeakMap(); /** * On the basis of `inject`, it is allowed to directly call inject to obtain the value after call provide in the same component. * * @example * ```ts * injectLocal('MyInjectionKey', 1) * const injectedValue = injectLocal('MyInjectionKey') // injectedValue === 1 * ``` * * @__NO_SIDE_EFFECTS__ */ const injectLocal = (...args) => { var _getCurrentInstance; const key = args[0]; const instance = (_getCurrentInstance = getCurrentInstance()) === null || _getCurrentInstance === void 0 ? void 0 : _getCurrentInstance.proxy; const owner = instance !== null && instance !== void 0 ? instance : getCurrentScope(); if (owner == null && !hasInjectionContext()) throw new Error("injectLocal must be called in setup"); if (owner && localProvidedStateMap.has(owner) && key in localProvidedStateMap.get(owner)) return localProvidedStateMap.get(owner)[key]; return inject(...args); }; const isClient = typeof window !== "undefined" && typeof document !== "undefined"; const isWorker = typeof WorkerGlobalScope !== "undefined" && globalThis instanceof WorkerGlobalScope; const isDef = (val) => typeof val !== "undefined"; const notNullish = (val) => val != null; const toString$1 = Object.prototype.toString; const isObject$2 = (val) => toString$1.call(val) === "[object Object]"; const clamp$2 = (n, min, max) => Math.min(max, Math.max(min, n)); const noop$1 = () => {}; const isIOS = /* @__PURE__ */ getIsIOS(); function getIsIOS() { var _window, _window2, _window3; return isClient && !!((_window = window) === null || _window === void 0 || (_window = _window.navigator) === null || _window === void 0 ? void 0 : _window.userAgent) && (/iP(?:ad|hone|od)/.test(window.navigator.userAgent) || ((_window2 = window) === null || _window2 === void 0 || (_window2 = _window2.navigator) === null || _window2 === void 0 ? void 0 : _window2.maxTouchPoints) > 2 && /iPad|Macintosh/.test((_window3 = window) === null || _window3 === void 0 ? void 0 : _window3.navigator.userAgent)); } /** * @internal */ function createFilterWrapper(filter, fn) { function wrapper(...args) { return new Promise((resolve, reject) => { Promise.resolve(filter(() => fn.apply(this, args), { fn, thisArg: this, args })).then(resolve).catch(reject); }); } return wrapper; } /** * Create an EventFilter that debounce the events */ function debounceFilter(ms, options = {}) { let timer; let maxTimer; let lastRejector = noop$1; const _clearTimeout = (timer) => { clearTimeout(timer); lastRejector(); lastRejector = noop$1; }; let lastInvoker; const filter = (invoke) => { const duration = toValue(ms); const maxDuration = toValue(options.maxWait); if (timer) _clearTimeout(timer); if (duration <= 0 || maxDuration !== void 0 && maxDuration <= 0) { if (maxTimer) { _clearTimeout(maxTimer); maxTimer = void 0; } return Promise.resolve(invoke()); } return new Promise((resolve, reject) => { lastRejector = options.rejectOnCancel ? reject : resolve; lastInvoker = invoke; if (maxDuration && !maxTimer) maxTimer = setTimeout(() => { if (timer) _clearTimeout(timer); maxTimer = void 0; resolve(lastInvoker()); }, maxDuration); timer = setTimeout(() => { if (maxTimer) _clearTimeout(maxTimer); maxTimer = void 0; resolve(invoke()); }, duration); }); }; return filter; } function throttleFilter(...args) { let lastExec = 0; let timer; let isLeading = true; let lastRejector = noop$1; let lastValue; let ms; let trailing; let leading; let rejectOnCancel; if (!isRef(args[0]) && typeof args[0] === "object") ({delay: ms, trailing = true, leading = true, rejectOnCancel = false} = args[0]); else [ms, trailing = true, leading = true, rejectOnCancel = false] = args; const clear = () => { if (timer) { clearTimeout(timer); timer = void 0; lastRejector(); lastRejector = noop$1; } }; const filter = (_invoke) => { const duration = toValue(ms); const elapsed = Date.now() - lastExec; const invoke = () => { return lastValue = _invoke(); }; clear(); if (duration <= 0) { lastExec = Date.now(); return invoke(); } if (elapsed > duration) { lastExec = Date.now(); if (leading || !isLeading) invoke(); } else if (trailing) lastValue = new Promise((resolve, reject) => { lastRejector = rejectOnCancel ? reject : resolve; timer = setTimeout(() => { lastExec = Date.now(); isLeading = true; resolve(invoke()); clear(); }, Math.max(0, duration - elapsed)); }); if (!leading && !timer) timer = setTimeout(() => isLeading = true, duration); isLeading = false; return lastValue; }; return filter; } /** * Get a px value for SSR use, do not rely on this method outside of SSR as REM unit is assumed at 16px, which might not be the case on the client */ function pxValue(px) { return px.endsWith("rem") ? Number.parseFloat(px) * 16 : Number.parseFloat(px); } function toArray(value) { return Array.isArray(value) ? value : [value]; } function cacheStringFunction$1(fn) { const cache = Object.create(null); return ((str) => { return cache[str] || (cache[str] = fn(str)); }); } const hyphenateRE$1 = /\B([A-Z])/g; const hyphenate$1 = cacheStringFunction$1((str) => str.replace(hyphenateRE$1, "-$1").toLowerCase()); const camelizeRE$1 = /-(\w)/g; const camelize$1 = cacheStringFunction$1((str) => { return str.replace(camelizeRE$1, (_, c) => c ? c.toUpperCase() : ""); }); function getLifeCycleTarget(target) { return target || getCurrentInstance(); } /** * Converts ref to reactive. * * @see https://vueuse.org/toReactive * @param objectRef A ref of object */ function toReactive(objectRef) { if (!isRef(objectRef)) return reactive(objectRef); return reactive(new Proxy({}, { get(_, p, receiver) { return unref(Reflect.get(objectRef.value, p, receiver)); }, set(_, p, value) { if (isRef(objectRef.value[p]) && !isRef(value)) objectRef.value[p].value = value; else objectRef.value[p] = value; return true; }, deleteProperty(_, p) { return Reflect.deleteProperty(objectRef.value, p); }, has(_, p) { return Reflect.has(objectRef.value, p); }, ownKeys() { return Object.keys(objectRef.value); }, getOwnPropertyDescriptor() { return { enumerable: true, configurable: true }; } })); } /** * Computed reactive object. */ function reactiveComputed(fn) { return toReactive(computed(fn)); } /** * Debounce execution of a function. * * @see https://vueuse.org/useDebounceFn * @param fn A function to be executed after delay milliseconds debounced. * @param ms A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful. * @param options Options * * @return A new, debounce, function. * * @__NO_SIDE_EFFECTS__ */ function useDebounceFn(fn, ms = 200, options = {}) { return createFilterWrapper(debounceFilter(ms, options), fn); } /** * Debounce updates of a ref. * * @return A new debounced ref. */ function refDebounced(value, ms = 200, options = {}) { const debounced = ref(toValue(value)); const updater = useDebounceFn(() => { debounced.value = value.value; }, ms, options); watch(value, () => updater()); return shallowReadonly(debounced); } /** * Throttle execution of a function. Especially useful for rate limiting * execution of handlers on events like resize and scroll. * * @param fn A function to be executed after delay milliseconds. The `this` context and all arguments are passed through, as-is, * to `callback` when the throttled-function is executed. * @param ms A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful. * (default value: 200) * * @param [trailing] if true, call fn again after the time is up (default value: false) * * @param [leading] if true, call fn on the leading edge of the ms timeout (default value: true) * * @param [rejectOnCancel] if true, reject the last call if it's been cancel (default value: false) * * @return A new, throttled, function. * * @__NO_SIDE_EFFECTS__ */ function useThrottleFn(fn, ms = 200, trailing = false, leading = true, rejectOnCancel = false) { return createFilterWrapper(throttleFilter(ms, trailing, leading, rejectOnCancel), fn); } /** * Call onMounted() if it's inside a component lifecycle, if not, just call the function * * @param fn * @param sync if set to false, it will run in the nextTick() of Vue * @param target */ function tryOnMounted(fn, sync = true, target) { if (getLifeCycleTarget(target)) onMounted(fn, target); else if (sync) fn(); else nextTick(fn); } /** * Wrapper for `setTimeout` with controls. * * @param cb * @param interval * @param options */ function useTimeoutFn(cb, interval, options = {}) { const { immediate = true, immediateCallback = false } = options; const isPending = shallowRef(false); let timer; function clear() { if (timer) { clearTimeout(timer); timer = void 0; } } function stop() { isPending.value = false; clear(); } function start(...args) { if (immediateCallback) cb(); clear(); isPending.value = true; timer = setTimeout(() => { isPending.value = false; timer = void 0; cb(...args); }, toValue(interval)); } if (immediate) { isPending.value = true; if (isClient) start(); } tryOnScopeDispose(stop); return { isPending: shallowReadonly(isPending), start, stop }; } /** * Shorthand for watching value with {immediate: true} * * @see https://vueuse.org/watchImmediate */ function watchImmediate(source, cb, options) { return watch(source, cb, { ...options, immediate: true }); } //#endregion //#region ../../node_modules/.pnpm/@vueuse+core@14.3.0_vue@3.5.25/node_modules/@vueuse/core/dist/index.js const defaultWindow = isClient ? window : void 0; const defaultDocument = isClient ? window.document : void 0; const defaultNavigator = isClient ? window.navigator : void 0; const defaultLocation = isClient ? window.location : void 0; /** * Get the dom element of a ref of element or Vue component instance * * @param elRef */ function unrefElement(elRef) { var _$el; const plain = toValue(elRef); return (_$el = plain === null || plain === void 0 ? void 0 : plain.$el) !== null && _$el !== void 0 ? _$el : plain; } function useEventListener(...args) { const register = (el, event, listener, options) => { el.addEventListener(event, listener, options); return () => el.removeEventListener(event, listener, options); }; const firstParamTargets = computed(() => { const test = toArray(toValue(args[0])).filter((e) => e != null); return test.every((e) => typeof e !== "string") ? test : void 0; }); return watchImmediate(() => { var _firstParamTargets$va, _firstParamTargets$va2; return [ (_firstParamTargets$va = (_firstParamTargets$va2 = firstParamTargets.value) === null || _firstParamTargets$va2 === void 0 ? void 0 : _firstParamTargets$va2.map((e) => unrefElement(e))) !== null && _firstParamTargets$va !== void 0 ? _firstParamTargets$va : [defaultWindow].filter((e) => e != null), toArray(toValue(firstParamTargets.value ? args[1] : args[0])), toArray(unref(firstParamTargets.value ? args[2] : args[1])), toValue(firstParamTargets.value ? args[3] : args[2]) ]; }, ([raw_targets, raw_events, raw_listeners, raw_options], _, onCleanup) => { if (!(raw_targets === null || raw_targets === void 0 ? void 0 : raw_targets.length) || !(raw_events === null || raw_events === void 0 ? void 0 : raw_events.length) || !(raw_listeners === null || raw_listeners === void 0 ? void 0 : raw_listeners.length)) return; const optionsClone = isObject$2(raw_options) ? { ...raw_options } : raw_options; const cleanups = raw_targets.flatMap((el) => raw_events.flatMap((event) => raw_listeners.map((listener) => register(el, event, listener, optionsClone)))); onCleanup(() => { cleanups.forEach((fn) => fn()); }); }, { flush: "post" }); } let _iOSWorkaround = false; function onClickOutside(target, handler, options = {}) { const { window = defaultWindow, ignore = [], capture = true, detectIframe = false, controls = false } = options; if (!window) return controls ? { stop: noop$1, cancel: noop$1, trigger: noop$1 } : noop$1; if (isIOS && !_iOSWorkaround) { _iOSWorkaround = true; const listenerOptions = { passive: true }; Array.from(window.document.body.children).forEach((el) => el.addEventListener("click", noop$1, listenerOptions)); window.document.documentElement.addEventListener("click", noop$1, listenerOptions); } let shouldListen = true; const shouldIgnore = (event) => { return toValue(ignore).some((target) => { if (typeof target === "string") return Array.from(window.document.querySelectorAll(target)).some((el) => el === event.target || event.composedPath().includes(el)); else { const el = unrefElement(target); return el && (event.target === el || event.composedPath().includes(el)); } }); }; /** * Determines if the given target has multiple root elements. * Referenced from: https://github.com/vuejs/test-utils/blob/ccb460be55f9f6be05ab708500a41ec8adf6f4bc/src/vue-wrapper.ts#L21 */ function hasMultipleRoots(target) { const vm = toValue(target); return vm && vm.$.subTree.shapeFlag === 16; } function checkMultipleRoots(target, event) { const vm = toValue(target); const children = vm.$.subTree && vm.$.subTree.children; if (children == null || !Array.isArray(children)) return false; return children.some((child) => child.el === event.target || event.composedPath().includes(child.el)); } const listener = (event) => { const el = unrefElement(target); if (event.target == null) return; if (!(el instanceof Element) && hasMultipleRoots(target) && checkMultipleRoots(target, event)) return; if (!el || el === event.target || event.composedPath().includes(el)) return; if ("detail" in event && event.detail === 0) shouldListen = !shouldIgnore(event); if (!shouldListen) { shouldListen = true; return; } handler(event); }; let isProcessingClick = false; const cleanup = [ useEventListener(window, "click", (event) => { if (!isProcessingClick) { isProcessingClick = true; setTimeout(() => { isProcessingClick = false; }, 0); listener(event); } }, { passive: true, capture }), useEventListener(window, "pointerdown", (e) => { const el = unrefElement(target); shouldListen = !shouldIgnore(e) && !!(el && !e.composedPath().includes(el)); }, { passive: true }), detectIframe && useEventListener(window, "blur", (event) => { setTimeout(() => { const el = unrefElement(target); let activeEl = window.document.activeElement; while (activeEl === null || activeEl === void 0 ? void 0 : activeEl.shadowRoot) activeEl = activeEl.shadowRoot.activeElement; if ((activeEl === null || activeEl === void 0 ? void 0 : activeEl.tagName) === "IFRAME" && !(el === null || el === void 0 ? void 0 : el.contains(window.document.activeElement))) handler(event); }, 0); }, { passive: true }) ].filter(Boolean); const stop = () => cleanup.forEach((fn) => fn()); if (controls) return { stop, cancel: () => { shouldListen = false; }, trigger: (event) => { shouldListen = true; listener(event); shouldListen = false; } }; return stop; } /** * Mounted state in ref. * * @see https://vueuse.org/useMounted * * @__NO_SIDE_EFFECTS__ */ function useMounted() { const isMounted = shallowRef(false); const instance = getCurrentInstance(); if (instance) onMounted(() => { isMounted.value = true; }, instance); return isMounted; } /* @__NO_SIDE_EFFECTS__ */ function useSupported(callback) { const isMounted = useMounted(); return computed(() => { isMounted.value; return Boolean(callback()); }); } /** * Watch for changes being made to the DOM tree. * * @see https://vueuse.org/useMutationObserver * @see https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver MutationObserver MDN * @param target * @param callback * @param options */ function useMutationObserver(target, callback, options = {}) { const { window = defaultWindow, ...mutationOptions } = options; let observer; const isSupported = /* @__PURE__ */ useSupported(() => window && "MutationObserver" in window); const cleanup = () => { if (observer) { observer.disconnect(); observer = void 0; } }; const stopWatch = watch(computed(() => { const items = toArray(toValue(target)).map(unrefElement).filter(notNullish); return new Set(items); }), (newTargets) => { cleanup(); if (isSupported.value && newTargets.size) { observer = new MutationObserver(callback); newTargets.forEach((el) => observer.observe(el, mutationOptions)); } }, { immediate: true, flush: "post" }); const takeRecords = () => { return observer === null || observer === void 0 ? void 0 : observer.takeRecords(); }; const stop = () => { stopWatch(); cleanup(); }; tryOnScopeDispose(stop); return { isSupported, stop, takeRecords }; } /** * Fires when the element or any element containing it is removed. * * @param target * @param callback * @param options */ function onElementRemoval(target, callback, options = {}) { const { window = defaultWindow, document = window === null || window === void 0 ? void 0 : window.document, flush = "sync" } = options; if (!window || !document) return noop$1; let stopFn; const cleanupAndUpdate = (fn) => { stopFn === null || stopFn === void 0 || stopFn(); stopFn = fn; }; const stopWatch = watchEffect(() => { const el = unrefElement(target); if (el) { const { stop } = useMutationObserver(document, (mutationsList) => { if (mutationsList.map((mutation) => [...mutation.removedNodes]).flat().some((node) => node === el || node.contains(el))) callback(mutationsList); }, { window, childList: true, subtree: true }); cleanupAndUpdate(stop); } }, { flush }); const stopHandle = () => { stopWatch(); cleanupAndUpdate(); }; tryOnScopeDispose(stopHandle); return stopHandle; } /** * Reactive `document.activeElement` * * @see https://vueuse.org/useActiveElement * @param options * * @__NO_SIDE_EFFECTS__ */ function useActiveElement(options = {}) { var _options$document; const { window = defaultWindow, deep = true, triggerOnRemoval = false } = options; const document = (_options$document = options.document) !== null && _options$document !== void 0 ? _options$document : window === null || window === void 0 ? void 0 : window.document; const getDeepActiveElement = () => { let element = document === null || document === void 0 ? void 0 : document.activeElement; if (deep) { var _element$shadowRoot; while (element === null || element === void 0 ? void 0 : element.shadowRoot) element = element === null || element === void 0 || (_element$shadowRoot = element.shadowRoot) === null || _element$shadowRoot === void 0 ? void 0 : _element$shadowRoot.activeElement; } return element; }; const activeElement = shallowRef(); const trigger = () => { activeElement.value = getDeepActiveElement(); }; if (window) { const listenerOptions = { capture: true, passive: true }; useEventListener(window, "blur", (event) => { if (event.relatedTarget !== null) return; trigger(); }, listenerOptions); useEventListener(window, "focus", trigger, listenerOptions); } if (triggerOnRemoval) onElementRemoval(activeElement, trigger, { document }); trigger(); return activeElement; } const ssrWidthSymbol = Symbol("vueuse-ssr-width"); /* @__NO_SIDE_EFFECTS__ */ function useSSRWidth() { const ssrWidth = hasInjectionContext() ? injectLocal(ssrWidthSymbol, null) : null; return typeof ssrWidth === "number" ? ssrWidth : void 0; } /** * Reactive Media Query. * * @see https://vueuse.org/useMediaQuery * @param query * @param options */ function useMediaQuery(query, options = {}) { const { window = defaultWindow, ssrWidth = /* @__PURE__ */ useSSRWidth() } = options; const isSupported = /* @__PURE__ */ useSupported(() => window && "matchMedia" in window && typeof window.matchMedia === "function"); const ssrSupport = shallowRef(typeof ssrWidth === "number"); const mediaQuery = shallowRef(); const matches = shallowRef(false); const handler = (event) => { matches.value = event.matches; }; watchEffect(() => { if (ssrSupport.value) { ssrSupport.value = !isSupported.value; matches.value = toValue(query).split(",").some((queryString) => { const not = queryString.includes("not all"); const minWidth = queryString.match(/\(\s*min-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/); const maxWidth = queryString.match(/\(\s*max-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/); let res = Boolean(minWidth || maxWidth); if (minWidth && res) res = ssrWidth >= pxValue(minWidth[1]); if (maxWidth && res) res = ssrWidth <= pxValue(maxWidth[1]); return not ? !res : res; }); return; } if (!isSupported.value) return; mediaQuery.value = window.matchMedia(toValue(query)); matches.value = mediaQuery.value.matches; }); useEventListener(mediaQuery, "change", handler, { passive: true }); return computed(() => matches.value); } function cloneFnJSON(source) { return JSON.parse(JSON.stringify(source)); } /** * Manipulate CSS variables. * * @see https://vueuse.org/useCssVar * @param prop * @param target * @param options */ function useCssVar(prop, target, options = {}) { const { window = defaultWindow, initialValue, observe = false } = options; const variable = shallowRef(initialValue); const elRef = computed(() => { var _window$document; return unrefElement(target) || (window === null || window === void 0 || (_window$document = window.document) === null || _window$document === void 0 ? void 0 : _window$document.documentElement); }); function updateCssVar() { const key = toValue(prop); const el = toValue(elRef); if (el && window && key) { var _window$getComputedSt; variable.value = ((_window$getComputedSt = window.getComputedStyle(el).getPropertyValue(key)) === null || _window$getComputedSt === void 0 ? void 0 : _window$getComputedSt.trim()) || variable.value || initialValue; } } if (observe) useMutationObserver(elRef, updateCssVar, { attributeFilter: ["style", "class"], window }); watch([elRef, () => toValue(prop)], (_, old) => { if (old[0] && old[1]) old[0].style.removeProperty(old[1]); updateCssVar(); }, { immediate: true }); watch([variable, elRef], ([val, el]) => { const raw_prop = toValue(prop); if ((el === null || el === void 0 ? void 0 : el.style) && raw_prop) if (val == null) el.style.removeProperty(raw_prop); else el.style.setProperty(raw_prop, val); }, { immediate: true }); return variable; } /** * Reactively track `document.visibilityState`. * * @see https://vueuse.org/useDocumentVisibility * * @__NO_SIDE_EFFECTS__ */ function useDocumentVisibility(options = {}) { const { document = defaultDocument } = options; if (!document) return shallowRef("visible"); const visibility = shallowRef(document.visibilityState); useEventListener(document, "visibilitychange", () => { visibility.value = document.visibilityState; }, { passive: true }); return visibility; } /** * Reports changes to the dimensions of an Element's content or the border-box * * @see https://vueuse.org/useResizeObserver * @param target * @param callback * @param options */ function useResizeObserver(target, callback, options = {}) { const { window = defaultWindow, ...observerOptions } = options; let observer; const isSupported = /* @__PURE__ */ useSupported(() => window && "ResizeObserver" in window); const cleanup = () => { if (observer) { observer.disconnect(); observer = void 0; } }; const stopWatch = watch(computed(() => { const _targets = toValue(target); return Array.isArray(_targets) ? _targets.map((el) => unrefElement(el)) : [unrefElement(_targets)]; }), (els) => { cleanup(); if (isSupported.value && window) { observer = new ResizeObserver(callback); for (const _el of els) if (_el) observer.observe(_el, observerOptions); } }, { immediate: true, flush: "post" }); const stop = () => { cleanup(); stopWatch(); }; tryOnScopeDispose(stop); return { isSupported, stop }; } /** * Reactive bounding box of an HTML element. * * @see https://vueuse.org/useElementBounding * @param target */ function useElementBounding(target, options = {}) { const { reset = true, windowResize = true, windowScroll = true, immediate = true, updateTiming = "sync" } = options; const height = shallowRef(0); const bottom = shallowRef(0); const left = shallowRef(0); const right = shallowRef(0); const top = shallowRef(0); const width = shallowRef(0); const x = shallowRef(0); const y = shallowRef(0); function recalculate() { const el = unrefElement(target); if (!el) { if (reset) { height.value = 0; bottom.value = 0; left.value = 0; right.value = 0; top.value = 0; width.value = 0; x.value = 0; y.value = 0; } return; } const rect = el.getBoundingClientRect(); height.value = rect.height; bottom.value = rect.bottom; left.value = rect.left; right.value = rect.right; top.value = rect.top; width.value = rect.width; x.value = rect.x; y.value = rect.y; } function update() { if (updateTiming === "sync") recalculate(); else if (updateTiming === "next-frame") requestAnimationFrame(() => recalculate()); } useResizeObserver(target, update); watch(() => unrefElement(target), (ele) => !ele && update()); useMutationObserver(target, update, { attributeFilter: ["style", "class"] }); if (windowScroll) useEventListener("scroll", update, { capture: true, passive: true }); if (windowResize) useEventListener("resize", update, { passive: true }); tryOnMounted(() => { if (immediate) update(); }); return { height, bottom, left, right, top, width, x, y, update }; } /** * Reactive size of an HTML element. * * @see https://vueuse.org/useElementSize */ function useElementSize(target, initialSize = { width: 0, height: 0 }, options = {}) { const { window = defaultWindow, box = "content-box" } = options; const isSVG = computed(() => { var _unrefElement; return (_unrefElement = unrefElement(target)) === null || _unrefElement === void 0 || (_unrefElement = _unrefElement.namespaceURI) === null || _unrefElement === void 0 ? void 0 : _unrefElement.includes("svg"); }); const width = shallowRef(initialSize.width); const height = shallowRef(initialSize.height); const { stop: stop1 } = useResizeObserver(target, ([entry]) => { const boxSize = box === "border-box" ? entry.borderBoxSize : box === "content-box" ? entry.contentBoxSize : entry.devicePixelContentBoxSize; if (window && isSVG.value) { const $elem = unrefElement(target); if ($elem) { const rect = $elem.getBoundingClientRect(); width.value = rect.width; height.value = rect.height; } } else if (boxSize) { const formatBoxSize = toArray(boxSize); width.value = formatBoxSize.reduce((acc, { inlineSize }) => acc + inlineSize, 0); height.value = formatBoxSize.reduce((acc, { blockSize }) => acc + blockSize, 0); } else { width.value = entry.contentRect.width; height.value = entry.contentRect.height; } }, options); tryOnMounted(() => { const ele = unrefElement(target); if (ele) { width.value = "offsetWidth" in ele ? ele.offsetWidth : initialSize.width; height.value = "offsetHeight" in ele ? ele.offsetHeight : initialSize.height; } }); const stop2 = watch(() => unrefElement(target), (ele) => { width.value = ele ? initialSize.width : 0; height.value = ele ? initialSize.height : 0; }); function stop() { stop1(); stop2(); } return { width, height, stop }; } /** * Detects changes to a target element's visibility. * * @see https://vueuse.org/useIntersectionObserver * @param target * @param callback * @param options */ function useIntersectionObserver(target, callback, options = {}) { const { root, rootMargin, threshold = 0, window = defaultWindow, immediate = true } = options; const isSupported = /* @__PURE__ */ useSupported(() => window && "IntersectionObserver" in window); const targets = computed(() => { return toArray(toValue(target)).map(unrefElement).filter(notNullish); }); let cleanup = noop$1; const isActive = shallowRef(immediate); const stopWatch = isSupported.value ? watch(() => [ targets.value, unrefElement(root), toValue(rootMargin), isActive.value ], ([targets, root, rootMargin]) => { cleanup(); if (!isActive.value) return; if (!targets.length) return; const observer = new IntersectionObserver(callback, { root: unrefElement(root), rootMargin, threshold }); targets.forEach((el) => el && observer.observe(el)); cleanup = () => { observer.disconnect(); cleanup = noop$1; }; }, { immediate, flush: "post" }) : noop$1; const stop = () => { cleanup(); stopWatch(); isActive.value = false; }; tryOnScopeDispose(stop); return { isSupported, isActive, pause() { cleanup(); isActive.value = false; }, resume() { isActive.value = true; }, stop }; } const DEFAULT_UNITS = [ { max: 6e4, value: 1e3, name: "second" }, { max: 276e4, value: 6e4, name: "minute" }, { max: 72e6, value: 36e5, name: "hour" }, { max: 5184e5, value: 864e5, name: "day" }, { max: 24192e5, value: 6048e5, name: "week" }, { max: 28512e6, value: 2592e6, name: "month" }, { max: Number.POSITIVE_INFINITY, value: 31536e6, name: "year" } ]; /** * Shorthand for v-model binding, props + emit -> ref * * @see https://vueuse.org/useVModel * @param props * @param key (default 'modelValue') * @param emit * @param options * * @__NO_SIDE_EFFECTS__ */ function useVModel(props, key, emit, options = {}) { var _vm$$emit, _vm$proxy; const { clone = false, passive = false, eventName, deep = false, defaultValue, shouldEmit } = options; const vm = getCurrentInstance(); const _emit = emit || (vm === null || vm === void 0 ? void 0 : vm.emit) || (vm === null || vm === void 0 || (_vm$$emit = vm.$emit) === null || _vm$$emit === void 0 ? void 0 : _vm$$emit.bind(vm)) || (vm === null || vm === void 0 || (_vm$proxy = vm.proxy) === null || _vm$proxy === void 0 || (_vm$proxy = _vm$proxy.$emit) === null || _vm$proxy === void 0 ? void 0 : _vm$proxy.bind(vm === null || vm === void 0 ? void 0 : vm.proxy)); let event = eventName; if (!key) key = "modelValue"; event = event || `update:${key.toString()}`; const cloneFn = (val) => !clone ? val : typeof clone === "function" ? clone(val) : cloneFnJSON(val); const getValue = () => isDef(props[key]) ? cloneFn(props[key]) : defaultValue; const triggerEmit = (value) => { if (shouldEmit) { if (shouldEmit(value)) _emit(event, value); } else _emit(event, value); }; if (passive) { const proxy = ref(getValue()); let isUpdating = false; watch(() => props[key], (v) => { if (!isUpdating) { isUpdating = true; proxy.value = cloneFn(v); nextTick(() => isUpdating = false); } }); watch(proxy, (v) => { if (!isUpdating && (v !== props[key] || deep)) triggerEmit(v); }, { deep }); return proxy; } else return computed({ get() { return getValue(); }, set(value) { triggerEmit(value); } }); } /** * Reactively track window focus with `window.onfocus` and `window.onblur`. * * @see https://vueuse.org/useWindowFocus * * @__NO_SIDE_EFFECTS__ */ function useWindowFocus(options = {}) { const { window = defaultWindow } = options; if (!window) return shallowRef(false); const focused = shallowRef(window.document.hasFocus()); const listenerOptions = { passive: true }; useEventListener(window, "blur", () => { focused.value = false; }, listenerOptions); useEventListener(window, "focus", () => { focused.value = true; }, listenerOptions); return focused; } /** * Reactive window size. * * @see https://vueuse.org/useWindowSize * @param options * * @__NO_SIDE_EFFECTS__ */ function useWindowSize(options = {}) { const { window = defaultWindow, initialWidth = Number.POSITIVE_INFINITY, initialHeight = Number.POSITIVE_INFINITY, listenOrientation = true, includeScrollbar = true, type = "inner" } = options; const width = shallowRef(initialWidth); const height = shallowRef(initialHeight); const update = () => { if (window) if (type === "outer") { width.value = window.outerWidth; height.value = window.outerHeight; } else if (type === "visual" && window.visualViewport) { const { width: visualViewportWidth, height: visualViewportHeight, scale } = window.visualViewport; width.value = Math.round(visualViewportWidth * scale); height.value = Math.round(visualViewportHeight * scale); } else if (includeScrollbar) { width.value = window.innerWidth; height.value = window.innerHeight; } else { width.value = window.document.documentElement.clientWidth; height.value = window.document.documentElement.clientHeight; } }; update(); tryOnMounted(update); const listenerOptions = { passive: true }; useEventListener("resize", update, listenerOptions); if (window && type === "visual" && window.visualViewport) useEventListener(window.visualViewport, "resize", update, listenerOptions); if (listenOrientation) watch(useMediaQuery("(orientation: portrait)"), () => update()); return { width, height }; } //#endregion //#region ../../packages/utils/browser.ts const isFirefox = () => isClient && /firefox/i.test(window.navigator.userAgent); const isAndroid = () => isClient && /android/i.test(window.navigator.userAgent); //#endregion //#region ../../packages/utils/dom/event.ts const composeEventHandlers = (theirsHandler, oursHandler, { checkForDefaultPrevented = true } = {}) => { const handleEvent = (event) => { const shouldPrevent = theirsHandler?.(event); if (checkForDefaultPrevented === false || !shouldPrevent) return oursHandler?.(event); }; return handleEvent; }; const whenMouse = (handler) => { return (e) => e.pointerType === "mouse" ? handler(e) : void 0; }; const getEventCode = (event) => { if (event.code && event.code !== "Unidentified") return event.code; const key = getEventKey(event); if (key) { if (Object.values(EVENT_CODE).includes(key)) return key; switch (key) { case " ": return EVENT_CODE.space; default: return ""; } } return ""; }; const getEventKey = (event) => { let key = event.key && event.key !== "Unidentified" ? event.key : ""; if (!key && event.type === "keyup" && isAndroid()) { const target = event.target; key = target.value.charAt(target.selectionStart - 1); } return key; }; //#endregion //#region ../../packages/utils/dom/position.ts const getOffsetTop = (el) => { let offset = 0; let parent = el; while (parent) { offset += parent.offsetTop; parent = parent.offsetParent; } return offset; }; const getOffsetTopDistance = (el, containerEl) => { return Math.abs(getOffsetTop(el) - getOffsetTop(containerEl)); }; const getClientXY = (event) => { let clientX; let clientY; if (event.type === "touchend") { clientY = event.changedTouches[0].clientY; clientX = event.changedTouches[0].clientX; } else if (event.type.startsWith("touch")) { clientY = event.touches[0].clientY; clientX = event.touches[0].clientX; } else { clientY = event.clientY; clientX = event.clientX; } return { clientX, clientY }; }; //#endregion //#region ../../packages/utils/easings.ts function easeInOutCubic(t, b, c, d) { const cc = c - b; t /= d / 2; if (t < 1) return cc / 2 * t * t * t + b; return cc / 2 * ((t -= 2) * t * t + 2) + b; } //#endregion //#region ../../node_modules/.pnpm/@vue+shared@3.5.25/node_modules/@vue/shared/dist/shared.esm-bundler.js /** * @vue/shared v3.5.25 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/ /* @__NO_SIDE_EFFECTS__ */ function makeMap(str) { const map = /* @__PURE__ */ Object.create(null); for (const key of str.split(",")) map[key] = 1; return (val) => val in map; } const NOOP = () => {}; const hasOwnProperty$14 = Object.prototype.hasOwnProperty; const hasOwn = (val, key) => hasOwnProperty$14.call(val, key); const isArray$1 = Array.isArray; const isDate = (val) => toTypeString(val) === "[object Date]"; const isFunction$1 = (val) => typeof val === "function"; const isString = (val) => typeof val === "string"; const isObject$1 = (val) => val !== null && typeof val === "object"; const isPromise = (val) => { return (isObject$1(val) || isFunction$1(val)) && isFunction$1(val.then) && isFunction$1(val.catch); }; const objectToString$1 = Object.prototype.toString; const toTypeString = (value) => objectToString$1.call(value); const isPlainObject$1 = (val) => toTypeString(val) === "[object Object]"; const cacheStringFunction = (fn) => { const cache = /* @__PURE__ */ Object.create(null); return ((str) => { return cache[str] || (cache[str] = fn(str)); }); }; const camelizeRE = /-\w/g; const camelize = cacheStringFunction((str) => { return str.replace(camelizeRE, (c) => c.slice(1).toUpperCase()); }); const hyphenateRE = /\B([A-Z])/g; const hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, "-$1").toLowerCase()); const capitalize$1 = cacheStringFunction((str) => { return str.charAt(0).toUpperCase() + str.slice(1); }); const toHandlerKey$1 = cacheStringFunction((str) => { return str ? `on${capitalize$1(str)}` : ``; }); const specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`; const isBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`); //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_freeGlobal.js /** Detect free variable `global` from Node.js. */ var freeGlobal = typeof global == "object" && global && global.Object === Object && global; //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_root.js /** Detect free variable `self`. */ var freeSelf = typeof self == "object" && self && self.Object === Object && self; /** Used as a reference to the global object. */ var root = freeGlobal || freeSelf || Function("return this")(); //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_Symbol.js /** Built-in value references. */ var Symbol$1 = root.Symbol; //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_getRawTag.js /** Used for built-in method references. */ var objectProto$4 = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty$13 = objectProto$4.hasOwnProperty; /** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */ var nativeObjectToString$1 = objectProto$4.toString; /** Built-in value references. */ var symToStringTag$1 = Symbol$1 ? Symbol$1.toStringTag : void 0; /** * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. * * @private * @param {*} value The value to query. * @returns {string} Returns the raw `toStringTag`. */ function getRawTag(value) { var isOwn = hasOwnProperty$13.call(value, symToStringTag$1), tag = value[symToStringTag$1]; try { value[symToStringTag$1] = void 0; var unmasked = true; } catch (e) {} var result = nativeObjectToString$1.call(value); if (unmasked) if (isOwn) value[symToStringTag$1] = tag; else delete value[symToStringTag$1]; return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_objectToString.js /** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */ var nativeObjectToString = Object.prototype.toString; /** * Converts `value` to a string using `Object.prototype.toString`. * * @private * @param {*} value The value to convert. * @returns {string} Returns the converted string. */ function objectToString(value) { return nativeObjectToString.call(value); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseGetTag.js /** `Object#toString` result references. */ var nullTag = "[object Null]", undefinedTag = "[object Undefined]"; /** Built-in value references. */ var symToStringTag = Symbol$1 ? Symbol$1.toStringTag : void 0; /** * The base implementation of `getTag` without fallbacks for buggy environments. * * @private * @param {*} value The value to query. * @returns {string} Returns the `toStringTag`. */ function baseGetTag(value) { if (value == null) return value === void 0 ? undefinedTag : nullTag; return symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/isObjectLike.js /** * Checks if `value` is object-like. A value is object-like if it's not `null` * and has a `typeof` result of "object". * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is object-like, else `false`. * @example * * _.isObjectLike({}); * // => true * * _.isObjectLike([1, 2, 3]); * // => true * * _.isObjectLike(_.noop); * // => false * * _.isObjectLike(null); * // => false */ function isObjectLike(value) { return value != null && typeof value == "object"; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/isSymbol.js /** `Object#toString` result references. */ var symbolTag$3 = "[object Symbol]"; /** * Checks if `value` is classified as a `Symbol` primitive or object. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. * @example * * _.isSymbol(Symbol.iterator); * // => true * * _.isSymbol('abc'); * // => false */ function isSymbol(value) { return typeof value == "symbol" || isObjectLike(value) && baseGetTag(value) == symbolTag$3; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_arrayMap.js /** * A specialized version of `_.map` for arrays without support for iteratee * shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns the new mapped array. */ function arrayMap(array, iteratee) { var index = -1, length = array == null ? 0 : array.length, result = Array(length); while (++index < length) result[index] = iteratee(array[index], index, array); return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/isArray.js /** * Checks if `value` is classified as an `Array` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array, else `false`. * @example * * _.isArray([1, 2, 3]); * // => true * * _.isArray(document.body.children); * // => false * * _.isArray('abc'); * // => false * * _.isArray(_.noop); * // => false */ var isArray = Array.isArray; //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseToString.js /** Used as references for various `Number` constants. */ var INFINITY$3 = Infinity; /** Used to convert symbols to primitives and strings. */ var symbolProto$2 = Symbol$1 ? Symbol$1.prototype : void 0, symbolToString = symbolProto$2 ? symbolProto$2.toString : void 0; /** * The base implementation of `_.toString` which doesn't convert nullish * values to empty strings. * * @private * @param {*} value The value to process. * @returns {string} Returns the string. */ function baseToString(value) { if (typeof value == "string") return value; if (isArray(value)) return arrayMap(value, baseToString) + ""; if (isSymbol(value)) return symbolToString ? symbolToString.call(value) : ""; var result = value + ""; return result == "0" && 1 / value == -INFINITY$3 ? "-0" : result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_trimmedEndIndex.js /** Used to match a single whitespace character. */ var reWhitespace = /\s/; /** * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace * character of `string`. * * @private * @param {string} string The string to inspect. * @returns {number} Returns the index of the last non-whitespace character. */ function trimmedEndIndex(string) { var index = string.length; while (index-- && reWhitespace.test(string.charAt(index))); return index; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseTrim.js /** Used to match leading whitespace. */ var reTrimStart = /^\s+/; /** * The base implementation of `_.trim`. * * @private * @param {string} string The string to trim. * @returns {string} Returns the trimmed string. */ function baseTrim(string) { return string ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, "") : string; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/isObject.js /** * Checks if `value` is the * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(_.noop); * // => true * * _.isObject(null); * // => false */ function isObject(value) { var type = typeof value; return value != null && (type == "object" || type == "function"); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/toNumber.js /** Used as references for various `Number` constants. */ var NAN = NaN; /** Used to detect bad signed hexadecimal string values. */ var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; /** Used to detect binary string values. */ var reIsBinary = /^0b[01]+$/i; /** Used to detect octal string values. */ var reIsOctal = /^0o[0-7]+$/i; /** Built-in method references without a dependency on `root`. */ var freeParseInt = parseInt; /** * Converts `value` to a number. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to process. * @returns {number} Returns the number. * @example * * _.toNumber(3.2); * // => 3.2 * * _.toNumber(Number.MIN_VALUE); * // => 5e-324 * * _.toNumber(Infinity); * // => Infinity * * _.toNumber('3.2'); * // => 3.2 */ function toNumber(value) { if (typeof value == "number") return value; if (isSymbol(value)) return NAN; if (isObject(value)) { var other = typeof value.valueOf == "function" ? value.valueOf() : value; value = isObject(other) ? other + "" : other; } if (typeof value != "string") return value === 0 ? value : +value; value = baseTrim(value); var isBinary = reIsBinary.test(value); return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/toFinite.js /** Used as references for various `Number` constants. */ var INFINITY$2 = Infinity, MAX_INTEGER = 17976931348623157e292; /** * Converts `value` to a finite number. * * @static * @memberOf _ * @since 4.12.0 * @category Lang * @param {*} value The value to convert. * @returns {number} Returns the converted number. * @example * * _.toFinite(3.2); * // => 3.2 * * _.toFinite(Number.MIN_VALUE); * // => 5e-324 * * _.toFinite(Infinity); * // => 1.7976931348623157e+308 * * _.toFinite('3.2'); * // => 3.2 */ function toFinite(value) { if (!value) return value === 0 ? value : 0; value = toNumber(value); if (value === INFINITY$2 || value === -INFINITY$2) return (value < 0 ? -1 : 1) * MAX_INTEGER; return value === value ? value : 0; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/toInteger.js /** * Converts `value` to an integer. * * **Note:** This method is loosely based on * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to convert. * @returns {number} Returns the converted integer. * @example * * _.toInteger(3.2); * // => 3 * * _.toInteger(Number.MIN_VALUE); * // => 0 * * _.toInteger(Infinity); * // => 1.7976931348623157e+308 * * _.toInteger('3.2'); * // => 3 */ function toInteger(value) { var result = toFinite(value), remainder = result % 1; return result === result ? remainder ? result - remainder : result : 0; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/identity.js /** * This method returns the first argument it receives. * * @static * @since 0.1.0 * @memberOf _ * @category Util * @param {*} value Any value. * @returns {*} Returns `value`. * @example * * var object = { 'a': 1 }; * * console.log(_.identity(object) === object); * // => true */ function identity(value) { return value; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/isFunction.js /** `Object#toString` result references. */ var asyncTag = "[object AsyncFunction]", funcTag$2 = "[object Function]", genTag$1 = "[object GeneratorFunction]", proxyTag = "[object Proxy]"; /** * Checks if `value` is classified as a `Function` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a function, else `false`. * @example * * _.isFunction(_); * // => true * * _.isFunction(/abc/); * // => false */ function isFunction(value) { if (!isObject(value)) return false; var tag = baseGetTag(value); return tag == funcTag$2 || tag == genTag$1 || tag == asyncTag || tag == proxyTag; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_coreJsData.js /** Used to detect overreaching core-js shims. */ var coreJsData = root["__core-js_shared__"]; //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_isMasked.js /** Used to detect methods masquerading as native. */ var maskSrcKey = function() { var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ""); return uid ? "Symbol(src)_1." + uid : ""; }(); /** * Checks if `func` has its source masked. * * @private * @param {Function} func The function to check. * @returns {boolean} Returns `true` if `func` is masked, else `false`. */ function isMasked(func) { return !!maskSrcKey && maskSrcKey in func; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_toSource.js /** Used to resolve the decompiled source of functions. */ var funcToString$2 = Function.prototype.toString; /** * Converts `func` to its source code. * * @private * @param {Function} func The function to convert. * @returns {string} Returns the source code. */ function toSource(func) { if (func != null) { try { return funcToString$2.call(func); } catch (e) {} try { return func + ""; } catch (e) {} } return ""; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseIsNative.js /** * Used to match `RegExp` * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). */ var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; /** Used to detect host constructors (Safari). */ var reIsHostCtor = /^\[object .+?Constructor\]$/; /** Used for built-in method references. */ var funcProto$1 = Function.prototype, objectProto$3 = Object.prototype; /** Used to resolve the decompiled source of functions. */ var funcToString$1 = funcProto$1.toString; /** Used to check objects for own properties. */ var hasOwnProperty$12 = objectProto$3.hasOwnProperty; /** Used to detect if a method is native. */ var reIsNative = RegExp("^" + funcToString$1.call(hasOwnProperty$12).replace(reRegExpChar, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"); /** * The base implementation of `_.isNative` without bad shim checks. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a native function, * else `false`. */ function baseIsNative(value) { if (!isObject(value) || isMasked(value)) return false; return (isFunction(value) ? reIsNative : reIsHostCtor).test(toSource(value)); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_getValue.js /** * Gets the value at `key` of `object`. * * @private * @param {Object} [object] The object to query. * @param {string} key The key of the property to get. * @returns {*} Returns the property value. */ function getValue$1(object, key) { return object == null ? void 0 : object[key]; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_getNative.js /** * Gets the native function at `key` of `object`. * * @private * @param {Object} object The object to query. * @param {string} key The key of the method to get. * @returns {*} Returns the function if it's native, else `undefined`. */ function getNative(object, key) { var value = getValue$1(object, key); return baseIsNative(value) ? value : void 0; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_WeakMap.js var WeakMap$1 = getNative(root, "WeakMap"); //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseCreate.js /** Built-in value references. */ var objectCreate = Object.create; /** * The base implementation of `_.create` without support for assigning * properties to the created object. * * @private * @param {Object} proto The object to inherit from. * @returns {Object} Returns the new object. */ var baseCreate = function() { function object() {} return function(proto) { if (!isObject(proto)) return {}; if (objectCreate) return objectCreate(proto); object.prototype = proto; var result = new object(); object.prototype = void 0; return result; }; }(); //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_apply.js /** * A faster alternative to `Function#apply`, this function invokes `func` * with the `this` binding of `thisArg` and the arguments of `args`. * * @private * @param {Function} func The function to invoke. * @param {*} thisArg The `this` binding of `func`. * @param {Array} args The arguments to invoke `func` with. * @returns {*} Returns the result of `func`. */ function apply(func, thisArg, args) { switch (args.length) { case 0: return func.call(thisArg); case 1: return func.call(thisArg, args[0]); case 2: return func.call(thisArg, args[0], args[1]); case 3: return func.call(thisArg, args[0], args[1], args[2]); } return func.apply(thisArg, args); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/noop.js /** * This method returns `undefined`. * * @static * @memberOf _ * @since 2.3.0 * @category Util * @example * * _.times(2, _.noop); * // => [undefined, undefined] */ function noop() {} //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_copyArray.js /** * Copies the values of `source` to `array`. * * @private * @param {Array} source The array to copy values from. * @param {Array} [array=[]] The array to copy values to. * @returns {Array} Returns `array`. */ function copyArray(source, array) { var index = -1, length = source.length; array || (array = Array(length)); while (++index < length) array[index] = source[index]; return array; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_shortOut.js /** Used to detect hot functions by number of calls within a span of milliseconds. */ var HOT_COUNT = 800, HOT_SPAN = 16; var nativeNow = Date.now; /** * Creates a function that'll short out and invoke `identity` instead * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` * milliseconds. * * @private * @param {Function} func The function to restrict. * @returns {Function} Returns the new shortable function. */ function shortOut(func) { var count = 0, lastCalled = 0; return function() { var stamp = nativeNow(), remaining = HOT_SPAN - (stamp - lastCalled); lastCalled = stamp; if (remaining > 0) { if (++count >= HOT_COUNT) return arguments[0]; } else count = 0; return func.apply(void 0, arguments); }; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/constant.js /** * Creates a function that returns `value`. * * @static * @memberOf _ * @since 2.4.0 * @category Util * @param {*} value The value to return from the new function. * @returns {Function} Returns the new constant function. * @example * * var objects = _.times(2, _.constant({ 'a': 1 })); * * console.log(objects); * // => [{ 'a': 1 }, { 'a': 1 }] * * console.log(objects[0] === objects[1]); * // => true */ function constant(value) { return function() { return value; }; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_defineProperty.js var defineProperty = function() { try { var func = getNative(Object, "defineProperty"); func({}, "", {}); return func; } catch (e) {} }(); //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseSetToString.js /** * The base implementation of `setToString` without support for hot loop shorting. * * @private * @param {Function} func The function to modify. * @param {Function} string The `toString` result. * @returns {Function} Returns `func`. */ var baseSetToString = !defineProperty ? identity : function(func, string) { return defineProperty(func, "toString", { "configurable": true, "enumerable": false, "value": constant(string), "writable": true }); }; //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_setToString.js /** * Sets the `toString` method of `func` to return `string`. * * @private * @param {Function} func The function to modify. * @param {Function} string The `toString` result. * @returns {Function} Returns `func`. */ var setToString = shortOut(baseSetToString); //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_arrayEach.js /** * A specialized version of `_.forEach` for arrays without support for * iteratee shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns `array`. */ function arrayEach(array, iteratee) { var index = -1, length = array == null ? 0 : array.length; while (++index < length) if (iteratee(array[index], index, array) === false) break; return array; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseFindIndex.js /** * The base implementation of `_.findIndex` and `_.findLastIndex` without * support for iteratee shorthands. * * @private * @param {Array} array The array to inspect. * @param {Function} predicate The function invoked per iteration. * @param {number} fromIndex The index to search from. * @param {boolean} [fromRight] Specify iterating from right to left. * @returns {number} Returns the index of the matched value, else `-1`. */ function baseFindIndex(array, predicate, fromIndex, fromRight) { var length = array.length, index = fromIndex + (fromRight ? 1 : -1); while (fromRight ? index-- : ++index < length) if (predicate(array[index], index, array)) return index; return -1; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseIsNaN.js /** * The base implementation of `_.isNaN` without support for number objects. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. */ function baseIsNaN(value) { return value !== value; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_strictIndexOf.js /** * A specialized version of `_.indexOf` which performs strict equality * comparisons of values, i.e. `===`. * * @private * @param {Array} array The array to inspect. * @param {*} value The value to search for. * @param {number} fromIndex The index to search from. * @returns {number} Returns the index of the matched value, else `-1`. */ function strictIndexOf(array, value, fromIndex) { var index = fromIndex - 1, length = array.length; while (++index < length) if (array[index] === value) return index; return -1; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseIndexOf.js /** * The base implementation of `_.indexOf` without `fromIndex` bounds checks. * * @private * @param {Array} array The array to inspect. * @param {*} value The value to search for. * @param {number} fromIndex The index to search from. * @returns {number} Returns the index of the matched value, else `-1`. */ function baseIndexOf(array, value, fromIndex) { return value === value ? strictIndexOf(array, value, fromIndex) : baseFindIndex(array, baseIsNaN, fromIndex); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_arrayIncludes.js /** * A specialized version of `_.includes` for arrays without support for * specifying an index to search from. * * @private * @param {Array} [array] The array to inspect. * @param {*} target The value to search for. * @returns {boolean} Returns `true` if `target` is found, else `false`. */ function arrayIncludes(array, value) { return !!(array == null ? 0 : array.length) && baseIndexOf(array, value, 0) > -1; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_isIndex.js /** Used as references for various `Number` constants. */ var MAX_SAFE_INTEGER$1 = 9007199254740991; /** Used to detect unsigned integer values. */ var reIsUint = /^(?:0|[1-9]\d*)$/; /** * Checks if `value` is a valid array-like index. * * @private * @param {*} value The value to check. * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. */ function isIndex(value, length) { var type = typeof value; length = length == null ? MAX_SAFE_INTEGER$1 : length; return !!length && (type == "number" || type != "symbol" && reIsUint.test(value)) && value > -1 && value % 1 == 0 && value < length; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseAssignValue.js /** * The base implementation of `assignValue` and `assignMergeValue` without * value checks. * * @private * @param {Object} object The object to modify. * @param {string} key The key of the property to assign. * @param {*} value The value to assign. */ function baseAssignValue(object, key, value) { if (key == "__proto__" && defineProperty) defineProperty(object, key, { "configurable": true, "enumerable": true, "value": value, "writable": true }); else object[key] = value; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/eq.js /** * Performs a * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * comparison between two values to determine if they are equivalent. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to compare. * @param {*} other The other value to compare. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. * @example * * var object = { 'a': 1 }; * var other = { 'a': 1 }; * * _.eq(object, object); * // => true * * _.eq(object, other); * // => false * * _.eq('a', 'a'); * // => true * * _.eq('a', Object('a')); * // => false * * _.eq(NaN, NaN); * // => true */ function eq(value, other) { return value === other || value !== value && other !== other; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_assignValue.js /** Used to check objects for own properties. */ var hasOwnProperty$11 = Object.prototype.hasOwnProperty; /** * Assigns `value` to `key` of `object` if the existing value is not equivalent * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * for equality comparisons. * * @private * @param {Object} object The object to modify. * @param {string} key The key of the property to assign. * @param {*} value The value to assign. */ function assignValue(object, key, value) { var objValue = object[key]; if (!(hasOwnProperty$11.call(object, key) && eq(objValue, value)) || value === void 0 && !(key in object)) baseAssignValue(object, key, value); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_copyObject.js /** * Copies properties of `source` to `object`. * * @private * @param {Object} source The object to copy properties from. * @param {Array} props The property identifiers to copy. * @param {Object} [object={}] The object to copy properties to. * @param {Function} [customizer] The function to customize copied values. * @returns {Object} Returns `object`. */ function copyObject(source, props, object, customizer) { var isNew = !object; object || (object = {}); var index = -1, length = props.length; while (++index < length) { var key = props[index]; var newValue = customizer ? customizer(object[key], source[key], key, object, source) : void 0; if (newValue === void 0) newValue = source[key]; if (isNew) baseAssignValue(object, key, newValue); else assignValue(object, key, newValue); } return object; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_overRest.js var nativeMax$2 = Math.max; /** * A specialized version of `baseRest` which transforms the rest array. * * @private * @param {Function} func The function to apply a rest parameter to. * @param {number} [start=func.length-1] The start position of the rest parameter. * @param {Function} transform The rest array transform. * @returns {Function} Returns the new function. */ function overRest(func, start, transform) { start = nativeMax$2(start === void 0 ? func.length - 1 : start, 0); return function() { var args = arguments, index = -1, length = nativeMax$2(args.length - start, 0), array = Array(length); while (++index < length) array[index] = args[start + index]; index = -1; var otherArgs = Array(start + 1); while (++index < start) otherArgs[index] = args[index]; otherArgs[start] = transform(array); return apply(func, this, otherArgs); }; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseRest.js /** * The base implementation of `_.rest` which doesn't validate or coerce arguments. * * @private * @param {Function} func The function to apply a rest parameter to. * @param {number} [start=func.length-1] The start position of the rest parameter. * @returns {Function} Returns the new function. */ function baseRest(func, start) { return setToString(overRest(func, start, identity), func + ""); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/isLength.js /** Used as references for various `Number` constants. */ var MAX_SAFE_INTEGER = 9007199254740991; /** * Checks if `value` is a valid array-like length. * * **Note:** This method is loosely based on * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. * @example * * _.isLength(3); * // => true * * _.isLength(Number.MIN_VALUE); * // => false * * _.isLength(Infinity); * // => false * * _.isLength('3'); * // => false */ function isLength(value) { return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/isArrayLike.js /** * Checks if `value` is array-like. A value is considered array-like if it's * not a function and has a `value.length` that's an integer greater than or * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is array-like, else `false`. * @example * * _.isArrayLike([1, 2, 3]); * // => true * * _.isArrayLike(document.body.children); * // => true * * _.isArrayLike('abc'); * // => true * * _.isArrayLike(_.noop); * // => false */ function isArrayLike(value) { return value != null && isLength(value.length) && !isFunction(value); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_isIterateeCall.js /** * Checks if the given arguments are from an iteratee call. * * @private * @param {*} value The potential iteratee value argument. * @param {*} index The potential iteratee index or key argument. * @param {*} object The potential iteratee object argument. * @returns {boolean} Returns `true` if the arguments are from an iteratee call, * else `false`. */ function isIterateeCall(value, index, object) { if (!isObject(object)) return false; var type = typeof index; if (type == "number" ? isArrayLike(object) && isIndex(index, object.length) : type == "string" && index in object) return eq(object[index], value); return false; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_createAssigner.js /** * Creates a function like `_.assign`. * * @private * @param {Function} assigner The function to assign values. * @returns {Function} Returns the new assigner function. */ function createAssigner(assigner) { return baseRest(function(object, sources) { var index = -1, length = sources.length, customizer = length > 1 ? sources[length - 1] : void 0, guard = length > 2 ? sources[2] : void 0; customizer = assigner.length > 3 && typeof customizer == "function" ? (length--, customizer) : void 0; if (guard && isIterateeCall(sources[0], sources[1], guard)) { customizer = length < 3 ? void 0 : customizer; length = 1; } object = Object(object); while (++index < length) { var source = sources[index]; if (source) assigner(object, source, index, customizer); } return object; }); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_isPrototype.js /** Used for built-in method references. */ var objectProto$2 = Object.prototype; /** * Checks if `value` is likely a prototype object. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. */ function isPrototype(value) { var Ctor = value && value.constructor; return value === (typeof Ctor == "function" && Ctor.prototype || objectProto$2); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseTimes.js /** * The base implementation of `_.times` without support for iteratee shorthands * or max array length checks. * * @private * @param {number} n The number of times to invoke `iteratee`. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns the array of results. */ function baseTimes(n, iteratee) { var index = -1, result = Array(n); while (++index < n) result[index] = iteratee(index); return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseIsArguments.js /** `Object#toString` result references. */ var argsTag$3 = "[object Arguments]"; /** * The base implementation of `_.isArguments`. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an `arguments` object, */ function baseIsArguments(value) { return isObjectLike(value) && baseGetTag(value) == argsTag$3; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/isArguments.js /** Used for built-in method references. */ var objectProto$1 = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty$10 = objectProto$1.hasOwnProperty; /** Built-in value references. */ var propertyIsEnumerable$1 = objectProto$1.propertyIsEnumerable; /** * Checks if `value` is likely an `arguments` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an `arguments` object, * else `false`. * @example * * _.isArguments(function() { return arguments; }()); * // => true * * _.isArguments([1, 2, 3]); * // => false */ var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { return isObjectLike(value) && hasOwnProperty$10.call(value, "callee") && !propertyIsEnumerable$1.call(value, "callee"); }; //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/stubFalse.js /** * This method returns `false`. * * @static * @memberOf _ * @since 4.13.0 * @category Util * @returns {boolean} Returns `false`. * @example * * _.times(2, _.stubFalse); * // => [false, false] */ function stubFalse() { return false; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/isBuffer.js /** Detect free variable `exports`. */ var freeExports$2 = typeof exports == "object" && exports && !exports.nodeType && exports; /** Detect free variable `module`. */ var freeModule$2 = freeExports$2 && typeof module == "object" && module && !module.nodeType && module; /** Built-in value references. */ var Buffer$2 = freeModule$2 && freeModule$2.exports === freeExports$2 ? root.Buffer : void 0; /** * Checks if `value` is a buffer. * * @static * @memberOf _ * @since 4.3.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. * @example * * _.isBuffer(new Buffer(2)); * // => true * * _.isBuffer(new Uint8Array(2)); * // => false */ var isBuffer = (Buffer$2 ? Buffer$2.isBuffer : void 0) || stubFalse; //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseIsTypedArray.js /** `Object#toString` result references. */ var argsTag$2 = "[object Arguments]", arrayTag$2 = "[object Array]", boolTag$3 = "[object Boolean]", dateTag$3 = "[object Date]", errorTag$2 = "[object Error]", funcTag$1 = "[object Function]", mapTag$5 = "[object Map]", numberTag$3 = "[object Number]", objectTag$4 = "[object Object]", regexpTag$3 = "[object RegExp]", setTag$5 = "[object Set]", stringTag$3 = "[object String]", weakMapTag$2 = "[object WeakMap]"; var arrayBufferTag$3 = "[object ArrayBuffer]", dataViewTag$4 = "[object DataView]", float32Tag$2 = "[object Float32Array]", float64Tag$2 = "[object Float64Array]", int8Tag$2 = "[object Int8Array]", int16Tag$2 = "[object Int16Array]", int32Tag$2 = "[object Int32Array]", uint8Tag$2 = "[object Uint8Array]", uint8ClampedTag$2 = "[object Uint8ClampedArray]", uint16Tag$2 = "[object Uint16Array]", uint32Tag$2 = "[object Uint32Array]"; /** Used to identify `toStringTag` values of typed arrays. */ var typedArrayTags = {}; typedArrayTags[float32Tag$2] = typedArrayTags[float64Tag$2] = typedArrayTags[int8Tag$2] = typedArrayTags[int16Tag$2] = typedArrayTags[int32Tag$2] = typedArrayTags[uint8Tag$2] = typedArrayTags[uint8ClampedTag$2] = typedArrayTags[uint16Tag$2] = typedArrayTags[uint32Tag$2] = true; typedArrayTags[argsTag$2] = typedArrayTags[arrayTag$2] = typedArrayTags[arrayBufferTag$3] = typedArrayTags[boolTag$3] = typedArrayTags[dataViewTag$4] = typedArrayTags[dateTag$3] = typedArrayTags[errorTag$2] = typedArrayTags[funcTag$1] = typedArrayTags[mapTag$5] = typedArrayTags[numberTag$3] = typedArrayTags[objectTag$4] = typedArrayTags[regexpTag$3] = typedArrayTags[setTag$5] = typedArrayTags[stringTag$3] = typedArrayTags[weakMapTag$2] = false; /** * The base implementation of `_.isTypedArray` without Node.js optimizations. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. */ function baseIsTypedArray(value) { return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseUnary.js /** * The base implementation of `_.unary` without support for storing metadata. * * @private * @param {Function} func The function to cap arguments for. * @returns {Function} Returns the new capped function. */ function baseUnary(func) { return function(value) { return func(value); }; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_nodeUtil.js /** Detect free variable `exports`. */ var freeExports$1 = typeof exports == "object" && exports && !exports.nodeType && exports; /** Detect free variable `module`. */ var freeModule$1 = freeExports$1 && typeof module == "object" && module && !module.nodeType && module; /** Detect free variable `process` from Node.js. */ var freeProcess = freeModule$1 && freeModule$1.exports === freeExports$1 && freeGlobal.process; /** Used to access faster Node.js helpers. */ var nodeUtil = function() { try { var types = freeModule$1 && freeModule$1.require && freeModule$1.require("util").types; if (types) return types; return freeProcess && freeProcess.binding && freeProcess.binding("util"); } catch (e) {} }(); //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/isTypedArray.js var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; /** * Checks if `value` is classified as a typed array. * * @static * @memberOf _ * @since 3.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. * @example * * _.isTypedArray(new Uint8Array); * // => true * * _.isTypedArray([]); * // => false */ var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_arrayLikeKeys.js /** Used to check objects for own properties. */ var hasOwnProperty$9 = Object.prototype.hasOwnProperty; /** * Creates an array of the enumerable property names of the array-like `value`. * * @private * @param {*} value The value to query. * @param {boolean} inherited Specify returning inherited property names. * @returns {Array} Returns the array of property names. */ function arrayLikeKeys(value, inherited) { var isArr = isArray(value), isArg = !isArr && isArguments(value), isBuff = !isArr && !isArg && isBuffer(value), isType = !isArr && !isArg && !isBuff && isTypedArray(value), skipIndexes = isArr || isArg || isBuff || isType, result = skipIndexes ? baseTimes(value.length, String) : [], length = result.length; for (var key in value) if ((inherited || hasOwnProperty$9.call(value, key)) && !(skipIndexes && (key == "length" || isBuff && (key == "offset" || key == "parent") || isType && (key == "buffer" || key == "byteLength" || key == "byteOffset") || isIndex(key, length)))) result.push(key); return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_overArg.js /** * Creates a unary function that invokes `func` with its argument transformed. * * @private * @param {Function} func The function to wrap. * @param {Function} transform The argument transform. * @returns {Function} Returns the new function. */ function overArg(func, transform) { return function(arg) { return func(transform(arg)); }; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_nativeKeys.js var nativeKeys = overArg(Object.keys, Object); //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseKeys.js /** Used to check objects for own properties. */ var hasOwnProperty$8 = Object.prototype.hasOwnProperty; /** * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. */ function baseKeys(object) { if (!isPrototype(object)) return nativeKeys(object); var result = []; for (var key in Object(object)) if (hasOwnProperty$8.call(object, key) && key != "constructor") result.push(key); return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/keys.js /** * Creates an array of the own enumerable property names of `object`. * * **Note:** Non-object values are coerced to objects. See the * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) * for more details. * * @static * @since 0.1.0 * @memberOf _ * @category Object * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. * @example * * function Foo() { * this.a = 1; * this.b = 2; * } * * Foo.prototype.c = 3; * * _.keys(new Foo); * // => ['a', 'b'] (iteration order is not guaranteed) * * _.keys('hi'); * // => ['0', '1'] */ function keys(object) { return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_nativeKeysIn.js /** * This function is like * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) * except that it includes inherited enumerable properties. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. */ function nativeKeysIn(object) { var result = []; if (object != null) for (var key in Object(object)) result.push(key); return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseKeysIn.js /** Used to check objects for own properties. */ var hasOwnProperty$7 = Object.prototype.hasOwnProperty; /** * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. */ function baseKeysIn(object) { if (!isObject(object)) return nativeKeysIn(object); var isProto = isPrototype(object), result = []; for (var key in object) if (!(key == "constructor" && (isProto || !hasOwnProperty$7.call(object, key)))) result.push(key); return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/keysIn.js /** * Creates an array of the own and inherited enumerable property names of `object`. * * **Note:** Non-object values are coerced to objects. * * @static * @memberOf _ * @since 3.0.0 * @category Object * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. * @example * * function Foo() { * this.a = 1; * this.b = 2; * } * * Foo.prototype.c = 3; * * _.keysIn(new Foo); * // => ['a', 'b', 'c'] (iteration order is not guaranteed) */ function keysIn(object) { return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_isKey.js /** Used to match property names within property paths. */ var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, reIsPlainProp = /^\w*$/; /** * Checks if `value` is a property name and not a property path. * * @private * @param {*} value The value to check. * @param {Object} [object] The object to query keys on. * @returns {boolean} Returns `true` if `value` is a property name, else `false`. */ function isKey(value, object) { if (isArray(value)) return false; var type = typeof value; if (type == "number" || type == "symbol" || type == "boolean" || value == null || isSymbol(value)) return true; return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || object != null && value in Object(object); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_nativeCreate.js var nativeCreate = getNative(Object, "create"); //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_hashClear.js /** * Removes all key-value entries from the hash. * * @private * @name clear * @memberOf Hash */ function hashClear() { this.__data__ = nativeCreate ? nativeCreate(null) : {}; this.size = 0; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_hashDelete.js /** * Removes `key` and its value from the hash. * * @private * @name delete * @memberOf Hash * @param {Object} hash The hash to modify. * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function hashDelete(key) { var result = this.has(key) && delete this.__data__[key]; this.size -= result ? 1 : 0; return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_hashGet.js /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED$2 = "__lodash_hash_undefined__"; /** Used to check objects for own properties. */ var hasOwnProperty$6 = Object.prototype.hasOwnProperty; /** * Gets the hash value for `key`. * * @private * @name get * @memberOf Hash * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function hashGet(key) { var data = this.__data__; if (nativeCreate) { var result = data[key]; return result === HASH_UNDEFINED$2 ? void 0 : result; } return hasOwnProperty$6.call(data, key) ? data[key] : void 0; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_hashHas.js /** Used to check objects for own properties. */ var hasOwnProperty$5 = Object.prototype.hasOwnProperty; /** * Checks if a hash value for `key` exists. * * @private * @name has * @memberOf Hash * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function hashHas(key) { var data = this.__data__; return nativeCreate ? data[key] !== void 0 : hasOwnProperty$5.call(data, key); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_hashSet.js /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED$1 = "__lodash_hash_undefined__"; /** * Sets the hash `key` to `value`. * * @private * @name set * @memberOf Hash * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the hash instance. */ function hashSet(key, value) { var data = this.__data__; this.size += this.has(key) ? 0 : 1; data[key] = nativeCreate && value === void 0 ? HASH_UNDEFINED$1 : value; return this; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_Hash.js /** * Creates a hash object. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function Hash(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } Hash.prototype.clear = hashClear; Hash.prototype["delete"] = hashDelete; Hash.prototype.get = hashGet; Hash.prototype.has = hashHas; Hash.prototype.set = hashSet; //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_listCacheClear.js /** * Removes all key-value entries from the list cache. * * @private * @name clear * @memberOf ListCache */ function listCacheClear() { this.__data__ = []; this.size = 0; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_assocIndexOf.js /** * Gets the index at which the `key` is found in `array` of key-value pairs. * * @private * @param {Array} array The array to inspect. * @param {*} key The key to search for. * @returns {number} Returns the index of the matched value, else `-1`. */ function assocIndexOf(array, key) { var length = array.length; while (length--) if (eq(array[length][0], key)) return length; return -1; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_listCacheDelete.js /** Built-in value references. */ var splice = Array.prototype.splice; /** * Removes `key` and its value from the list cache. * * @private * @name delete * @memberOf ListCache * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function listCacheDelete(key) { var data = this.__data__, index = assocIndexOf(data, key); if (index < 0) return false; if (index == data.length - 1) data.pop(); else splice.call(data, index, 1); --this.size; return true; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_listCacheGet.js /** * Gets the list cache value for `key`. * * @private * @name get * @memberOf ListCache * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function listCacheGet(key) { var data = this.__data__, index = assocIndexOf(data, key); return index < 0 ? void 0 : data[index][1]; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_listCacheHas.js /** * Checks if a list cache value for `key` exists. * * @private * @name has * @memberOf ListCache * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function listCacheHas(key) { return assocIndexOf(this.__data__, key) > -1; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_listCacheSet.js /** * Sets the list cache `key` to `value`. * * @private * @name set * @memberOf ListCache * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the list cache instance. */ function listCacheSet(key, value) { var data = this.__data__, index = assocIndexOf(data, key); if (index < 0) { ++this.size; data.push([key, value]); } else data[index][1] = value; return this; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_ListCache.js /** * Creates an list cache object. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function ListCache(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } ListCache.prototype.clear = listCacheClear; ListCache.prototype["delete"] = listCacheDelete; ListCache.prototype.get = listCacheGet; ListCache.prototype.has = listCacheHas; ListCache.prototype.set = listCacheSet; //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_Map.js var Map$1 = getNative(root, "Map"); //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_mapCacheClear.js /** * Removes all key-value entries from the map. * * @private * @name clear * @memberOf MapCache */ function mapCacheClear() { this.size = 0; this.__data__ = { "hash": new Hash(), "map": new (Map$1 || ListCache)(), "string": new Hash() }; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_isKeyable.js /** * Checks if `value` is suitable for use as unique object key. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is suitable, else `false`. */ function isKeyable(value) { var type = typeof value; return type == "string" || type == "number" || type == "symbol" || type == "boolean" ? value !== "__proto__" : value === null; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_getMapData.js /** * Gets the data for `map`. * * @private * @param {Object} map The map to query. * @param {string} key The reference key. * @returns {*} Returns the map data. */ function getMapData(map, key) { var data = map.__data__; return isKeyable(key) ? data[typeof key == "string" ? "string" : "hash"] : data.map; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_mapCacheDelete.js /** * Removes `key` and its value from the map. * * @private * @name delete * @memberOf MapCache * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function mapCacheDelete(key) { var result = getMapData(this, key)["delete"](key); this.size -= result ? 1 : 0; return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_mapCacheGet.js /** * Gets the map value for `key`. * * @private * @name get * @memberOf MapCache * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function mapCacheGet(key) { return getMapData(this, key).get(key); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_mapCacheHas.js /** * Checks if a map value for `key` exists. * * @private * @name has * @memberOf MapCache * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function mapCacheHas(key) { return getMapData(this, key).has(key); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_mapCacheSet.js /** * Sets the map `key` to `value`. * * @private * @name set * @memberOf MapCache * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the map cache instance. */ function mapCacheSet(key, value) { var data = getMapData(this, key), size = data.size; data.set(key, value); this.size += data.size == size ? 0 : 1; return this; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_MapCache.js /** * Creates a map cache object to store key-value pairs. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function MapCache(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } MapCache.prototype.clear = mapCacheClear; MapCache.prototype["delete"] = mapCacheDelete; MapCache.prototype.get = mapCacheGet; MapCache.prototype.has = mapCacheHas; MapCache.prototype.set = mapCacheSet; //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/memoize.js /** Error message constants. */ var FUNC_ERROR_TEXT$2 = "Expected a function"; /** * Creates a function that memoizes the result of `func`. If `resolver` is * provided, it determines the cache key for storing the result based on the * arguments provided to the memoized function. By default, the first argument * provided to the memoized function is used as the map cache key. The `func` * is invoked with the `this` binding of the memoized function. * * **Note:** The cache is exposed as the `cache` property on the memoized * function. Its creation may be customized by replacing the `_.memoize.Cache` * constructor with one whose instances implement the * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) * method interface of `clear`, `delete`, `get`, `has`, and `set`. * * @static * @memberOf _ * @since 0.1.0 * @category Function * @param {Function} func The function to have its output memoized. * @param {Function} [resolver] The function to resolve the cache key. * @returns {Function} Returns the new memoized function. * @example * * var object = { 'a': 1, 'b': 2 }; * var other = { 'c': 3, 'd': 4 }; * * var values = _.memoize(_.values); * values(object); * // => [1, 2] * * values(other); * // => [3, 4] * * object.a = 2; * values(object); * // => [1, 2] * * // Modify the result cache. * values.cache.set(object, ['a', 'b']); * values(object); * // => ['a', 'b'] * * // Replace `_.memoize.Cache`. * _.memoize.Cache = WeakMap; */ function memoize(func, resolver) { if (typeof func != "function" || resolver != null && typeof resolver != "function") throw new TypeError(FUNC_ERROR_TEXT$2); var memoized = function() { var args = arguments, key = resolver ? resolver.apply(this, args) : args[0], cache = memoized.cache; if (cache.has(key)) return cache.get(key); var result = func.apply(this, args); memoized.cache = cache.set(key, result) || cache; return result; }; memoized.cache = new (memoize.Cache || MapCache)(); return memoized; } memoize.Cache = MapCache; //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_memoizeCapped.js /** Used as the maximum memoize cache size. */ var MAX_MEMOIZE_SIZE = 500; /** * A specialized version of `_.memoize` which clears the memoized function's * cache when it exceeds `MAX_MEMOIZE_SIZE`. * * @private * @param {Function} func The function to have its output memoized. * @returns {Function} Returns the new memoized function. */ function memoizeCapped(func) { var result = memoize(func, function(key) { if (cache.size === MAX_MEMOIZE_SIZE) cache.clear(); return key; }); var cache = result.cache; return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_stringToPath.js /** Used to match property names within property paths. */ var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; /** Used to match backslashes in property paths. */ var reEscapeChar = /\\(\\)?/g; /** * Converts `string` to a property path array. * * @private * @param {string} string The string to convert. * @returns {Array} Returns the property path array. */ var stringToPath = memoizeCapped(function(string) { var result = []; if (string.charCodeAt(0) === 46) result.push(""); string.replace(rePropName, function(match, number, quote, subString) { result.push(quote ? subString.replace(reEscapeChar, "$1") : number || match); }); return result; }); //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/toString.js /** * Converts `value` to a string. An empty string is returned for `null` * and `undefined` values. The sign of `-0` is preserved. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to convert. * @returns {string} Returns the converted string. * @example * * _.toString(null); * // => '' * * _.toString(-0); * // => '-0' * * _.toString([1, 2, 3]); * // => '1,2,3' */ function toString(value) { return value == null ? "" : baseToString(value); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_castPath.js /** * Casts `value` to a path array if it's not one. * * @private * @param {*} value The value to inspect. * @param {Object} [object] The object to query keys on. * @returns {Array} Returns the cast property path array. */ function castPath(value, object) { if (isArray(value)) return value; return isKey(value, object) ? [value] : stringToPath(toString(value)); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_toKey.js /** Used as references for various `Number` constants. */ var INFINITY$1 = Infinity; /** * Converts `value` to a string key if it's not a string or symbol. * * @private * @param {*} value The value to inspect. * @returns {string|symbol} Returns the key. */ function toKey(value) { if (typeof value == "string" || isSymbol(value)) return value; var result = value + ""; return result == "0" && 1 / value == -INFINITY$1 ? "-0" : result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseGet.js /** * The base implementation of `_.get` without support for default values. * * @private * @param {Object} object The object to query. * @param {Array|string} path The path of the property to get. * @returns {*} Returns the resolved value. */ function baseGet(object, path) { path = castPath(path, object); var index = 0, length = path.length; while (object != null && index < length) object = object[toKey(path[index++])]; return index && index == length ? object : void 0; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/get.js /** * Gets the value at `path` of `object`. If the resolved value is * `undefined`, the `defaultValue` is returned in its place. * * @static * @memberOf _ * @since 3.7.0 * @category Object * @param {Object} object The object to query. * @param {Array|string} path The path of the property to get. * @param {*} [defaultValue] The value returned for `undefined` resolved values. * @returns {*} Returns the resolved value. * @example * * var object = { 'a': [{ 'b': { 'c': 3 } }] }; * * _.get(object, 'a[0].b.c'); * // => 3 * * _.get(object, ['a', '0', 'b', 'c']); * // => 3 * * _.get(object, 'a.b.c', 'default'); * // => 'default' */ function get(object, path, defaultValue) { var result = object == null ? void 0 : baseGet(object, path); return result === void 0 ? defaultValue : result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_arrayPush.js /** * Appends the elements of `values` to `array`. * * @private * @param {Array} array The array to modify. * @param {Array} values The values to append. * @returns {Array} Returns `array`. */ function arrayPush(array, values) { var index = -1, length = values.length, offset = array.length; while (++index < length) array[offset + index] = values[index]; return array; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_isFlattenable.js /** Built-in value references. */ var spreadableSymbol = Symbol$1 ? Symbol$1.isConcatSpreadable : void 0; /** * Checks if `value` is a flattenable `arguments` object or array. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. */ function isFlattenable(value) { return isArray(value) || isArguments(value) || !!(spreadableSymbol && value && value[spreadableSymbol]); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseFlatten.js /** * The base implementation of `_.flatten` with support for restricting flattening. * * @private * @param {Array} array The array to flatten. * @param {number} depth The maximum recursion depth. * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. * @param {Array} [result=[]] The initial result value. * @returns {Array} Returns the new flattened array. */ function baseFlatten(array, depth, predicate, isStrict, result) { var index = -1, length = array.length; predicate || (predicate = isFlattenable); result || (result = []); while (++index < length) { var value = array[index]; if (depth > 0 && predicate(value)) if (depth > 1) baseFlatten(value, depth - 1, predicate, isStrict, result); else arrayPush(result, value); else if (!isStrict) result[result.length] = value; } return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/flatten.js /** * Flattens `array` a single level deep. * * @static * @memberOf _ * @since 0.1.0 * @category Array * @param {Array} array The array to flatten. * @returns {Array} Returns the new flattened array. * @example * * _.flatten([1, [2, [3, [4]], 5]]); * // => [1, 2, [3, [4]], 5] */ function flatten(array) { return (array == null ? 0 : array.length) ? baseFlatten(array, 1) : []; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_flatRest.js /** * A specialized version of `baseRest` which flattens the rest array. * * @private * @param {Function} func The function to apply a rest parameter to. * @returns {Function} Returns the new function. */ function flatRest(func) { return setToString(overRest(func, void 0, flatten), func + ""); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_getPrototype.js /** Built-in value references. */ var getPrototype = overArg(Object.getPrototypeOf, Object); //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/isPlainObject.js /** `Object#toString` result references. */ var objectTag$3 = "[object Object]"; /** Used for built-in method references. */ var funcProto = Function.prototype, objectProto = Object.prototype; /** Used to resolve the decompiled source of functions. */ var funcToString = funcProto.toString; /** Used to check objects for own properties. */ var hasOwnProperty$4 = objectProto.hasOwnProperty; /** Used to infer the `Object` constructor. */ var objectCtorString = funcToString.call(Object); /** * Checks if `value` is a plain object, that is, an object created by the * `Object` constructor or one with a `[[Prototype]]` of `null`. * * @static * @memberOf _ * @since 0.8.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. * @example * * function Foo() { * this.a = 1; * } * * _.isPlainObject(new Foo); * // => false * * _.isPlainObject([1, 2, 3]); * // => false * * _.isPlainObject({ 'x': 0, 'y': 0 }); * // => true * * _.isPlainObject(Object.create(null)); * // => true */ function isPlainObject(value) { if (!isObjectLike(value) || baseGetTag(value) != objectTag$3) return false; var proto = getPrototype(value); if (proto === null) return true; var Ctor = hasOwnProperty$4.call(proto, "constructor") && proto.constructor; return typeof Ctor == "function" && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseSlice.js /** * The base implementation of `_.slice` without an iteratee call guard. * * @private * @param {Array} array The array to slice. * @param {number} [start=0] The start position. * @param {number} [end=array.length] The end position. * @returns {Array} Returns the slice of `array`. */ function baseSlice(array, start, end) { var index = -1, length = array.length; if (start < 0) start = -start > length ? 0 : length + start; end = end > length ? length : end; if (end < 0) end += length; length = start > end ? 0 : end - start >>> 0; start >>>= 0; var result = Array(length); while (++index < length) result[index] = array[index + start]; return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/castArray.js /** * Casts `value` as an array if it's not one. * * @static * @memberOf _ * @since 4.4.0 * @category Lang * @param {*} value The value to inspect. * @returns {Array} Returns the cast array. * @example * * _.castArray(1); * // => [1] * * _.castArray({ 'a': 1 }); * // => [{ 'a': 1 }] * * _.castArray('abc'); * // => ['abc'] * * _.castArray(null); * // => [null] * * _.castArray(undefined); * // => [undefined] * * _.castArray(); * // => [] * * var array = [1, 2, 3]; * console.log(_.castArray(array) === array); * // => true */ function castArray$1() { if (!arguments.length) return []; var value = arguments[0]; return isArray(value) ? value : [value]; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseClamp.js /** * The base implementation of `_.clamp` which doesn't coerce arguments. * * @private * @param {number} number The number to clamp. * @param {number} [lower] The lower bound. * @param {number} upper The upper bound. * @returns {number} Returns the clamped number. */ function baseClamp(number, lower, upper) { if (number === number) { if (upper !== void 0) number = number <= upper ? number : upper; if (lower !== void 0) number = number >= lower ? number : lower; } return number; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/clamp.js /** * Clamps `number` within the inclusive `lower` and `upper` bounds. * * @static * @memberOf _ * @since 4.0.0 * @category Number * @param {number} number The number to clamp. * @param {number} [lower] The lower bound. * @param {number} upper The upper bound. * @returns {number} Returns the clamped number. * @example * * _.clamp(-10, -5, 5); * // => -5 * * _.clamp(10, -5, 5); * // => 5 */ function clamp$1(number, lower, upper) { if (upper === void 0) { upper = lower; lower = void 0; } if (upper !== void 0) { upper = toNumber(upper); upper = upper === upper ? upper : 0; } if (lower !== void 0) { lower = toNumber(lower); lower = lower === lower ? lower : 0; } return baseClamp(toNumber(number), lower, upper); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_stackClear.js /** * Removes all key-value entries from the stack. * * @private * @name clear * @memberOf Stack */ function stackClear() { this.__data__ = new ListCache(); this.size = 0; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_stackDelete.js /** * Removes `key` and its value from the stack. * * @private * @name delete * @memberOf Stack * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function stackDelete(key) { var data = this.__data__, result = data["delete"](key); this.size = data.size; return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_stackGet.js /** * Gets the stack value for `key`. * * @private * @name get * @memberOf Stack * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function stackGet(key) { return this.__data__.get(key); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_stackHas.js /** * Checks if a stack value for `key` exists. * * @private * @name has * @memberOf Stack * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function stackHas(key) { return this.__data__.has(key); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_stackSet.js /** Used as the size to enable large array optimizations. */ var LARGE_ARRAY_SIZE$1 = 200; /** * Sets the stack `key` to `value`. * * @private * @name set * @memberOf Stack * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the stack cache instance. */ function stackSet(key, value) { var data = this.__data__; if (data instanceof ListCache) { var pairs = data.__data__; if (!Map$1 || pairs.length < LARGE_ARRAY_SIZE$1 - 1) { pairs.push([key, value]); this.size = ++data.size; return this; } data = this.__data__ = new MapCache(pairs); } data.set(key, value); this.size = data.size; return this; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_Stack.js /** * Creates a stack cache object to store key-value pairs. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function Stack(entries) { var data = this.__data__ = new ListCache(entries); this.size = data.size; } Stack.prototype.clear = stackClear; Stack.prototype["delete"] = stackDelete; Stack.prototype.get = stackGet; Stack.prototype.has = stackHas; Stack.prototype.set = stackSet; //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseAssign.js /** * The base implementation of `_.assign` without support for multiple sources * or `customizer` functions. * * @private * @param {Object} object The destination object. * @param {Object} source The source object. * @returns {Object} Returns `object`. */ function baseAssign(object, source) { return object && copyObject(source, keys(source), object); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseAssignIn.js /** * The base implementation of `_.assignIn` without support for multiple sources * or `customizer` functions. * * @private * @param {Object} object The destination object. * @param {Object} source The source object. * @returns {Object} Returns `object`. */ function baseAssignIn(object, source) { return object && copyObject(source, keysIn(source), object); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_cloneBuffer.js /** Detect free variable `exports`. */ var freeExports = typeof exports == "object" && exports && !exports.nodeType && exports; /** Detect free variable `module`. */ var freeModule = freeExports && typeof module == "object" && module && !module.nodeType && module; /** Built-in value references. */ var Buffer$1 = freeModule && freeModule.exports === freeExports ? root.Buffer : void 0, allocUnsafe = Buffer$1 ? Buffer$1.allocUnsafe : void 0; /** * Creates a clone of `buffer`. * * @private * @param {Buffer} buffer The buffer to clone. * @param {boolean} [isDeep] Specify a deep clone. * @returns {Buffer} Returns the cloned buffer. */ function cloneBuffer(buffer, isDeep) { if (isDeep) return buffer.slice(); var length = buffer.length, result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); buffer.copy(result); return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_arrayFilter.js /** * A specialized version of `_.filter` for arrays without support for * iteratee shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} predicate The function invoked per iteration. * @returns {Array} Returns the new filtered array. */ function arrayFilter(array, predicate) { var index = -1, length = array == null ? 0 : array.length, resIndex = 0, result = []; while (++index < length) { var value = array[index]; if (predicate(value, index, array)) result[resIndex++] = value; } return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/stubArray.js /** * This method returns a new empty array. * * @static * @memberOf _ * @since 4.13.0 * @category Util * @returns {Array} Returns the new empty array. * @example * * var arrays = _.times(2, _.stubArray); * * console.log(arrays); * // => [[], []] * * console.log(arrays[0] === arrays[1]); * // => false */ function stubArray() { return []; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_getSymbols.js /** Built-in value references. */ var propertyIsEnumerable = Object.prototype.propertyIsEnumerable; var nativeGetSymbols = Object.getOwnPropertySymbols; /** * Creates an array of the own enumerable symbols of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of symbols. */ var getSymbols = !nativeGetSymbols ? stubArray : function(object) { if (object == null) return []; object = Object(object); return arrayFilter(nativeGetSymbols(object), function(symbol) { return propertyIsEnumerable.call(object, symbol); }); }; //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_copySymbols.js /** * Copies own symbols of `source` to `object`. * * @private * @param {Object} source The object to copy symbols from. * @param {Object} [object={}] The object to copy symbols to. * @returns {Object} Returns `object`. */ function copySymbols(source, object) { return copyObject(source, getSymbols(source), object); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_getSymbolsIn.js /** * Creates an array of the own and inherited enumerable symbols of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of symbols. */ var getSymbolsIn = !Object.getOwnPropertySymbols ? stubArray : function(object) { var result = []; while (object) { arrayPush(result, getSymbols(object)); object = getPrototype(object); } return result; }; //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_copySymbolsIn.js /** * Copies own and inherited symbols of `source` to `object`. * * @private * @param {Object} source The object to copy symbols from. * @param {Object} [object={}] The object to copy symbols to. * @returns {Object} Returns `object`. */ function copySymbolsIn(source, object) { return copyObject(source, getSymbolsIn(source), object); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseGetAllKeys.js /** * The base implementation of `getAllKeys` and `getAllKeysIn` which uses * `keysFunc` and `symbolsFunc` to get the enumerable property names and * symbols of `object`. * * @private * @param {Object} object The object to query. * @param {Function} keysFunc The function to get the keys of `object`. * @param {Function} symbolsFunc The function to get the symbols of `object`. * @returns {Array} Returns the array of property names and symbols. */ function baseGetAllKeys(object, keysFunc, symbolsFunc) { var result = keysFunc(object); return isArray(object) ? result : arrayPush(result, symbolsFunc(object)); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_getAllKeys.js /** * Creates an array of own enumerable property names and symbols of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names and symbols. */ function getAllKeys(object) { return baseGetAllKeys(object, keys, getSymbols); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_getAllKeysIn.js /** * Creates an array of own and inherited enumerable property names and * symbols of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names and symbols. */ function getAllKeysIn(object) { return baseGetAllKeys(object, keysIn, getSymbolsIn); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_DataView.js var DataView = getNative(root, "DataView"); //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_Promise.js var Promise$1 = getNative(root, "Promise"); //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_Set.js var Set$1 = getNative(root, "Set"); //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_getTag.js /** `Object#toString` result references. */ var mapTag$4 = "[object Map]", objectTag$2 = "[object Object]", promiseTag = "[object Promise]", setTag$4 = "[object Set]", weakMapTag$1 = "[object WeakMap]"; var dataViewTag$3 = "[object DataView]"; /** Used to detect maps, sets, and weakmaps. */ var dataViewCtorString = toSource(DataView), mapCtorString = toSource(Map$1), promiseCtorString = toSource(Promise$1), setCtorString = toSource(Set$1), weakMapCtorString = toSource(WeakMap$1); /** * Gets the `toStringTag` of `value`. * * @private * @param {*} value The value to query. * @returns {string} Returns the `toStringTag`. */ var getTag = baseGetTag; if (DataView && getTag(new DataView(/* @__PURE__ */ new ArrayBuffer(1))) != dataViewTag$3 || Map$1 && getTag(new Map$1()) != mapTag$4 || Promise$1 && getTag(Promise$1.resolve()) != promiseTag || Set$1 && getTag(new Set$1()) != setTag$4 || WeakMap$1 && getTag(new WeakMap$1()) != weakMapTag$1) getTag = function(value) { var result = baseGetTag(value), Ctor = result == objectTag$2 ? value.constructor : void 0, ctorString = Ctor ? toSource(Ctor) : ""; if (ctorString) switch (ctorString) { case dataViewCtorString: return dataViewTag$3; case mapCtorString: return mapTag$4; case promiseCtorString: return promiseTag; case setCtorString: return setTag$4; case weakMapCtorString: return weakMapTag$1; } return result; }; var _getTag_default = getTag; //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_initCloneArray.js /** Used to check objects for own properties. */ var hasOwnProperty$3 = Object.prototype.hasOwnProperty; /** * Initializes an array clone. * * @private * @param {Array} array The array to clone. * @returns {Array} Returns the initialized clone. */ function initCloneArray(array) { var length = array.length, result = new array.constructor(length); if (length && typeof array[0] == "string" && hasOwnProperty$3.call(array, "index")) { result.index = array.index; result.input = array.input; } return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_Uint8Array.js /** Built-in value references. */ var Uint8Array$1 = root.Uint8Array; //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_cloneArrayBuffer.js /** * Creates a clone of `arrayBuffer`. * * @private * @param {ArrayBuffer} arrayBuffer The array buffer to clone. * @returns {ArrayBuffer} Returns the cloned array buffer. */ function cloneArrayBuffer(arrayBuffer) { var result = new arrayBuffer.constructor(arrayBuffer.byteLength); new Uint8Array$1(result).set(new Uint8Array$1(arrayBuffer)); return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_cloneDataView.js /** * Creates a clone of `dataView`. * * @private * @param {Object} dataView The data view to clone. * @param {boolean} [isDeep] Specify a deep clone. * @returns {Object} Returns the cloned data view. */ function cloneDataView(dataView, isDeep) { var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer; return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_cloneRegExp.js /** Used to match `RegExp` flags from their coerced string values. */ var reFlags = /\w*$/; /** * Creates a clone of `regexp`. * * @private * @param {Object} regexp The regexp to clone. * @returns {Object} Returns the cloned regexp. */ function cloneRegExp(regexp) { var result = new regexp.constructor(regexp.source, reFlags.exec(regexp)); result.lastIndex = regexp.lastIndex; return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_cloneSymbol.js /** Used to convert symbols to primitives and strings. */ var symbolProto$1 = Symbol$1 ? Symbol$1.prototype : void 0, symbolValueOf$1 = symbolProto$1 ? symbolProto$1.valueOf : void 0; /** * Creates a clone of the `symbol` object. * * @private * @param {Object} symbol The symbol object to clone. * @returns {Object} Returns the cloned symbol object. */ function cloneSymbol(symbol) { return symbolValueOf$1 ? Object(symbolValueOf$1.call(symbol)) : {}; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_cloneTypedArray.js /** * Creates a clone of `typedArray`. * * @private * @param {Object} typedArray The typed array to clone. * @param {boolean} [isDeep] Specify a deep clone. * @returns {Object} Returns the cloned typed array. */ function cloneTypedArray(typedArray, isDeep) { var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_initCloneByTag.js /** `Object#toString` result references. */ var boolTag$2 = "[object Boolean]", dateTag$2 = "[object Date]", mapTag$3 = "[object Map]", numberTag$2 = "[object Number]", regexpTag$2 = "[object RegExp]", setTag$3 = "[object Set]", stringTag$2 = "[object String]", symbolTag$2 = "[object Symbol]"; var arrayBufferTag$2 = "[object ArrayBuffer]", dataViewTag$2 = "[object DataView]", float32Tag$1 = "[object Float32Array]", float64Tag$1 = "[object Float64Array]", int8Tag$1 = "[object Int8Array]", int16Tag$1 = "[object Int16Array]", int32Tag$1 = "[object Int32Array]", uint8Tag$1 = "[object Uint8Array]", uint8ClampedTag$1 = "[object Uint8ClampedArray]", uint16Tag$1 = "[object Uint16Array]", uint32Tag$1 = "[object Uint32Array]"; /** * Initializes an object clone based on its `toStringTag`. * * **Note:** This function only supports cloning values with tags of * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`. * * @private * @param {Object} object The object to clone. * @param {string} tag The `toStringTag` of the object to clone. * @param {boolean} [isDeep] Specify a deep clone. * @returns {Object} Returns the initialized clone. */ function initCloneByTag(object, tag, isDeep) { var Ctor = object.constructor; switch (tag) { case arrayBufferTag$2: return cloneArrayBuffer(object); case boolTag$2: case dateTag$2: return new Ctor(+object); case dataViewTag$2: return cloneDataView(object, isDeep); case float32Tag$1: case float64Tag$1: case int8Tag$1: case int16Tag$1: case int32Tag$1: case uint8Tag$1: case uint8ClampedTag$1: case uint16Tag$1: case uint32Tag$1: return cloneTypedArray(object, isDeep); case mapTag$3: return new Ctor(); case numberTag$2: case stringTag$2: return new Ctor(object); case regexpTag$2: return cloneRegExp(object); case setTag$3: return new Ctor(); case symbolTag$2: return cloneSymbol(object); } } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_initCloneObject.js /** * Initializes an object clone. * * @private * @param {Object} object The object to clone. * @returns {Object} Returns the initialized clone. */ function initCloneObject(object) { return typeof object.constructor == "function" && !isPrototype(object) ? baseCreate(getPrototype(object)) : {}; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseIsMap.js /** `Object#toString` result references. */ var mapTag$2 = "[object Map]"; /** * The base implementation of `_.isMap` without Node.js optimizations. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a map, else `false`. */ function baseIsMap(value) { return isObjectLike(value) && _getTag_default(value) == mapTag$2; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/isMap.js var nodeIsMap = nodeUtil && nodeUtil.isMap; /** * Checks if `value` is classified as a `Map` object. * * @static * @memberOf _ * @since 4.3.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a map, else `false`. * @example * * _.isMap(new Map); * // => true * * _.isMap(new WeakMap); * // => false */ var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseIsSet.js /** `Object#toString` result references. */ var setTag$2 = "[object Set]"; /** * The base implementation of `_.isSet` without Node.js optimizations. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a set, else `false`. */ function baseIsSet(value) { return isObjectLike(value) && _getTag_default(value) == setTag$2; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/isSet.js var nodeIsSet = nodeUtil && nodeUtil.isSet; /** * Checks if `value` is classified as a `Set` object. * * @static * @memberOf _ * @since 4.3.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a set, else `false`. * @example * * _.isSet(new Set); * // => true * * _.isSet(new WeakSet); * // => false */ var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet; //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseClone.js /** Used to compose bitmasks for cloning. */ var CLONE_DEEP_FLAG$2 = 1, CLONE_FLAT_FLAG$1 = 2, CLONE_SYMBOLS_FLAG$2 = 4; /** `Object#toString` result references. */ var argsTag$1 = "[object Arguments]", arrayTag$1 = "[object Array]", boolTag$1 = "[object Boolean]", dateTag$1 = "[object Date]", errorTag$1 = "[object Error]", funcTag = "[object Function]", genTag = "[object GeneratorFunction]", mapTag$1 = "[object Map]", numberTag$1 = "[object Number]", objectTag$1 = "[object Object]", regexpTag$1 = "[object RegExp]", setTag$1 = "[object Set]", stringTag$1 = "[object String]", symbolTag$1 = "[object Symbol]", weakMapTag = "[object WeakMap]"; var arrayBufferTag$1 = "[object ArrayBuffer]", dataViewTag$1 = "[object DataView]", float32Tag = "[object Float32Array]", float64Tag = "[object Float64Array]", int8Tag = "[object Int8Array]", int16Tag = "[object Int16Array]", int32Tag = "[object Int32Array]", uint8Tag = "[object Uint8Array]", uint8ClampedTag = "[object Uint8ClampedArray]", uint16Tag = "[object Uint16Array]", uint32Tag = "[object Uint32Array]"; /** Used to identify `toStringTag` values supported by `_.clone`. */ var cloneableTags = {}; cloneableTags[argsTag$1] = cloneableTags[arrayTag$1] = cloneableTags[arrayBufferTag$1] = cloneableTags[dataViewTag$1] = cloneableTags[boolTag$1] = cloneableTags[dateTag$1] = cloneableTags[float32Tag] = cloneableTags[float64Tag] = cloneableTags[int8Tag] = cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[mapTag$1] = cloneableTags[numberTag$1] = cloneableTags[objectTag$1] = cloneableTags[regexpTag$1] = cloneableTags[setTag$1] = cloneableTags[stringTag$1] = cloneableTags[symbolTag$1] = cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; cloneableTags[errorTag$1] = cloneableTags[funcTag] = cloneableTags[weakMapTag] = false; /** * The base implementation of `_.clone` and `_.cloneDeep` which tracks * traversed objects. * * @private * @param {*} value The value to clone. * @param {boolean} bitmask The bitmask flags. * 1 - Deep clone * 2 - Flatten inherited properties * 4 - Clone symbols * @param {Function} [customizer] The function to customize cloning. * @param {string} [key] The key of `value`. * @param {Object} [object] The parent object of `value`. * @param {Object} [stack] Tracks traversed objects and their clone counterparts. * @returns {*} Returns the cloned value. */ function baseClone(value, bitmask, customizer, key, object, stack) { var result, isDeep = bitmask & CLONE_DEEP_FLAG$2, isFlat = bitmask & CLONE_FLAT_FLAG$1, isFull = bitmask & CLONE_SYMBOLS_FLAG$2; if (customizer) result = object ? customizer(value, key, object, stack) : customizer(value); if (result !== void 0) return result; if (!isObject(value)) return value; var isArr = isArray(value); if (isArr) { result = initCloneArray(value); if (!isDeep) return copyArray(value, result); } else { var tag = _getTag_default(value), isFunc = tag == funcTag || tag == genTag; if (isBuffer(value)) return cloneBuffer(value, isDeep); if (tag == objectTag$1 || tag == argsTag$1 || isFunc && !object) { result = isFlat || isFunc ? {} : initCloneObject(value); if (!isDeep) return isFlat ? copySymbolsIn(value, baseAssignIn(result, value)) : copySymbols(value, baseAssign(result, value)); } else { if (!cloneableTags[tag]) return object ? value : {}; result = initCloneByTag(value, tag, isDeep); } } stack || (stack = new Stack()); var stacked = stack.get(value); if (stacked) return stacked; stack.set(value, result); if (isSet(value)) value.forEach(function(subValue) { result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack)); }); else if (isMap(value)) value.forEach(function(subValue, key) { result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack)); }); var props = isArr ? void 0 : (isFull ? isFlat ? getAllKeysIn : getAllKeys : isFlat ? keysIn : keys)(value); arrayEach(props || value, function(subValue, key) { if (props) { key = subValue; subValue = value[key]; } assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack)); }); return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/cloneDeep.js /** Used to compose bitmasks for cloning. */ var CLONE_DEEP_FLAG$1 = 1, CLONE_SYMBOLS_FLAG$1 = 4; /** * This method is like `_.clone` except that it recursively clones `value`. * * @static * @memberOf _ * @since 1.0.0 * @category Lang * @param {*} value The value to recursively clone. * @returns {*} Returns the deep cloned value. * @see _.clone * @example * * var objects = [{ 'a': 1 }, { 'b': 2 }]; * * var deep = _.cloneDeep(objects); * console.log(deep[0] === objects[0]); * // => false */ function cloneDeep(value) { return baseClone(value, CLONE_DEEP_FLAG$1 | CLONE_SYMBOLS_FLAG$1); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_setCacheAdd.js /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED = "__lodash_hash_undefined__"; /** * Adds `value` to the array cache. * * @private * @name add * @memberOf SetCache * @alias push * @param {*} value The value to cache. * @returns {Object} Returns the cache instance. */ function setCacheAdd(value) { this.__data__.set(value, HASH_UNDEFINED); return this; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_setCacheHas.js /** * Checks if `value` is in the array cache. * * @private * @name has * @memberOf SetCache * @param {*} value The value to search for. * @returns {boolean} Returns `true` if `value` is found, else `false`. */ function setCacheHas(value) { return this.__data__.has(value); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_SetCache.js /** * * Creates an array cache object to store unique values. * * @private * @constructor * @param {Array} [values] The values to cache. */ function SetCache(values) { var index = -1, length = values == null ? 0 : values.length; this.__data__ = new MapCache(); while (++index < length) this.add(values[index]); } SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; SetCache.prototype.has = setCacheHas; //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_arraySome.js /** * A specialized version of `_.some` for arrays without support for iteratee * shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} predicate The function invoked per iteration. * @returns {boolean} Returns `true` if any element passes the predicate check, * else `false`. */ function arraySome(array, predicate) { var index = -1, length = array == null ? 0 : array.length; while (++index < length) if (predicate(array[index], index, array)) return true; return false; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_cacheHas.js /** * Checks if a `cache` value for `key` exists. * * @private * @param {Object} cache The cache to query. * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function cacheHas(cache, key) { return cache.has(key); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_equalArrays.js /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG$5 = 1, COMPARE_UNORDERED_FLAG$3 = 2; /** * A specialized version of `baseIsEqualDeep` for arrays with support for * partial deep comparisons. * * @private * @param {Array} array The array to compare. * @param {Array} other The other array to compare. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} stack Tracks traversed `array` and `other` objects. * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. */ function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { var isPartial = bitmask & COMPARE_PARTIAL_FLAG$5, arrLength = array.length, othLength = other.length; if (arrLength != othLength && !(isPartial && othLength > arrLength)) return false; var arrStacked = stack.get(array); var othStacked = stack.get(other); if (arrStacked && othStacked) return arrStacked == other && othStacked == array; var index = -1, result = true, seen = bitmask & COMPARE_UNORDERED_FLAG$3 ? new SetCache() : void 0; stack.set(array, other); stack.set(other, array); while (++index < arrLength) { var arrValue = array[index], othValue = other[index]; if (customizer) var compared = isPartial ? customizer(othValue, arrValue, index, other, array, stack) : customizer(arrValue, othValue, index, array, other, stack); if (compared !== void 0) { if (compared) continue; result = false; break; } if (seen) { if (!arraySome(other, function(othValue, othIndex) { if (!cacheHas(seen, othIndex) && (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) return seen.push(othIndex); })) { result = false; break; } } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { result = false; break; } } stack["delete"](array); stack["delete"](other); return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_mapToArray.js /** * Converts `map` to its key-value pairs. * * @private * @param {Object} map The map to convert. * @returns {Array} Returns the key-value pairs. */ function mapToArray(map) { var index = -1, result = Array(map.size); map.forEach(function(value, key) { result[++index] = [key, value]; }); return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_setToArray.js /** * Converts `set` to an array of its values. * * @private * @param {Object} set The set to convert. * @returns {Array} Returns the values. */ function setToArray(set) { var index = -1, result = Array(set.size); set.forEach(function(value) { result[++index] = value; }); return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_equalByTag.js /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG$4 = 1, COMPARE_UNORDERED_FLAG$2 = 2; /** `Object#toString` result references. */ var boolTag = "[object Boolean]", dateTag = "[object Date]", errorTag = "[object Error]", mapTag = "[object Map]", numberTag = "[object Number]", regexpTag = "[object RegExp]", setTag = "[object Set]", stringTag = "[object String]", symbolTag = "[object Symbol]"; var arrayBufferTag = "[object ArrayBuffer]", dataViewTag = "[object DataView]"; /** Used to convert symbols to primitives and strings. */ var symbolProto = Symbol$1 ? Symbol$1.prototype : void 0, symbolValueOf = symbolProto ? symbolProto.valueOf : void 0; /** * A specialized version of `baseIsEqualDeep` for comparing objects of * the same `toStringTag`. * * **Note:** This function only supports comparing values with tags of * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. * * @private * @param {Object} object The object to compare. * @param {Object} other The other object to compare. * @param {string} tag The `toStringTag` of the objects to compare. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} stack Tracks traversed `object` and `other` objects. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { switch (tag) { case dataViewTag: if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) return false; object = object.buffer; other = other.buffer; case arrayBufferTag: if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array$1(object), new Uint8Array$1(other))) return false; return true; case boolTag: case dateTag: case numberTag: return eq(+object, +other); case errorTag: return object.name == other.name && object.message == other.message; case regexpTag: case stringTag: return object == other + ""; case mapTag: var convert = mapToArray; case setTag: var isPartial = bitmask & COMPARE_PARTIAL_FLAG$4; convert || (convert = setToArray); if (object.size != other.size && !isPartial) return false; var stacked = stack.get(object); if (stacked) return stacked == other; bitmask |= COMPARE_UNORDERED_FLAG$2; stack.set(object, other); var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); stack["delete"](object); return result; case symbolTag: if (symbolValueOf) return symbolValueOf.call(object) == symbolValueOf.call(other); } return false; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_equalObjects.js /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG$3 = 1; /** Used to check objects for own properties. */ var hasOwnProperty$2 = Object.prototype.hasOwnProperty; /** * A specialized version of `baseIsEqualDeep` for objects with support for * partial deep comparisons. * * @private * @param {Object} object The object to compare. * @param {Object} other The other object to compare. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} stack Tracks traversed `object` and `other` objects. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { var isPartial = bitmask & COMPARE_PARTIAL_FLAG$3, objProps = getAllKeys(object), objLength = objProps.length; if (objLength != getAllKeys(other).length && !isPartial) return false; var index = objLength; while (index--) { var key = objProps[index]; if (!(isPartial ? key in other : hasOwnProperty$2.call(other, key))) return false; } var objStacked = stack.get(object); var othStacked = stack.get(other); if (objStacked && othStacked) return objStacked == other && othStacked == object; var result = true; stack.set(object, other); stack.set(other, object); var skipCtor = isPartial; while (++index < objLength) { key = objProps[index]; var objValue = object[key], othValue = other[key]; if (customizer) var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack); if (!(compared === void 0 ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) { result = false; break; } skipCtor || (skipCtor = key == "constructor"); } if (result && !skipCtor) { var objCtor = object.constructor, othCtor = other.constructor; if (objCtor != othCtor && "constructor" in object && "constructor" in other && !(typeof objCtor == "function" && objCtor instanceof objCtor && typeof othCtor == "function" && othCtor instanceof othCtor)) result = false; } stack["delete"](object); stack["delete"](other); return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseIsEqualDeep.js /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG$2 = 1; /** `Object#toString` result references. */ var argsTag = "[object Arguments]", arrayTag = "[object Array]", objectTag = "[object Object]"; /** Used to check objects for own properties. */ var hasOwnProperty$1 = Object.prototype.hasOwnProperty; /** * A specialized version of `baseIsEqual` for arrays and objects which performs * deep comparisons and tracks traversed objects enabling objects with circular * references to be compared. * * @private * @param {Object} object The object to compare. * @param {Object} other The other object to compare. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} [stack] Tracks traversed `object` and `other` objects. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { var objIsArr = isArray(object), othIsArr = isArray(other), objTag = objIsArr ? arrayTag : _getTag_default(object), othTag = othIsArr ? arrayTag : _getTag_default(other); objTag = objTag == argsTag ? objectTag : objTag; othTag = othTag == argsTag ? objectTag : othTag; var objIsObj = objTag == objectTag, othIsObj = othTag == objectTag, isSameTag = objTag == othTag; if (isSameTag && isBuffer(object)) { if (!isBuffer(other)) return false; objIsArr = true; objIsObj = false; } if (isSameTag && !objIsObj) { stack || (stack = new Stack()); return objIsArr || isTypedArray(object) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); } if (!(bitmask & COMPARE_PARTIAL_FLAG$2)) { var objIsWrapped = objIsObj && hasOwnProperty$1.call(object, "__wrapped__"), othIsWrapped = othIsObj && hasOwnProperty$1.call(other, "__wrapped__"); if (objIsWrapped || othIsWrapped) { var objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other; stack || (stack = new Stack()); return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); } } if (!isSameTag) return false; stack || (stack = new Stack()); return equalObjects(object, other, bitmask, customizer, equalFunc, stack); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseIsEqual.js /** * The base implementation of `_.isEqual` which supports partial comparisons * and tracks traversed objects. * * @private * @param {*} value The value to compare. * @param {*} other The other value to compare. * @param {boolean} bitmask The bitmask flags. * 1 - Unordered comparison * 2 - Partial comparison * @param {Function} [customizer] The function to customize comparisons. * @param {Object} [stack] Tracks traversed `value` and `other` objects. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. */ function baseIsEqual(value, other, bitmask, customizer, stack) { if (value === other) return true; if (value == null || other == null || !isObjectLike(value) && !isObjectLike(other)) return value !== value && other !== other; return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseIsMatch.js /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG$1 = 1, COMPARE_UNORDERED_FLAG$1 = 2; /** * The base implementation of `_.isMatch` without support for iteratee shorthands. * * @private * @param {Object} object The object to inspect. * @param {Object} source The object of property values to match. * @param {Array} matchData The property names, values, and compare flags to match. * @param {Function} [customizer] The function to customize comparisons. * @returns {boolean} Returns `true` if `object` is a match, else `false`. */ function baseIsMatch(object, source, matchData, customizer) { var index = matchData.length, length = index, noCustomizer = !customizer; if (object == null) return !length; object = Object(object); while (index--) { var data = matchData[index]; if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) return false; } while (++index < length) { data = matchData[index]; var key = data[0], objValue = object[key], srcValue = data[1]; if (noCustomizer && data[2]) { if (objValue === void 0 && !(key in object)) return false; } else { var stack = new Stack(); if (customizer) var result = customizer(objValue, srcValue, key, object, source, stack); if (!(result === void 0 ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$1 | COMPARE_UNORDERED_FLAG$1, customizer, stack) : result)) return false; } } return true; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_isStrictComparable.js /** * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` if suitable for strict * equality comparisons, else `false`. */ function isStrictComparable(value) { return value === value && !isObject(value); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_getMatchData.js /** * Gets the property names, values, and compare flags of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the match data of `object`. */ function getMatchData(object) { var result = keys(object), length = result.length; while (length--) { var key = result[length], value = object[key]; result[length] = [ key, value, isStrictComparable(value) ]; } return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_matchesStrictComparable.js /** * A specialized version of `matchesProperty` for source values suitable * for strict equality comparisons, i.e. `===`. * * @private * @param {string} key The key of the property to get. * @param {*} srcValue The value to match. * @returns {Function} Returns the new spec function. */ function matchesStrictComparable(key, srcValue) { return function(object) { if (object == null) return false; return object[key] === srcValue && (srcValue !== void 0 || key in Object(object)); }; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseMatches.js /** * The base implementation of `_.matches` which doesn't clone `source`. * * @private * @param {Object} source The object of property values to match. * @returns {Function} Returns the new spec function. */ function baseMatches(source) { var matchData = getMatchData(source); if (matchData.length == 1 && matchData[0][2]) return matchesStrictComparable(matchData[0][0], matchData[0][1]); return function(object) { return object === source || baseIsMatch(object, source, matchData); }; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseHasIn.js /** * The base implementation of `_.hasIn` without support for deep paths. * * @private * @param {Object} [object] The object to query. * @param {Array|string} key The key to check. * @returns {boolean} Returns `true` if `key` exists, else `false`. */ function baseHasIn(object, key) { return object != null && key in Object(object); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_hasPath.js /** * Checks if `path` exists on `object`. * * @private * @param {Object} object The object to query. * @param {Array|string} path The path to check. * @param {Function} hasFunc The function to check properties. * @returns {boolean} Returns `true` if `path` exists, else `false`. */ function hasPath(object, path, hasFunc) { path = castPath(path, object); var index = -1, length = path.length, result = false; while (++index < length) { var key = toKey(path[index]); if (!(result = object != null && hasFunc(object, key))) break; object = object[key]; } if (result || ++index != length) return result; length = object == null ? 0 : object.length; return !!length && isLength(length) && isIndex(key, length) && (isArray(object) || isArguments(object)); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/hasIn.js /** * Checks if `path` is a direct or inherited property of `object`. * * @static * @memberOf _ * @since 4.0.0 * @category Object * @param {Object} object The object to query. * @param {Array|string} path The path to check. * @returns {boolean} Returns `true` if `path` exists, else `false`. * @example * * var object = _.create({ 'a': _.create({ 'b': 2 }) }); * * _.hasIn(object, 'a'); * // => true * * _.hasIn(object, 'a.b'); * // => true * * _.hasIn(object, ['a', 'b']); * // => true * * _.hasIn(object, 'b'); * // => false */ function hasIn(object, path) { return object != null && hasPath(object, path, baseHasIn); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseMatchesProperty.js /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2; /** * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. * * @private * @param {string} path The path of the property to get. * @param {*} srcValue The value to match. * @returns {Function} Returns the new spec function. */ function baseMatchesProperty(path, srcValue) { if (isKey(path) && isStrictComparable(srcValue)) return matchesStrictComparable(toKey(path), srcValue); return function(object) { var objValue = get(object, path); return objValue === void 0 && objValue === srcValue ? hasIn(object, path) : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); }; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseProperty.js /** * The base implementation of `_.property` without support for deep paths. * * @private * @param {string} key The key of the property to get. * @returns {Function} Returns the new accessor function. */ function baseProperty(key) { return function(object) { return object == null ? void 0 : object[key]; }; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_basePropertyDeep.js /** * A specialized version of `baseProperty` which supports deep paths. * * @private * @param {Array|string} path The path of the property to get. * @returns {Function} Returns the new accessor function. */ function basePropertyDeep(path) { return function(object) { return baseGet(object, path); }; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/property.js /** * Creates a function that returns the value at `path` of a given object. * * @static * @memberOf _ * @since 2.4.0 * @category Util * @param {Array|string} path The path of the property to get. * @returns {Function} Returns the new accessor function. * @example * * var objects = [ * { 'a': { 'b': 2 } }, * { 'a': { 'b': 1 } } * ]; * * _.map(objects, _.property('a.b')); * // => [2, 1] * * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b'); * // => [1, 2] */ function property(path) { return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseIteratee.js /** * The base implementation of `_.iteratee`. * * @private * @param {*} [value=_.identity] The value to convert to an iteratee. * @returns {Function} Returns the iteratee. */ function baseIteratee(value) { if (typeof value == "function") return value; if (value == null) return identity; if (typeof value == "object") return isArray(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value); return property(value); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_createBaseFor.js /** * Creates a base function for methods like `_.forIn` and `_.forOwn`. * * @private * @param {boolean} [fromRight] Specify iterating from right to left. * @returns {Function} Returns the new base function. */ function createBaseFor(fromRight) { return function(object, iteratee, keysFunc) { var index = -1, iterable = Object(object), props = keysFunc(object), length = props.length; while (length--) { var key = props[fromRight ? length : ++index]; if (iteratee(iterable[key], key, iterable) === false) break; } return object; }; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseFor.js /** * The base implementation of `baseForOwn` which iterates over `object` * properties returned by `keysFunc` and invokes `iteratee` for each property. * Iteratee functions may exit iteration early by explicitly returning `false`. * * @private * @param {Object} object The object to iterate over. * @param {Function} iteratee The function invoked per iteration. * @param {Function} keysFunc The function to get the keys of `object`. * @returns {Object} Returns `object`. */ var baseFor = createBaseFor(); //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseForOwn.js /** * The base implementation of `_.forOwn` without support for iteratee shorthands. * * @private * @param {Object} object The object to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Object} Returns `object`. */ function baseForOwn(object, iteratee) { return object && baseFor(object, iteratee, keys); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_createBaseEach.js /** * Creates a `baseEach` or `baseEachRight` function. * * @private * @param {Function} eachFunc The function to iterate over a collection. * @param {boolean} [fromRight] Specify iterating from right to left. * @returns {Function} Returns the new base function. */ function createBaseEach(eachFunc, fromRight) { return function(collection, iteratee) { if (collection == null) return collection; if (!isArrayLike(collection)) return eachFunc(collection, iteratee); var length = collection.length, index = fromRight ? length : -1, iterable = Object(collection); while (fromRight ? index-- : ++index < length) if (iteratee(iterable[index], index, iterable) === false) break; return collection; }; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseEach.js /** * The base implementation of `_.forEach` without support for iteratee shorthands. * * @private * @param {Array|Object} collection The collection to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Array|Object} Returns `collection`. */ var baseEach = createBaseEach(baseForOwn); //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/now.js /** * Gets the timestamp of the number of milliseconds that have elapsed since * the Unix epoch (1 January 1970 00:00:00 UTC). * * @static * @memberOf _ * @since 2.4.0 * @category Date * @returns {number} Returns the timestamp. * @example * * _.defer(function(stamp) { * console.log(_.now() - stamp); * }, _.now()); * // => Logs the number of milliseconds it took for the deferred invocation. */ var now = function() { return root.Date.now(); }; //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/debounce.js /** Error message constants. */ var FUNC_ERROR_TEXT$1 = "Expected a function"; var nativeMax$1 = Math.max, nativeMin$1 = Math.min; /** * Creates a debounced function that delays invoking `func` until after `wait` * milliseconds have elapsed since the last time the debounced function was * invoked. The debounced function comes with a `cancel` method to cancel * delayed `func` invocations and a `flush` method to immediately invoke them. * Provide `options` to indicate whether `func` should be invoked on the * leading and/or trailing edge of the `wait` timeout. The `func` is invoked * with the last arguments provided to the debounced function. Subsequent * calls to the debounced function return the result of the last `func` * invocation. * * **Note:** If `leading` and `trailing` options are `true`, `func` is * invoked on the trailing edge of the timeout only if the debounced function * is invoked more than once during the `wait` timeout. * * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred * until to the next tick, similar to `setTimeout` with a timeout of `0`. * * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) * for details over the differences between `_.debounce` and `_.throttle`. * * @static * @memberOf _ * @since 0.1.0 * @category Function * @param {Function} func The function to debounce. * @param {number} [wait=0] The number of milliseconds to delay. * @param {Object} [options={}] The options object. * @param {boolean} [options.leading=false] * Specify invoking on the leading edge of the timeout. * @param {number} [options.maxWait] * The maximum time `func` is allowed to be delayed before it's invoked. * @param {boolean} [options.trailing=true] * Specify invoking on the trailing edge of the timeout. * @returns {Function} Returns the new debounced function. * @example * * // Avoid costly calculations while the window size is in flux. * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); * * // Invoke `sendMail` when clicked, debouncing subsequent calls. * jQuery(element).on('click', _.debounce(sendMail, 300, { * 'leading': true, * 'trailing': false * })); * * // Ensure `batchLog` is invoked once after 1 second of debounced calls. * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); * var source = new EventSource('/stream'); * jQuery(source).on('message', debounced); * * // Cancel the trailing debounced invocation. * jQuery(window).on('popstate', debounced.cancel); */ function debounce(func, wait, options) { var lastArgs, lastThis, maxWait, result, timerId, lastCallTime, lastInvokeTime = 0, leading = false, maxing = false, trailing = true; if (typeof func != "function") throw new TypeError(FUNC_ERROR_TEXT$1); wait = toNumber(wait) || 0; if (isObject(options)) { leading = !!options.leading; maxing = "maxWait" in options; maxWait = maxing ? nativeMax$1(toNumber(options.maxWait) || 0, wait) : maxWait; trailing = "trailing" in options ? !!options.trailing : trailing; } function invokeFunc(time) { var args = lastArgs, thisArg = lastThis; lastArgs = lastThis = void 0; lastInvokeTime = time; result = func.apply(thisArg, args); return result; } function leadingEdge(time) { lastInvokeTime = time; timerId = setTimeout(timerExpired, wait); return leading ? invokeFunc(time) : result; } function remainingWait(time) { var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait - timeSinceLastCall; return maxing ? nativeMin$1(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting; } function shouldInvoke(time) { var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime; return lastCallTime === void 0 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait; } function timerExpired() { var time = now(); if (shouldInvoke(time)) return trailingEdge(time); timerId = setTimeout(timerExpired, remainingWait(time)); } function trailingEdge(time) { timerId = void 0; if (trailing && lastArgs) return invokeFunc(time); lastArgs = lastThis = void 0; return result; } function cancel() { if (timerId !== void 0) clearTimeout(timerId); lastInvokeTime = 0; lastArgs = lastCallTime = lastThis = timerId = void 0; } function flush() { return timerId === void 0 ? result : trailingEdge(now()); } function debounced() { var time = now(), isInvoking = shouldInvoke(time); lastArgs = arguments; lastThis = this; lastCallTime = time; if (isInvoking) { if (timerId === void 0) return leadingEdge(lastCallTime); if (maxing) { clearTimeout(timerId); timerId = setTimeout(timerExpired, wait); return invokeFunc(lastCallTime); } } if (timerId === void 0) timerId = setTimeout(timerExpired, wait); return result; } debounced.cancel = cancel; debounced.flush = flush; return debounced; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_assignMergeValue.js /** * This function is like `assignValue` except that it doesn't assign * `undefined` values. * * @private * @param {Object} object The object to modify. * @param {string} key The key of the property to assign. * @param {*} value The value to assign. */ function assignMergeValue(object, key, value) { if (value !== void 0 && !eq(object[key], value) || value === void 0 && !(key in object)) baseAssignValue(object, key, value); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/isArrayLikeObject.js /** * This method is like `_.isArrayLike` except that it also checks if `value` * is an object. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array-like object, * else `false`. * @example * * _.isArrayLikeObject([1, 2, 3]); * // => true * * _.isArrayLikeObject(document.body.children); * // => true * * _.isArrayLikeObject('abc'); * // => false * * _.isArrayLikeObject(_.noop); * // => false */ function isArrayLikeObject(value) { return isObjectLike(value) && isArrayLike(value); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_safeGet.js /** * Gets the value at `key`, unless `key` is "__proto__" or "constructor". * * @private * @param {Object} object The object to query. * @param {string} key The key of the property to get. * @returns {*} Returns the property value. */ function safeGet(object, key) { if (key === "constructor" && typeof object[key] === "function") return; if (key == "__proto__") return; return object[key]; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/toPlainObject.js /** * Converts `value` to a plain object flattening inherited enumerable string * keyed properties of `value` to own properties of the plain object. * * @static * @memberOf _ * @since 3.0.0 * @category Lang * @param {*} value The value to convert. * @returns {Object} Returns the converted plain object. * @example * * function Foo() { * this.b = 2; * } * * Foo.prototype.c = 3; * * _.assign({ 'a': 1 }, new Foo); * // => { 'a': 1, 'b': 2 } * * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); * // => { 'a': 1, 'b': 2, 'c': 3 } */ function toPlainObject(value) { return copyObject(value, keysIn(value)); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseMergeDeep.js /** * A specialized version of `baseMerge` for arrays and objects which performs * deep merges and tracks traversed objects enabling objects with circular * references to be merged. * * @private * @param {Object} object The destination object. * @param {Object} source The source object. * @param {string} key The key of the value to merge. * @param {number} srcIndex The index of `source`. * @param {Function} mergeFunc The function to merge values. * @param {Function} [customizer] The function to customize assigned values. * @param {Object} [stack] Tracks traversed source values and their merged * counterparts. */ function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { var objValue = safeGet(object, key), srcValue = safeGet(source, key), stacked = stack.get(srcValue); if (stacked) { assignMergeValue(object, key, stacked); return; } var newValue = customizer ? customizer(objValue, srcValue, key + "", object, source, stack) : void 0; var isCommon = newValue === void 0; if (isCommon) { var isArr = isArray(srcValue), isBuff = !isArr && isBuffer(srcValue), isTyped = !isArr && !isBuff && isTypedArray(srcValue); newValue = srcValue; if (isArr || isBuff || isTyped) if (isArray(objValue)) newValue = objValue; else if (isArrayLikeObject(objValue)) newValue = copyArray(objValue); else if (isBuff) { isCommon = false; newValue = cloneBuffer(srcValue, true); } else if (isTyped) { isCommon = false; newValue = cloneTypedArray(srcValue, true); } else newValue = []; else if (isPlainObject(srcValue) || isArguments(srcValue)) { newValue = objValue; if (isArguments(objValue)) newValue = toPlainObject(objValue); else if (!isObject(objValue) || isFunction(objValue)) newValue = initCloneObject(srcValue); } else isCommon = false; } if (isCommon) { stack.set(srcValue, newValue); mergeFunc(newValue, srcValue, srcIndex, customizer, stack); stack["delete"](srcValue); } assignMergeValue(object, key, newValue); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseMerge.js /** * The base implementation of `_.merge` without support for multiple sources. * * @private * @param {Object} object The destination object. * @param {Object} source The source object. * @param {number} srcIndex The index of `source`. * @param {Function} [customizer] The function to customize merged values. * @param {Object} [stack] Tracks traversed source values and their merged * counterparts. */ function baseMerge(object, source, srcIndex, customizer, stack) { if (object === source) return; baseFor(source, function(srcValue, key) { stack || (stack = new Stack()); if (isObject(srcValue)) baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); else { var newValue = customizer ? customizer(safeGet(object, key), srcValue, key + "", object, source, stack) : void 0; if (newValue === void 0) newValue = srcValue; assignMergeValue(object, key, newValue); } }, keysIn); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_arrayIncludesWith.js /** * This function is like `arrayIncludes` except that it accepts a comparator. * * @private * @param {Array} [array] The array to inspect. * @param {*} target The value to search for. * @param {Function} comparator The comparator invoked per element. * @returns {boolean} Returns `true` if `target` is found, else `false`. */ function arrayIncludesWith(array, value, comparator) { var index = -1, length = array == null ? 0 : array.length; while (++index < length) if (comparator(value, array[index])) return true; return false; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/last.js /** * Gets the last element of `array`. * * @static * @memberOf _ * @since 0.1.0 * @category Array * @param {Array} array The array to query. * @returns {*} Returns the last element of `array`. * @example * * _.last([1, 2, 3]); * // => 3 */ function last(array) { var length = array == null ? 0 : array.length; return length ? array[length - 1] : void 0; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/findLastIndex.js var nativeMax = Math.max, nativeMin = Math.min; /** * This method is like `_.findIndex` except that it iterates over elements * of `collection` from right to left. * * @static * @memberOf _ * @since 2.0.0 * @category Array * @param {Array} array The array to inspect. * @param {Function} [predicate=_.identity] The function invoked per iteration. * @param {number} [fromIndex=array.length-1] The index to search from. * @returns {number} Returns the index of the found element, else `-1`. * @example * * var users = [ * { 'user': 'barney', 'active': true }, * { 'user': 'fred', 'active': false }, * { 'user': 'pebbles', 'active': false } * ]; * * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; }); * // => 2 * * // The `_.matches` iteratee shorthand. * _.findLastIndex(users, { 'user': 'barney', 'active': true }); * // => 0 * * // The `_.matchesProperty` iteratee shorthand. * _.findLastIndex(users, ['active', false]); * // => 2 * * // The `_.property` iteratee shorthand. * _.findLastIndex(users, 'active'); * // => 0 */ function findLastIndex(array, predicate, fromIndex) { var length = array == null ? 0 : array.length; if (!length) return -1; var index = length - 1; if (fromIndex !== void 0) { index = toInteger(fromIndex); index = fromIndex < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1); } return baseFindIndex(array, baseIteratee(predicate, 3), index, true); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseMap.js /** * The base implementation of `_.map` without support for iteratee shorthands. * * @private * @param {Array|Object} collection The collection to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns the new mapped array. */ function baseMap(collection, iteratee) { var index = -1, result = isArrayLike(collection) ? Array(collection.length) : []; baseEach(collection, function(value, key, collection) { result[++index] = iteratee(value, key, collection); }); return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/map.js /** * Creates an array of values by running each element in `collection` thru * `iteratee`. The iteratee is invoked with three arguments: * (value, index|key, collection). * * Many lodash methods are guarded to work as iteratees for methods like * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. * * The guarded methods are: * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, * `template`, `trim`, `trimEnd`, `trimStart`, and `words` * * @static * @memberOf _ * @since 0.1.0 * @category Collection * @param {Array|Object} collection The collection to iterate over. * @param {Function} [iteratee=_.identity] The function invoked per iteration. * @returns {Array} Returns the new mapped array. * @example * * function square(n) { * return n * n; * } * * _.map([4, 8], square); * // => [16, 64] * * _.map({ 'a': 4, 'b': 8 }, square); * // => [16, 64] (iteration order is not guaranteed) * * var users = [ * { 'user': 'barney' }, * { 'user': 'fred' } * ]; * * // The `_.property` iteratee shorthand. * _.map(users, 'user'); * // => ['barney', 'fred'] */ function map(collection, iteratee) { return (isArray(collection) ? arrayMap : baseMap)(collection, baseIteratee(iteratee, 3)); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/flatMap.js /** * Creates a flattened array of values by running each element in `collection` * thru `iteratee` and flattening the mapped results. The iteratee is invoked * with three arguments: (value, index|key, collection). * * @static * @memberOf _ * @since 4.0.0 * @category Collection * @param {Array|Object} collection The collection to iterate over. * @param {Function} [iteratee=_.identity] The function invoked per iteration. * @returns {Array} Returns the new flattened array. * @example * * function duplicate(n) { * return [n, n]; * } * * _.flatMap([1, 2], duplicate); * // => [1, 1, 2, 2] */ function flatMap(collection, iteratee) { return baseFlatten(map(collection, iteratee), 1); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/flattenDeep.js /** Used as references for various `Number` constants. */ var INFINITY = Infinity; /** * Recursively flattens `array`. * * @static * @memberOf _ * @since 3.0.0 * @category Array * @param {Array} array The array to flatten. * @returns {Array} Returns the new flattened array. * @example * * _.flattenDeep([1, [2, [3, [4]], 5]]); * // => [1, 2, 3, 4, 5] */ function flattenDeep(array) { return (array == null ? 0 : array.length) ? baseFlatten(array, INFINITY) : []; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/fromPairs.js /** * The inverse of `_.toPairs`; this method returns an object composed * from key-value `pairs`. * * @static * @memberOf _ * @since 4.0.0 * @category Array * @param {Array} pairs The key-value pairs. * @returns {Object} Returns the new object. * @example * * _.fromPairs([['a', 1], ['b', 2]]); * // => { 'a': 1, 'b': 2 } */ function fromPairs(pairs) { var index = -1, length = pairs == null ? 0 : pairs.length, result = {}; while (++index < length) { var pair = pairs[index]; baseAssignValue(result, pair[0], pair[1]); } return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_parent.js /** * Gets the parent value at `path` of `object`. * * @private * @param {Object} object The object to query. * @param {Array} path The path to get the parent value of. * @returns {*} Returns the parent value. */ function parent(object, path) { return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1)); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/isEqual.js /** * Performs a deep comparison between two values to determine if they are * equivalent. * * **Note:** This method supports comparing arrays, array buffers, booleans, * date objects, error objects, maps, numbers, `Object` objects, regexes, * sets, strings, symbols, and typed arrays. `Object` objects are compared * by their own, not inherited, enumerable properties. Functions and DOM * nodes are compared by strict equality, i.e. `===`. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to compare. * @param {*} other The other value to compare. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. * @example * * var object = { 'a': 1 }; * var other = { 'a': 1 }; * * _.isEqual(object, other); * // => true * * object === other; * // => false */ function isEqual$1(value, other) { return baseIsEqual(value, other); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/isNil.js /** * Checks if `value` is `null` or `undefined`. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is nullish, else `false`. * @example * * _.isNil(null); * // => true * * _.isNil(void 0); * // => true * * _.isNil(NaN); * // => false */ function isNil(value) { return value == null; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/isNull.js /** * Checks if `value` is `null`. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is `null`, else `false`. * @example * * _.isNull(null); * // => true * * _.isNull(void 0); * // => false */ function isNull(value) { return value === null; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/isUndefined.js /** * Checks if `value` is `undefined`. * * @static * @since 0.1.0 * @memberOf _ * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. * @example * * _.isUndefined(void 0); * // => true * * _.isUndefined(null); * // => false */ function isUndefined$1(value) { return value === void 0; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/merge.js /** * This method is like `_.assign` except that it recursively merges own and * inherited enumerable string keyed properties of source objects into the * destination object. Source properties that resolve to `undefined` are * skipped if a destination value exists. Array and plain object properties * are merged recursively. Other objects and value types are overridden by * assignment. Source objects are applied from left to right. Subsequent * sources overwrite property assignments of previous sources. * * **Note:** This method mutates `object`. * * @static * @memberOf _ * @since 0.5.0 * @category Object * @param {Object} object The destination object. * @param {...Object} [sources] The source objects. * @returns {Object} Returns `object`. * @example * * var object = { * 'a': [{ 'b': 2 }, { 'd': 4 }] * }; * * var other = { * 'a': [{ 'c': 3 }, { 'e': 5 }] * }; * * _.merge(object, other); * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] } */ var merge = createAssigner(function(object, source, srcIndex) { baseMerge(object, source, srcIndex); }); //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseUnset.js /** Used to check objects for own properties. */ var hasOwnProperty = Object.prototype.hasOwnProperty; /** * The base implementation of `_.unset`. * * @private * @param {Object} object The object to modify. * @param {Array|string} path The property path to unset. * @returns {boolean} Returns `true` if the property is deleted, else `false`. */ function baseUnset(object, path) { path = castPath(path, object); var index = -1, length = path.length; if (!length) return true; while (++index < length) { var key = toKey(path[index]); if (key === "__proto__" && !hasOwnProperty.call(object, "__proto__")) return false; if ((key === "constructor" || key === "prototype") && index < length - 1) return false; } var obj = parent(object, path); return obj == null || delete obj[toKey(last(path))]; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_customOmitClone.js /** * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain * objects. * * @private * @param {*} value The value to inspect. * @param {string} key The key of the property to inspect. * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`. */ function customOmitClone(value) { return isPlainObject(value) ? void 0 : value; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/omit.js /** Used to compose bitmasks for cloning. */ var CLONE_DEEP_FLAG = 1, CLONE_FLAT_FLAG = 2, CLONE_SYMBOLS_FLAG = 4; /** * The opposite of `_.pick`; this method creates an object composed of the * own and inherited enumerable property paths of `object` that are not omitted. * * **Note:** This method is considerably slower than `_.pick`. * * @static * @since 0.1.0 * @memberOf _ * @category Object * @param {Object} object The source object. * @param {...(string|string[])} [paths] The property paths to omit. * @returns {Object} Returns the new object. * @example * * var object = { 'a': 1, 'b': '2', 'c': 3 }; * * _.omit(object, ['a', 'c']); * // => { 'b': '2' } */ var omit = flatRest(function(object, paths) { var result = {}; if (object == null) return result; var isDeep = false; paths = arrayMap(paths, function(path) { path = castPath(path, object); isDeep || (isDeep = path.length > 1); return path; }); copyObject(object, getAllKeysIn(object), result); if (isDeep) result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone); var length = paths.length; while (length--) baseUnset(result, paths[length]); return result; }); //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseSet.js /** * The base implementation of `_.set`. * * @private * @param {Object} object The object to modify. * @param {Array|string} path The path of the property to set. * @param {*} value The value to set. * @param {Function} [customizer] The function to customize path creation. * @returns {Object} Returns `object`. */ function baseSet(object, path, value, customizer) { if (!isObject(object)) return object; path = castPath(path, object); var index = -1, length = path.length, lastIndex = length - 1, nested = object; while (nested != null && ++index < length) { var key = toKey(path[index]), newValue = value; if (key === "__proto__" || key === "constructor" || key === "prototype") return object; if (index != lastIndex) { var objValue = nested[key]; newValue = customizer ? customizer(objValue, key, nested) : void 0; if (newValue === void 0) newValue = isObject(objValue) ? objValue : isIndex(path[index + 1]) ? [] : {}; } assignValue(nested, key, newValue); nested = nested[key]; } return object; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_basePickBy.js /** * The base implementation of `_.pickBy` without support for iteratee shorthands. * * @private * @param {Object} object The source object. * @param {string[]} paths The property paths to pick. * @param {Function} predicate The function invoked per property. * @returns {Object} Returns the new object. */ function basePickBy(object, paths, predicate) { var index = -1, length = paths.length, result = {}; while (++index < length) { var path = paths[index], value = baseGet(object, path); if (predicate(value, path)) baseSet(result, castPath(path, object), value); } return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_basePick.js /** * The base implementation of `_.pick` without support for individual * property identifiers. * * @private * @param {Object} object The source object. * @param {string[]} paths The property paths to pick. * @returns {Object} Returns the new object. */ function basePick(object, paths) { return basePickBy(object, paths, function(value, path) { return hasIn(object, path); }); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/pick.js /** * Creates an object composed of the picked `object` properties. * * @static * @since 0.1.0 * @memberOf _ * @category Object * @param {Object} object The source object. * @param {...(string|string[])} [paths] The property paths to pick. * @returns {Object} Returns the new object. * @example * * var object = { 'a': 1, 'b': '2', 'c': 3 }; * * _.pick(object, ['a', 'c']); * // => { 'a': 1, 'c': 3 } */ var pick = flatRest(function(object, paths) { return object == null ? {} : basePick(object, paths); }); //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/set.js /** * Sets the value at `path` of `object`. If a portion of `path` doesn't exist, * it's created. Arrays are created for missing index properties while objects * are created for all other missing properties. Use `_.setWith` to customize * `path` creation. * * **Note:** This method mutates `object`. * * @static * @memberOf _ * @since 3.7.0 * @category Object * @param {Object} object The object to modify. * @param {Array|string} path The path of the property to set. * @param {*} value The value to set. * @returns {Object} Returns `object`. * @example * * var object = { 'a': [{ 'b': { 'c': 3 } }] }; * * _.set(object, 'a[0].b.c', 4); * console.log(object.a[0].b.c); * // => 4 * * _.set(object, ['x', '0', 'y', 'z'], 5); * console.log(object.x[0].y.z); * // => 5 */ function set(object, path, value) { return object == null ? object : baseSet(object, path, value); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/throttle.js /** Error message constants. */ var FUNC_ERROR_TEXT = "Expected a function"; /** * Creates a throttled function that only invokes `func` at most once per * every `wait` milliseconds. The throttled function comes with a `cancel` * method to cancel delayed `func` invocations and a `flush` method to * immediately invoke them. Provide `options` to indicate whether `func` * should be invoked on the leading and/or trailing edge of the `wait` * timeout. The `func` is invoked with the last arguments provided to the * throttled function. Subsequent calls to the throttled function return the * result of the last `func` invocation. * * **Note:** If `leading` and `trailing` options are `true`, `func` is * invoked on the trailing edge of the timeout only if the throttled function * is invoked more than once during the `wait` timeout. * * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred * until to the next tick, similar to `setTimeout` with a timeout of `0`. * * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) * for details over the differences between `_.throttle` and `_.debounce`. * * @static * @memberOf _ * @since 0.1.0 * @category Function * @param {Function} func The function to throttle. * @param {number} [wait=0] The number of milliseconds to throttle invocations to. * @param {Object} [options={}] The options object. * @param {boolean} [options.leading=true] * Specify invoking on the leading edge of the timeout. * @param {boolean} [options.trailing=true] * Specify invoking on the trailing edge of the timeout. * @returns {Function} Returns the new throttled function. * @example * * // Avoid excessively updating the position while scrolling. * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); * * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes. * var throttled = _.throttle(renewToken, 300000, { 'trailing': false }); * jQuery(element).on('click', throttled); * * // Cancel the trailing throttled invocation. * jQuery(window).on('popstate', throttled.cancel); */ function throttle(func, wait, options) { var leading = true, trailing = true; if (typeof func != "function") throw new TypeError(FUNC_ERROR_TEXT); if (isObject(options)) { leading = "leading" in options ? !!options.leading : leading; trailing = "trailing" in options ? !!options.trailing : trailing; } return debounce(func, wait, { "leading": leading, "maxWait": wait, "trailing": trailing }); } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_createSet.js /** * Creates a set object of `values`. * * @private * @param {Array} values The values to add to the set. * @returns {Object} Returns the new set. */ var createSet = !(Set$1 && 1 / setToArray(new Set$1([, -0]))[1] == Infinity) ? noop : function(values) { return new Set$1(values); }; //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseUniq.js /** Used as the size to enable large array optimizations. */ var LARGE_ARRAY_SIZE = 200; /** * The base implementation of `_.uniqBy` without support for iteratee shorthands. * * @private * @param {Array} array The array to inspect. * @param {Function} [iteratee] The iteratee invoked per element. * @param {Function} [comparator] The comparator invoked per element. * @returns {Array} Returns the new duplicate free array. */ function baseUniq(array, iteratee, comparator) { var index = -1, includes = arrayIncludes, length = array.length, isCommon = true, result = [], seen = result; if (comparator) { isCommon = false; includes = arrayIncludesWith; } else if (length >= LARGE_ARRAY_SIZE) { var set = iteratee ? null : createSet(array); if (set) return setToArray(set); isCommon = false; includes = cacheHas; seen = new SetCache(); } else seen = iteratee ? [] : result; outer: while (++index < length) { var value = array[index], computed = iteratee ? iteratee(value) : value; value = comparator || value !== 0 ? value : 0; if (isCommon && computed === computed) { var seenIndex = seen.length; while (seenIndex--) if (seen[seenIndex] === computed) continue outer; if (iteratee) seen.push(computed); result.push(value); } else if (!includes(seen, computed, comparator)) { if (seen !== result) seen.push(computed); result.push(value); } } return result; } //#endregion //#region ../../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/union.js /** * Creates an array of unique values, in order, from all given arrays using * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * for equality comparisons. * * @static * @memberOf _ * @since 0.1.0 * @category Array * @param {...Array} [arrays] The arrays to inspect. * @returns {Array} Returns the new array of combined values. * @example * * _.union([2], [1, 2]); * // => [2, 1] */ var union = baseRest(function(arrays) { return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true)); }); //#endregion //#region ../../packages/utils/types.ts const isUndefined = (val) => val === void 0; const isBoolean = (val) => typeof val === "boolean"; const isNumber = (val) => typeof val === "number"; const isEmpty = (val) => !val && val !== 0 || isArray$1(val) && val.length === 0 || isObject$1(val) && !Object.keys(val).length; const isElement$1 = (e) => { if (typeof Element === "undefined") return false; return e instanceof Element; }; const isPropAbsent = (prop) => isNil(prop); const isStringNumber = (val) => { if (!isString(val)) return false; return !Number.isNaN(Number(val)); }; const isWindow = (val) => val === window; //#endregion //#region ../../packages/utils/raf.ts const rAF = (fn) => isClient ? window.requestAnimationFrame(fn) : setTimeout(fn, 16); const cAF = (handle) => isClient ? window.cancelAnimationFrame(handle) : clearTimeout(handle); //#endregion //#region ../../packages/utils/strings.ts /** * fork from {@link https://github.com/sindresorhus/escape-string-regexp} */ const escapeStringRegexp = (string = "") => string.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d"); const capitalize = (str) => capitalize$1(str); //#endregion //#region ../../packages/utils/objects.ts const keysOf = (arr) => Object.keys(arr); const entriesOf = (arr) => Object.entries(arr); const getProp = (obj, path, defaultValue) => { return { get value() { return get(obj, path, defaultValue); }, set value(val) { set(obj, path, val); } }; }; //#endregion //#region ../../packages/utils/error.ts var ElementPlusError = class extends Error { constructor(m) { super(m); this.name = "ElementPlusError"; } }; function throwError(scope, m) { throw new ElementPlusError(`[${scope}] ${m}`); } function debugWarn(scope, message) {} //#endregion //#region ../../packages/utils/dom/style.ts const SCOPE$9 = "utils/dom/style"; const classNameToArray = (cls = "") => cls.split(" ").filter((item) => !!item.trim()); const hasClass = (el, cls) => { if (!el || !cls) return false; if (cls.includes(" ")) throw new Error("className should not contain space."); return el.classList.contains(cls); }; const addClass = (el, cls) => { if (!el || !cls.trim()) return; el.classList.add(...classNameToArray(cls)); }; const removeClass = (el, cls) => { if (!el || !cls.trim()) return; el.classList.remove(...classNameToArray(cls)); }; const getStyle = (element, styleName) => { if (!isClient || !element || !styleName || isShadowRoot$1(element)) return ""; let key = camelize(styleName); if (key === "float") key = "cssFloat"; try { const style = element.style[key]; if (style) return style; const computed = document.defaultView?.getComputedStyle(element, ""); return computed ? computed[key] : ""; } catch { return element.style[key]; } }; const setStyle = (element, styleName, value) => { if (!element || !styleName) return; if (isObject$1(styleName)) entriesOf(styleName).forEach(([prop, value]) => setStyle(element, prop, value)); else { const key = camelize(styleName); element.style[key] = value; } }; function addUnit(value, defaultUnit = "px") { if (!value && value !== 0) return ""; if (isNumber(value) || isStringNumber(value)) return `${value}${defaultUnit}`; else if (isString(value)) return value; /* @__PURE__ */ debugWarn(SCOPE$9, "binding value must be a string or number"); } //#endregion //#region ../../packages/utils/dom/scroll.ts const isScroll = (el, isVertical) => { if (!isClient) return false; const key = { undefined: "overflow", true: "overflow-y", false: "overflow-x" }[String(isVertical)]; const overflow = getStyle(el, key); return [ "scroll", "auto", "overlay" ].some((s) => overflow.includes(s)); }; const getScrollContainer = (el, isVertical) => { if (!isClient) return; let parent = el; while (parent) { if ([ window, document, document.documentElement ].includes(parent)) return window; if (isScroll(parent, isVertical)) return parent; if (isShadowRoot$1(parent)) parent = parent.host; else parent = parent.parentNode; } return parent; }; let scrollBarWidth; const getScrollBarWidth = (namespace) => { if (!isClient) return 0; if (scrollBarWidth !== void 0) return scrollBarWidth; const outer = document.createElement("div"); outer.className = `${namespace}-scrollbar__wrap`; outer.style.visibility = "hidden"; outer.style.width = "100px"; outer.style.position = "absolute"; outer.style.top = "-9999px"; document.body.appendChild(outer); const widthNoScroll = outer.offsetWidth; outer.style.overflow = "scroll"; const inner = document.createElement("div"); inner.style.width = "100%"; outer.appendChild(inner); const widthWithScroll = inner.offsetWidth; outer.parentNode?.removeChild(outer); scrollBarWidth = widthNoScroll - widthWithScroll; return scrollBarWidth; }; /** * Scroll with in the container element, positioning the **selected** element at the top * of the container */ function scrollIntoView(container, selected) { if (!isClient) return; if (!selected) { container.scrollTop = 0; return; } const offsetParents = []; let pointer = selected.offsetParent; while (pointer !== null && container !== pointer && container.contains(pointer)) { offsetParents.push(pointer); pointer = pointer.offsetParent; } const top = selected.offsetTop + offsetParents.reduce((prev, curr) => prev + curr.offsetTop, 0); const bottom = top + selected.offsetHeight; const viewRectTop = container.scrollTop; const viewRectBottom = viewRectTop + container.clientHeight; if (top < viewRectTop) container.scrollTop = top; else if (bottom > viewRectBottom) container.scrollTop = bottom - container.clientHeight; } function animateScrollTo(container, from, to, duration, callback) { const startTime = Date.now(); let handle; const scroll = () => { const time = Date.now() - startTime; const nextScrollTop = easeInOutCubic(time > duration ? duration : time, from, to, duration); if (isWindow(container)) container.scrollTo(window.pageXOffset, nextScrollTop); else container.scrollTop = nextScrollTop; if (time < duration) handle = rAF(scroll); else if (isFunction$1(callback)) callback(); }; scroll(); return () => { handle && cAF(handle); }; } const getScrollElement = (target, container) => { if (isWindow(container)) return target.ownerDocument.documentElement; return container; }; const getScrollTop = (container) => { if (isWindow(container)) return window.scrollY; return container.scrollTop; }; //#endregion //#region ../../packages/utils/dom/element.ts const getElement = ((target) => { if (!isClient || target === "") return null; if (isString(target)) try { return document.querySelector(target); } catch { return null; } return target; }); //#endregion //#region ../../packages/utils/vue/global-node.ts const globalNodes = []; let target = !isClient ? void 0 : document.body; function createGlobalNode(id) { const el = document.createElement("div"); if (id !== void 0) el.setAttribute("id", id); if (target) { target.appendChild(el); globalNodes.push(el); } return el; } function removeGlobalNode(el) { globalNodes.splice(globalNodes.indexOf(el), 1); el.remove(); } //#endregion //#region ../../node_modules/.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.25/node_modules/@element-plus/icons-vue/dist/index.js /*! Element Plus Icons Vue v2.3.2 */ var arrow_down_default = /* @__PURE__ */ defineComponent({ name: "ArrowDown", __name: "arrow-down", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M831.872 340.864 512 652.672 192.128 340.864a30.59 30.59 0 0 0-42.752 0 29.12 29.12 0 0 0 0 41.6L489.664 714.24a32 32 0 0 0 44.672 0l340.288-331.712a29.12 29.12 0 0 0 0-41.728 30.59 30.59 0 0 0-42.752 0z" })])); } }); var arrow_left_default = /* @__PURE__ */ defineComponent({ name: "ArrowLeft", __name: "arrow-left", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M609.408 149.376 277.76 489.6a32 32 0 0 0 0 44.672l331.648 340.352a29.12 29.12 0 0 0 41.728 0 30.59 30.59 0 0 0 0-42.752L339.264 511.936l311.872-319.872a30.59 30.59 0 0 0 0-42.688 29.12 29.12 0 0 0-41.728 0" })])); } }); var arrow_right_default = /* @__PURE__ */ defineComponent({ name: "ArrowRight", __name: "arrow-right", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M340.864 149.312a30.59 30.59 0 0 0 0 42.752L652.736 512 340.864 831.872a30.59 30.59 0 0 0 0 42.752 29.12 29.12 0 0 0 41.728 0L714.24 534.336a32 32 0 0 0 0-44.672L382.592 149.376a29.12 29.12 0 0 0-41.728 0z" })])); } }); var arrow_up_default = /* @__PURE__ */ defineComponent({ name: "ArrowUp", __name: "arrow-up", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "m488.832 344.32-339.84 356.672a32 32 0 0 0 0 44.16l.384.384a29.44 29.44 0 0 0 42.688 0l320-335.872 319.872 335.872a29.44 29.44 0 0 0 42.688 0l.384-.384a32 32 0 0 0 0-44.16L535.168 344.32a32 32 0 0 0-46.336 0" })])); } }); var back_default = /* @__PURE__ */ defineComponent({ name: "Back", __name: "back", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M224 480h640a32 32 0 1 1 0 64H224a32 32 0 0 1 0-64" }), createElementVNode("path", { fill: "currentColor", d: "m237.248 512 265.408 265.344a32 32 0 0 1-45.312 45.312l-288-288a32 32 0 0 1 0-45.312l288-288a32 32 0 1 1 45.312 45.312z" })])); } }); var calendar_default$1 = /* @__PURE__ */ defineComponent({ name: "Calendar", __name: "calendar", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M128 384v512h768V192H768v32a32 32 0 1 1-64 0v-32H320v32a32 32 0 0 1-64 0v-32H128v128h768v64zm192-256h384V96a32 32 0 1 1 64 0v32h160a32 32 0 0 1 32 32v768a32 32 0 0 1-32 32H96a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32h160V96a32 32 0 0 1 64 0zm-32 384h64a32 32 0 0 1 0 64h-64a32 32 0 0 1 0-64m0 192h64a32 32 0 1 1 0 64h-64a32 32 0 1 1 0-64m192-192h64a32 32 0 0 1 0 64h-64a32 32 0 0 1 0-64m0 192h64a32 32 0 1 1 0 64h-64a32 32 0 1 1 0-64m192-192h64a32 32 0 1 1 0 64h-64a32 32 0 1 1 0-64m0 192h64a32 32 0 1 1 0 64h-64a32 32 0 1 1 0-64" })])); } }); var caret_right_default = /* @__PURE__ */ defineComponent({ name: "CaretRight", __name: "caret-right", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M384 192v640l384-320.064z" })])); } }); var caret_top_default = /* @__PURE__ */ defineComponent({ name: "CaretTop", __name: "caret-top", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M512 320 192 704h639.936z" })])); } }); var check_default = /* @__PURE__ */ defineComponent({ name: "Check", __name: "check", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M406.656 706.944 195.84 496.256a32 32 0 1 0-45.248 45.248l256 256 512-512a32 32 0 0 0-45.248-45.248L406.592 706.944z" })])); } }); var circle_check_filled_default = /* @__PURE__ */ defineComponent({ name: "CircleCheckFilled", __name: "circle-check-filled", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m-55.808 536.384-99.52-99.584a38.4 38.4 0 1 0-54.336 54.336l126.72 126.72a38.27 38.27 0 0 0 54.336 0l262.4-262.464a38.4 38.4 0 1 0-54.272-54.336z" })])); } }); var circle_check_default = /* @__PURE__ */ defineComponent({ name: "CircleCheck", __name: "circle-check", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M512 896a384 384 0 1 0 0-768 384 384 0 0 0 0 768m0 64a448 448 0 1 1 0-896 448 448 0 0 1 0 896" }), createElementVNode("path", { fill: "currentColor", d: "M745.344 361.344a32 32 0 0 1 45.312 45.312l-288 288a32 32 0 0 1-45.312 0l-160-160a32 32 0 1 1 45.312-45.312L480 626.752z" })])); } }); var circle_close_filled_default = /* @__PURE__ */ defineComponent({ name: "CircleCloseFilled", __name: "circle-close-filled", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m0 393.664L407.936 353.6a38.4 38.4 0 1 0-54.336 54.336L457.664 512 353.6 616.064a38.4 38.4 0 1 0 54.336 54.336L512 566.336 616.064 670.4a38.4 38.4 0 1 0 54.336-54.336L566.336 512 670.4 407.936a38.4 38.4 0 1 0-54.336-54.336z" })])); } }); var circle_close_default = /* @__PURE__ */ defineComponent({ name: "CircleClose", __name: "circle-close", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "m466.752 512-90.496-90.496a32 32 0 0 1 45.248-45.248L512 466.752l90.496-90.496a32 32 0 1 1 45.248 45.248L557.248 512l90.496 90.496a32 32 0 1 1-45.248 45.248L512 557.248l-90.496 90.496a32 32 0 0 1-45.248-45.248z" }), createElementVNode("path", { fill: "currentColor", d: "M512 896a384 384 0 1 0 0-768 384 384 0 0 0 0 768m0 64a448 448 0 1 1 0-896 448 448 0 0 1 0 896" })])); } }); var clock_default = /* @__PURE__ */ defineComponent({ name: "Clock", __name: "clock", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [ createElementVNode("path", { fill: "currentColor", d: "M512 896a384 384 0 1 0 0-768 384 384 0 0 0 0 768m0 64a448 448 0 1 1 0-896 448 448 0 0 1 0 896" }), createElementVNode("path", { fill: "currentColor", d: "M480 256a32 32 0 0 1 32 32v256a32 32 0 0 1-64 0V288a32 32 0 0 1 32-32" }), createElementVNode("path", { fill: "currentColor", d: "M480 512h256q32 0 32 32t-32 32H480q-32 0-32-32t32-32" }) ])); } }); var close_default = /* @__PURE__ */ defineComponent({ name: "Close", __name: "close", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M764.288 214.592 512 466.88 259.712 214.592a31.936 31.936 0 0 0-45.12 45.12L466.752 512 214.528 764.224a31.936 31.936 0 1 0 45.12 45.184L512 557.184l252.288 252.288a31.936 31.936 0 0 0 45.12-45.12L557.12 512.064l252.288-252.352a31.936 31.936 0 1 0-45.12-45.184z" })])); } }); var d_arrow_left_default = /* @__PURE__ */ defineComponent({ name: "DArrowLeft", __name: "d-arrow-left", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M529.408 149.376a29.12 29.12 0 0 1 41.728 0 30.59 30.59 0 0 1 0 42.688L259.264 511.936l311.872 319.936a30.59 30.59 0 0 1-.512 43.264 29.12 29.12 0 0 1-41.216-.512L197.76 534.272a32 32 0 0 1 0-44.672zm256 0a29.12 29.12 0 0 1 41.728 0 30.59 30.59 0 0 1 0 42.688L515.264 511.936l311.872 319.936a30.59 30.59 0 0 1-.512 43.264 29.12 29.12 0 0 1-41.216-.512L453.76 534.272a32 32 0 0 1 0-44.672z" })])); } }); var d_arrow_right_default = /* @__PURE__ */ defineComponent({ name: "DArrowRight", __name: "d-arrow-right", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M452.864 149.312a29.12 29.12 0 0 1 41.728.064L826.24 489.664a32 32 0 0 1 0 44.672L494.592 874.624a29.12 29.12 0 0 1-41.728 0 30.59 30.59 0 0 1 0-42.752L764.736 512 452.864 192a30.59 30.59 0 0 1 0-42.688m-256 0a29.12 29.12 0 0 1 41.728.064L570.24 489.664a32 32 0 0 1 0 44.672L238.592 874.624a29.12 29.12 0 0 1-41.728 0 30.59 30.59 0 0 1 0-42.752L508.736 512 196.864 192a30.59 30.59 0 0 1 0-42.688" })])); } }); var delete_default = /* @__PURE__ */ defineComponent({ name: "Delete", __name: "delete", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M160 256H96a32 32 0 0 1 0-64h256V95.936a32 32 0 0 1 32-32h256a32 32 0 0 1 32 32V192h256a32 32 0 1 1 0 64h-64v672a32 32 0 0 1-32 32H192a32 32 0 0 1-32-32zm448-64v-64H416v64zM224 896h576V256H224zm192-128a32 32 0 0 1-32-32V416a32 32 0 0 1 64 0v320a32 32 0 0 1-32 32m192 0a32 32 0 0 1-32-32V416a32 32 0 0 1 64 0v320a32 32 0 0 1-32 32" })])); } }); var document_default = /* @__PURE__ */ defineComponent({ name: "Document", __name: "document", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M832 384H576V128H192v768h640zm-26.496-64L640 154.496V320zM160 64h480l256 256v608a32 32 0 0 1-32 32H160a32 32 0 0 1-32-32V96a32 32 0 0 1 32-32m160 448h384v64H320zm0-192h160v64H320zm0 384h384v64H320z" })])); } }); var full_screen_default = /* @__PURE__ */ defineComponent({ name: "FullScreen", __name: "full-screen", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "m160 96.064 192 .192a32 32 0 0 1 0 64l-192-.192V352a32 32 0 0 1-64 0V96h64zm0 831.872V928H96V672a32 32 0 1 1 64 0v191.936l192-.192a32 32 0 1 1 0 64zM864 96.064V96h64v256a32 32 0 1 1-64 0V160.064l-192 .192a32 32 0 1 1 0-64zm0 831.872-192-.192a32 32 0 0 1 0-64l192 .192V672a32 32 0 1 1 64 0v256h-64z" })])); } }); var hide_default = /* @__PURE__ */ defineComponent({ name: "Hide", __name: "hide", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M876.8 156.8c0-9.6-3.2-16-9.6-22.4s-12.8-9.6-22.4-9.6-16 3.2-22.4 9.6L736 220.8c-64-32-137.6-51.2-224-60.8-160 16-288 73.6-377.6 176S0 496 0 512s48 73.6 134.4 176c22.4 25.6 44.8 48 73.6 67.2l-86.4 89.6c-6.4 6.4-9.6 12.8-9.6 22.4s3.2 16 9.6 22.4 12.8 9.6 22.4 9.6 16-3.2 22.4-9.6l704-710.4c3.2-6.4 6.4-12.8 6.4-22.4m-646.4 528Q115.2 579.2 76.8 512q43.2-72 153.6-172.8C304 272 400 230.4 512 224c64 3.2 124.8 19.2 176 44.8l-54.4 54.4C598.4 300.8 560 288 512 288c-64 0-115.2 22.4-160 64s-64 96-64 160c0 48 12.8 89.6 35.2 124.8L256 707.2c-9.6-6.4-19.2-16-25.6-22.4m140.8-96Q352 555.2 352 512c0-44.8 16-83.2 48-112s67.2-48 112-48c28.8 0 54.4 6.4 73.6 19.2zM889.599 336c-12.8-16-28.8-28.8-41.6-41.6l-48 48c73.6 67.2 124.8 124.8 150.4 169.6q-43.2 72-153.6 172.8c-73.6 67.2-172.8 108.8-284.8 115.2-51.2-3.2-99.2-12.8-140.8-28.8l-48 48c57.6 22.4 118.4 38.4 188.8 44.8 160-16 288-73.6 377.6-176S1024 528 1024 512s-48.001-73.6-134.401-176" }), createElementVNode("path", { fill: "currentColor", d: "M511.998 672c-12.8 0-25.6-3.2-38.4-6.4l-51.2 51.2c28.8 12.8 57.6 19.2 89.6 19.2 64 0 115.2-22.4 160-64 41.6-41.6 64-96 64-160 0-32-6.4-64-19.2-89.6l-51.2 51.2c3.2 12.8 6.4 25.6 6.4 38.4 0 44.8-16 83.2-48 112s-67.2 48-112 48" })])); } }); var info_filled_default = /* @__PURE__ */ defineComponent({ name: "InfoFilled", __name: "info-filled", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M512 64a448 448 0 1 1 0 896.064A448 448 0 0 1 512 64m67.2 275.072c33.28 0 60.288-23.104 60.288-57.344s-27.072-57.344-60.288-57.344c-33.28 0-60.16 23.104-60.16 57.344s26.88 57.344 60.16 57.344M590.912 699.2c0-6.848 2.368-24.64 1.024-34.752l-52.608 60.544c-10.88 11.456-24.512 19.392-30.912 17.28a12.99 12.99 0 0 1-8.256-14.72l87.68-276.992c7.168-35.136-12.544-67.2-54.336-71.296-44.096 0-108.992 44.736-148.48 101.504 0 6.784-1.28 23.68.064 33.792l52.544-60.608c10.88-11.328 23.552-19.328 29.952-17.152a12.8 12.8 0 0 1 7.808 16.128L388.48 728.576c-10.048 32.256 8.96 63.872 55.04 71.04 67.84 0 107.904-43.648 147.456-100.416z" })])); } }); var loading_default = /* @__PURE__ */ defineComponent({ name: "Loading", __name: "loading", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32m0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32m448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32m-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32M195.2 195.2a32 32 0 0 1 45.248 0L376.32 331.008a32 32 0 0 1-45.248 45.248L195.2 240.448a32 32 0 0 1 0-45.248m452.544 452.544a32 32 0 0 1 45.248 0L828.8 783.552a32 32 0 0 1-45.248 45.248L647.744 692.992a32 32 0 0 1 0-45.248M828.8 195.264a32 32 0 0 1 0 45.184L692.992 376.32a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0m-452.544 452.48a32 32 0 0 1 0 45.248L240.448 828.8a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0" })])); } }); var minus_default = /* @__PURE__ */ defineComponent({ name: "Minus", __name: "minus", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M128 544h768a32 32 0 1 0 0-64H128a32 32 0 0 0 0 64" })])); } }); var more_filled_default = /* @__PURE__ */ defineComponent({ name: "MoreFilled", __name: "more-filled", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M176 416a112 112 0 1 1 0 224 112 112 0 0 1 0-224m336 0a112 112 0 1 1 0 224 112 112 0 0 1 0-224m336 0a112 112 0 1 1 0 224 112 112 0 0 1 0-224" })])); } }); var more_default = /* @__PURE__ */ defineComponent({ name: "More", __name: "more", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M176 416a112 112 0 1 0 0 224 112 112 0 0 0 0-224m0 64a48 48 0 1 1 0 96 48 48 0 0 1 0-96m336-64a112 112 0 1 1 0 224 112 112 0 0 1 0-224m0 64a48 48 0 1 0 0 96 48 48 0 0 0 0-96m336-64a112 112 0 1 1 0 224 112 112 0 0 1 0-224m0 64a48 48 0 1 0 0 96 48 48 0 0 0 0-96" })])); } }); var picture_filled_default = /* @__PURE__ */ defineComponent({ name: "PictureFilled", __name: "picture-filled", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M96 896a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32h832a32 32 0 0 1 32 32v704a32 32 0 0 1-32 32zm315.52-228.48-68.928-68.928a32 32 0 0 0-45.248 0L128 768.064h778.688l-242.112-290.56a32 32 0 0 0-49.216 0L458.752 665.408a32 32 0 0 1-47.232 2.112M256 384a96 96 0 1 0 192.064-.064A96 96 0 0 0 256 384" })])); } }); var plus_default = /* @__PURE__ */ defineComponent({ name: "Plus", __name: "plus", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M480 480V128a32 32 0 0 1 64 0v352h352a32 32 0 1 1 0 64H544v352a32 32 0 1 1-64 0V544H128a32 32 0 0 1 0-64z" })])); } }); var question_filled_default = /* @__PURE__ */ defineComponent({ name: "QuestionFilled", __name: "question-filled", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m23.744 191.488c-52.096 0-92.928 14.784-123.2 44.352-30.976 29.568-45.76 70.4-45.76 122.496h80.256c0-29.568 5.632-52.8 17.6-68.992 13.376-19.712 35.2-28.864 66.176-28.864 23.936 0 42.944 6.336 56.32 19.712 12.672 13.376 19.712 31.68 19.712 54.912 0 17.6-6.336 34.496-19.008 49.984l-8.448 9.856c-45.76 40.832-73.216 70.4-82.368 89.408-9.856 19.008-14.08 42.24-14.08 68.992v9.856h80.96v-9.856c0-16.896 3.52-31.68 10.56-45.76 6.336-12.672 15.488-24.64 28.16-35.2 33.792-29.568 54.208-48.576 60.544-55.616 16.896-22.528 26.048-51.392 26.048-86.592q0-64.416-42.24-101.376c-28.16-25.344-65.472-37.312-111.232-37.312m-12.672 406.208a54.27 54.27 0 0 0-38.72 14.784 49.4 49.4 0 0 0-15.488 38.016c0 15.488 4.928 28.16 15.488 38.016A54.85 54.85 0 0 0 523.072 768c15.488 0 28.16-4.928 38.72-14.784a51.52 51.52 0 0 0 16.192-38.72 51.97 51.97 0 0 0-15.488-38.016 55.94 55.94 0 0 0-39.424-14.784" })])); } }); var refresh_left_default = /* @__PURE__ */ defineComponent({ name: "RefreshLeft", __name: "refresh-left", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M289.088 296.704h92.992a32 32 0 0 1 0 64H232.96a32 32 0 0 1-32-32V179.712a32 32 0 0 1 64 0v50.56a384 384 0 0 1 643.84 282.88 384 384 0 0 1-383.936 384 384 384 0 0 1-384-384h64a320 320 0 1 0 640 0 320 320 0 0 0-555.712-216.448z" })])); } }); var refresh_right_default = /* @__PURE__ */ defineComponent({ name: "RefreshRight", __name: "refresh-right", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M784.512 230.272v-50.56a32 32 0 1 1 64 0v149.056a32 32 0 0 1-32 32H667.52a32 32 0 1 1 0-64h92.992A320 320 0 1 0 524.8 833.152a320 320 0 0 0 320-320h64a384 384 0 0 1-384 384 384 384 0 0 1-384-384 384 384 0 0 1 643.712-282.88" })])); } }); var scale_to_original_default = /* @__PURE__ */ defineComponent({ name: "ScaleToOriginal", __name: "scale-to-original", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M813.176 180.706a60.235 60.235 0 0 1 60.236 60.235v481.883a60.235 60.235 0 0 1-60.236 60.235H210.824a60.235 60.235 0 0 1-60.236-60.235V240.94a60.235 60.235 0 0 1 60.236-60.235h602.352zm0-60.235H210.824A120.47 120.47 0 0 0 90.353 240.94v481.883a120.47 120.47 0 0 0 120.47 120.47h602.353a120.47 120.47 0 0 0 120.471-120.47V240.94a120.47 120.47 0 0 0-120.47-120.47zm-120.47 180.705a30.12 30.12 0 0 0-30.118 30.118v301.177a30.118 30.118 0 0 0 60.236 0V331.294a30.12 30.12 0 0 0-30.118-30.118m-361.412 0a30.12 30.12 0 0 0-30.118 30.118v301.177a30.118 30.118 0 1 0 60.236 0V331.294a30.12 30.12 0 0 0-30.118-30.118M512 361.412a30.12 30.12 0 0 0-30.118 30.117v30.118a30.118 30.118 0 0 0 60.236 0V391.53A30.12 30.12 0 0 0 512 361.412M512 512a30.12 30.12 0 0 0-30.118 30.118v30.117a30.118 30.118 0 0 0 60.236 0v-30.117A30.12 30.12 0 0 0 512 512" })])); } }); var search_default = /* @__PURE__ */ defineComponent({ name: "Search", __name: "search", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "m795.904 750.72 124.992 124.928a32 32 0 0 1-45.248 45.248L750.656 795.904a416 416 0 1 1 45.248-45.248zM480 832a352 352 0 1 0 0-704 352 352 0 0 0 0 704" })])); } }); var sort_down_default = /* @__PURE__ */ defineComponent({ name: "SortDown", __name: "sort-down", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M576 96v709.568L333.312 562.816A32 32 0 1 0 288 608l297.408 297.344A32 32 0 0 0 640 882.688V96a32 32 0 0 0-64 0" })])); } }); var sort_up_default = /* @__PURE__ */ defineComponent({ name: "SortUp", __name: "sort-up", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M384 141.248V928a32 32 0 1 0 64 0V218.56l242.688 242.688A32 32 0 1 0 736 416L438.592 118.656A32 32 0 0 0 384 141.248" })])); } }); var star_filled_default = /* @__PURE__ */ defineComponent({ name: "StarFilled", __name: "star-filled", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M313.6 924.48a70.4 70.4 0 0 1-74.152-5.365 70.4 70.4 0 0 1-27.992-68.875l37.888-220.928L88.96 472.96a70.4 70.4 0 0 1 3.788-104.225A70.4 70.4 0 0 1 128 352.896l221.76-32.256 99.2-200.96a70.4 70.4 0 0 1 100.246-28.595 70.4 70.4 0 0 1 25.962 28.595l99.2 200.96 221.824 32.256a70.4 70.4 0 0 1 39.04 120.064L774.72 629.376l37.888 220.928a70.4 70.4 0 0 1-102.144 74.24L512 820.096l-198.4 104.32z" })])); } }); var star_default = /* @__PURE__ */ defineComponent({ name: "Star", __name: "star", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "m512 747.84 228.16 119.936a6.4 6.4 0 0 0 9.28-6.72l-43.52-254.08 184.512-179.904a6.4 6.4 0 0 0-3.52-10.88l-255.104-37.12L517.76 147.904a6.4 6.4 0 0 0-11.52 0L392.192 379.072l-255.104 37.12a6.4 6.4 0 0 0-3.52 10.88L318.08 606.976l-43.584 254.08a6.4 6.4 0 0 0 9.28 6.72zM313.6 924.48a70.4 70.4 0 0 1-102.144-74.24l37.888-220.928L88.96 472.96A70.4 70.4 0 0 1 128 352.896l221.76-32.256 99.2-200.96a70.4 70.4 0 0 1 126.208 0l99.2 200.96 221.824 32.256a70.4 70.4 0 0 1 39.04 120.064L774.72 629.376l37.888 220.928a70.4 70.4 0 0 1-102.144 74.24L512 820.096l-198.4 104.32z" })])); } }); var success_filled_default = /* @__PURE__ */ defineComponent({ name: "SuccessFilled", __name: "success-filled", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m-55.808 536.384-99.52-99.584a38.4 38.4 0 1 0-54.336 54.336l126.72 126.72a38.27 38.27 0 0 0 54.336 0l262.4-262.464a38.4 38.4 0 1 0-54.272-54.336z" })])); } }); var view_default = /* @__PURE__ */ defineComponent({ name: "View", __name: "view", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M512 160c320 0 512 352 512 352S832 864 512 864 0 512 0 512s192-352 512-352m0 64c-225.28 0-384.128 208.064-436.8 288 52.608 79.872 211.456 288 436.8 288 225.28 0 384.128-208.064 436.8-288-52.608-79.872-211.456-288-436.8-288m0 64a224 224 0 1 1 0 448 224 224 0 0 1 0-448m0 64a160.19 160.19 0 0 0-160 160c0 88.192 71.744 160 160 160s160-71.808 160-160-71.744-160-160-160" })])); } }); var warning_filled_default = /* @__PURE__ */ defineComponent({ name: "WarningFilled", __name: "warning-filled", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m0 192a58.43 58.43 0 0 0-58.24 63.744l23.36 256.384a35.072 35.072 0 0 0 69.76 0l23.296-256.384A58.43 58.43 0 0 0 512 256m0 512a51.2 51.2 0 1 0 0-102.4 51.2 51.2 0 0 0 0 102.4" })])); } }); var zoom_in_default = /* @__PURE__ */ defineComponent({ name: "ZoomIn", __name: "zoom-in", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "m795.904 750.72 124.992 124.928a32 32 0 0 1-45.248 45.248L750.656 795.904a416 416 0 1 1 45.248-45.248zM480 832a352 352 0 1 0 0-704 352 352 0 0 0 0 704m-32-384v-96a32 32 0 0 1 64 0v96h96a32 32 0 0 1 0 64h-96v96a32 32 0 0 1-64 0v-96h-96a32 32 0 0 1 0-64z" })])); } }); var zoom_out_default = /* @__PURE__ */ defineComponent({ name: "ZoomOut", __name: "zoom-out", setup(__props) { return (_ctx, _cache) => (openBlock(), createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [createElementVNode("path", { fill: "currentColor", d: "m795.904 750.72 124.992 124.928a32 32 0 0 1-45.248 45.248L750.656 795.904a416 416 0 1 1 45.248-45.248zM480 832a352 352 0 1 0 0-704 352 352 0 0 0 0 704M352 448h256a32 32 0 0 1 0 64H352a32 32 0 0 1 0-64" })])); } }); //#endregion //#region ../../packages/utils/vue/props/runtime.ts const epPropKey = "__epPropKey"; const definePropType = (val) => val; const isEpProp = (val) => isObject$1(val) && !!val["__epPropKey"]; /** * @description Build prop. It can better optimize prop types * @description 生成 prop,能更好地优化类型 * @example // limited options // the type will be PropType<'light' | 'dark'> buildProp({ type: String, values: ['light', 'dark'], } as const) * @example // limited options and other types // the type will be PropType<'small' | 'large' | number> buildProp({ type: [String, Number], values: ['small', 'large'], validator: (val: unknown): val is number => typeof val === 'number', } as const) @link see more: https://github.com/element-plus/element-plus/pull/3341 */ const buildProp = (prop, key) => { if (!isObject$1(prop) || isEpProp(prop)) return prop; const { values, required, default: defaultValue, type, validator } = prop; const epProp = { type, required: !!required, validator: values || validator ? (val) => { let valid = false; let allowedValues = []; if (values) { allowedValues = Array.from(values); if (hasOwn(prop, "default")) allowedValues.push(defaultValue); valid ||= allowedValues.includes(val); } if (validator) valid ||= validator(val); if (!valid && allowedValues.length > 0) { const allowValuesText = [...new Set(allowedValues)].map((value) => JSON.stringify(value)).join(", "); warn(`Invalid prop: validation failed${key ? ` for prop "${key}"` : ""}. Expected one of [${allowValuesText}], got value ${JSON.stringify(val)}.`); } return valid; } : void 0, [epPropKey]: true }; if (hasOwn(prop, "default")) epProp.default = defaultValue; return epProp; }; const buildProps = (props) => fromPairs(Object.entries(props).map(([key, option]) => [key, buildProp(option, key)])); //#endregion //#region ../../packages/utils/vue/icon.ts const iconPropType = definePropType([ String, Object, Function ]); const CloseComponents = { Close: close_default }; const TypeComponents = { Close: close_default, SuccessFilled: success_filled_default, InfoFilled: info_filled_default, WarningFilled: warning_filled_default, CircleCloseFilled: circle_close_filled_default }; const TypeComponentsMap = { primary: info_filled_default, success: success_filled_default, warning: warning_filled_default, error: circle_close_filled_default, info: info_filled_default }; const ValidateComponentsMap = { validating: loading_default, success: circle_check_default, error: circle_close_default }; //#endregion //#region ../../packages/utils/vue/install.ts const withPropsDefaultsSetter = (target) => { const _p = target.props; const props = isArray$1(_p) ? fromPairs(_p.map((key) => [key, {}])) : _p; target.setPropsDefaults = (defaults) => { if (!props) return; for (const [key, value] of Object.entries(defaults)) { const prop = props[key]; if (!hasOwn(props, key)) continue; if (isPlainObject(prop)) { props[key] = { ...prop, default: value }; continue; } props[key] = { type: prop, default: value }; } target.props = props; }; }; const withInstall = (main, extra) => { main.install = (app) => { for (const comp of [main, ...Object.values(extra ?? {})]) app.component(comp.name, comp); }; if (extra) for (const [key, comp] of Object.entries(extra)) main[key] = comp; withPropsDefaultsSetter(main); return main; }; const withInstallFunction = (fn, name) => { fn.install = (app) => { fn._context = app._context; app.config.globalProperties[name] = fn; }; return fn; }; const withInstallDirective = (directive, name) => { directive.install = (app) => { app.directive(name, directive); }; return directive; }; const withNoopInstall = (component) => { component.install = NOOP; withPropsDefaultsSetter(component); return component; }; //#endregion //#region ../../packages/utils/vue/refs.ts const composeRefs = (...refs) => { return (el) => { refs.forEach((ref) => { ref.value = el; }); }; }; //#endregion //#region ../../packages/utils/vue/validator.ts const isValidComponentSize = (val) => ["", ...componentSizes].includes(val); //#endregion //#region ../../packages/utils/vue/vnode.ts const SCOPE$8 = "utils/vue/vnode"; function isFragment(node) { return isVNode(node) && node.type === Fragment; } function isComment(node) { return isVNode(node) && node.type === Comment; } function isValidElementNode(node) { return isVNode(node) && !isFragment(node) && !isComment(node); } const getNormalizedProps = (node) => { if (!isVNode(node)) { /* @__PURE__ */ debugWarn(SCOPE$8, "[getNormalizedProps] must be a VNode"); return {}; } const raw = node.props || {}; const type = (isVNode(node.type) ? node.type.props : void 0) || {}; const props = {}; Object.keys(type).forEach((key) => { if (hasOwn(type[key], "default")) props[key] = type[key].default; }); Object.keys(raw).forEach((key) => { props[camelize(key)] = raw[key]; }); return props; }; const flattedChildren = (children) => { const vNodes = isArray$1(children) ? children : [children]; const result = []; vNodes.forEach((child) => { if (isArray$1(child)) result.push(...flattedChildren(child)); else if (isVNode(child) && child.component?.subTree) result.push(child, ...flattedChildren(child.component.subTree)); else if (isVNode(child) && isArray$1(child.children)) result.push(...flattedChildren(child.children)); else if (isVNode(child) && child.shapeFlag === 2) result.push(...flattedChildren(child.type())); else result.push(child); }); return result; }; //#endregion //#region ../../packages/utils/arrays.ts const unique = (arr) => [...new Set(arr)]; const extractFirst = (arr) => { return isArray$1(arr) ? arr[0] : arr; }; /** like `_.castArray`, except falsy value returns empty array. */ const castArray = (arr) => { if (!arr && arr !== 0) return []; return isArray$1(arr) ? arr : [arr]; }; //#endregion //#region ../../packages/utils/typescript.ts const mutable = (val) => val; //#endregion //#region ../../packages/utils/throttleByRaf.ts function throttleByRaf(cb) { let timer = 0; const throttle = (...args) => { if (timer) cAF(timer); timer = rAF(() => { cb(...args); timer = 0; }); }; throttle.cancel = () => { cAF(timer); timer = 0; }; return throttle; } //#endregion //#region ../../packages/utils/numbers.ts /** * Due to browser rendering and calculation precision loss issues, * boundary checks cannot be based solely on value equality; * a certain range of fluctuation is permissible. */ function isGreaterThan(a, b, epsilon = .03) { return a - b > epsilon; } //#endregion //#region ../../packages/hooks/use-attrs/index.ts const DEFAULT_EXCLUDE_KEYS = ["class", "style"]; const LISTENER_PREFIX = /^on[A-Z]/; const useAttrs = (params = {}) => { const { excludeListeners = false, excludeKeys } = params; const allExcludeKeys = computed(() => { return (excludeKeys?.value || []).concat(DEFAULT_EXCLUDE_KEYS); }); const instance = getCurrentInstance(); if (!instance) { /* @__PURE__ */ debugWarn("use-attrs", "getCurrentInstance() returned null. useAttrs() must be called at the top of a setup function"); return computed(() => ({})); } return computed(() => fromPairs(Object.entries(instance.proxy?.$attrs).filter(([key]) => !allExcludeKeys.value.includes(key) && !(excludeListeners && LISTENER_PREFIX.test(key))))); }; //#endregion //#region ../../packages/hooks/use-calc-input-width/index.ts function useCalcInputWidth() { const calculatorRef = shallowRef(); const calculatorWidth = ref(0); const inputStyle = computed(() => ({ minWidth: `${Math.max(calculatorWidth.value, 11)}px` })); const resetCalculatorWidth = () => { calculatorWidth.value = calculatorRef.value?.getBoundingClientRect().width ?? 0; }; useResizeObserver(calculatorRef, resetCalculatorWidth); return { calculatorRef, calculatorWidth, inputStyle }; } //#endregion //#region ../../packages/hooks/use-deprecated/index.ts const useDeprecated = ({ from, replacement, scope, version, ref, type = "API" }, condition) => { watch(() => unref(condition), (val) => { if (val) /* @__PURE__ */ debugWarn(scope, `[${type}] ${from} is about to be deprecated in version ${version}, please use ${replacement} instead. For more detail, please visit: ${ref} `); }, { immediate: true }); }; //#endregion //#region ../../packages/hooks/use-draggable/index.ts const useDraggable = (targetRef, dragRef, draggable, overflow) => { const transform = { offsetX: 0, offsetY: 0 }; const isDragging = ref(false); const adjustPosition = (moveX, moveY) => { if (targetRef.value) { const { offsetX, offsetY } = transform; const targetRect = targetRef.value.getBoundingClientRect(); const targetLeft = Math.max(targetRect.left, 0); const targetTop = Math.max(targetRect.top, 0); const targetWidth = targetRect.width; const targetHeight = targetRect.height; const clientWidth = document.documentElement.clientWidth; const clientHeight = document.documentElement.clientHeight; const minLeft = -targetLeft + offsetX; const minTop = -targetTop + offsetY; const maxLeft = clientWidth - targetLeft - targetWidth + offsetX; const maxTop = clientHeight - targetTop - (targetHeight < clientHeight ? targetHeight : 0) + offsetY; if (!overflow?.value) { moveX = clamp$1(moveX, minLeft, maxLeft); moveY = clamp$1(moveY, minTop, maxTop); } transform.offsetX = moveX; transform.offsetY = moveY; targetRef.value.style.transform = `translate(${addUnit(moveX)}, ${addUnit(moveY)})`; } }; const onMousedown = (e) => { const downX = e.clientX; const downY = e.clientY; const { offsetX, offsetY } = transform; const onMousemove = (e) => { if (!isDragging.value) isDragging.value = true; adjustPosition(offsetX + e.clientX - downX, offsetY + e.clientY - downY); }; const onMouseup = () => { isDragging.value = false; document.removeEventListener("mousemove", onMousemove); document.removeEventListener("mouseup", onMouseup); }; document.addEventListener("mousemove", onMousemove); document.addEventListener("mouseup", onMouseup); }; const onDraggable = () => { if (dragRef.value && targetRef.value) { dragRef.value.addEventListener("mousedown", onMousedown); window.addEventListener("resize", updatePosition); } }; const offDraggable = () => { if (dragRef.value && targetRef.value) { dragRef.value.removeEventListener("mousedown", onMousedown); window.removeEventListener("resize", updatePosition); } }; const resetPosition = () => { transform.offsetX = 0; transform.offsetY = 0; if (targetRef.value) targetRef.value.style.transform = ""; }; const updatePosition = () => { const { offsetX, offsetY } = transform; adjustPosition(offsetX, offsetY); }; onMounted(() => { watchEffect(() => { if (draggable.value) onDraggable(); else offDraggable(); }); }); onBeforeUnmount(() => { offDraggable(); }); return { isDragging, resetPosition, updatePosition }; }; //#endregion //#region ../../packages/hooks/use-focus/index.ts const useFocus = (el) => { return { focus: () => { el.value?.focus?.(); } }; }; //#endregion //#region ../../packages/locale/lang/en.ts var en_default = { name: "en", el: { breadcrumb: { label: "Breadcrumb" }, colorpicker: { confirm: "OK", clear: "Clear", defaultLabel: "color picker", description: "current color is {color}. press enter to select a new color.", alphaLabel: "pick alpha value", alphaDescription: "alpha {alpha}, current color is {color}", hueLabel: "pick hue value", hueDescription: "hue {hue}, current color is {color}", svLabel: "pick saturation and brightness value", svDescription: "saturation {saturation}, brightness {brightness}, current color is {color}", predefineDescription: "select {value} as the color" }, datepicker: { now: "Now", today: "Today", cancel: "Cancel", clear: "Clear", confirm: "OK", dateTablePrompt: "Use the arrow keys and enter to select the day of the month", monthTablePrompt: "Use the arrow keys and enter to select the month", yearTablePrompt: "Use the arrow keys and enter to select the year", selectedDate: "Selected date", selectDate: "Select date", selectTime: "Select time", startDate: "Start Date", startTime: "Start Time", endDate: "End Date", endTime: "End Time", prevYear: "Previous Year", nextYear: "Next Year", prevMonth: "Previous Month", nextMonth: "Next Month", year: "", month1: "January", month2: "February", month3: "March", month4: "April", month5: "May", month6: "June", month7: "July", month8: "August", month9: "September", month10: "October", month11: "November", month12: "December", weeks: { sun: "Sun", mon: "Mon", tue: "Tue", wed: "Wed", thu: "Thu", fri: "Fri", sat: "Sat" }, weeksFull: { sun: "Sunday", mon: "Monday", tue: "Tuesday", wed: "Wednesday", thu: "Thursday", fri: "Friday", sat: "Saturday" }, months: { jan: "Jan", feb: "Feb", mar: "Mar", apr: "Apr", may: "May", jun: "Jun", jul: "Jul", aug: "Aug", sep: "Sep", oct: "Oct", nov: "Nov", dec: "Dec" } }, inputNumber: { decrease: "decrease number", increase: "increase number" }, select: { loading: "Loading", noMatch: "No matching data", noData: "No data", placeholder: "Select" }, mention: { loading: "Loading" }, dropdown: { toggleDropdown: "Toggle Dropdown" }, cascader: { noMatch: "No matching data", loading: "Loading", placeholder: "Select", noData: "No data" }, pagination: { goto: "Go to", pagesize: "/page", total: "Total {total}", pageClassifier: "", page: "Page", prev: "Go to previous page", next: "Go to next page", currentPage: "page {pager}", prevPages: "Previous {pager} pages", nextPages: "Next {pager} pages", deprecationWarning: "Deprecated usages detected, please refer to the el-pagination documentation for more details" }, dialog: { close: "Close this dialog" }, drawer: { close: "Close this dialog" }, messagebox: { title: "Message", confirm: "OK", cancel: "Cancel", error: "Illegal input", close: "Close this dialog" }, upload: { deleteTip: "press delete to remove", delete: "Delete", preview: "Preview", continue: "Continue" }, slider: { defaultLabel: "slider between {min} and {max}", defaultRangeStartLabel: "pick start value", defaultRangeEndLabel: "pick end value" }, table: { emptyText: "No Data", confirmFilter: "Confirm", resetFilter: "Reset", clearFilter: "All", sumText: "Sum", selectAllLabel: "Select all rows", selectRowLabel: "Select this row", expandRowLabel: "Expand this row", collapseRowLabel: "Collapse this row", sortLabel: "Sort by {column}", filterLabel: "Filter by {column}" }, tag: { close: "Close this tag" }, tour: { next: "Next", previous: "Previous", finish: "Finish", close: "Close this dialog" }, tree: { emptyText: "No Data" }, transfer: { noMatch: "No matching data", noData: "No data", titles: ["List 1", "List 2"], filterPlaceholder: "Enter keyword", noCheckedFormat: "{total} items", hasCheckedFormat: "{checked}/{total} checked" }, image: { error: "FAILED" }, pageHeader: { title: "Back" }, popconfirm: { confirmButtonText: "Yes", cancelButtonText: "No" }, carousel: { leftArrow: "Carousel arrow left", rightArrow: "Carousel arrow right", indicator: "Carousel switch to index {index}" }, inputOTP: { groupLabel: "OTP Input", defaultLabel: "Please enter OTP character {index}" } } }; //#endregion //#region ../../packages/hooks/use-locale/index.ts const buildTranslator = (locale) => (path, option) => translate(path, option, unref(locale)); const translate = (path, option, locale) => get(locale, path, path).replace(/\{(\w+)\}/g, (_, key) => `${option?.[key] ?? `{${key}}`}`); const buildLocaleContext = (locale) => { return { lang: computed(() => unref(locale).name), locale: isRef(locale) ? locale : ref(locale), t: buildTranslator(locale) }; }; const localeContextKey = Symbol("localeContextKey"); const useLocale = (localeOverrides) => { const locale = localeOverrides || inject(localeContextKey, ref()); return buildLocaleContext(computed(() => locale.value || en_default)); }; //#endregion //#region ../../packages/hooks/use-namespace/index.ts const defaultNamespace = "el"; const statePrefix = "is-"; const _bem = (namespace, block, blockSuffix, element, modifier) => { let cls = `${namespace}-${block}`; if (blockSuffix) cls += `-${blockSuffix}`; if (element) cls += `__${element}`; if (modifier) cls += `--${modifier}`; return cls; }; const namespaceContextKey = Symbol("namespaceContextKey"); const useGetDerivedNamespace = (namespaceOverrides) => { const derivedNamespace = namespaceOverrides || (getCurrentInstance() ? inject(namespaceContextKey, ref("el")) : ref("el")); return computed(() => { return unref(derivedNamespace) || "el"; }); }; const useNamespace = (block, namespaceOverrides) => { const namespace = useGetDerivedNamespace(namespaceOverrides); const b = (blockSuffix = "") => _bem(namespace.value, block, blockSuffix, "", ""); const e = (element) => element ? _bem(namespace.value, block, "", element, "") : ""; const m = (modifier) => modifier ? _bem(namespace.value, block, "", "", modifier) : ""; const be = (blockSuffix, element) => blockSuffix && element ? _bem(namespace.value, block, blockSuffix, element, "") : ""; const em = (element, modifier) => element && modifier ? _bem(namespace.value, block, "", element, modifier) : ""; const bm = (blockSuffix, modifier) => blockSuffix && modifier ? _bem(namespace.value, block, blockSuffix, "", modifier) : ""; const bem = (blockSuffix, element, modifier) => blockSuffix && element && modifier ? _bem(namespace.value, block, blockSuffix, element, modifier) : ""; const is = (name, ...args) => { const state = args.length >= 1 ? args[0] : true; return name && state ? `${statePrefix}${name}` : ""; }; const cssVar = (object) => { const styles = {}; for (const key in object) if (object[key]) styles[`--${namespace.value}-${key}`] = object[key]; return styles; }; const cssVarBlock = (object) => { const styles = {}; for (const key in object) if (object[key]) styles[`--${namespace.value}-${block}-${key}`] = object[key]; return styles; }; const cssVarName = (name) => `--${namespace.value}-${name}`; const cssVarBlockName = (name) => `--${namespace.value}-${block}-${name}`; return { namespace, b, e, m, be, em, bm, bem, is, cssVar, cssVarName, cssVarBlock, cssVarBlockName }; }; //#endregion //#region ../../packages/hooks/use-lockscreen/index.ts /** * Hook that monitoring the ref value to lock or unlock the screen. * When the trigger became true, it assumes modal is now opened and vice versa. * @param trigger {Ref} */ const useLockscreen = (trigger, options = {}) => { if (!isRef(trigger)) throwError("[useLockscreen]", "You need to pass a ref param to this function"); const ns = options.ns || useNamespace("popup"); const hiddenCls = computed(() => ns.bm("parent", "hidden")); let scrollBarWidth = 0; let withoutHiddenClass = false; let bodyWidth = "0"; let cleaned = false; const cleanup = () => { if (cleaned) return; cleaned = true; setTimeout(() => { if (typeof document === "undefined") return; if (withoutHiddenClass && document) { document.body.style.width = bodyWidth; removeClass(document.body, hiddenCls.value); } }, 200); }; watch(trigger, (val) => { if (!val) { cleanup(); return; } cleaned = false; withoutHiddenClass = !hasClass(document.body, hiddenCls.value); if (withoutHiddenClass) { bodyWidth = document.body.style.width; addClass(document.body, hiddenCls.value); } scrollBarWidth = getScrollBarWidth(ns.namespace.value); const bodyHasOverflow = document.documentElement.clientHeight < document.body.scrollHeight; const bodyOverflowY = getStyle(document.body, "overflowY"); if (scrollBarWidth > 0 && (bodyHasOverflow || bodyOverflowY === "scroll") && withoutHiddenClass) document.body.style.width = `calc(100% - ${scrollBarWidth}px)`; }); onScopeDispose(() => cleanup()); }; //#endregion //#region ../../packages/hooks/use-modal/index.ts const modalStack = []; const closeModal = (e) => { if (modalStack.length === 0) return; if (getEventCode(e) === EVENT_CODE.esc) { e.stopPropagation(); modalStack[modalStack.length - 1].handleClose(); } }; const useModal = (instance, visibleRef) => { watch(visibleRef, (val) => { if (val) modalStack.push(instance); else modalStack.splice(modalStack.indexOf(instance), 1); }); }; if (isClient) useEventListener(document, "keydown", closeModal); //#endregion //#region ../../packages/hooks/use-model-toggle/index.ts const _prop = buildProp({ type: definePropType(Boolean), default: null }); const _event = buildProp({ type: definePropType(Function) }); const createModelToggleComposable = (name) => { const updateEventKey = `update:${name}`; const updateEventKeyRaw = `onUpdate:${name}`; const useModelToggleEmits = [updateEventKey]; const useModelToggleProps = { [name]: _prop, [updateEventKeyRaw]: _event }; const useModelToggle = ({ indicator, toggleReason, shouldHideWhenRouteChanges, shouldProceed, onShow, onHide }) => { const instance = getCurrentInstance(); const { emit } = instance; const props = instance.props; const hasUpdateHandler = computed(() => isFunction$1(props[updateEventKeyRaw])); const isModelBindingAbsent = computed(() => props[name] === null); const doShow = (event) => { if (indicator.value === true) return; indicator.value = true; if (toggleReason) toggleReason.value = event; if (isFunction$1(onShow)) onShow(event); }; const doHide = (event) => { if (indicator.value === false) return; indicator.value = false; if (toggleReason) toggleReason.value = event; if (isFunction$1(onHide)) onHide(event); }; const show = (event) => { if (props.disabled === true || isFunction$1(shouldProceed) && !shouldProceed()) return; const shouldEmit = hasUpdateHandler.value && isClient; if (shouldEmit) emit(updateEventKey, true); if (isModelBindingAbsent.value || !shouldEmit) doShow(event); }; const hide = (event) => { if (props.disabled === true || !isClient) return; const shouldEmit = hasUpdateHandler.value && isClient; if (shouldEmit) emit(updateEventKey, false); if (isModelBindingAbsent.value || !shouldEmit) doHide(event); }; const onChange = (val) => { if (!isBoolean(val)) return; if (props.disabled && val) { if (hasUpdateHandler.value) emit(updateEventKey, false); } else if (indicator.value !== val) if (val) doShow(); else doHide(); }; const toggle = () => { if (indicator.value) hide(); else show(); }; watch(() => props[name], onChange); if (shouldHideWhenRouteChanges && instance.appContext.config.globalProperties.$route !== void 0) watch(() => ({ ...instance.proxy.$route }), () => { if (shouldHideWhenRouteChanges.value && indicator.value) hide(); }); onMounted(() => { onChange(props[name]); }); return { hide, show, toggle, hasUpdateHandler }; }; return { useModelToggle, useModelToggleProps, useModelToggleEmits }; }; const { useModelToggle, useModelToggleProps, useModelToggleEmits } = createModelToggleComposable("modelValue"); //#endregion //#region ../../packages/hooks/use-prevent-global/index.ts const usePreventGlobal = (indicator, evt, cb) => { const prevent = (e) => { if (cb(e)) e.stopImmediatePropagation(); }; let stop = void 0; watch(() => indicator.value, (val) => { if (val) stop = useEventListener(document, evt, prevent, true); else stop?.(); }, { immediate: true }); }; //#endregion //#region ../../packages/hooks/use-prop/index.ts const useProp = (name) => { const vm = getCurrentInstance(); return computed(() => (vm?.proxy?.$props)?.[name]); }; //#endregion //#region ../../node_modules/.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es/dist/index.mjs var L = "top", W = "bottom", T$1 = "right", P$1 = "left", me = "auto", Q = [ "top", W, T$1, P$1 ], Y$1 = "start", Z = "end", Ye = "clippingParents", je = "viewport", ee = "popper", Ge = "reference", De = Q.reduce(function(e, t) { return e.concat([t + "-" + Y$1, t + "-" + "end"]); }, []), Ee = [].concat(Q, [me]).reduce(function(e, t) { return e.concat([ t, t + "-" + Y$1, t + "-" + "end" ]); }, []), Je = "beforeRead", Ke = "read", Qe = "afterRead", Ze = "beforeMain", et = "main", tt = "afterMain", nt = "beforeWrite", rt = "write", ot = "afterWrite", it = [ Je, Ke, Qe, Ze, et, tt, nt, rt, ot ]; function V(e) { return e ? (e.nodeName || "").toLowerCase() : null; } function B(e) { if (e == null) return window; if (e.toString() !== "[object Window]") { var t = e.ownerDocument; return t && t.defaultView || window; } return e; } function G(e) { return e instanceof B(e).Element || e instanceof Element; } function R(e) { return e instanceof B(e).HTMLElement || e instanceof HTMLElement; } function Ae(e) { if (typeof ShadowRoot == "undefined") return !1; return e instanceof B(e).ShadowRoot || e instanceof ShadowRoot; } function Tt(e) { var t = e.state; Object.keys(t.elements).forEach(function(n) { var r = t.styles[n] || {}, o = t.attributes[n] || {}, a = t.elements[n]; !R(a) || !V(a) || (Object.assign(a.style, r), Object.keys(o).forEach(function(c) { var s = o[c]; s === !1 ? a.removeAttribute(c) : a.setAttribute(c, s === !0 ? "" : s); })); }); } function Bt(e) { var t = e.state, n = { popper: { position: t.options.strategy, left: "0", top: "0", margin: "0" }, arrow: { position: "absolute" }, reference: {} }; return Object.assign(t.elements.popper.style, n.popper), t.styles = n, t.elements.arrow && Object.assign(t.elements.arrow.style, n.arrow), function() { Object.keys(t.elements).forEach(function(r) { var o = t.elements[r], a = t.attributes[r] || {}, s = Object.keys(t.styles.hasOwnProperty(r) ? t.styles[r] : n[r]).reduce(function(i, f) { return i[f] = "", i; }, {}); !R(o) || !V(o) || (Object.assign(o.style, s), Object.keys(a).forEach(function(i) { o.removeAttribute(i); })); }); }; } var ke = { name: "applyStyles", enabled: !0, phase: "write", fn: Tt, effect: Bt, requires: ["computeStyles"] }; function C(e) { return e.split("-")[0]; } var J = Math.max, ve = Math.min, te = Math.round; function Le() { var e = navigator.userAgentData; return e != null && e.brands && Array.isArray(e.brands) ? e.brands.map(function(t) { return t.brand + "/" + t.version; }).join(" ") : navigator.userAgent; } function at() { return !/^((?!chrome|android).)*safari/i.test(Le()); } function ne(e, t, n) { t === void 0 && (t = !1), n === void 0 && (n = !1); var r = e.getBoundingClientRect(), o = 1, a = 1; t && R(e) && (o = e.offsetWidth > 0 && te(r.width) / e.offsetWidth || 1, a = e.offsetHeight > 0 && te(r.height) / e.offsetHeight || 1); var s = (G(e) ? B(e) : window).visualViewport, i = !at() && n, f = (r.left + (i && s ? s.offsetLeft : 0)) / o, u = (r.top + (i && s ? s.offsetTop : 0)) / a, m = r.width / o, h = r.height / a; return { width: m, height: h, top: u, right: f + m, bottom: u + h, left: f, x: f, y: u }; } function Pe(e) { var t = ne(e), n = e.offsetWidth, r = e.offsetHeight; return Math.abs(t.width - n) <= 1 && (n = t.width), Math.abs(t.height - r) <= 1 && (r = t.height), { x: e.offsetLeft, y: e.offsetTop, width: n, height: r }; } function st(e, t) { var n = t.getRootNode && t.getRootNode(); if (e.contains(t)) return !0; if (n && Ae(n)) { var r = t; do { if (r && e.isSameNode(r)) return !0; r = r.parentNode || r.host; } while (r); } return !1; } function I$1(e) { return B(e).getComputedStyle(e); } function Rt(e) { return [ "table", "td", "th" ].indexOf(V(e)) >= 0; } function N$1(e) { return ((G(e) ? e.ownerDocument : e.document) || window.document).documentElement; } function ye(e) { return V(e) === "html" ? e : e.assignedSlot || e.parentNode || (Ae(e) ? e.host : null) || N$1(e); } function ft(e) { return !R(e) || I$1(e).position === "fixed" ? null : e.offsetParent; } function Ht(e) { var t = /firefox/i.test(Le()); if (/Trident/i.test(Le()) && R(e)) { if (I$1(e).position === "fixed") return null; } var o = ye(e); for (Ae(o) && (o = o.host); R(o) && ["html", "body"].indexOf(V(o)) < 0;) { var a = I$1(o); if (a.transform !== "none" || a.perspective !== "none" || a.contain === "paint" || ["transform", "perspective"].indexOf(a.willChange) !== -1 || t && a.willChange === "filter" || t && a.filter && a.filter !== "none") return o; o = o.parentNode; } return null; } function se(e) { for (var t = B(e), n = ft(e); n && Rt(n) && I$1(n).position === "static";) n = ft(n); return n && (V(n) === "html" || V(n) === "body" && I$1(n).position === "static") ? t : n || Ht(e) || t; } function Me(e) { return ["top", "bottom"].indexOf(e) >= 0 ? "x" : "y"; } function fe(e, t, n) { return J(e, ve(t, n)); } function St(e, t, n) { var r = fe(e, t, n); return r > n ? n : r; } function ct() { return { top: 0, right: 0, bottom: 0, left: 0 }; } function ut(e) { return Object.assign({}, ct(), e); } function pt(e, t) { return t.reduce(function(n, r) { return n[r] = e, n; }, {}); } var Vt = function(e, t) { return e = typeof e == "function" ? e(Object.assign({}, t.rects, { placement: t.placement })) : e, ut(typeof e != "number" ? e : pt(e, Q)); }; function Ct(e) { var t, n = e.state, r = e.name, o = e.options, a = n.elements.arrow, c = n.modifiersData.popperOffsets, s = C(n.placement), i = Me(s), u = ["left", "right"].indexOf(s) >= 0 ? "height" : "width"; if (!(!a || !c)) { var m = Vt(o.padding, n), h = Pe(a), l = i === "y" ? "top" : P$1, g = i === "y" ? W : T$1, p = n.rects.reference[u] + n.rects.reference[i] - c[i] - n.rects.popper[u], y = c[i] - n.rects.reference[i], b = se(a), x = b ? i === "y" ? b.clientHeight || 0 : b.clientWidth || 0 : 0, O = p / 2 - y / 2, d = m[l], v = x - h[u] - m[g], w = x / 2 - h[u] / 2 + O, $ = fe(d, w, v), j = i; n.modifiersData[r] = (t = {}, t[j] = $, t.centerOffset = $ - w, t); } } function qt(e) { var t = e.state, r = e.options.element, o = r === void 0 ? "[data-popper-arrow]" : r; o != null && (typeof o == "string" && (o = t.elements.popper.querySelector(o), !o) || st(t.elements.popper, o) && (t.elements.arrow = o)); } var lt = { name: "arrow", enabled: !0, phase: "main", fn: Ct, effect: qt, requires: ["popperOffsets"], requiresIfExists: ["preventOverflow"] }; function re(e) { return e.split("-")[1]; } var It = { top: "auto", right: "auto", bottom: "auto", left: "auto" }; function Nt(e, t) { var n = e.x, r = e.y, o = t.devicePixelRatio || 1; return { x: te(n * o) / o || 0, y: te(r * o) / o || 0 }; } function dt(e) { var t, n = e.popper, r = e.popperRect, o = e.placement, a = e.variation, c = e.offsets, s = e.position, i = e.gpuAcceleration, f = e.adaptive, u = e.roundOffsets, m = e.isFixed, h = c.x, l = h === void 0 ? 0 : h, g = c.y, p = g === void 0 ? 0 : g, y = typeof u == "function" ? u({ x: l, y: p }) : { x: l, y: p }; l = y.x, p = y.y; var b = c.hasOwnProperty("x"), x = c.hasOwnProperty("y"), O = P$1, d = "top", v = window; if (f) { var w = se(n), $ = "clientHeight", j = "clientWidth"; if (w === B(n) && (w = N$1(n), I$1(w).position !== "static" && s === "absolute" && ($ = "scrollHeight", j = "scrollWidth")), w = w, o === "top" || (o === "left" || o === "right") && a === "end") { d = W; var D = m && w === v && v.visualViewport ? v.visualViewport.height : w[$]; p -= D - r.height, p *= i ? 1 : -1; } if (o === "left" || (o === "top" || o === "bottom") && a === "end") { O = T$1; var E = m && w === v && v.visualViewport ? v.visualViewport.width : w[j]; l -= E - r.width, l *= i ? 1 : -1; } } var A = Object.assign({ position: s }, f && It), H = u === !0 ? Nt({ x: l, y: p }, B(n)) : { x: l, y: p }; if (l = H.x, p = H.y, i) { var k; return Object.assign({}, A, (k = {}, k[d] = x ? "0" : "", k[O] = b ? "0" : "", k.transform = (v.devicePixelRatio || 1) <= 1 ? "translate(" + l + "px, " + p + "px)" : "translate3d(" + l + "px, " + p + "px, 0)", k)); } return Object.assign({}, A, (t = {}, t[d] = x ? p + "px" : "", t[O] = b ? l + "px" : "", t.transform = "", t)); } function Ft(e) { var t = e.state, n = e.options, r = n.gpuAcceleration, o = r === void 0 ? !0 : r, a = n.adaptive, c = a === void 0 ? !0 : a, s = n.roundOffsets, i = s === void 0 ? !0 : s, f = { placement: C(t.placement), variation: re(t.placement), popper: t.elements.popper, popperRect: t.rects.popper, gpuAcceleration: o, isFixed: t.options.strategy === "fixed" }; t.modifiersData.popperOffsets != null && (t.styles.popper = Object.assign({}, t.styles.popper, dt(Object.assign({}, f, { offsets: t.modifiersData.popperOffsets, position: t.options.strategy, adaptive: c, roundOffsets: i })))), t.modifiersData.arrow != null && (t.styles.arrow = Object.assign({}, t.styles.arrow, dt(Object.assign({}, f, { offsets: t.modifiersData.arrow, position: "absolute", adaptive: !1, roundOffsets: i })))), t.attributes.popper = Object.assign({}, t.attributes.popper, { "data-popper-placement": t.placement }); } var We = { name: "computeStyles", enabled: !0, phase: "beforeWrite", fn: Ft, data: {} }, ge = { passive: !0 }; function Ut(e) { var t = e.state, n = e.instance, r = e.options, o = r.scroll, a = o === void 0 ? !0 : o, c = r.resize, s = c === void 0 ? !0 : c, i = B(t.elements.popper), f = [].concat(t.scrollParents.reference, t.scrollParents.popper); return a && f.forEach(function(u) { u.addEventListener("scroll", n.update, ge); }), s && i.addEventListener("resize", n.update, ge), function() { a && f.forEach(function(u) { u.removeEventListener("scroll", n.update, ge); }), s && i.removeEventListener("resize", n.update, ge); }; } var Te = { name: "eventListeners", enabled: !0, phase: "write", fn: function() {}, effect: Ut, data: {} }, _t = { left: "right", right: "left", bottom: "top", top: "bottom" }; function be(e) { return e.replace(/left|right|bottom|top/g, function(t) { return _t[t]; }); } var zt = { start: "end", end: "start" }; function ht(e) { return e.replace(/start|end/g, function(t) { return zt[t]; }); } function Be(e) { var t = B(e); return { scrollLeft: t.pageXOffset, scrollTop: t.pageYOffset }; } function Re(e) { return ne(N$1(e)).left + Be(e).scrollLeft; } function Xt(e, t) { var n = B(e), r = N$1(e), o = n.visualViewport, a = r.clientWidth, c = r.clientHeight, s = 0, i = 0; if (o) { a = o.width, c = o.height; var f = at(); (f || !f && t === "fixed") && (s = o.offsetLeft, i = o.offsetTop); } return { width: a, height: c, x: s + Re(e), y: i }; } function Yt(e) { var t, n = N$1(e), r = Be(e), o = (t = e.ownerDocument) == null ? void 0 : t.body, a = J(n.scrollWidth, n.clientWidth, o ? o.scrollWidth : 0, o ? o.clientWidth : 0), c = J(n.scrollHeight, n.clientHeight, o ? o.scrollHeight : 0, o ? o.clientHeight : 0), s = -r.scrollLeft + Re(e), i = -r.scrollTop; return I$1(o || n).direction === "rtl" && (s += J(n.clientWidth, o ? o.clientWidth : 0) - a), { width: a, height: c, x: s, y: i }; } function He(e) { var t = I$1(e), n = t.overflow, r = t.overflowX, o = t.overflowY; return /auto|scroll|overlay|hidden/.test(n + o + r); } function mt(e) { return [ "html", "body", "#document" ].indexOf(V(e)) >= 0 ? e.ownerDocument.body : R(e) && He(e) ? e : mt(ye(e)); } function ce(e, t) { var n; t === void 0 && (t = []); var r = mt(e), o = r === ((n = e.ownerDocument) == null ? void 0 : n.body), a = B(r), c = o ? [a].concat(a.visualViewport || [], He(r) ? r : []) : r, s = t.concat(c); return o ? s : s.concat(ce(ye(c))); } function Se(e) { return Object.assign({}, e, { left: e.x, top: e.y, right: e.x + e.width, bottom: e.y + e.height }); } function Gt(e, t) { var n = ne(e, !1, t === "fixed"); return n.top = n.top + e.clientTop, n.left = n.left + e.clientLeft, n.bottom = n.top + e.clientHeight, n.right = n.left + e.clientWidth, n.width = e.clientWidth, n.height = e.clientHeight, n.x = n.left, n.y = n.top, n; } function vt(e, t, n) { return t === "viewport" ? Se(Xt(e, n)) : G(t) ? Gt(t, n) : Se(Yt(N$1(e))); } function Jt(e) { var t = ce(ye(e)), r = ["absolute", "fixed"].indexOf(I$1(e).position) >= 0 && R(e) ? se(e) : e; return G(r) ? t.filter(function(o) { return G(o) && st(o, r) && V(o) !== "body"; }) : []; } function Kt(e, t, n, r) { var o = t === "clippingParents" ? Jt(e) : [].concat(t), a = [].concat(o, [n]), c = a[0], s = a.reduce(function(i, f) { var u = vt(e, f, r); return i.top = J(u.top, i.top), i.right = ve(u.right, i.right), i.bottom = ve(u.bottom, i.bottom), i.left = J(u.left, i.left), i; }, vt(e, c, r)); return s.width = s.right - s.left, s.height = s.bottom - s.top, s.x = s.left, s.y = s.top, s; } function yt(e) { var t = e.reference, n = e.element, r = e.placement, o = r ? C(r) : null, a = r ? re(r) : null, c = t.x + t.width / 2 - n.width / 2, s = t.y + t.height / 2 - n.height / 2, i; switch (o) { case "top": i = { x: c, y: t.y - n.height }; break; case W: i = { x: c, y: t.y + t.height }; break; case T$1: i = { x: t.x + t.width, y: s }; break; case P$1: i = { x: t.x - n.width, y: s }; break; default: i = { x: t.x, y: t.y }; } var f = o ? Me(o) : null; if (f != null) { var u = f === "y" ? "height" : "width"; switch (a) { case Y$1: i[f] = i[f] - (t[u] / 2 - n[u] / 2); break; case "end": i[f] = i[f] + (t[u] / 2 - n[u] / 2); break; } } return i; } function oe(e, t) { t === void 0 && (t = {}); var n = t, r = n.placement, o = r === void 0 ? e.placement : r, a = n.strategy, c = a === void 0 ? e.strategy : a, s = n.boundary, i = s === void 0 ? Ye : s, f = n.rootBoundary, u = f === void 0 ? je : f, m = n.elementContext, h = m === void 0 ? ee : m, l = n.altBoundary, g = l === void 0 ? !1 : l, p = n.padding, y = p === void 0 ? 0 : p, b = ut(typeof y != "number" ? y : pt(y, Q)), x = h === "popper" ? Ge : ee, O = e.rects.popper, d = e.elements[g ? x : h], v = Kt(G(d) ? d : d.contextElement || N$1(e.elements.popper), i, u, c), w = ne(e.elements.reference), $ = yt({ reference: w, element: O, placement: o }), j = Se(Object.assign({}, O, $)), D = h === "popper" ? j : w, E = { top: v.top - D.top + b.top, bottom: D.bottom - v.bottom + b.bottom, left: v.left - D.left + b.left, right: D.right - v.right + b.right }, A = e.modifiersData.offset; if (h === "popper" && A) { var H = A[o]; Object.keys(E).forEach(function(k) { var F = ["right", "bottom"].indexOf(k) >= 0 ? 1 : -1, U = ["top", "bottom"].indexOf(k) >= 0 ? "y" : "x"; E[k] += H[U] * F; }); } return E; } function Qt(e, t) { t === void 0 && (t = {}); var n = t, r = n.placement, o = n.boundary, a = n.rootBoundary, c = n.padding, s = n.flipVariations, i = n.allowedAutoPlacements, f = i === void 0 ? Ee : i, u = re(r), m = u ? s ? De : De.filter(function(g) { return re(g) === u; }) : Q, h = m.filter(function(g) { return f.indexOf(g) >= 0; }); h.length === 0 && (h = m); var l = h.reduce(function(g, p) { return g[p] = oe(e, { placement: p, boundary: o, rootBoundary: a, padding: c })[C(p)], g; }, {}); return Object.keys(l).sort(function(g, p) { return l[g] - l[p]; }); } function Zt(e) { if (C(e) === "auto") return []; var t = be(e); return [ ht(e), t, ht(t) ]; } function en(e) { var t = e.state, n = e.options, r = e.name; if (!t.modifiersData[r]._skip) { for (var o = n.mainAxis, a = o === void 0 ? !0 : o, c = n.altAxis, s = c === void 0 ? !0 : c, i = n.fallbackPlacements, f = n.padding, u = n.boundary, m = n.rootBoundary, h = n.altBoundary, l = n.flipVariations, g = l === void 0 ? !0 : l, p = n.allowedAutoPlacements, y = t.options.placement, x = C(y) === y, O = i || (x || !g ? [be(y)] : Zt(y)), d = [y].concat(O).reduce(function(z, q) { return z.concat(C(q) === "auto" ? Qt(t, { placement: q, boundary: u, rootBoundary: m, padding: f, flipVariations: g, allowedAutoPlacements: p }) : q); }, []), v = t.rects.reference, w = t.rects.popper, $ = /* @__PURE__ */ new Map(), j = !0, D = d[0], E = 0; E < d.length; E++) { var A = d[E], H = C(A), k = re(A) === Y$1, F = ["top", W].indexOf(H) >= 0, U = F ? "width" : "height", M = oe(t, { placement: A, boundary: u, rootBoundary: m, altBoundary: h, padding: f }), S = F ? k ? T$1 : P$1 : k ? W : "top"; v[U] > w[U] && (S = be(S)); var ue = be(S), _ = []; if (a && _.push(M[H] <= 0), s && _.push(M[S] <= 0, M[ue] <= 0), _.every(function(z) { return z; })) { D = A, j = !1; break; } $.set(A, _); } if (j) { for (var pe = g ? 3 : 1, xe = function(z) { var q = d.find(function(de) { var ae = $.get(de); if (ae) return ae.slice(0, z).every(function(K) { return K; }); }); if (q) return D = q, "break"; }, ie = pe; ie > 0; ie--) if (xe(ie) === "break") break; } t.placement !== D && (t.modifiersData[r]._skip = !0, t.placement = D, t.reset = !0); } } var gt = { name: "flip", enabled: !0, phase: "main", fn: en, requiresIfExists: ["offset"], data: { _skip: !1 } }; function bt(e, t, n) { return n === void 0 && (n = { x: 0, y: 0 }), { top: e.top - t.height - n.y, right: e.right - t.width + n.x, bottom: e.bottom - t.height + n.y, left: e.left - t.width - n.x }; } function wt(e) { return [ "top", T$1, W, P$1 ].some(function(t) { return e[t] >= 0; }); } function tn(e) { var t = e.state, n = e.name, r = t.rects.reference, o = t.rects.popper, a = t.modifiersData.preventOverflow, c = oe(t, { elementContext: "reference" }), s = oe(t, { altBoundary: !0 }), i = bt(c, r), f = bt(s, o, a), u = wt(i), m = wt(f); t.modifiersData[n] = { referenceClippingOffsets: i, popperEscapeOffsets: f, isReferenceHidden: u, hasPopperEscaped: m }, t.attributes.popper = Object.assign({}, t.attributes.popper, { "data-popper-reference-hidden": u, "data-popper-escaped": m }); } var xt = { name: "hide", enabled: !0, phase: "main", requiresIfExists: ["preventOverflow"], fn: tn }; function nn(e, t, n) { var r = C(e), o = ["left", "top"].indexOf(r) >= 0 ? -1 : 1, a = typeof n == "function" ? n(Object.assign({}, t, { placement: e })) : n, c = a[0], s = a[1]; return c = c || 0, s = (s || 0) * o, ["left", "right"].indexOf(r) >= 0 ? { x: s, y: c } : { x: c, y: s }; } function rn(e) { var t = e.state, n = e.options, r = e.name, o = n.offset, a = o === void 0 ? [0, 0] : o, c = Ee.reduce(function(u, m) { return u[m] = nn(m, t.rects, a), u; }, {}), s = c[t.placement], i = s.x, f = s.y; t.modifiersData.popperOffsets != null && (t.modifiersData.popperOffsets.x += i, t.modifiersData.popperOffsets.y += f), t.modifiersData[r] = c; } var Ot = { name: "offset", enabled: !0, phase: "main", requires: ["popperOffsets"], fn: rn }; function on(e) { var t = e.state, n = e.name; t.modifiersData[n] = yt({ reference: t.rects.reference, element: t.rects.popper, placement: t.placement }); } var Ve = { name: "popperOffsets", enabled: !0, phase: "read", fn: on, data: {} }; function an(e) { return e === "x" ? "y" : "x"; } function sn(e) { var t = e.state, n = e.options, r = e.name, o = n.mainAxis, a = o === void 0 ? !0 : o, c = n.altAxis, s = c === void 0 ? !1 : c, i = n.boundary, f = n.rootBoundary, u = n.altBoundary, m = n.padding, h = n.tether, l = h === void 0 ? !0 : h, g = n.tetherOffset, p = g === void 0 ? 0 : g, y = oe(t, { boundary: i, rootBoundary: f, padding: m, altBoundary: u }), b = C(t.placement), x = re(t.placement), O = !x, d = Me(b), v = an(d), w = t.modifiersData.popperOffsets, $ = t.rects.reference, j = t.rects.popper, D = typeof p == "function" ? p(Object.assign({}, t.rects, { placement: t.placement })) : p, E = typeof D == "number" ? { mainAxis: D, altAxis: D } : Object.assign({ mainAxis: 0, altAxis: 0 }, D), A = t.modifiersData.offset ? t.modifiersData.offset[t.placement] : null, H = { x: 0, y: 0 }; if (w) { if (a) { var k, F = d === "y" ? "top" : P$1, U = d === "y" ? W : T$1, M = d === "y" ? "height" : "width", S = w[d], ue = S + y[F], _ = S - y[U], pe = l ? -j[M] / 2 : 0, xe = x === "start" ? $[M] : j[M], ie = x === "start" ? -j[M] : -$[M], le = t.elements.arrow, z = l && le ? Pe(le) : { width: 0, height: 0 }, q = t.modifiersData["arrow#persistent"] ? t.modifiersData["arrow#persistent"].padding : ct(), de = q[F], ae = q[U], K = fe(0, $[M], z[M]), Et = O ? $[M] / 2 - pe - K - de - E.mainAxis : xe - K - de - E.mainAxis, At = O ? -$[M] / 2 + pe + K + ae + E.mainAxis : ie + K + ae + E.mainAxis, Oe = t.elements.arrow && se(t.elements.arrow), kt = Oe ? d === "y" ? Oe.clientTop || 0 : Oe.clientLeft || 0 : 0, Ce = (k = A == null ? void 0 : A[d]) != null ? k : 0, Lt = S + Et - Ce - kt, Pt = S + At - Ce, qe = fe(l ? ve(ue, Lt) : ue, S, l ? J(_, Pt) : _); w[d] = qe, H[d] = qe - S; } if (s) { var Ie, Mt = d === "x" ? "top" : P$1, Wt = d === "x" ? W : T$1, X = w[v], he = v === "y" ? "height" : "width", Ne = X + y[Mt], Fe = X - y[Wt], $e = ["top", P$1].indexOf(b) !== -1, Ue = (Ie = A == null ? void 0 : A[v]) != null ? Ie : 0, _e = $e ? Ne : X - $[he] - j[he] - Ue + E.altAxis, ze = $e ? X + $[he] + j[he] - Ue - E.altAxis : Fe, Xe = l && $e ? St(_e, X, ze) : fe(l ? _e : Ne, X, l ? ze : Fe); w[v] = Xe, H[v] = Xe - X; } t.modifiersData[r] = H; } } var $t = { name: "preventOverflow", enabled: !0, phase: "main", fn: sn, requiresIfExists: ["offset"] }; function fn(e) { return { scrollLeft: e.scrollLeft, scrollTop: e.scrollTop }; } function cn(e) { return e === B(e) || !R(e) ? Be(e) : fn(e); } function un(e) { var t = e.getBoundingClientRect(), n = te(t.width) / e.offsetWidth || 1, r = te(t.height) / e.offsetHeight || 1; return n !== 1 || r !== 1; } function pn(e, t, n) { n === void 0 && (n = !1); var r = R(t), o = R(t) && un(t), a = N$1(t), c = ne(e, o, n), s = { scrollLeft: 0, scrollTop: 0 }, i = { x: 0, y: 0 }; return (r || !r && !n) && ((V(t) !== "body" || He(a)) && (s = cn(t)), R(t) ? (i = ne(t, !0), i.x += t.clientLeft, i.y += t.clientTop) : a && (i.x = Re(a))), { x: c.left + s.scrollLeft - i.x, y: c.top + s.scrollTop - i.y, width: c.width, height: c.height }; } function ln(e) { var t = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new Set(), r = []; e.forEach(function(a) { t.set(a.name, a); }); function o(a) { n.add(a.name); [].concat(a.requires || [], a.requiresIfExists || []).forEach(function(s) { if (!n.has(s)) { var i = t.get(s); i && o(i); } }), r.push(a); } return e.forEach(function(a) { n.has(a.name) || o(a); }), r; } function dn(e) { var t = ln(e); return it.reduce(function(n, r) { return n.concat(t.filter(function(o) { return o.phase === r; })); }, []); } function hn(e) { var t; return function() { return t || (t = new Promise(function(n) { Promise.resolve().then(function() { t = void 0, n(e()); }); })), t; }; } function mn(e) { var t = e.reduce(function(n, r) { var o = n[r.name]; return n[r.name] = o ? Object.assign({}, o, r, { options: Object.assign({}, o.options, r.options), data: Object.assign({}, o.data, r.data) }) : r, n; }, {}); return Object.keys(t).map(function(n) { return t[n]; }); } var jt = { placement: "bottom", modifiers: [], strategy: "absolute" }; function Dt() { for (var e = arguments.length, t = new Array(e), n = 0; n < e; n++) t[n] = arguments[n]; return !t.some(function(r) { return !(r && typeof r.getBoundingClientRect == "function"); }); } function we(e) { e === void 0 && (e = {}); var t = e, n = t.defaultModifiers, r = n === void 0 ? [] : n, o = t.defaultOptions, a = o === void 0 ? jt : o; return function(c, s, i) { i === void 0 && (i = a); var f = { placement: "bottom", orderedModifiers: [], options: Object.assign({}, jt, a), modifiersData: {}, elements: { reference: c, popper: s }, attributes: {}, styles: {} }, u = [], m = !1, h = { state: f, setOptions: function(p) { var y = typeof p == "function" ? p(f.options) : p; g(), f.options = Object.assign({}, a, f.options, y), f.scrollParents = { reference: G(c) ? ce(c) : c.contextElement ? ce(c.contextElement) : [], popper: ce(s) }; var b = dn(mn([].concat(r, f.options.modifiers))); return f.orderedModifiers = b.filter(function(x) { return x.enabled; }), l(), h.update(); }, forceUpdate: function() { if (!m) { var p = f.elements, y = p.reference, b = p.popper; if (Dt(y, b)) { f.rects = { reference: pn(y, se(b), f.options.strategy === "fixed"), popper: Pe(b) }, f.reset = !1, f.placement = f.options.placement, f.orderedModifiers.forEach(function(j) { return f.modifiersData[j.name] = Object.assign({}, j.data); }); for (var x = 0; x < f.orderedModifiers.length; x++) { if (f.reset === !0) { f.reset = !1, x = -1; continue; } var O = f.orderedModifiers[x], d = O.fn, v = O.options, w = v === void 0 ? {} : v, $ = O.name; typeof d == "function" && (f = d({ state: f, options: w, name: $, instance: h }) || f); } } } }, update: hn(function() { return new Promise(function(p) { h.forceUpdate(), p(f); }); }), destroy: function() { g(), m = !0; } }; if (!Dt(c, s)) return h; h.setOptions(i).then(function(p) { !m && i.onFirstUpdate && i.onFirstUpdate(p); }); function l() { f.orderedModifiers.forEach(function(p) { var y = p.name, b = p.options, x = b === void 0 ? {} : b, O = p.effect; if (typeof O == "function") { var d = O({ state: f, name: y, instance: h, options: x }), v = function() {}; u.push(d || v); } }); } function g() { u.forEach(function(p) { return p(); }), u = []; } return h; }; } var vn = we(), gn = we({ defaultModifiers: [ Te, Ve, We, ke ] }), wn = we({ defaultModifiers: [ Te, Ve, We, ke, Ot, gt, $t, lt, xt ] }); //#endregion //#region ../../packages/hooks/use-popper/index.ts const usePopper = (referenceElementRef, popperElementRef, opts = {}) => { const stateUpdater = { name: "updateState", enabled: true, phase: "write", fn: ({ state }) => { const derivedState = deriveState(state); Object.assign(states.value, derivedState); }, requires: ["computeStyles"] }; const options = computed(() => { const { onFirstUpdate, placement, strategy, modifiers } = unref(opts); return { onFirstUpdate, placement: placement || "bottom", strategy: strategy || "absolute", modifiers: [ ...modifiers || [], stateUpdater, { name: "applyStyles", enabled: false } ] }; }); const instanceRef = shallowRef(); const states = ref({ styles: { popper: { position: unref(options).strategy, left: "0", top: "0" }, arrow: { position: "absolute" } }, attributes: {} }); const destroy = () => { if (!instanceRef.value) return; instanceRef.value.destroy(); instanceRef.value = void 0; }; watch(options, (newOptions) => { const instance = unref(instanceRef); if (instance) instance.setOptions(newOptions); }, { deep: true }); watch([referenceElementRef, popperElementRef], ([referenceElement, popperElement]) => { destroy(); if (!referenceElement || !popperElement) return; instanceRef.value = wn(referenceElement, popperElement, unref(options)); }); onBeforeUnmount(() => { destroy(); }); return { state: computed(() => ({ ...unref(instanceRef)?.state || {} })), styles: computed(() => unref(states).styles), attributes: computed(() => unref(states).attributes), update: () => unref(instanceRef)?.update(), forceUpdate: () => unref(instanceRef)?.forceUpdate(), instanceRef: computed(() => unref(instanceRef)) }; }; function deriveState(state) { const elements = Object.keys(state.elements); return { styles: fromPairs(elements.map((element) => [element, state.styles[element] || {}])), attributes: fromPairs(elements.map((element) => [element, state.attributes[element]])) }; } //#endregion //#region ../../packages/hooks/use-same-target/index.ts const useSameTarget = (handleClick) => { if (!handleClick) return { onClick: NOOP, onMousedown: NOOP, onMouseup: NOOP }; let mousedownTarget = false; let mouseupTarget = false; const onClick = (e) => { if (mousedownTarget && mouseupTarget) handleClick(e); mousedownTarget = mouseupTarget = false; }; const onMousedown = (e) => { mousedownTarget = e.target === e.currentTarget; }; const onMouseup = (e) => { mouseupTarget = e.target === e.currentTarget; }; return { onClick, onMousedown, onMouseup }; }; //#endregion //#region ../../packages/hooks/use-teleport/index.ts const useTeleport = (contentRenderer, appendToBody) => { const isTeleportVisible = ref(false); if (!isClient) return { isTeleportVisible, showTeleport: NOOP, hideTeleport: NOOP, renderTeleport: NOOP }; let $el = null; const showTeleport = () => { isTeleportVisible.value = true; if ($el !== null) return; $el = createGlobalNode(); }; const hideTeleport = () => { isTeleportVisible.value = false; if ($el !== null) { removeGlobalNode($el); $el = null; } }; const renderTeleport = () => { return appendToBody.value !== true ? contentRenderer() : isTeleportVisible.value ? [h(Teleport, { to: $el }, contentRenderer())] : void 0; }; onUnmounted(hideTeleport); return { isTeleportVisible, showTeleport, hideTeleport, renderTeleport }; }; //#endregion //#region ../../packages/hooks/use-throttle-render/index.ts const useThrottleRender = (loading, throttle = 0) => { if (throttle === 0) return loading; const throttled = ref(isObject$1(throttle) && Boolean(throttle.initVal)); let timeoutHandle = null; const dispatchThrottling = (timer) => { if (isUndefined(timer)) { throttled.value = loading.value; return; } if (timeoutHandle) clearTimeout(timeoutHandle); timeoutHandle = setTimeout(() => { throttled.value = loading.value; }, timer); }; const dispatcher = (type) => { if (type === "leading") if (isNumber(throttle)) dispatchThrottling(throttle); else dispatchThrottling(throttle.leading); else if (isObject$1(throttle)) dispatchThrottling(throttle.trailing); else throttled.value = false; }; onMounted(() => dispatcher("leading")); watch(() => loading.value, (val) => { dispatcher(val ? "leading" : "trailing"); }); return throttled; }; //#endregion //#region ../../packages/hooks/use-timeout/index.ts function useTimeout() { let timeoutHandle; const registerTimeout = (fn, delay) => { cancelTimeout(); timeoutHandle = globalThis.setTimeout(fn, delay); }; const cancelTimeout = () => { if (timeoutHandle === void 0) return; globalThis.clearTimeout(timeoutHandle); timeoutHandle = void 0; }; tryOnScopeDispose(() => cancelTimeout()); return { registerTimeout, cancelTimeout }; } //#endregion //#region ../../packages/hooks/use-transition-fallthrough/index.ts /* istanbul ignore file */ const AFTER_APPEAR = "after-appear"; const AFTER_ENTER = "after-enter"; const AFTER_LEAVE = "after-leave"; const APPEAR = "appear"; const APPEAR_CANCELLED = "appear-cancelled"; const BEFORE_ENTER = "before-enter"; const BEFORE_LEAVE = "before-leave"; const ENTER = "enter"; const ENTER_CANCELLED = "enter-cancelled"; const LEAVE = "leave"; const LEAVE_CANCELLED = "leave-cancelled"; const useTransitionFallthroughEmits = [ AFTER_APPEAR, AFTER_ENTER, AFTER_LEAVE, APPEAR, APPEAR_CANCELLED, BEFORE_ENTER, BEFORE_LEAVE, ENTER, ENTER_CANCELLED, LEAVE, LEAVE_CANCELLED ]; /** * NOTE: * This is only a delegator for delegating transition callbacks. * Use this at your need. */ /** * Simple usage * * In your setups: * * setup() { * const fallthroughMethods = useTransitionFallthrough() * return fallthrough * } * * In your template: * * * */ const useTransitionFallthrough = () => { const { emit } = getCurrentInstance(); return { onAfterAppear: () => { emit(AFTER_APPEAR); }, onAfterEnter: () => { emit(AFTER_ENTER); }, onAfterLeave: () => { emit(AFTER_LEAVE); }, onAppearCancelled: () => { emit(APPEAR_CANCELLED); }, onBeforeEnter: () => { emit(BEFORE_ENTER); }, onBeforeLeave: () => { emit(BEFORE_LEAVE); }, onEnter: () => { emit(ENTER); }, onEnterCancelled: () => { emit(ENTER_CANCELLED); }, onLeave: () => { emit(LEAVE); }, onLeaveCancelled: () => { emit(LEAVE_CANCELLED); } }; }; //#endregion //#region ../../packages/hooks/use-id/index.ts const defaultIdInjection = { prefix: Math.floor(Math.random() * 1e4), current: 0 }; const ID_INJECTION_KEY = Symbol("elIdInjection"); const useIdInjection = () => { return getCurrentInstance() ? inject(ID_INJECTION_KEY, defaultIdInjection) : defaultIdInjection; }; const useId = (deterministicId) => { const idInjection = useIdInjection(); if (!isClient && idInjection === defaultIdInjection) /* @__PURE__ */ debugWarn("IdInjection", `Looks like you are using server rendering, you must provide a id provider to ensure the hydration process to be succeed usage: app.provide(ID_INJECTION_KEY, { prefix: number, current: number, })`); const namespace = useGetDerivedNamespace(); return computedEager(() => unref(deterministicId) || `${namespace.value}-id-${idInjection.prefix}-${idInjection.current++}`); }; //#endregion //#region ../../packages/hooks/use-escape-keydown/index.ts let registeredEscapeHandlers = []; const cachedHandler = (event) => { if (getEventCode(event) === EVENT_CODE.esc) registeredEscapeHandlers.forEach((registeredHandler) => registeredHandler(event)); }; const useEscapeKeydown = (handler) => { onMounted(() => { if (registeredEscapeHandlers.length === 0) document.addEventListener("keydown", cachedHandler); if (isClient) registeredEscapeHandlers.push(handler); }); onBeforeUnmount(() => { registeredEscapeHandlers = registeredEscapeHandlers.filter((registeredHandler) => registeredHandler !== handler); if (registeredEscapeHandlers.length === 0) { if (isClient) document.removeEventListener("keydown", cachedHandler); } }); }; //#endregion //#region ../../packages/hooks/use-popper-container/index.ts const usePopperContainerId = () => { const namespace = useGetDerivedNamespace(); const idInjection = useIdInjection(); const id = computed(() => { return `${namespace.value}-popper-container-${idInjection.prefix}`; }); return { id, selector: computed(() => `#${id.value}`) }; }; const createContainer = (id) => { const container = document.createElement("div"); container.id = id; document.body.appendChild(container); return container; }; const usePopperContainer = () => { const { id, selector } = usePopperContainerId(); onBeforeMount(() => { if (!isClient) return; if (!document.body.querySelector(selector.value)) createContainer(id.value); }); return { id, selector }; }; //#endregion //#region ../../packages/hooks/use-intermediate-render/index.ts const useDelayedRender = ({ indicator, intermediateIndicator, shouldSetIntermediate = () => true, beforeShow, afterShow, afterHide, beforeHide }) => { watch(() => unref(indicator), (val) => { if (val) { beforeShow?.(); nextTick(() => { if (!unref(indicator)) return; if (shouldSetIntermediate("show")) intermediateIndicator.value = true; }); } else { beforeHide?.(); nextTick(() => { if (unref(indicator)) return; if (shouldSetIntermediate("hide")) intermediateIndicator.value = false; }); } }); watch(() => intermediateIndicator.value, (val) => { if (val) afterShow?.(); else afterHide?.(); }); }; //#endregion //#region ../../packages/hooks/use-delayed-toggle/index.ts /** * @deprecated Removed after 3.0.0, Use `UseDelayedToggleProps` instead. */ const useDelayedToggleProps = buildProps({ /** * @description delay of appearance, in millisecond, not valid in controlled mode */ showAfter: { type: Number, default: 0 }, /** * @description delay of disappear, in millisecond, not valid in controlled mode */ hideAfter: { type: Number, default: 200 }, /** * @description disappear automatically, in millisecond, not valid in controlled mode */ autoClose: { type: Number, default: 0 } }); const useDelayedTogglePropsDefaults = { showAfter: 0, hideAfter: 200, autoClose: 0 }; const useDelayedToggle = ({ showAfter, hideAfter, autoClose, open, close }) => { const { registerTimeout } = useTimeout(); const { registerTimeout: registerTimeoutForAutoClose, cancelTimeout: cancelTimeoutForAutoClose } = useTimeout(); const onOpen = (event, delay = unref(showAfter)) => { registerTimeout(() => { open(event); const _autoClose = unref(autoClose); if (isNumber(_autoClose) && _autoClose > 0) registerTimeoutForAutoClose(() => { close(event); }, _autoClose); }, delay); }; const onClose = (event, delay = unref(hideAfter)) => { cancelTimeoutForAutoClose(); registerTimeout(() => { close(event); }, delay); }; return { onOpen, onClose }; }; //#endregion //#region ../../packages/hooks/use-forward-ref/index.ts const FORWARD_REF_INJECTION_KEY = Symbol("elForwardRef"); const useForwardRef = (forwardRef) => { const setForwardRef = ((el) => { forwardRef.value = el; }); provide(FORWARD_REF_INJECTION_KEY, { setForwardRef }); }; const useForwardRefDirective = (setForwardRef) => { return { mounted(el) { setForwardRef(el); }, updated(el) { setForwardRef(el); }, unmounted() { setForwardRef(null); } }; }; //#endregion //#region ../../packages/hooks/use-z-index/index.ts const initial = { current: 0 }; const zIndex = ref(0); const defaultInitialZIndex = 2e3; const ZINDEX_INJECTION_KEY = Symbol("elZIndexContextKey"); const zIndexContextKey = Symbol("zIndexContextKey"); const useZIndex = (zIndexOverrides) => { const increasingInjection = getCurrentInstance() ? inject(ZINDEX_INJECTION_KEY, initial) : initial; const zIndexInjection = zIndexOverrides || (getCurrentInstance() ? inject(zIndexContextKey, void 0) : void 0); const initialZIndex = computed(() => { const zIndexFromInjection = unref(zIndexInjection); return isNumber(zIndexFromInjection) ? zIndexFromInjection : defaultInitialZIndex; }); const currentZIndex = computed(() => initialZIndex.value + zIndex.value); const nextZIndex = () => { increasingInjection.current++; zIndex.value = increasingInjection.current; return currentZIndex.value; }; if (!isClient && !inject(ZINDEX_INJECTION_KEY)) /* @__PURE__ */ debugWarn("ZIndexInjection", `Looks like you are using server rendering, you must provide a z-index provider to ensure the hydration process to be succeed usage: app.provide(ZINDEX_INJECTION_KEY, { current: 0 })`); return { initialZIndex, currentZIndex, nextZIndex }; }; //#endregion //#region ../../node_modules/.pnpm/@floating-ui+utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs const min$1 = Math.min; const max$1 = Math.max; const round = Math.round; const floor$1 = Math.floor; const createCoords = (v) => ({ x: v, y: v }); const oppositeSideMap = { left: "right", right: "left", bottom: "top", top: "bottom" }; const oppositeAlignmentMap = { start: "end", end: "start" }; function clamp(start, value, end) { return max$1(start, min$1(value, end)); } function evaluate(value, param) { return typeof value === "function" ? value(param) : value; } function getSide(placement) { return placement.split("-")[0]; } function getAlignment(placement) { return placement.split("-")[1]; } function getOppositeAxis(axis) { return axis === "x" ? "y" : "x"; } function getAxisLength(axis) { return axis === "y" ? "height" : "width"; } const yAxisSides = /* @__PURE__ */ new Set(["top", "bottom"]); function getSideAxis(placement) { return yAxisSides.has(getSide(placement)) ? "y" : "x"; } function getAlignmentAxis(placement) { return getOppositeAxis(getSideAxis(placement)); } function getAlignmentSides(placement, rects, rtl) { if (rtl === void 0) rtl = false; const alignment = getAlignment(placement); const alignmentAxis = getAlignmentAxis(placement); const length = getAxisLength(alignmentAxis); let mainAlignmentSide = alignmentAxis === "x" ? alignment === (rtl ? "end" : "start") ? "right" : "left" : alignment === "start" ? "bottom" : "top"; if (rects.reference[length] > rects.floating[length]) mainAlignmentSide = getOppositePlacement(mainAlignmentSide); return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)]; } function getExpandedPlacements(placement) { const oppositePlacement = getOppositePlacement(placement); return [ getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement) ]; } function getOppositeAlignmentPlacement(placement) { return placement.replace(/start|end/g, (alignment) => oppositeAlignmentMap[alignment]); } const lrPlacement = ["left", "right"]; const rlPlacement = ["right", "left"]; const tbPlacement = ["top", "bottom"]; const btPlacement = ["bottom", "top"]; function getSideList(side, isStart, rtl) { switch (side) { case "top": case "bottom": if (rtl) return isStart ? rlPlacement : lrPlacement; return isStart ? lrPlacement : rlPlacement; case "left": case "right": return isStart ? tbPlacement : btPlacement; default: return []; } } function getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) { const alignment = getAlignment(placement); let list = getSideList(getSide(placement), direction === "start", rtl); if (alignment) { list = list.map((side) => side + "-" + alignment); if (flipAlignment) list = list.concat(list.map(getOppositeAlignmentPlacement)); } return list; } function getOppositePlacement(placement) { return placement.replace(/left|right|bottom|top/g, (side) => oppositeSideMap[side]); } function expandPaddingObject(padding) { return { top: 0, right: 0, bottom: 0, left: 0, ...padding }; } function getPaddingObject(padding) { return typeof padding !== "number" ? expandPaddingObject(padding) : { top: padding, right: padding, bottom: padding, left: padding }; } function rectToClientRect(rect) { const { x, y, width, height } = rect; return { width, height, top: y, left: x, right: x + width, bottom: y + height, x, y }; } //#endregion //#region ../../node_modules/.pnpm/@floating-ui+core@1.7.3/node_modules/@floating-ui/core/dist/floating-ui.core.mjs function computeCoordsFromPlacement(_ref, placement, rtl) { let { reference, floating } = _ref; const sideAxis = getSideAxis(placement); const alignmentAxis = getAlignmentAxis(placement); const alignLength = getAxisLength(alignmentAxis); const side = getSide(placement); const isVertical = sideAxis === "y"; const commonX = reference.x + reference.width / 2 - floating.width / 2; const commonY = reference.y + reference.height / 2 - floating.height / 2; const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2; let coords; switch (side) { case "top": coords = { x: commonX, y: reference.y - floating.height }; break; case "bottom": coords = { x: commonX, y: reference.y + reference.height }; break; case "right": coords = { x: reference.x + reference.width, y: commonY }; break; case "left": coords = { x: reference.x - floating.width, y: commonY }; break; default: coords = { x: reference.x, y: reference.y }; } switch (getAlignment(placement)) { case "start": coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1); break; case "end": coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1); break; } return coords; } /** * Computes the `x` and `y` coordinates that will place the floating element * next to a given reference element. * * This export does not have any `platform` interface logic. You will need to * write one for the platform you are using Floating UI with. */ const computePosition$1 = async (reference, floating, config) => { const { placement = "bottom", strategy = "absolute", middleware = [], platform } = config; const validMiddleware = middleware.filter(Boolean); const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating)); let rects = await platform.getElementRects({ reference, floating, strategy }); let { x, y } = computeCoordsFromPlacement(rects, placement, rtl); let statefulPlacement = placement; let middlewareData = {}; let resetCount = 0; for (let i = 0; i < validMiddleware.length; i++) { const { name, fn } = validMiddleware[i]; const { x: nextX, y: nextY, data, reset } = await fn({ x, y, initialPlacement: placement, placement: statefulPlacement, strategy, middlewareData, rects, platform, elements: { reference, floating } }); x = nextX != null ? nextX : x; y = nextY != null ? nextY : y; middlewareData = { ...middlewareData, [name]: { ...middlewareData[name], ...data } }; if (reset && resetCount <= 50) { resetCount++; if (typeof reset === "object") { if (reset.placement) statefulPlacement = reset.placement; if (reset.rects) rects = reset.rects === true ? await platform.getElementRects({ reference, floating, strategy }) : reset.rects; ({x, y} = computeCoordsFromPlacement(rects, statefulPlacement, rtl)); } i = -1; } } return { x, y, placement: statefulPlacement, strategy, middlewareData }; }; /** * Resolves with an object of overflow side offsets that determine how much the * element is overflowing a given clipping boundary on each side. * - positive = overflowing the boundary by that number of pixels * - negative = how many pixels left before it will overflow * - 0 = lies flush with the boundary * @see https://floating-ui.com/docs/detectOverflow */ async function detectOverflow$1(state, options) { var _await$platform$isEle; if (options === void 0) options = {}; const { x, y, platform, rects, elements, strategy } = state; const { boundary = "clippingAncestors", rootBoundary = "viewport", elementContext = "floating", altBoundary = false, padding = 0 } = evaluate(options, state); const paddingObject = getPaddingObject(padding); const element = elements[altBoundary ? elementContext === "floating" ? "reference" : "floating" : elementContext]; const clippingClientRect = rectToClientRect(await platform.getClippingRect({ element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating)), boundary, rootBoundary, strategy })); const rect = elementContext === "floating" ? { x, y, width: rects.floating.width, height: rects.floating.height } : rects.reference; const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating)); const offsetScale = await (platform.isElement == null ? void 0 : platform.isElement(offsetParent)) ? await (platform.getScale == null ? void 0 : platform.getScale(offsetParent)) || { x: 1, y: 1 } : { x: 1, y: 1 }; const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({ elements, rect, offsetParent, strategy }) : rect); return { top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y, bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y, left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x, right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x }; } /** * Provides data to position an inner element of the floating element so that it * appears centered to the reference element. * @see https://floating-ui.com/docs/arrow */ const arrow$1 = (options) => ({ name: "arrow", options, async fn(state) { const { x, y, placement, rects, platform, elements, middlewareData } = state; const { element, padding = 0 } = evaluate(options, state) || {}; if (element == null) return {}; const paddingObject = getPaddingObject(padding); const coords = { x, y }; const axis = getAlignmentAxis(placement); const length = getAxisLength(axis); const arrowDimensions = await platform.getDimensions(element); const isYAxis = axis === "y"; const minProp = isYAxis ? "top" : "left"; const maxProp = isYAxis ? "bottom" : "right"; const clientProp = isYAxis ? "clientHeight" : "clientWidth"; const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length]; const startDiff = coords[axis] - rects.reference[axis]; const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element)); let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0; if (!clientSize || !await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent))) clientSize = elements.floating[clientProp] || rects.floating[length]; const centerToReference = endDiff / 2 - startDiff / 2; const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1; const minPadding = min$1(paddingObject[minProp], largestPossiblePadding); const maxPadding = min$1(paddingObject[maxProp], largestPossiblePadding); const min$1$1 = minPadding; const max = clientSize - arrowDimensions[length] - maxPadding; const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference; const offset = clamp(min$1$1, center, max); const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0; const alignmentOffset = shouldAddOffset ? center < min$1$1 ? center - min$1$1 : center - max : 0; return { [axis]: coords[axis] + alignmentOffset, data: { [axis]: offset, centerOffset: center - offset - alignmentOffset, ...shouldAddOffset && { alignmentOffset } }, reset: shouldAddOffset }; } }); /** * Optimizes the visibility of the floating element by flipping the `placement` * in order to keep it in view when the preferred placement(s) will overflow the * clipping boundary. Alternative to `autoPlacement`. * @see https://floating-ui.com/docs/flip */ const flip$1 = function(options) { if (options === void 0) options = {}; return { name: "flip", options, async fn(state) { var _middlewareData$arrow, _middlewareData$flip; const { placement, middlewareData, rects, initialPlacement, platform, elements } = state; const { mainAxis: checkMainAxis = true, crossAxis: checkCrossAxis = true, fallbackPlacements: specifiedFallbackPlacements, fallbackStrategy = "bestFit", fallbackAxisSideDirection = "none", flipAlignment = true, ...detectOverflowOptions } = evaluate(options, state); if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) return {}; const side = getSide(placement); const initialSideAxis = getSideAxis(initialPlacement); const isBasePlacement = getSide(initialPlacement) === initialPlacement; const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)); const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement)); const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== "none"; if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl)); const placements = [initialPlacement, ...fallbackPlacements]; const overflow = await detectOverflow$1(state, detectOverflowOptions); const overflows = []; let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || []; if (checkMainAxis) overflows.push(overflow[side]); if (checkCrossAxis) { const sides = getAlignmentSides(placement, rects, rtl); overflows.push(overflow[sides[0]], overflow[sides[1]]); } overflowsData = [...overflowsData, { placement, overflows }]; if (!overflows.every((side) => side <= 0)) { var _middlewareData$flip2, _overflowsData$filter; const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1; const nextPlacement = placements[nextIndex]; if (nextPlacement) { if (!(checkCrossAxis === "alignment" ? initialSideAxis !== getSideAxis(nextPlacement) : false) || overflowsData.every((d) => getSideAxis(d.placement) === initialSideAxis ? d.overflows[0] > 0 : true)) return { data: { index: nextIndex, overflows: overflowsData }, reset: { placement: nextPlacement } }; } let resetPlacement = (_overflowsData$filter = overflowsData.filter((d) => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement; if (!resetPlacement) switch (fallbackStrategy) { case "bestFit": { var _overflowsData$filter2; const placement = (_overflowsData$filter2 = overflowsData.filter((d) => { if (hasFallbackAxisSideDirection) { const currentSideAxis = getSideAxis(d.placement); return currentSideAxis === initialSideAxis || currentSideAxis === "y"; } return true; }).map((d) => [d.placement, d.overflows.filter((overflow) => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0]; if (placement) resetPlacement = placement; break; } case "initialPlacement": resetPlacement = initialPlacement; break; } if (placement !== resetPlacement) return { reset: { placement: resetPlacement } }; } return {}; } }; }; const originSides = /* @__PURE__ */ new Set(["left", "top"]); async function convertValueToCoords(state, options) { const { placement, platform, elements } = state; const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)); const side = getSide(placement); const alignment = getAlignment(placement); const isVertical = getSideAxis(placement) === "y"; const mainAxisMulti = originSides.has(side) ? -1 : 1; const crossAxisMulti = rtl && isVertical ? -1 : 1; const rawValue = evaluate(options, state); let { mainAxis, crossAxis, alignmentAxis } = typeof rawValue === "number" ? { mainAxis: rawValue, crossAxis: 0, alignmentAxis: null } : { mainAxis: rawValue.mainAxis || 0, crossAxis: rawValue.crossAxis || 0, alignmentAxis: rawValue.alignmentAxis }; if (alignment && typeof alignmentAxis === "number") crossAxis = alignment === "end" ? alignmentAxis * -1 : alignmentAxis; return isVertical ? { x: crossAxis * crossAxisMulti, y: mainAxis * mainAxisMulti } : { x: mainAxis * mainAxisMulti, y: crossAxis * crossAxisMulti }; } /** * Modifies the placement by translating the floating element along the * specified axes. * A number (shorthand for `mainAxis` or distance), or an axes configuration * object may be passed. * @see https://floating-ui.com/docs/offset */ const offset$1 = function(options) { if (options === void 0) options = 0; return { name: "offset", options, async fn(state) { var _middlewareData$offse, _middlewareData$arrow; const { x, y, placement, middlewareData } = state; const diffCoords = await convertValueToCoords(state, options); if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) return {}; return { x: x + diffCoords.x, y: y + diffCoords.y, data: { ...diffCoords, placement } }; } }; }; /** * Optimizes the visibility of the floating element by shifting it in order to * keep it in view when it will overflow the clipping boundary. * @see https://floating-ui.com/docs/shift */ const shift$1 = function(options) { if (options === void 0) options = {}; return { name: "shift", options, async fn(state) { const { x, y, placement } = state; const { mainAxis: checkMainAxis = true, crossAxis: checkCrossAxis = false, limiter = { fn: (_ref) => { let { x, y } = _ref; return { x, y }; } }, ...detectOverflowOptions } = evaluate(options, state); const coords = { x, y }; const overflow = await detectOverflow$1(state, detectOverflowOptions); const crossAxis = getSideAxis(getSide(placement)); const mainAxis = getOppositeAxis(crossAxis); let mainAxisCoord = coords[mainAxis]; let crossAxisCoord = coords[crossAxis]; if (checkMainAxis) { const minSide = mainAxis === "y" ? "top" : "left"; const maxSide = mainAxis === "y" ? "bottom" : "right"; const min = mainAxisCoord + overflow[minSide]; const max = mainAxisCoord - overflow[maxSide]; mainAxisCoord = clamp(min, mainAxisCoord, max); } if (checkCrossAxis) { const minSide = crossAxis === "y" ? "top" : "left"; const maxSide = crossAxis === "y" ? "bottom" : "right"; const min = crossAxisCoord + overflow[minSide]; const max = crossAxisCoord - overflow[maxSide]; crossAxisCoord = clamp(min, crossAxisCoord, max); } const limitedCoords = limiter.fn({ ...state, [mainAxis]: mainAxisCoord, [crossAxis]: crossAxisCoord }); return { ...limitedCoords, data: { x: limitedCoords.x - x, y: limitedCoords.y - y, enabled: { [mainAxis]: checkMainAxis, [crossAxis]: checkCrossAxis } } }; } }; }; //#endregion //#region ../../node_modules/.pnpm/@floating-ui+utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs function hasWindow() { return typeof window !== "undefined"; } function getNodeName(node) { if (isNode(node)) return (node.nodeName || "").toLowerCase(); return "#document"; } function getWindow(node) { var _node$ownerDocument; return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window; } function getDocumentElement(node) { var _ref; return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement; } function isNode(value) { if (!hasWindow()) return false; return value instanceof Node || value instanceof getWindow(value).Node; } function isElement(value) { if (!hasWindow()) return false; return value instanceof Element || value instanceof getWindow(value).Element; } function isHTMLElement(value) { if (!hasWindow()) return false; return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement; } function isShadowRoot(value) { if (!hasWindow() || typeof ShadowRoot === "undefined") return false; return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot; } const invalidOverflowDisplayValues = /* @__PURE__ */ new Set(["inline", "contents"]); function isOverflowElement(element) { const { overflow, overflowX, overflowY, display } = getComputedStyle$1(element); return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !invalidOverflowDisplayValues.has(display); } const tableElements = /* @__PURE__ */ new Set([ "table", "td", "th" ]); function isTableElement(element) { return tableElements.has(getNodeName(element)); } const topLayerSelectors = [":popover-open", ":modal"]; function isTopLayer(element) { return topLayerSelectors.some((selector) => { try { return element.matches(selector); } catch (_e) { return false; } }); } const transformProperties = [ "transform", "translate", "scale", "rotate", "perspective" ]; const willChangeValues = [ "transform", "translate", "scale", "rotate", "perspective", "filter" ]; const containValues = [ "paint", "layout", "strict", "content" ]; function isContainingBlock(elementOrCss) { const webkit = isWebKit(); const css = isElement(elementOrCss) ? getComputedStyle$1(elementOrCss) : elementOrCss; return transformProperties.some((value) => css[value] ? css[value] !== "none" : false) || (css.containerType ? css.containerType !== "normal" : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== "none" : false) || !webkit && (css.filter ? css.filter !== "none" : false) || willChangeValues.some((value) => (css.willChange || "").includes(value)) || containValues.some((value) => (css.contain || "").includes(value)); } function getContainingBlock(element) { let currentNode = getParentNode(element); while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) { if (isContainingBlock(currentNode)) return currentNode; else if (isTopLayer(currentNode)) return null; currentNode = getParentNode(currentNode); } return null; } function isWebKit() { if (typeof CSS === "undefined" || !CSS.supports) return false; return CSS.supports("-webkit-backdrop-filter", "none"); } const lastTraversableNodeNames = /* @__PURE__ */ new Set([ "html", "body", "#document" ]); function isLastTraversableNode(node) { return lastTraversableNodeNames.has(getNodeName(node)); } function getComputedStyle$1(element) { return getWindow(element).getComputedStyle(element); } function getNodeScroll(element) { if (isElement(element)) return { scrollLeft: element.scrollLeft, scrollTop: element.scrollTop }; return { scrollLeft: element.scrollX, scrollTop: element.scrollY }; } function getParentNode(node) { if (getNodeName(node) === "html") return node; const result = node.assignedSlot || node.parentNode || isShadowRoot(node) && node.host || getDocumentElement(node); return isShadowRoot(result) ? result.host : result; } function getNearestOverflowAncestor(node) { const parentNode = getParentNode(node); if (isLastTraversableNode(parentNode)) return node.ownerDocument ? node.ownerDocument.body : node.body; if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) return parentNode; return getNearestOverflowAncestor(parentNode); } function getOverflowAncestors(node, list, traverseIframes) { var _node$ownerDocument2; if (list === void 0) list = []; if (traverseIframes === void 0) traverseIframes = true; const scrollableAncestor = getNearestOverflowAncestor(node); const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body); const win = getWindow(scrollableAncestor); if (isBody) { const frameElement = getFrameElement(win); return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []); } return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes)); } function getFrameElement(win) { return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null; } //#endregion //#region ../../node_modules/.pnpm/@floating-ui+dom@1.7.4/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs function getCssDimensions(element) { const css = getComputedStyle$1(element); let width = parseFloat(css.width) || 0; let height = parseFloat(css.height) || 0; const hasOffset = isHTMLElement(element); const offsetWidth = hasOffset ? element.offsetWidth : width; const offsetHeight = hasOffset ? element.offsetHeight : height; const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight; if (shouldFallback) { width = offsetWidth; height = offsetHeight; } return { width, height, $: shouldFallback }; } function unwrapElement(element) { return !isElement(element) ? element.contextElement : element; } function getScale(element) { const domElement = unwrapElement(element); if (!isHTMLElement(domElement)) return createCoords(1); const rect = domElement.getBoundingClientRect(); const { width, height, $ } = getCssDimensions(domElement); let x = ($ ? round(rect.width) : rect.width) / width; let y = ($ ? round(rect.height) : rect.height) / height; if (!x || !Number.isFinite(x)) x = 1; if (!y || !Number.isFinite(y)) y = 1; return { x, y }; } const noOffsets = /* @__PURE__ */ createCoords(0); function getVisualOffsets(element) { const win = getWindow(element); if (!isWebKit() || !win.visualViewport) return noOffsets; return { x: win.visualViewport.offsetLeft, y: win.visualViewport.offsetTop }; } function shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) { if (isFixed === void 0) isFixed = false; if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) return false; return isFixed; } function getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) { if (includeScale === void 0) includeScale = false; if (isFixedStrategy === void 0) isFixedStrategy = false; const clientRect = element.getBoundingClientRect(); const domElement = unwrapElement(element); let scale = createCoords(1); if (includeScale) if (offsetParent) { if (isElement(offsetParent)) scale = getScale(offsetParent); } else scale = getScale(element); const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0); let x = (clientRect.left + visualOffsets.x) / scale.x; let y = (clientRect.top + visualOffsets.y) / scale.y; let width = clientRect.width / scale.x; let height = clientRect.height / scale.y; if (domElement) { const win = getWindow(domElement); const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent; let currentWin = win; let currentIFrame = getFrameElement(currentWin); while (currentIFrame && offsetParent && offsetWin !== currentWin) { const iframeScale = getScale(currentIFrame); const iframeRect = currentIFrame.getBoundingClientRect(); const css = getComputedStyle$1(currentIFrame); const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x; const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y; x *= iframeScale.x; y *= iframeScale.y; width *= iframeScale.x; height *= iframeScale.y; x += left; y += top; currentWin = getWindow(currentIFrame); currentIFrame = getFrameElement(currentWin); } } return rectToClientRect({ width, height, x, y }); } function getWindowScrollBarX(element, rect) { const leftScroll = getNodeScroll(element).scrollLeft; if (!rect) return getBoundingClientRect(getDocumentElement(element)).left + leftScroll; return rect.left + leftScroll; } function getHTMLOffset(documentElement, scroll) { const htmlRect = documentElement.getBoundingClientRect(); return { x: htmlRect.left + scroll.scrollLeft - getWindowScrollBarX(documentElement, htmlRect), y: htmlRect.top + scroll.scrollTop }; } function convertOffsetParentRelativeRectToViewportRelativeRect(_ref) { let { elements, rect, offsetParent, strategy } = _ref; const isFixed = strategy === "fixed"; const documentElement = getDocumentElement(offsetParent); const topLayer = elements ? isTopLayer(elements.floating) : false; if (offsetParent === documentElement || topLayer && isFixed) return rect; let scroll = { scrollLeft: 0, scrollTop: 0 }; let scale = createCoords(1); const offsets = createCoords(0); const isOffsetParentAnElement = isHTMLElement(offsetParent); if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { if (getNodeName(offsetParent) !== "body" || isOverflowElement(documentElement)) scroll = getNodeScroll(offsetParent); if (isHTMLElement(offsetParent)) { const offsetRect = getBoundingClientRect(offsetParent); scale = getScale(offsetParent); offsets.x = offsetRect.x + offsetParent.clientLeft; offsets.y = offsetRect.y + offsetParent.clientTop; } } const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0); return { width: rect.width * scale.x, height: rect.height * scale.y, x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x, y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y }; } function getClientRects(element) { return Array.from(element.getClientRects()); } function getDocumentRect(element) { const html = getDocumentElement(element); const scroll = getNodeScroll(element); const body = element.ownerDocument.body; const width = max$1(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth); const height = max$1(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight); let x = -scroll.scrollLeft + getWindowScrollBarX(element); const y = -scroll.scrollTop; if (getComputedStyle$1(body).direction === "rtl") x += max$1(html.clientWidth, body.clientWidth) - width; return { width, height, x, y }; } const SCROLLBAR_MAX = 25; function getViewportRect(element, strategy) { const win = getWindow(element); const html = getDocumentElement(element); const visualViewport = win.visualViewport; let width = html.clientWidth; let height = html.clientHeight; let x = 0; let y = 0; if (visualViewport) { width = visualViewport.width; height = visualViewport.height; const visualViewportBased = isWebKit(); if (!visualViewportBased || visualViewportBased && strategy === "fixed") { x = visualViewport.offsetLeft; y = visualViewport.offsetTop; } } const windowScrollbarX = getWindowScrollBarX(html); if (windowScrollbarX <= 0) { const doc = html.ownerDocument; const body = doc.body; const bodyStyles = getComputedStyle(body); const bodyMarginInline = doc.compatMode === "CSS1Compat" ? parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight) || 0 : 0; const clippingStableScrollbarWidth = Math.abs(html.clientWidth - body.clientWidth - bodyMarginInline); if (clippingStableScrollbarWidth <= SCROLLBAR_MAX) width -= clippingStableScrollbarWidth; } else if (windowScrollbarX <= SCROLLBAR_MAX) width += windowScrollbarX; return { width, height, x, y }; } const absoluteOrFixed = /* @__PURE__ */ new Set(["absolute", "fixed"]); function getInnerBoundingClientRect(element, strategy) { const clientRect = getBoundingClientRect(element, true, strategy === "fixed"); const top = clientRect.top + element.clientTop; const left = clientRect.left + element.clientLeft; const scale = isHTMLElement(element) ? getScale(element) : createCoords(1); return { width: element.clientWidth * scale.x, height: element.clientHeight * scale.y, x: left * scale.x, y: top * scale.y }; } function getClientRectFromClippingAncestor(element, clippingAncestor, strategy) { let rect; if (clippingAncestor === "viewport") rect = getViewportRect(element, strategy); else if (clippingAncestor === "document") rect = getDocumentRect(getDocumentElement(element)); else if (isElement(clippingAncestor)) rect = getInnerBoundingClientRect(clippingAncestor, strategy); else { const visualOffsets = getVisualOffsets(element); rect = { x: clippingAncestor.x - visualOffsets.x, y: clippingAncestor.y - visualOffsets.y, width: clippingAncestor.width, height: clippingAncestor.height }; } return rectToClientRect(rect); } function hasFixedPositionAncestor(element, stopNode) { const parentNode = getParentNode(element); if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) return false; return getComputedStyle$1(parentNode).position === "fixed" || hasFixedPositionAncestor(parentNode, stopNode); } function getClippingElementAncestors(element, cache) { const cachedResult = cache.get(element); if (cachedResult) return cachedResult; let result = getOverflowAncestors(element, [], false).filter((el) => isElement(el) && getNodeName(el) !== "body"); let currentContainingBlockComputedStyle = null; const elementIsFixed = getComputedStyle$1(element).position === "fixed"; let currentNode = elementIsFixed ? getParentNode(element) : element; while (isElement(currentNode) && !isLastTraversableNode(currentNode)) { const computedStyle = getComputedStyle$1(currentNode); const currentNodeIsContaining = isContainingBlock(currentNode); if (!currentNodeIsContaining && computedStyle.position === "fixed") currentContainingBlockComputedStyle = null; if (elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === "static" && !!currentContainingBlockComputedStyle && absoluteOrFixed.has(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode)) result = result.filter((ancestor) => ancestor !== currentNode); else currentContainingBlockComputedStyle = computedStyle; currentNode = getParentNode(currentNode); } cache.set(element, result); return result; } function getClippingRect(_ref) { let { element, boundary, rootBoundary, strategy } = _ref; const clippingAncestors = [...boundary === "clippingAncestors" ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary), rootBoundary]; const firstClippingAncestor = clippingAncestors[0]; const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => { const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy); accRect.top = max$1(rect.top, accRect.top); accRect.right = min$1(rect.right, accRect.right); accRect.bottom = min$1(rect.bottom, accRect.bottom); accRect.left = max$1(rect.left, accRect.left); return accRect; }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy)); return { width: clippingRect.right - clippingRect.left, height: clippingRect.bottom - clippingRect.top, x: clippingRect.left, y: clippingRect.top }; } function getDimensions(element) { const { width, height } = getCssDimensions(element); return { width, height }; } function getRectRelativeToOffsetParent(element, offsetParent, strategy) { const isOffsetParentAnElement = isHTMLElement(offsetParent); const documentElement = getDocumentElement(offsetParent); const isFixed = strategy === "fixed"; const rect = getBoundingClientRect(element, true, isFixed, offsetParent); let scroll = { scrollLeft: 0, scrollTop: 0 }; const offsets = createCoords(0); function setLeftRTLScrollbarOffset() { offsets.x = getWindowScrollBarX(documentElement); } if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { if (getNodeName(offsetParent) !== "body" || isOverflowElement(documentElement)) scroll = getNodeScroll(offsetParent); if (isOffsetParentAnElement) { const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent); offsets.x = offsetRect.x + offsetParent.clientLeft; offsets.y = offsetRect.y + offsetParent.clientTop; } else if (documentElement) setLeftRTLScrollbarOffset(); } if (isFixed && !isOffsetParentAnElement && documentElement) setLeftRTLScrollbarOffset(); const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0); return { x: rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x, y: rect.top + scroll.scrollTop - offsets.y - htmlOffset.y, width: rect.width, height: rect.height }; } function isStaticPositioned(element) { return getComputedStyle$1(element).position === "static"; } function getTrueOffsetParent(element, polyfill) { if (!isHTMLElement(element) || getComputedStyle$1(element).position === "fixed") return null; if (polyfill) return polyfill(element); let rawOffsetParent = element.offsetParent; if (getDocumentElement(element) === rawOffsetParent) rawOffsetParent = rawOffsetParent.ownerDocument.body; return rawOffsetParent; } function getOffsetParent(element, polyfill) { const win = getWindow(element); if (isTopLayer(element)) return win; if (!isHTMLElement(element)) { let svgOffsetParent = getParentNode(element); while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) { if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) return svgOffsetParent; svgOffsetParent = getParentNode(svgOffsetParent); } return win; } let offsetParent = getTrueOffsetParent(element, polyfill); while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) offsetParent = getTrueOffsetParent(offsetParent, polyfill); if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) return win; return offsetParent || getContainingBlock(element) || win; } const getElementRects = async function(data) { const getOffsetParentFn = this.getOffsetParent || getOffsetParent; const getDimensionsFn = this.getDimensions; const floatingDimensions = await getDimensionsFn(data.floating); return { reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy), floating: { x: 0, y: 0, width: floatingDimensions.width, height: floatingDimensions.height } }; }; function isRTL$1(element) { return getComputedStyle$1(element).direction === "rtl"; } const platform = { convertOffsetParentRelativeRectToViewportRelativeRect, getDocumentElement, getClippingRect, getOffsetParent, getElementRects, getClientRects, getDimensions, getScale, isElement, isRTL: isRTL$1 }; function rectsAreEqual(a, b) { return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height; } function observeMove(element, onMove) { let io = null; let timeoutId; const root = getDocumentElement(element); function cleanup() { var _io; clearTimeout(timeoutId); (_io = io) == null || _io.disconnect(); io = null; } function refresh(skip, threshold) { if (skip === void 0) skip = false; if (threshold === void 0) threshold = 1; cleanup(); const elementRectForRootMargin = element.getBoundingClientRect(); const { left, top, width, height } = elementRectForRootMargin; if (!skip) onMove(); if (!width || !height) return; const insetTop = floor$1(top); const insetRight = floor$1(root.clientWidth - (left + width)); const insetBottom = floor$1(root.clientHeight - (top + height)); const insetLeft = floor$1(left); const options = { rootMargin: -insetTop + "px " + -insetRight + "px " + -insetBottom + "px " + -insetLeft + "px", threshold: max$1(0, min$1(1, threshold)) || 1 }; let isFirstUpdate = true; function handleObserve(entries) { const ratio = entries[0].intersectionRatio; if (ratio !== threshold) { if (!isFirstUpdate) return refresh(); if (!ratio) timeoutId = setTimeout(() => { refresh(false, 1e-7); }, 1e3); else refresh(false, ratio); } if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) refresh(); isFirstUpdate = false; } try { io = new IntersectionObserver(handleObserve, { ...options, root: root.ownerDocument }); } catch (_e) { io = new IntersectionObserver(handleObserve, options); } io.observe(element); } refresh(true); return cleanup; } /** * Automatically updates the position of the floating element when necessary. * Should only be called when the floating element is mounted on the DOM or * visible on the screen. * @returns cleanup function that should be invoked when the floating element is * removed from the DOM or hidden from the screen. * @see https://floating-ui.com/docs/autoUpdate */ function autoUpdate(reference, floating, update, options) { if (options === void 0) options = {}; const { ancestorScroll = true, ancestorResize = true, elementResize = typeof ResizeObserver === "function", layoutShift = typeof IntersectionObserver === "function", animationFrame = false } = options; const referenceEl = unwrapElement(reference); const ancestors = ancestorScroll || ancestorResize ? [...referenceEl ? getOverflowAncestors(referenceEl) : [], ...getOverflowAncestors(floating)] : []; ancestors.forEach((ancestor) => { ancestorScroll && ancestor.addEventListener("scroll", update, { passive: true }); ancestorResize && ancestor.addEventListener("resize", update); }); const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null; let reobserveFrame = -1; let resizeObserver = null; if (elementResize) { resizeObserver = new ResizeObserver((_ref) => { let [firstEntry] = _ref; if (firstEntry && firstEntry.target === referenceEl && resizeObserver) { resizeObserver.unobserve(floating); cancelAnimationFrame(reobserveFrame); reobserveFrame = requestAnimationFrame(() => { var _resizeObserver; (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating); }); } update(); }); if (referenceEl && !animationFrame) resizeObserver.observe(referenceEl); resizeObserver.observe(floating); } let frameId; let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null; if (animationFrame) frameLoop(); function frameLoop() { const nextRefRect = getBoundingClientRect(reference); if (prevRefRect && !rectsAreEqual(prevRefRect, nextRefRect)) update(); prevRefRect = nextRefRect; frameId = requestAnimationFrame(frameLoop); } update(); return () => { var _resizeObserver2; ancestors.forEach((ancestor) => { ancestorScroll && ancestor.removeEventListener("scroll", update); ancestorResize && ancestor.removeEventListener("resize", update); }); cleanupIo?.(); (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect(); resizeObserver = null; if (animationFrame) cancelAnimationFrame(frameId); }; } /** * Resolves with an object of overflow side offsets that determine how much the * element is overflowing a given clipping boundary on each side. * - positive = overflowing the boundary by that number of pixels * - negative = how many pixels left before it will overflow * - 0 = lies flush with the boundary * @see https://floating-ui.com/docs/detectOverflow */ const detectOverflow = detectOverflow$1; /** * Modifies the placement by translating the floating element along the * specified axes. * A number (shorthand for `mainAxis` or distance), or an axes configuration * object may be passed. * @see https://floating-ui.com/docs/offset */ const offset = offset$1; /** * Optimizes the visibility of the floating element by shifting it in order to * keep it in view when it will overflow the clipping boundary. * @see https://floating-ui.com/docs/shift */ const shift = shift$1; /** * Optimizes the visibility of the floating element by flipping the `placement` * in order to keep it in view when the preferred placement(s) will overflow the * clipping boundary. Alternative to `autoPlacement`. * @see https://floating-ui.com/docs/flip */ const flip = flip$1; /** * Provides data to position an inner element of the floating element so that it * appears centered to the reference element. * @see https://floating-ui.com/docs/arrow */ const arrow = arrow$1; /** * Computes the `x` and `y` coordinates that will place the floating element * next to a given reference element. */ const computePosition = (reference, floating, options) => { const cache = /* @__PURE__ */ new Map(); const mergedOptions = { platform, ...options }; const platformWithCache = { ...mergedOptions.platform, _c: cache }; return computePosition$1(reference, floating, { ...mergedOptions, platform: platformWithCache }); }; //#endregion //#region ../../packages/hooks/use-floating/index.ts const useFloatingProps = buildProps({}); const unrefReference = (elRef) => { if (!isClient) return; if (!elRef) return elRef; const unrefEl = unrefElement(elRef); if (unrefEl) return unrefEl; return isRef(elRef) ? unrefEl : elRef; }; const getPositionDataWithUnit = (record, key) => { const value = record?.[key]; return isNil(value) ? "" : `${value}px`; }; const useFloating = ({ middleware, placement, strategy }) => { const referenceRef = ref(); const contentRef = ref(); const states = { x: ref(), y: ref(), placement, strategy, middlewareData: ref({}) }; const update = async () => { if (!isClient) return; const referenceEl = unrefReference(referenceRef); const contentEl = unrefElement(contentRef); if (!referenceEl || !contentEl) return; const data = await computePosition(referenceEl, contentEl, { placement: unref(placement), strategy: unref(strategy), middleware: unref(middleware) }); keysOf(states).forEach((key) => { states[key].value = data[key]; }); }; onMounted(() => { watchEffect(() => { update(); }); }); return { ...states, update, referenceRef, contentRef }; }; const arrowMiddleware = ({ arrowRef, padding }) => { return { name: "arrow", options: { element: arrowRef, padding }, fn(args) { const arrowEl = unref(arrowRef); if (!arrowEl) return {}; return arrow({ element: arrowEl, padding }).fn(args); } }; }; //#endregion //#region ../../packages/hooks/use-cursor/index.ts function useCursor(input) { let selectionInfo; function recordCursor() { if (input.value == void 0) return; const { selectionStart, selectionEnd, value } = input.value; if (selectionStart == null || selectionEnd == null) return; selectionInfo = { selectionStart, selectionEnd, value, beforeTxt: value.slice(0, Math.max(0, selectionStart)), afterTxt: value.slice(Math.max(0, selectionEnd)) }; } function setCursor() { if (input.value == void 0 || selectionInfo == void 0) return; const { value } = input.value; const { beforeTxt, afterTxt, selectionStart } = selectionInfo; if (beforeTxt == void 0 || afterTxt == void 0 || selectionStart == void 0) return; let startPos = value.length; if (value.endsWith(afterTxt)) startPos = value.length - afterTxt.length; else if (value.startsWith(beforeTxt)) startPos = beforeTxt.length; else { const beforeLastChar = beforeTxt[selectionStart - 1]; const newIndex = value.indexOf(beforeLastChar, selectionStart - 1); if (newIndex !== -1) startPos = newIndex + 1; } input.value.setSelectionRange(startPos, startPos); } return [recordCursor, setCursor]; } //#endregion //#region ../../packages/hooks/use-ordered-children/index.ts const getOrderedChildren = (vm, childComponentName, children) => { return flattedChildren(vm.subTree).filter((n) => isVNode(n) && n.type?.name === childComponentName && !!n.component).map((n) => n.component.uid).map((uid) => children[uid]).filter((p) => !!p); }; const useOrderedChildren = (vm, childComponentName) => { const children = shallowRef({}); const orderedChildren = shallowRef([]); const nodesMap = /* @__PURE__ */ new WeakMap(); const addChild = (child) => { children.value[child.uid] = child; triggerRef(children); onMounted(() => { const childNode = child.getVnode().el; const parentNode = childNode.parentNode; if (!nodesMap.has(parentNode)) { nodesMap.set(parentNode, []); const originalFn = parentNode.insertBefore.bind(parentNode); parentNode.insertBefore = (node, anchor) => { if (nodesMap.get(parentNode).some((el) => node === el || anchor === el)) triggerRef(children); return originalFn(node, anchor); }; } nodesMap.get(parentNode).push(childNode); }); }; const removeChild = (child) => { delete children.value[child.uid]; triggerRef(children); const childNode = child.getVnode().el; const parentNode = childNode.parentNode; const childNodes = nodesMap.get(parentNode); const index = childNodes.indexOf(childNode); childNodes.splice(index, 1); }; const sortChildren = () => { orderedChildren.value = getOrderedChildren(vm, childComponentName, children.value); }; const IsolatedRenderer = (props) => { return props.render(); }; return { children: orderedChildren, addChild, removeChild, ChildrenSorter: defineComponent({ setup(_, { slots }) { return () => { sortChildren(); return slots.default ? h(IsolatedRenderer, { render: slots.default }) : null; }; } }) }; }; //#endregion //#region ../../packages/hooks/use-size/index.ts const useSizeProp = buildProp({ type: String, values: componentSizes, required: false }); const useSizeProps = { size: useSizeProp }; const SIZE_INJECTION_KEY = Symbol("size"); const useGlobalSize = () => { const injectedSize = inject(SIZE_INJECTION_KEY, {}); return computed(() => { return unref(injectedSize.size) || ""; }); }; //#endregion //#region ../../packages/hooks/use-focus-controller/index.ts function useFocusController(target, { disabled, beforeFocus, afterFocus, beforeBlur, afterBlur } = {}) { const { emit } = getCurrentInstance(); const wrapperRef = shallowRef(); const isFocused = ref(false); const handleFocus = (event) => { const cancelFocus = isFunction$1(beforeFocus) ? beforeFocus(event) : false; if (unref(disabled) || isFocused.value || cancelFocus) return; isFocused.value = true; emit("focus", event); afterFocus?.(); }; const handleBlur = (event) => { const cancelBlur = isFunction$1(beforeBlur) ? beforeBlur(event) : false; if (unref(disabled) || event.relatedTarget && wrapperRef.value?.contains(event.relatedTarget) || cancelBlur) return; isFocused.value = false; emit("blur", event); afterBlur?.(); }; const handleClick = (event) => { if (unref(disabled) || isFocusable(event.target) || wrapperRef.value?.contains(document.activeElement) && wrapperRef.value !== document.activeElement) return; target.value?.focus(); }; watch([wrapperRef, () => unref(disabled)], ([el, disabled]) => { if (!el) return; if (disabled) el.removeAttribute("tabindex"); else el.setAttribute("tabindex", "-1"); }); useEventListener(wrapperRef, "focus", handleFocus, true); useEventListener(wrapperRef, "blur", handleBlur, true); useEventListener(wrapperRef, "click", handleClick, true); return { isFocused, /** Avoid using wrapperRef and handleFocus/handleBlur together */ wrapperRef, handleFocus, handleBlur }; } //#endregion //#region ../../packages/hooks/use-composition/index.ts function useComposition({ afterComposition, emit }) { const isComposing = ref(false); const handleCompositionStart = (event) => { emit?.("compositionstart", event); isComposing.value = true; }; const handleCompositionUpdate = (event) => { emit?.("compositionupdate", event); isComposing.value = true; }; const handleCompositionEnd = (event) => { emit?.("compositionend", event); if (isComposing.value) { isComposing.value = false; nextTick(() => afterComposition(event)); } }; const handleComposition = (event) => { event.type === "compositionend" ? handleCompositionEnd(event) : handleCompositionUpdate(event); }; return { isComposing, handleComposition, handleCompositionStart, handleCompositionUpdate, handleCompositionEnd }; } //#endregion //#region ../../packages/hooks/use-empty-values/index.ts const emptyValuesContextKey = Symbol("emptyValuesContextKey"); const SCOPE = "use-empty-values"; const DEFAULT_EMPTY_VALUES = [ "", void 0, null ]; const DEFAULT_VALUE_ON_CLEAR = void 0; /** * @deprecated Removed after 3.0.0, Use `UseEmptyValuesProps` instead. */ const useEmptyValuesProps = buildProps({ /** * @description empty values supported by the component */ emptyValues: Array, /** * @description return value when cleared, if you want to set `undefined`, use `() => undefined` */ valueOnClear: { type: definePropType([ String, Number, Boolean, Function ]), default: void 0, validator: (val) => { val = isFunction$1(val) ? val() : val; if (isArray$1(val)) return val.every((item) => !item); return !val; } } }); const useEmptyValues = (props, defaultValue) => { const config = getCurrentInstance() ? inject(emptyValuesContextKey, ref({})) : ref({}); const emptyValues = computed(() => props.emptyValues || config.value.emptyValues || DEFAULT_EMPTY_VALUES); const valueOnClear = computed(() => { if (isFunction$1(props.valueOnClear)) return props.valueOnClear(); else if (props.valueOnClear !== void 0) return props.valueOnClear; else if (isFunction$1(config.value.valueOnClear)) return config.value.valueOnClear(); else if (config.value.valueOnClear !== void 0) return config.value.valueOnClear; return defaultValue !== void 0 ? defaultValue : void 0; }); const isEmptyValue = (value) => { let result = true; if (isArray$1(value)) result = emptyValues.value.some((emptyValue) => { return isEqual$1(value, emptyValue); }); else result = emptyValues.value.includes(value); return result; }; if (!isEmptyValue(valueOnClear.value)) /* @__PURE__ */ debugWarn(SCOPE, "value-on-clear should be a value of empty-values"); return { emptyValues, valueOnClear, isEmptyValue }; }; //#endregion //#region ../../packages/hooks/use-aria/index.ts /** * @deprecated Removed after 3.0.0, Use `AriaProps` instead. */ const ariaProps = buildProps({ /** * @description native `aria-label` attribute */ ariaLabel: String, /** * @description native `aria-orientation` attribute */ ariaOrientation: { type: String, values: [ "horizontal", "vertical", "undefined" ] }, /** * @description native `aria-controls` attribute */ ariaControls: String }); const useAriaProps = (arias) => { return pick(ariaProps, arias); }; //#endregion //#region ../../packages/components/config-provider/src/constants.ts const configProviderContextKey = Symbol(); //#endregion //#region ../../packages/components/config-provider/src/hooks/use-global-config.ts const globalConfig = ref(); function useGlobalConfig(key, defaultValue = void 0) { const config = getCurrentInstance() ? inject(configProviderContextKey, globalConfig) : globalConfig; if (key) return computed(() => config.value?.[key] ?? defaultValue); else return config; } function useGlobalComponentSettings(block, sizeFallback) { const config = useGlobalConfig(); const ns = useNamespace(block, computed(() => config.value?.namespace || "el")); const locale = useLocale(computed(() => config.value?.locale)); const zIndex = useZIndex(computed(() => config.value?.zIndex || 2e3)); const size = computed(() => unref(sizeFallback) || config.value?.size || ""); provideGlobalConfig(computed(() => unref(config) || {})); return { ns, locale, zIndex, size }; } const provideGlobalConfig = (config, app, global = false) => { const inSetup = !!getCurrentInstance(); const oldConfig = inSetup ? useGlobalConfig() : void 0; const provideFn = app?.provide ?? (inSetup ? provide : void 0); if (!provideFn) { /* @__PURE__ */ debugWarn("provideGlobalConfig", "provideGlobalConfig() can only be used inside setup()."); return; } const context = computed(() => { const cfg = unref(config); if (!oldConfig?.value) return cfg; return mergeConfig(oldConfig.value, cfg); }); provideFn(configProviderContextKey, context); provideFn(localeContextKey, computed(() => context.value.locale)); provideFn(namespaceContextKey, computed(() => context.value.namespace)); provideFn(zIndexContextKey, computed(() => context.value.zIndex)); provideFn(SIZE_INJECTION_KEY, { size: computed(() => context.value.size || "") }); provideFn(emptyValuesContextKey, computed(() => ({ emptyValues: context.value.emptyValues, valueOnClear: context.value.valueOnClear }))); if (global || !globalConfig.value) globalConfig.value = context.value; return context; }; const mergeConfig = (a, b) => { const keys = [...new Set([...keysOf(a), ...keysOf(b)])]; const obj = {}; for (const key of keys) obj[key] = b[key] !== void 0 ? b[key] : a[key]; return obj; }; //#endregion //#region ../../packages/components/config-provider/src/config-provider-props.ts const configProviderProps = buildProps({ /** * @description Controlling if the users want a11y features */ a11y: { type: Boolean, default: true }, /** * @description Locale Object */ locale: { type: definePropType(Object) }, /** * @description global component size */ size: useSizeProp, /** * @description button related configuration, [see the following table](https://element-plus.org/en-US/component/config-provider.html#button-attribute) */ button: { type: definePropType(Object) }, /** * @description card related configuration, [see the following table](https://element-plus.org/en-US/component/config-provider.html#card-attribute) */ card: { type: definePropType(Object) }, /** * @description dialog related configuration, [see the following table](https://element-plus.org/en-US/component/config-provider.html#dialog-attribute) */ dialog: { type: definePropType(Object) }, /** * @description link related configuration, [see the following table](https://element-plus.org/en-US/component/config-provider.html#link-attribute) */ link: { type: definePropType(Object) }, /** * @description features at experimental stage to be added, all features are default to be set to false, [see the following table](https://element-plus.org/en-US/component/config-provider.html#experimental-features) | ^[object] */ experimentalFeatures: { type: definePropType(Object) }, /** * @description Controls if we should handle keyboard navigation */ keyboardNavigation: { type: Boolean, default: true }, /** * @description message related configuration, [see the following table](https://element-plus.org/en-US/component/config-provider.html#message-attribute) */ message: { type: definePropType(Object) }, /** * @description global Initial zIndex */ zIndex: Number, /** * @description global component className prefix (cooperated with [$namespace](https://github.com/element-plus/element-plus/blob/dev/packages/theme-chalk/src/mixins/config.scss#L1)) | ^[string] */ namespace: { type: String, default: "el" }, /** * @description table related configuration, [see the following table](https://element-plus.org/en-US/component/config-provider.html#table-attribute) */ table: { type: definePropType(Object) }, ...useEmptyValuesProps }); //#endregion //#region ../../packages/components/config-provider/src/config-provider.ts const messageConfig = { placement: "top" }; const ConfigProvider = defineComponent({ name: "ElConfigProvider", props: configProviderProps, setup(props, { slots }) { const config = provideGlobalConfig(props); watch(() => props.message, (val) => { Object.assign(messageConfig, config?.value?.message ?? {}, val ?? {}); }, { immediate: true, deep: true }); return () => renderSlot(slots, "default", { config: config?.value }); } }); //#endregion //#region ../../packages/components/config-provider/index.ts const ElConfigProvider = withInstall(ConfigProvider); //#endregion //#region ../../packages/element-plus/version.ts const version$1 = "2.14.0"; //#endregion //#region ../../packages/element-plus/make-installer.ts const makeInstaller = (components = []) => { const install = (app, options) => { if (app[INSTALLED_KEY]) return; app[INSTALLED_KEY] = true; components.forEach((c) => app.use(c)); if (options) provideGlobalConfig(options, app, true); }; return { version: version$1, install }; }; //#endregion //#region ../../packages/components/affix/src/affix.ts /** * @deprecated Removed after 3.0.0, Use `AffixProps` instead. */ const affixProps = buildProps({ /** * @description affix element zIndex value * */ zIndex: { type: definePropType([Number, String]), default: 100 }, /** * @description target container. (CSS selector) */ target: { type: String, default: "" }, /** * @description offset distance * */ offset: { type: Number, default: 0 }, /** * @description position of affix * */ position: { type: String, values: ["top", "bottom"], default: "top" }, /** * @description whether affix element is teleported, if `true` it will be teleported to where `append-to` sets * */ teleported: Boolean, /** * @description which element the affix element appends to * */ appendTo: { type: definePropType([String, Object]), default: "body" } }); const affixEmits = { scroll: ({ scrollTop, fixed }) => isNumber(scrollTop) && isBoolean(fixed), [CHANGE_EVENT]: (fixed) => isBoolean(fixed) }; //#endregion //#region ../../packages/components/affix/src/affix.vue?vue&type=script&setup=true&lang.ts const COMPONENT_NAME$22 = "ElAffix"; var affix_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: COMPONENT_NAME$22, __name: "affix", props: affixProps, emits: affixEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const ns = useNamespace("affix"); const target = shallowRef(); const root = shallowRef(); const scrollContainer = shallowRef(); const { height: windowHeight } = useWindowSize(); const { height: rootHeight, width: rootWidth, top: rootTop, bottom: rootBottom, left: rootLeft, update: updateRoot } = useElementBounding(root, { windowScroll: false }); const targetRect = useElementBounding(target); const fixed = ref(false); const scrollTop = ref(0); const transform = ref(0); const teleportDisabled = computed(() => { return !props.teleported || !fixed.value; }); const rootStyle = computed(() => { return { display: "flow-root", height: fixed.value ? `${rootHeight.value}px` : "", width: fixed.value ? `${rootWidth.value}px` : "" }; }); const affixStyle = computed(() => { if (!fixed.value) return {}; const offset = addUnit(props.offset); return { height: `${rootHeight.value}px`, width: `${rootWidth.value}px`, top: props.position === "top" ? offset : "", bottom: props.position === "bottom" ? offset : "", left: props.teleported ? `${rootLeft.value}px` : "", transform: transform.value ? `translateY(${transform.value}px)` : "", zIndex: props.zIndex }; }); const update = () => { if (!scrollContainer.value) return; scrollTop.value = scrollContainer.value instanceof Window ? document.documentElement.scrollTop : scrollContainer.value.scrollTop || 0; const { position, target, offset } = props; const rootHeightOffset = offset + rootHeight.value; if (position === "top") if (target) { const difference = targetRect.bottom.value - rootHeightOffset; fixed.value = offset > rootTop.value && targetRect.bottom.value > 0; transform.value = difference < 0 ? difference : 0; } else fixed.value = offset > rootTop.value; else if (target) { const difference = windowHeight.value - targetRect.top.value - rootHeightOffset; fixed.value = windowHeight.value - offset < rootBottom.value && windowHeight.value > targetRect.top.value; transform.value = difference < 0 ? -difference : 0; } else fixed.value = windowHeight.value - offset < rootBottom.value; }; const updateRootRect = async () => { if (!fixed.value) { updateRoot(); return; } fixed.value = false; await nextTick(); updateRoot(); fixed.value = true; }; const handleScroll = async () => { updateRoot(); await nextTick(); emit("scroll", { scrollTop: scrollTop.value, fixed: fixed.value }); }; watch(fixed, (val) => emit(CHANGE_EVENT, val)); onMounted(() => { if (props.target) { target.value = document.querySelector(props.target) ?? void 0; if (!target.value) throwError(COMPONENT_NAME$22, `Target does not exist: ${props.target}`); } else target.value = document.documentElement; scrollContainer.value = getScrollContainer(root.value, true); updateRoot(); }); onActivated(() => { nextTick(updateRootRect); }); onDeactivated(() => { fixed.value = false; }); useEventListener(scrollContainer, "scroll", handleScroll); watchEffect(update); __expose({ /** @description update affix status */ update, /** @description update rootRect info */ updateRoot: updateRootRect }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { ref_key: "root", ref: root, class: normalizeClass(unref(ns).b()), style: normalizeStyle(rootStyle.value) }, [(openBlock(), createBlock(Teleport, { disabled: teleportDisabled.value, to: __props.appendTo }, [createElementVNode("div", { class: normalizeClass({ [unref(ns).m("fixed")]: fixed.value }), style: normalizeStyle(affixStyle.value) }, [renderSlot(_ctx.$slots, "default")], 6)], 8, ["disabled", "to"]))], 6); }; } }); //#endregion //#region ../../packages/components/affix/src/affix.vue var affix_default = affix_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/affix/index.ts const ElAffix = withInstall(affix_default); //#endregion //#region ../../packages/components/alert/src/alert.ts const alertEffects = ["light", "dark"]; /** * @deprecated Removed after 3.0.0, Use `AlertProps` instead. */ const alertProps = buildProps({ /** * @description alert title. */ title: { type: String, default: "" }, description: { type: String, default: "" }, /** * @description alert type. */ type: { type: String, values: keysOf(TypeComponentsMap), default: "info" }, /** * @description whether alert can be dismissed. */ closable: { type: Boolean, default: true }, /** * @description text for replacing x button */ closeText: { type: String, default: "" }, /** * @description whether show icon */ showIcon: Boolean, /** * @description should content be placed in center. */ center: Boolean, effect: { type: String, values: alertEffects, default: "light" } }); const alertEmits = { close: (evt) => evt instanceof MouseEvent }; //#endregion //#region ../../packages/components/icon/src/icon.ts /** * @deprecated Removed after 3.0.0, Use `IconProps` instead. */ const iconProps = buildProps({ /** * @description SVG icon size, size x size */ size: { type: definePropType([Number, String]) }, /** * @description SVG tag's fill attribute */ color: { type: String } }); //#endregion //#region ../../packages/components/icon/src/icon.vue?vue&type=script&setup=true&lang.ts var icon_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElIcon", inheritAttrs: false, __name: "icon", props: iconProps, setup(__props) { const props = __props; const ns = useNamespace("icon"); const style = computed(() => { const { size, color } = props; const fontSize = addUnit(size); if (!fontSize && !color) return {}; return { fontSize, "--color": color }; }); return (_ctx, _cache) => { return openBlock(), createElementBlock("i", mergeProps({ class: unref(ns).b(), style: style.value }, _ctx.$attrs), [renderSlot(_ctx.$slots, "default")], 16); }; } }); //#endregion //#region ../../packages/components/icon/src/icon.vue var icon_default = icon_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/icon/index.ts const ElIcon = withInstall(icon_default); //#endregion //#region ../../packages/components/alert/src/alert.vue?vue&type=script&setup=true&lang.ts var alert_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElAlert", __name: "alert", props: alertProps, emits: alertEmits, setup(__props, { emit: __emit }) { const { Close } = TypeComponents; const props = __props; const emit = __emit; const slots = useSlots(); const ns = useNamespace("alert"); const visible = ref(true); const iconComponent = computed(() => TypeComponentsMap[props.type]); const hasDesc = computed(() => { if (props.description) return true; const slotContent = slots.default?.(); if (!slotContent) return false; return flattedChildren(slotContent).some((child) => !isComment(child)); }); const close = (evt) => { visible.value = false; emit("close", evt); }; return (_ctx, _cache) => { return openBlock(), createBlock(Transition, { name: unref(ns).b("fade"), persisted: "" }, { default: withCtx(() => [withDirectives(createElementVNode("div", { class: normalizeClass([ unref(ns).b(), unref(ns).m(__props.type), unref(ns).is("center", __props.center), unref(ns).is(__props.effect) ]), role: "alert" }, [__props.showIcon && (_ctx.$slots.icon || iconComponent.value) ? (openBlock(), createBlock(unref(ElIcon), { key: 0, class: normalizeClass([unref(ns).e("icon"), unref(ns).is("big", hasDesc.value)]) }, { default: withCtx(() => [renderSlot(_ctx.$slots, "icon", {}, () => [(openBlock(), createBlock(resolveDynamicComponent(iconComponent.value)))])]), _: 3 }, 8, ["class"])) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass(unref(ns).e("content")) }, [ __props.title || _ctx.$slots.title ? (openBlock(), createElementBlock("span", { key: 0, class: normalizeClass([unref(ns).e("title"), { "with-description": hasDesc.value }]) }, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])], 2)) : createCommentVNode("v-if", true), hasDesc.value ? (openBlock(), createElementBlock("p", { key: 1, class: normalizeClass(unref(ns).e("description")) }, [renderSlot(_ctx.$slots, "default", {}, () => [createTextVNode(toDisplayString(__props.description), 1)])], 2)) : createCommentVNode("v-if", true), __props.closable ? (openBlock(), createElementBlock(Fragment, { key: 2 }, [__props.closeText ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass([unref(ns).e("close-btn"), unref(ns).is("customed")]), onClick: close }, toDisplayString(__props.closeText), 3)) : (openBlock(), createBlock(unref(ElIcon), { key: 1, class: normalizeClass(unref(ns).e("close-btn")), onClick: close }, { default: withCtx(() => [createVNode(unref(Close))]), _: 1 }, 8, ["class"]))], 64)) : createCommentVNode("v-if", true) ], 2)], 2), [[vShow, visible.value]])]), _: 3 }, 8, ["name"]); }; } }); //#endregion //#region ../../packages/components/alert/src/alert.vue var alert_default = alert_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/alert/index.ts const ElAlert = withInstall(alert_default); //#endregion //#region ../../packages/components/popper/src/popper.ts const Effect = { LIGHT: "light", DARK: "dark" }; const roleTypes = [ "dialog", "grid", "group", "listbox", "menu", "navigation", "tooltip", "tree" ]; /** * @deprecated Removed after 3.0.0, Use `PopperProps` instead. */ const popperProps = buildProps({ role: { type: String, values: roleTypes, default: "tooltip" } }); /** @deprecated use `popperProps` instead, and it will be deprecated in the next major version */ const usePopperProps = popperProps; //#endregion //#region ../../packages/components/popper/src/constants.ts const POPPER_INJECTION_KEY = Symbol("popper"); const POPPER_CONTENT_INJECTION_KEY = Symbol("popperContent"); //#endregion //#region ../../packages/components/popper/src/popper.vue?vue&type=script&setup=true&lang.ts var popper_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElPopper", inheritAttrs: false, __name: "popper", props: popperProps, setup(__props, { expose: __expose }) { const props = __props; const popperProvides = { /** * @description trigger element */ triggerRef: ref(), /** * @description popperjs instance */ popperInstanceRef: ref(), /** * @description popper content element */ contentRef: ref(), /** * @description popper reference element */ referenceRef: ref(), /** * @description role determines how aria attributes are distributed */ role: computed(() => props.role) }; __expose(popperProvides); provide(POPPER_INJECTION_KEY, popperProvides); return (_ctx, _cache) => { return renderSlot(_ctx.$slots, "default"); }; } }); //#endregion //#region ../../packages/components/popper/src/popper.vue var popper_default = popper_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/popper/src/arrow.vue?vue&type=script&setup=true&lang.ts var arrow_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElPopperArrow", inheritAttrs: false, __name: "arrow", setup(__props, { expose: __expose }) { const ns = useNamespace("popper"); const { arrowRef, arrowStyle } = inject(POPPER_CONTENT_INJECTION_KEY, void 0); onBeforeUnmount(() => { arrowRef.value = void 0; }); __expose({ /** * @description Arrow element */ arrowRef }); return (_ctx, _cache) => { return openBlock(), createElementBlock("span", { ref_key: "arrowRef", ref: arrowRef, class: normalizeClass(unref(ns).e("arrow")), style: normalizeStyle(unref(arrowStyle)), "data-popper-arrow": "" }, null, 6); }; } }); //#endregion //#region ../../packages/components/popper/src/arrow.vue var arrow_default = arrow_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/popper/src/trigger.ts /** * @deprecated Removed after 3.0.0, Use `PopperTriggerProps` instead. */ const popperTriggerProps = buildProps({ /** @description Indicates the reference element to which the popper is attached */ virtualRef: { type: definePropType(Object) }, /** @description Indicates whether virtual triggering is enabled */ virtualTriggering: Boolean, onMouseenter: { type: definePropType(Function) }, onMouseleave: { type: definePropType(Function) }, onClick: { type: definePropType(Function) }, onKeydown: { type: definePropType(Function) }, onFocus: { type: definePropType(Function) }, onBlur: { type: definePropType(Function) }, onContextmenu: { type: definePropType(Function) }, id: String, open: Boolean }); /** @deprecated use `popperTriggerProps` instead, and it will be deprecated in the next major version */ const usePopperTriggerProps = popperTriggerProps; //#endregion //#region ../../packages/components/slot/src/only-child.tsx const NAME = "ElOnlyChild"; const OnlyChild = /* @__PURE__ */ defineComponent({ name: NAME, setup(_, { slots, attrs }) { const forwardRefDirective = useForwardRefDirective(inject(FORWARD_REF_INJECTION_KEY)?.setForwardRef ?? NOOP); return () => { const defaultSlot = slots.default?.(attrs); if (!defaultSlot) return null; const [firstLegitNode, length] = findFirstLegitChild(defaultSlot); if (!firstLegitNode) { /* @__PURE__ */ debugWarn(NAME, "no valid child node found"); return null; } if (length > 1) /* @__PURE__ */ debugWarn(NAME, "requires exact only one valid child."); return withDirectives(cloneVNode(firstLegitNode, attrs), [[forwardRefDirective]]); }; } }); function findFirstLegitChild(node) { if (!node) return [null, 0]; const children = node; const len = children.filter((c) => c.type !== Comment).length; for (const child of children) { /** * when user uses h(Fragment, [text]) to render plain string, * this switch case just cannot handle, when the value is primitives * we should just return the wrapped string */ if (isObject$1(child)) switch (child.type) { case Comment: continue; case Text: case "svg": return [wrapTextContent(child), len]; case Fragment: return findFirstLegitChild(child.children); default: return [child, len]; } return [wrapTextContent(child), len]; } return [null, 0]; } function wrapTextContent(s) { return createVNode("span", { "class": useNamespace("only-child").e("content") }, [s]); } //#endregion //#region ../../packages/components/popper/src/trigger.vue?vue&type=script&setup=true&lang.ts var trigger_vue_vue_type_script_setup_true_lang_default$1 = /* @__PURE__ */ defineComponent({ name: "ElPopperTrigger", inheritAttrs: false, __name: "trigger", props: popperTriggerProps, setup(__props, { expose: __expose }) { const props = __props; const { role, triggerRef } = inject(POPPER_INJECTION_KEY, void 0); useForwardRef(triggerRef); const ariaControls = computed(() => { return ariaHaspopup.value ? props.id : void 0; }); const ariaDescribedby = computed(() => { if (role && role.value === "tooltip") return props.open && props.id ? props.id : void 0; }); const ariaHaspopup = computed(() => { if (role && role.value !== "tooltip") return role.value; }); const ariaExpanded = computed(() => { return ariaHaspopup.value ? `${props.open}` : void 0; }); let virtualTriggerAriaStopWatch = void 0; const TRIGGER_ELE_EVENTS = [ "onMouseenter", "onMouseleave", "onClick", "onKeydown", "onFocus", "onBlur", "onContextmenu" ]; onMounted(() => { watch(() => props.virtualRef, (virtualEl) => { if (virtualEl) triggerRef.value = unrefElement(virtualEl); }, { immediate: true }); watch(triggerRef, (el, prevEl) => { virtualTriggerAriaStopWatch?.(); virtualTriggerAriaStopWatch = void 0; if (isElement$1(prevEl)) TRIGGER_ELE_EVENTS.forEach((eventName) => { const handler = props[eventName]; if (handler) prevEl.removeEventListener(eventName.slice(2).toLowerCase(), handler, ["onFocus", "onBlur"].includes(eventName)); }); if (isElement$1(el)) { TRIGGER_ELE_EVENTS.forEach((eventName) => { const handler = props[eventName]; if (handler) el.addEventListener(eventName.slice(2).toLowerCase(), handler, ["onFocus", "onBlur"].includes(eventName)); }); if (isFocusable(el)) virtualTriggerAriaStopWatch = watch([ ariaControls, ariaDescribedby, ariaHaspopup, ariaExpanded ], (watches) => { [ "aria-controls", "aria-describedby", "aria-haspopup", "aria-expanded" ].forEach((key, idx) => { isNil(watches[idx]) ? el.removeAttribute(key) : el.setAttribute(key, watches[idx]); }); }, { immediate: true }); } if (isElement$1(prevEl) && isFocusable(prevEl)) [ "aria-controls", "aria-describedby", "aria-haspopup", "aria-expanded" ].forEach((key) => prevEl.removeAttribute(key)); }, { immediate: true }); }); onBeforeUnmount(() => { virtualTriggerAriaStopWatch?.(); virtualTriggerAriaStopWatch = void 0; if (triggerRef.value && isElement$1(triggerRef.value)) { const el = triggerRef.value; TRIGGER_ELE_EVENTS.forEach((eventName) => { const handler = props[eventName]; if (handler) el.removeEventListener(eventName.slice(2).toLowerCase(), handler, ["onFocus", "onBlur"].includes(eventName)); }); triggerRef.value = void 0; } }); __expose({ /** * @description trigger element */ triggerRef }); return (_ctx, _cache) => { return !__props.virtualTriggering ? (openBlock(), createBlock(unref(OnlyChild), mergeProps({ key: 0 }, _ctx.$attrs, { "aria-controls": ariaControls.value, "aria-describedby": ariaDescribedby.value, "aria-expanded": ariaExpanded.value, "aria-haspopup": ariaHaspopup.value }), { default: withCtx(() => [renderSlot(_ctx.$slots, "default")]), _: 3 }, 16, [ "aria-controls", "aria-describedby", "aria-expanded", "aria-haspopup" ])) : createCommentVNode("v-if", true); }; } }); //#endregion //#region ../../packages/components/popper/src/trigger.vue var trigger_default = trigger_vue_vue_type_script_setup_true_lang_default$1; //#endregion //#region ../../packages/components/popper/src/arrow.ts /** * @deprecated Removed after 3.0.0, Use `PopperArrowProps` instead. */ const popperArrowProps = buildProps({ arrowOffset: { type: Number, default: 5 } }); const popperArrowPropsDefaults = { arrowOffset: 5 }; /** @deprecated use `popperArrowProps` instead, and it will be deprecated in the next major version */ const usePopperArrowProps = popperArrowProps; //#endregion //#region ../../packages/components/popper/src/content.ts const POSITIONING_STRATEGIES = ["fixed", "absolute"]; /** * @deprecated Removed after 3.0.0, Use `PopperCoreConfigProps` instead. */ const popperCoreConfigProps = buildProps({ boundariesPadding: { type: Number, default: 0 }, fallbackPlacements: { type: definePropType(Array), default: void 0 }, gpuAcceleration: { type: Boolean, default: true }, /** * @description offset of the Tooltip */ offset: { type: Number, default: 12 }, /** * @description position of Tooltip */ placement: { type: String, values: Ee, default: "bottom" }, /** * @description [popper.js](https://popper.js.org/docs/v2/) parameters */ popperOptions: { type: definePropType(Object), default: () => ({}) }, strategy: { type: String, values: POSITIONING_STRATEGIES, default: "absolute" } }); /** * @deprecated Removed after 3.0.0, Use `PopperContentProps` instead. */ const popperContentProps = buildProps({ ...popperCoreConfigProps, ...popperArrowProps, id: String, style: { type: definePropType([ String, Array, Object, Boolean ]), default: void 0 }, className: { type: definePropType([ String, Array, Object ]) }, effect: { type: definePropType(String), default: "dark" }, visible: Boolean, enterable: { type: Boolean, default: true }, pure: Boolean, focusOnShow: Boolean, trapping: Boolean, popperClass: { type: definePropType([ String, Array, Object ]) }, popperStyle: { type: definePropType([ String, Array, Object, Boolean ]), default: void 0 }, referenceEl: { type: definePropType(Object) }, triggerTargetEl: { type: definePropType(Object) }, stopPopperMouseEvent: { type: Boolean, default: true }, virtualTriggering: Boolean, zIndex: Number, ...useAriaProps(["ariaLabel"]), loop: Boolean }); const popperCoreConfigPropsDefaults = { boundariesPadding: 0, gpuAcceleration: true, offset: 12, placement: "bottom", popperOptions: () => ({}), strategy: "absolute" }; const popperContentPropsDefaults = { ...popperCoreConfigPropsDefaults, ...popperArrowPropsDefaults, effect: "dark", enterable: true, stopPopperMouseEvent: true, visible: false, pure: false, focusOnShow: false, trapping: false, virtualTriggering: false, loop: false, style: void 0, popperStyle: void 0 }; const popperContentEmits = { mouseenter: (evt) => evt instanceof MouseEvent, mouseleave: (evt) => evt instanceof MouseEvent, focus: () => true, blur: () => true, close: () => true }; /** @deprecated use `popperCoreConfigProps` instead, and it will be deprecated in the next major version */ const usePopperCoreConfigProps = popperCoreConfigProps; /** @deprecated use `popperContentProps` instead, and it will be deprecated in the next major version */ const usePopperContentProps = popperContentProps; /** @deprecated use `popperContentEmits` instead, and it will be deprecated in the next major version */ const usePopperContentEmits = popperContentEmits; //#endregion //#region ../../packages/components/focus-trap/src/tokens.ts const FOCUS_AFTER_TRAPPED = "focus-trap.focus-after-trapped"; const FOCUS_AFTER_RELEASED = "focus-trap.focus-after-released"; const FOCUSOUT_PREVENTED = "focus-trap.focusout-prevented"; const FOCUS_AFTER_TRAPPED_OPTS = { cancelable: true, bubbles: false }; const FOCUSOUT_PREVENTED_OPTS = { cancelable: true, bubbles: false }; const ON_TRAP_FOCUS_EVT = "focusAfterTrapped"; const ON_RELEASE_FOCUS_EVT = "focusAfterReleased"; const FOCUS_TRAP_INJECTION_KEY = Symbol("elFocusTrap"); //#endregion //#region ../../packages/components/focus-trap/src/utils.ts const focusReason = ref(); const lastUserFocusTimestamp = ref(0); const lastAutomatedFocusTimestamp = ref(0); let focusReasonUserCount = 0; const obtainAllFocusableElements = (element) => { const nodes = []; const walker = document.createTreeWalker(element, NodeFilter.SHOW_ELEMENT, { acceptNode: (node) => { const isHiddenInput = node.tagName === "INPUT" && node.type === "hidden"; if (node.disabled || node.hidden || isHiddenInput) return NodeFilter.FILTER_SKIP; return node.tabIndex >= 0 || node === document.activeElement ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP; } }); while (walker.nextNode()) nodes.push(walker.currentNode); return nodes; }; const getVisibleElement = (elements, container) => { for (const element of elements) if (!isHidden(element, container)) return element; }; const isHidden = (element, container) => { if (getComputedStyle(element).visibility === "hidden") return true; while (element) { if (container && element === container) return false; if (getComputedStyle(element).display === "none") return true; element = element.parentElement; } return false; }; const getEdges = (container) => { const focusable = obtainAllFocusableElements(container); return [getVisibleElement(focusable, container), getVisibleElement(focusable.reverse(), container)]; }; const isSelectable = (element) => { return element instanceof HTMLInputElement && "select" in element; }; const tryFocus = (element, shouldSelect) => { if (element) { const prevFocusedElement = document.activeElement; focusElement(element, { preventScroll: true }); lastAutomatedFocusTimestamp.value = window.performance.now(); if (element !== prevFocusedElement && isSelectable(element) && shouldSelect) element.select(); } }; function removeFromStack(list, item) { const copy = [...list]; const idx = list.indexOf(item); if (idx !== -1) copy.splice(idx, 1); return copy; } const createFocusableStack = () => { let stack = []; const push = (layer) => { const currentLayer = stack[0]; if (currentLayer && layer !== currentLayer) currentLayer.pause(); stack = removeFromStack(stack, layer); stack.unshift(layer); }; const remove = (layer) => { stack = removeFromStack(stack, layer); stack[0]?.resume?.(); }; return { push, remove }; }; const focusFirstDescendant = (elements, shouldSelect = false) => { const prevFocusedElement = document.activeElement; for (const element of elements) { tryFocus(element, shouldSelect); if (document.activeElement !== prevFocusedElement) return; } }; const focusableStack = createFocusableStack(); const isFocusCausedByUserEvent = () => { return lastUserFocusTimestamp.value > lastAutomatedFocusTimestamp.value; }; const notifyFocusReasonPointer = () => { focusReason.value = "pointer"; lastUserFocusTimestamp.value = window.performance.now(); }; const notifyFocusReasonKeydown = () => { focusReason.value = "keyboard"; lastUserFocusTimestamp.value = window.performance.now(); }; const useFocusReason = () => { onMounted(() => { if (focusReasonUserCount === 0) { document.addEventListener("mousedown", notifyFocusReasonPointer); document.addEventListener("touchstart", notifyFocusReasonPointer); document.addEventListener("keydown", notifyFocusReasonKeydown); } focusReasonUserCount++; }); onBeforeUnmount(() => { focusReasonUserCount--; if (focusReasonUserCount <= 0) { document.removeEventListener("mousedown", notifyFocusReasonPointer); document.removeEventListener("touchstart", notifyFocusReasonPointer); document.removeEventListener("keydown", notifyFocusReasonKeydown); } }); return { focusReason, lastUserFocusTimestamp, lastAutomatedFocusTimestamp }; }; const createFocusOutPreventedEvent = (detail) => { return new CustomEvent(FOCUSOUT_PREVENTED, { ...FOCUSOUT_PREVENTED_OPTS, detail }); }; //#endregion //#region ../../packages/components/focus-trap/src/focus-trap.vue?vue&type=script&lang.ts var focus_trap_vue_vue_type_script_lang_default = defineComponent({ name: "ElFocusTrap", inheritAttrs: false, props: { loop: Boolean, trapped: Boolean, focusTrapEl: Object, focusStartEl: { type: [Object, String], default: "first" } }, emits: [ ON_TRAP_FOCUS_EVT, ON_RELEASE_FOCUS_EVT, "focusin", "focusout", "focusout-prevented", "release-requested" ], setup(props, { emit }) { const forwardRef = ref(); let lastFocusBeforeTrapped; let lastFocusAfterTrapped; const { focusReason } = useFocusReason(); useEscapeKeydown((event) => { if (props.trapped && !focusLayer.paused) emit("release-requested", event); }); const focusLayer = { paused: false, pause() { this.paused = true; }, resume() { this.paused = false; } }; const onKeydown = (e) => { if (!props.loop && !props.trapped) return; if (focusLayer.paused) return; const { altKey, ctrlKey, metaKey, currentTarget, shiftKey } = e; const { loop } = props; const isTabbing = getEventCode(e) === EVENT_CODE.tab && !altKey && !ctrlKey && !metaKey; const currentFocusingEl = document.activeElement; if (isTabbing && currentFocusingEl) { const container = currentTarget; const [first, last] = getEdges(container); if (!(first && last)) { if (currentFocusingEl === container) { const focusoutPreventedEvent = createFocusOutPreventedEvent({ focusReason: focusReason.value }); emit("focusout-prevented", focusoutPreventedEvent); if (!focusoutPreventedEvent.defaultPrevented) e.preventDefault(); } } else if (!shiftKey && currentFocusingEl === last) { const focusoutPreventedEvent = createFocusOutPreventedEvent({ focusReason: focusReason.value }); emit("focusout-prevented", focusoutPreventedEvent); if (!focusoutPreventedEvent.defaultPrevented) { e.preventDefault(); if (loop) tryFocus(first, true); } } else if (shiftKey && [first, container].includes(currentFocusingEl)) { const focusoutPreventedEvent = createFocusOutPreventedEvent({ focusReason: focusReason.value }); emit("focusout-prevented", focusoutPreventedEvent); if (!focusoutPreventedEvent.defaultPrevented) { e.preventDefault(); if (loop) tryFocus(last, true); } } } }; provide(FOCUS_TRAP_INJECTION_KEY, { focusTrapRef: forwardRef, onKeydown }); watch(() => props.focusTrapEl, (focusTrapEl) => { if (focusTrapEl) forwardRef.value = focusTrapEl; }, { immediate: true }); watch([forwardRef], ([forwardRef], [oldForwardRef]) => { if (forwardRef) { forwardRef.addEventListener("keydown", onKeydown); forwardRef.addEventListener("focusin", onFocusIn); forwardRef.addEventListener("focusout", onFocusOut); } if (oldForwardRef) { oldForwardRef.removeEventListener("keydown", onKeydown); oldForwardRef.removeEventListener("focusin", onFocusIn); oldForwardRef.removeEventListener("focusout", onFocusOut); } }); const trapOnFocus = (e) => { emit(ON_TRAP_FOCUS_EVT, e); }; const releaseOnFocus = (e) => emit(ON_RELEASE_FOCUS_EVT, e); const onFocusIn = (e) => { const trapContainer = unref(forwardRef); if (!trapContainer) return; const target = e.target; const relatedTarget = e.relatedTarget; const isFocusedInTrap = target && trapContainer.contains(target); if (!props.trapped) { if (!(relatedTarget && trapContainer.contains(relatedTarget))) lastFocusBeforeTrapped = relatedTarget; } if (isFocusedInTrap) emit("focusin", e); if (focusLayer.paused) return; if (props.trapped) if (isFocusedInTrap) lastFocusAfterTrapped = target; else tryFocus(lastFocusAfterTrapped, true); }; const onFocusOut = (e) => { const trapContainer = unref(forwardRef); if (focusLayer.paused || !trapContainer) return; if (props.trapped) { const relatedTarget = e.relatedTarget; if (!isNil(relatedTarget) && !trapContainer.contains(relatedTarget)) setTimeout(() => { if (!focusLayer.paused && props.trapped) { const focusoutPreventedEvent = createFocusOutPreventedEvent({ focusReason: focusReason.value }); emit("focusout-prevented", focusoutPreventedEvent); if (!focusoutPreventedEvent.defaultPrevented) tryFocus(lastFocusAfterTrapped, true); } }, 0); } else { const target = e.target; if (!(target && trapContainer.contains(target))) emit("focusout", e); } }; async function startTrap() { await nextTick(); const trapContainer = unref(forwardRef); if (trapContainer) { focusableStack.push(focusLayer); const prevFocusedElement = trapContainer.contains(document.activeElement) ? lastFocusBeforeTrapped : document.activeElement; lastFocusBeforeTrapped = prevFocusedElement; if (!trapContainer.contains(prevFocusedElement)) { const focusEvent = new Event(FOCUS_AFTER_TRAPPED, FOCUS_AFTER_TRAPPED_OPTS); trapContainer.addEventListener(FOCUS_AFTER_TRAPPED, trapOnFocus); trapContainer.dispatchEvent(focusEvent); if (!focusEvent.defaultPrevented) nextTick(() => { let focusStartEl = props.focusStartEl; if (!isString(focusStartEl)) { tryFocus(focusStartEl); if (document.activeElement !== focusStartEl) focusStartEl = "first"; } if (focusStartEl === "first") focusFirstDescendant(obtainAllFocusableElements(trapContainer), true); if (document.activeElement === prevFocusedElement || focusStartEl === "container") tryFocus(trapContainer); }); } } } function stopTrap() { const trapContainer = unref(forwardRef); if (trapContainer) { trapContainer.removeEventListener(FOCUS_AFTER_TRAPPED, trapOnFocus); const releasedEvent = new CustomEvent(FOCUS_AFTER_RELEASED, { ...FOCUS_AFTER_TRAPPED_OPTS, detail: { focusReason: focusReason.value } }); trapContainer.addEventListener(FOCUS_AFTER_RELEASED, releaseOnFocus); trapContainer.dispatchEvent(releasedEvent); if (!releasedEvent.defaultPrevented && (focusReason.value == "keyboard" || !isFocusCausedByUserEvent() || trapContainer.contains(document.activeElement))) tryFocus(lastFocusBeforeTrapped ?? document.body); trapContainer.removeEventListener(FOCUS_AFTER_RELEASED, releaseOnFocus); focusableStack.remove(focusLayer); lastFocusBeforeTrapped = null; lastFocusAfterTrapped = null; } } onMounted(() => { if (props.trapped) startTrap(); watch(() => props.trapped, (trapped) => { if (trapped) startTrap(); else stopTrap(); }); }); onBeforeUnmount(() => { if (props.trapped) stopTrap(); if (forwardRef.value) { forwardRef.value.removeEventListener("keydown", onKeydown); forwardRef.value.removeEventListener("focusin", onFocusIn); forwardRef.value.removeEventListener("focusout", onFocusOut); forwardRef.value = void 0; } lastFocusBeforeTrapped = null; lastFocusAfterTrapped = null; }); return { onKeydown }; } }); //#endregion //#region \0plugin-vue:export-helper var _plugin_vue_export_helper_default = (sfc, props) => { const target = sfc.__vccOpts || sfc; for (const [key, val] of props) target[key] = val; return target; }; //#endregion //#region ../../packages/components/focus-trap/src/focus-trap.vue function _sfc_render$21(_ctx, _cache, $props, $setup, $data, $options) { return renderSlot(_ctx.$slots, "default", { handleKeydown: _ctx.onKeydown }); } var focus_trap_default$1 = /* @__PURE__ */ _plugin_vue_export_helper_default(focus_trap_vue_vue_type_script_lang_default, [["render", _sfc_render$21]]); //#endregion //#region ../../packages/components/focus-trap/index.ts var focus_trap_default = focus_trap_default$1; //#endregion //#region ../../packages/components/form/src/form.ts /** * @deprecated Removed after 3.0.0, Use `FormMetaProps` instead. */ const formMetaProps = buildProps({ /** * @description Control the size of components in this form. */ size: { type: String, values: componentSizes }, /** * @description Whether to disable all components in this form. If set to `true`, it will override the `disabled` prop of the inner component. */ disabled: Boolean }); /** * @deprecated Removed after 3.0.0, Use `FormProps` instead. */ const formProps = buildProps({ ...formMetaProps, /** * @description Data of form component. */ model: Object, /** * @description Validation rules of form. */ rules: { type: definePropType(Object) }, /** * @description Position of label. If set to `'left'` or `'right'`, `label-width` prop is also required. */ labelPosition: { type: String, values: [ "left", "right", "top" ], default: "right" }, /** * @description Position of asterisk. */ requireAsteriskPosition: { type: String, values: ["left", "right"], default: "left" }, /** * @description Width of label, e.g. `'50px'`. All its direct child form items will inherit this value. `auto` is supported. */ labelWidth: { type: [String, Number], default: "" }, /** * @description Suffix of the label. */ labelSuffix: { type: String, default: "" }, /** * @description Whether the form is inline. */ inline: Boolean, /** * @description Whether to display the error message inline with the form item. */ inlineMessage: Boolean, /** * @description Whether to display an icon indicating the validation result. */ statusIcon: Boolean, /** * @description Whether to show the error message. */ showMessage: { type: Boolean, default: true }, /** * @description Whether to trigger validation when the `rules` prop is changed. */ validateOnRuleChange: { type: Boolean, default: true }, /** * @description Whether to hide required fields should have a red asterisk (star) beside their labels. */ hideRequiredAsterisk: Boolean, /** * @description When validation fails, scroll to the first error form entry. */ scrollToError: Boolean, /** * @description When validation fails, it scrolls to the first error item based on the scrollIntoView option. */ scrollIntoViewOptions: { type: definePropType([Object, Boolean]), default: true } }); const formEmits = { validate: (prop, isValid, message) => (isArray$1(prop) || isString(prop)) && isBoolean(isValid) && isString(message) }; //#endregion //#region ../../packages/components/form/src/constants.ts const formContextKey = Symbol("formContextKey"); const formItemContextKey = Symbol("formItemContextKey"); //#endregion //#region ../../packages/components/form/src/hooks/use-form-common-props.ts const useFormSize = (fallback, ignore = {}) => { const emptyRef = ref(void 0); const size = ignore.prop ? emptyRef : useProp("size"); const globalConfig = ignore.global ? emptyRef : useGlobalSize(); const form = ignore.form ? { size: void 0 } : inject(formContextKey, void 0); const formItem = ignore.formItem ? { size: void 0 } : inject(formItemContextKey, void 0); return computed(() => size.value || unref(fallback) || formItem?.size || form?.size || globalConfig.value || ""); }; const useFormDisabled = (fallback) => { const disabled = useProp("disabled"); const form = inject(formContextKey, void 0); return computed(() => { return disabled.value ?? unref(fallback) ?? form?.disabled ?? false; }); }; const useSize = useFormSize; const useDisabled = useFormDisabled; //#endregion //#region ../../packages/components/form/src/hooks/use-form-item.ts const useFormItem = () => { return { form: inject(formContextKey, void 0), formItem: inject(formItemContextKey, void 0) }; }; const useFormItemInputId = (props, { formItemContext, disableIdGeneration, disableIdManagement }) => { if (!disableIdGeneration) disableIdGeneration = ref(false); if (!disableIdManagement) disableIdManagement = ref(false); const instance = getCurrentInstance(); const inLabel = () => { let parent = instance?.parent; while (parent) { if (parent.type.name === "ElFormItem") return false; if (parent.type.name === "ElLabelWrap") return true; parent = parent.parent; } return false; }; const inputId = ref(); let idUnwatch = void 0; const isLabeledByFormItem = computed(() => { return !!(!(props.label || props.ariaLabel) && formItemContext && formItemContext.inputIds && formItemContext.inputIds?.length <= 1); }); onMounted(() => { idUnwatch = watch([toRef(props, "id"), disableIdGeneration], ([id, disableIdGeneration]) => { const newId = id ?? (!disableIdGeneration ? useId().value : void 0); if (newId !== inputId.value) { if (formItemContext?.removeInputId && !inLabel()) { inputId.value && formItemContext.removeInputId(inputId.value); if (!disableIdManagement?.value && !disableIdGeneration && newId) formItemContext.addInputId(newId); } inputId.value = newId; } }, { immediate: true }); }); onUnmounted(() => { idUnwatch && idUnwatch(); if (formItemContext?.removeInputId) inputId.value && formItemContext.removeInputId(inputId.value); }); return { isLabeledByFormItem, inputId }; }; //#endregion //#region ../../packages/components/form/src/utils.ts const SCOPE$7 = "ElForm"; function useFormLabelWidth() { const potentialLabelWidthArr = ref([]); const autoLabelWidth = computed(() => { if (!potentialLabelWidthArr.value.length) return "0"; const max = Math.max(...potentialLabelWidthArr.value); return max ? `${max}px` : ""; }); function getLabelWidthIndex(width) { const index = potentialLabelWidthArr.value.indexOf(width); if (index === -1 && autoLabelWidth.value === "0") /* @__PURE__ */ debugWarn(SCOPE$7, `unexpected width ${width}`); return index; } function registerLabelWidth(val, oldVal) { if (val && oldVal) { const index = getLabelWidthIndex(oldVal); potentialLabelWidthArr.value.splice(index, 1, val); } else if (val) potentialLabelWidthArr.value.push(val); } function deregisterLabelWidth(val) { const index = getLabelWidthIndex(val); if (index > -1) potentialLabelWidthArr.value.splice(index, 1); } return { autoLabelWidth, registerLabelWidth, deregisterLabelWidth }; } const filterFields = (fields, props) => { const normalized = castArray$1(props).map((prop) => isArray$1(prop) ? prop.join(".") : prop); return normalized.length > 0 ? fields.filter((field) => field.propString && normalized.includes(field.propString)) : fields; }; //#endregion //#region ../../packages/components/form/src/form.vue?vue&type=script&setup=true&lang.ts const COMPONENT_NAME$21 = "ElForm"; var form_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: COMPONENT_NAME$21, __name: "form", props: formProps, emits: formEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const formRef = ref(); const fields = reactive([]); const initialValues = /* @__PURE__ */ new Map(); const formSize = useFormSize(); const ns = useNamespace("form"); const formClasses = computed(() => { const { labelPosition, inline } = props; return [ ns.b(), ns.m(formSize.value || "default"), { [ns.m(`label-${labelPosition}`)]: labelPosition, [ns.m("inline")]: inline } ]; }); const getField = (prop) => { return filterFields(fields, [prop])[0]; }; const addField = (field) => { if (!fields.includes(field)) fields.push(field); if (field.propString) if (initialValues.has(field.propString)) field.setInitialValue(initialValues.get(field.propString)); else initialValues.set(field.propString, cloneDeep(field.fieldValue)); }; const removeField = (field, oldPropString) => { if (oldPropString) { initialValues.delete(oldPropString); return; } const idx = fields.indexOf(field); if (idx > -1) { fields.splice(idx, 1); if (field.propString) initialValues.set(field.propString, cloneDeep(field.getInitialValue())); } }; const setInitialValues = (initModel) => { if (!props.model) { /* @__PURE__ */ debugWarn(COMPONENT_NAME$21, "model is required for setInitialValues to work."); return; } if (!initModel) { /* @__PURE__ */ debugWarn(COMPONENT_NAME$21, "initModel is required for setInitialValues to work."); return; } for (const key of initialValues.keys()) initialValues.set(key, cloneDeep(getProp(initModel, key).value)); fields.forEach((field) => { if (field.prop) field.setInitialValue(getProp(initModel, field.prop).value); }); }; const resetFields = (properties = []) => { if (!props.model) { /* @__PURE__ */ debugWarn(COMPONENT_NAME$21, "model is required for resetFields to work."); return; } filterFields(fields, properties).forEach((field) => field.resetField()); const activePropStrings = new Set(fields.map((f) => f.propString).filter(Boolean)); const propsToCheck = properties.length > 0 ? castArray$1(properties).map((p) => isArray$1(p) ? p.join(".") : p) : [...initialValues.keys()]; for (const propString of propsToCheck) if (!activePropStrings.has(propString) && initialValues.has(propString)) getProp(props.model, propString).value = cloneDeep(initialValues.get(propString)); }; const clearValidate = (props = []) => { filterFields(fields, props).forEach((field) => field.clearValidate()); }; const isValidatable = computed(() => { const hasModel = !!props.model; if (!hasModel) /* @__PURE__ */ debugWarn(COMPONENT_NAME$21, "model is required for validate to work."); return hasModel; }); const obtainValidateFields = (props) => { if (fields.length === 0) return []; const filteredFields = filterFields(fields, props); if (!filteredFields.length) { /* @__PURE__ */ debugWarn(COMPONENT_NAME$21, "please pass correct props!"); return []; } return filteredFields; }; const validate = async (callback) => validateField(void 0, callback); const doValidateField = async (props = []) => { if (!isValidatable.value) return false; const fields = obtainValidateFields(props); if (fields.length === 0) return true; let validationErrors = {}; for (const field of fields) try { await field.validate(""); if (field.validateState === "error" && !field.error) field.resetField(); } catch (fields) { validationErrors = { ...validationErrors, ...fields }; } if (Object.keys(validationErrors).length === 0) return true; return Promise.reject(validationErrors); }; const validateField = async (modelProps = [], callback) => { let result = false; const shouldThrow = !isFunction$1(callback); try { result = await doValidateField(modelProps); if (result === true) await callback?.(result); return result; } catch (e) { if (e instanceof Error) throw e; const invalidFields = e; if (props.scrollToError) { if (formRef.value) formRef.value.querySelector(`.${ns.b()}-item.is-error`)?.scrollIntoView(props.scrollIntoViewOptions); } !result && await callback?.(false, invalidFields); return shouldThrow && Promise.reject(invalidFields); } }; const scrollToField = (prop) => { const field = getField(prop); if (field) field.$el?.scrollIntoView(props.scrollIntoViewOptions); }; watch(() => props.rules, () => { if (props.validateOnRuleChange) validate().catch(NOOP); }, { deep: true, flush: "post" }); provide(formContextKey, reactive({ ...toRefs(props), emit, resetFields, clearValidate, validateField, getField, addField, removeField, setInitialValues, ...useFormLabelWidth() })); __expose({ /** * @description Validate the whole form. Receives a callback or returns `Promise`. */ validate, /** * @description Validate specified fields. */ validateField, /** * @description Reset specified fields and remove validation result. */ resetFields, /** * @description Clear validation message for specified fields. */ clearValidate, /** * @description Scroll to the specified fields. */ scrollToField, /** * @description Get a field context. */ getField, /** * @description All fields context. */ fields, /** * @description Set initial values for form fields. When `resetFields` is called, fields will reset to these values. */ setInitialValues }); return (_ctx, _cache) => { return openBlock(), createElementBlock("form", { ref_key: "formRef", ref: formRef, class: normalizeClass(formClasses.value) }, [renderSlot(_ctx.$slots, "default")], 2); }; } }); //#endregion //#region ../../packages/components/form/src/form.vue var form_default = form_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/form/src/form-item.ts const formItemValidateStates = [ "", "error", "validating", "success" ]; /** * @deprecated Removed after 3.0.0, Use `FormItemProps` instead. */ const formItemProps = buildProps({ /** * @description Label text. */ label: String, /** * @description Width of label, e.g. `'50px'`. `'auto'` is supported. */ labelWidth: { type: [String, Number] }, /** * @description Position of label. If set to `'left'` or `'right'`, `label-width` prop is also required. The default is extend from `form label-position`. */ labelPosition: { type: String, values: [ "left", "right", "top", "" ], default: "" }, /** * @description A key of `model`. It could be an array of property paths (e.g `['a', 'b', '0']`). In the use of `validate` and `resetFields` method, the attribute is required. */ prop: { type: definePropType([String, Array]) }, /** * @description Whether the field is required or not, will be determined by validation rules if omitted. */ required: { type: Boolean, default: void 0 }, /** * @description Validation rules of form, see the [following table](#formitemrule), more advanced usage at [async-validator](https://github.com/yiminghe/async-validator). */ rules: { type: definePropType([Object, Array]) }, /** * @description Field error message, set its value and the field will validate error and show this message immediately. */ error: String, /** * @description Validation state of formItem. */ validateStatus: { type: String, values: formItemValidateStates }, /** * @description Same as for in native label. */ for: String, /** * @description Inline style validate message. */ inlineMessage: { type: Boolean, default: void 0 }, /** * @description Whether to show the error message. */ showMessage: { type: Boolean, default: true }, /** * @description Control the size of components in this form-item. */ size: { type: String, values: componentSizes } }); //#endregion //#region ../../node_modules/.pnpm/async-validator@4.2.5_patch_hash=cc6d77b35ed2a1683012935ca9ed998d418912785fcf78c6497d3268ac596d23/node_modules/async-validator/dist-web/index.js function _extends() { _extends = Object.assign ? Object.assign.bind() : function(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) if (Object.prototype.hasOwnProperty.call(source, key)) target[key] = source[key]; } return target; }; return _extends.apply(this, arguments); } function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {})); return true; } catch (e) { return false; } } function _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) _construct = Reflect.construct.bind(); else _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var instance = new (Function.bind.apply(Parent, a))(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; return _construct.apply(null, arguments); } function _isNativeFunction(fn) { return Function.toString.call(fn).indexOf("[native code]") !== -1; } function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? /* @__PURE__ */ new Map() : void 0; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") throw new TypeError("Super expression must either be null or a function"); if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); } var formatRegExp = /%[sdj%]/g; var warning = function warning() {}; if (typeof process !== "undefined" && process.env && false); function convertFieldsError(errors) { if (!errors || !errors.length) return null; var fields = {}; errors.forEach(function(error) { var field = error.field; fields[field] = fields[field] || []; fields[field].push(error); }); return fields; } function format(template) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) args[_key - 1] = arguments[_key]; var i = 0; var len = args.length; if (typeof template === "function") return template.apply(null, args); if (typeof template === "string") return template.replace(formatRegExp, function(x) { if (x === "%%") return "%"; if (i >= len) return x; switch (x) { case "%s": return String(args[i++]); case "%d": return Number(args[i++]); case "%j": try { return JSON.stringify(args[i++]); } catch (_) { return "[Circular]"; } break; default: return x; } }); return template; } function isNativeStringType(type) { return type === "string" || type === "url" || type === "hex" || type === "email" || type === "date" || type === "pattern"; } function isEmptyValue(value, type) { if (value === void 0 || value === null) return true; if (type === "array" && Array.isArray(value) && !value.length) return true; if (isNativeStringType(type) && typeof value === "string" && !value) return true; return false; } function asyncParallelArray(arr, func, callback) { var results = []; var total = 0; var arrLength = arr.length; function count(errors) { results.push.apply(results, errors || []); total++; if (total === arrLength) callback(results); } arr.forEach(function(a) { func(a, count); }); } function asyncSerialArray(arr, func, callback) { var index = 0; var arrLength = arr.length; function next(errors) { if (errors && errors.length) { callback(errors); return; } var original = index; index = index + 1; if (original < arrLength) func(arr[original], next); else callback([]); } next([]); } function flattenObjArr(objArr) { var ret = []; Object.keys(objArr).forEach(function(k) { ret.push.apply(ret, objArr[k] || []); }); return ret; } var AsyncValidationError = /* @__PURE__ */ function(_Error) { _inheritsLoose(AsyncValidationError, _Error); function AsyncValidationError(errors, fields) { var _this = _Error.call(this, "Async Validation Error") || this; _this.errors = errors; _this.fields = fields; return _this; } return AsyncValidationError; }(/* @__PURE__ */ _wrapNativeSuper(Error)); function asyncMap(objArr, option, func, callback, source) { if (option.first) { var _pending = new Promise(function(resolve, reject) { asyncSerialArray(flattenObjArr(objArr), func, function next(errors) { callback(errors); return errors.length ? reject(new AsyncValidationError(errors, convertFieldsError(errors))) : resolve(source); }); }); _pending["catch"](function(e) { return e; }); return _pending; } var firstFields = option.firstFields === true ? Object.keys(objArr) : option.firstFields || []; var objArrKeys = Object.keys(objArr); var objArrLength = objArrKeys.length; var total = 0; var results = []; var pending = new Promise(function(resolve, reject) { var next = function next(errors) { results.push.apply(results, errors); total++; if (total === objArrLength) { callback(results); return results.length ? reject(new AsyncValidationError(results, convertFieldsError(results))) : resolve(source); } }; if (!objArrKeys.length) { callback(results); resolve(source); } objArrKeys.forEach(function(key) { var arr = objArr[key]; if (firstFields.indexOf(key) !== -1) asyncSerialArray(arr, func, next); else asyncParallelArray(arr, func, next); }); }); pending["catch"](function(e) { return e; }); return pending; } function isErrorObj(obj) { return !!(obj && obj.message !== void 0); } function getValue(value, path) { var v = value; for (var i = 0; i < path.length; i++) { if (v == void 0) return v; v = v[path[i]]; } return v; } function complementError(rule, source) { return function(oe) { var fieldValue; if (rule.fullFields) fieldValue = getValue(source, rule.fullFields); else fieldValue = source[oe.field || rule.fullField]; if (isErrorObj(oe)) { oe.field = oe.field || rule.fullField; oe.fieldValue = fieldValue; return oe; } return { message: typeof oe === "function" ? oe() : oe, fieldValue, field: oe.field || rule.fullField }; }; } function deepMerge(target, source) { if (source) { for (var s in source) if (source.hasOwnProperty(s)) { var value = source[s]; if (typeof value === "object" && typeof target[s] === "object") target[s] = _extends({}, target[s], value); else target[s] = value; } } return target; } var required$1 = function required(rule, value, source, errors, options, type) { if (rule.required && (!source.hasOwnProperty(rule.field) || isEmptyValue(value, type || rule.type))) errors.push(format(options.messages.required, rule.fullField)); }; /** * Rule for validating whitespace. * * @param rule The validation rule. * @param value The value of the field on the source object. * @param source The source object being validated. * @param errors An array of errors that this rule may add * validation errors to. * @param options The validation options. * @param options.messages The validation messages. */ var whitespace = function whitespace(rule, value, source, errors, options) { if (/^\s+$/.test(value) || value === "") errors.push(format(options.messages.whitespace, rule.fullField)); }; var urlReg; var getUrlRegex = (function() { if (urlReg) return urlReg; var word = "[a-fA-F\\d:]"; var b = function b(options) { return options && options.includeBoundaries ? "(?:(?<=\\s|^)(?=" + word + ")|(?<=" + word + ")(?=\\s|$))" : ""; }; var v4 = "(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}"; var v6seg = "[a-fA-F\\d]{1,4}"; var v6 = ("\n(?:\n(?:" + v6seg + ":){7}(?:" + v6seg + "|:)| // 1:2:3:4:5:6:7:: 1:2:3:4:5:6:7:8\n(?:" + v6seg + ":){6}(?:" + v4 + "|:" + v6seg + "|:)| // 1:2:3:4:5:6:: 1:2:3:4:5:6::8 1:2:3:4:5:6::8 1:2:3:4:5:6::1.2.3.4\n(?:" + v6seg + ":){5}(?::" + v4 + "|(?::" + v6seg + "){1,2}|:)| // 1:2:3:4:5:: 1:2:3:4:5::7:8 1:2:3:4:5::8 1:2:3:4:5::7:1.2.3.4\n(?:" + v6seg + ":){4}(?:(?::" + v6seg + "){0,1}:" + v4 + "|(?::" + v6seg + "){1,3}|:)| // 1:2:3:4:: 1:2:3:4::6:7:8 1:2:3:4::8 1:2:3:4::6:7:1.2.3.4\n(?:" + v6seg + ":){3}(?:(?::" + v6seg + "){0,2}:" + v4 + "|(?::" + v6seg + "){1,4}|:)| // 1:2:3:: 1:2:3::5:6:7:8 1:2:3::8 1:2:3::5:6:7:1.2.3.4\n(?:" + v6seg + ":){2}(?:(?::" + v6seg + "){0,3}:" + v4 + "|(?::" + v6seg + "){1,5}|:)| // 1:2:: 1:2::4:5:6:7:8 1:2::8 1:2::4:5:6:7:1.2.3.4\n(?:" + v6seg + ":){1}(?:(?::" + v6seg + "){0,4}:" + v4 + "|(?::" + v6seg + "){1,6}|:)| // 1:: 1::3:4:5:6:7:8 1::8 1::3:4:5:6:7:1.2.3.4\n(?::(?:(?::" + v6seg + "){0,5}:" + v4 + "|(?::" + v6seg + "){1,7}|:)) // ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::1.2.3.4\n)(?:%[0-9a-zA-Z]{1,})? // %eth0 %1\n").replace(/\s*\/\/.*$/gm, "").replace(/\n/g, "").trim(); var v46Exact = new RegExp("(?:^" + v4 + "$)|(?:^" + v6 + "$)"); var v4exact = new RegExp("^" + v4 + "$"); var v6exact = new RegExp("^" + v6 + "$"); var ip = function ip(options) { return options && options.exact ? v46Exact : new RegExp("(?:" + b(options) + v4 + b(options) + ")|(?:" + b(options) + v6 + b(options) + ")", "g"); }; ip.v4 = function(options) { return options && options.exact ? v4exact : new RegExp("" + b(options) + v4 + b(options), "g"); }; ip.v6 = function(options) { return options && options.exact ? v6exact : new RegExp("" + b(options) + v6 + b(options), "g"); }; var protocol = "(?:(?:[a-z]+:)?//)"; var auth = "(?:\\S+(?::\\S*)?@)?"; var ipv4 = ip.v4().source; var ipv6 = ip.v6().source; var regex = "(?:" + protocol + "|www\\.)" + auth + "(?:localhost|" + ipv4 + "|" + ipv6 + "|(?:(?:[a-z\\u00a1-\\uffff0-9][-_]*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))(?::\\d{2,5})?(?:[/?#][^\\s\"]*)?"; urlReg = new RegExp("(?:^" + regex + "$)", "i"); return urlReg; }); var pattern$2 = { email: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+\.)+[a-zA-Z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]{2,}))$/, hex: /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i }; var types = { integer: function integer(value) { return types.number(value) && parseInt(value, 10) === value; }, "float": function float(value) { return types.number(value) && !types.integer(value); }, array: function array(value) { return Array.isArray(value); }, regexp: function regexp(value) { if (value instanceof RegExp) return true; try { return !!new RegExp(value); } catch (e) { return false; } }, date: function date(value) { return typeof value.getTime === "function" && typeof value.getMonth === "function" && typeof value.getYear === "function" && !isNaN(value.getTime()); }, number: function number(value) { if (isNaN(value)) return false; return typeof value === "number"; }, object: function object(value) { return typeof value === "object" && !types.array(value); }, method: function method(value) { return typeof value === "function"; }, email: function email(value) { return typeof value === "string" && value.length <= 320 && !!value.match(pattern$2.email); }, url: function url(value) { return typeof value === "string" && value.length <= 2048 && !!value.match(getUrlRegex()); }, hex: function hex(value) { return typeof value === "string" && !!value.match(pattern$2.hex); } }; var type$1 = function type(rule, value, source, errors, options) { if (rule.required && value === void 0) { required$1(rule, value, source, errors, options); return; } var custom = [ "integer", "float", "array", "regexp", "object", "method", "email", "number", "date", "url", "hex" ]; var ruleType = rule.type; if (custom.indexOf(ruleType) > -1) { if (!types[ruleType](value)) errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type)); } else if (ruleType && typeof value !== rule.type) errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type)); }; var range = function range(rule, value, source, errors, options) { var len = typeof rule.len === "number"; var min = typeof rule.min === "number"; var max = typeof rule.max === "number"; var val = value; var key = null; var num = typeof value === "number"; var str = typeof value === "string"; var arr = Array.isArray(value); if (num) key = "number"; else if (str) key = "string"; else if (arr) key = "array"; if (!key) return false; if (arr) val = value.length; if (str) val = value.length; if (len) { if (val !== rule.len) errors.push(format(options.messages[key].len, rule.fullField, rule.len)); } else if (min && !max && val < rule.min) errors.push(format(options.messages[key].min, rule.fullField, rule.min)); else if (max && !min && val > rule.max) errors.push(format(options.messages[key].max, rule.fullField, rule.max)); else if (min && max && (val < rule.min || val > rule.max)) errors.push(format(options.messages[key].range, rule.fullField, rule.min, rule.max)); }; var ENUM$1 = "enum"; var rules = { required: required$1, whitespace, type: type$1, range, "enum": function enumerable(rule, value, source, errors, options) { rule[ENUM$1] = Array.isArray(rule[ENUM$1]) ? rule[ENUM$1] : []; if (rule[ENUM$1].indexOf(value) === -1) errors.push(format(options.messages[ENUM$1], rule.fullField, rule[ENUM$1].join(", "))); }, pattern: function pattern(rule, value, source, errors, options) { if (rule.pattern) { if (rule.pattern instanceof RegExp) { rule.pattern.lastIndex = 0; if (!rule.pattern.test(value)) errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern)); } else if (typeof rule.pattern === "string") { if (!new RegExp(rule.pattern).test(value)) errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern)); } } } }; var string = function string(rule, value, callback, source, options) { var errors = []; if (rule.required || !rule.required && source.hasOwnProperty(rule.field)) { if (isEmptyValue(value, "string") && !rule.required) return callback(); rules.required(rule, value, source, errors, options, "string"); if (!isEmptyValue(value, "string")) { rules.type(rule, value, source, errors, options); rules.range(rule, value, source, errors, options); rules.pattern(rule, value, source, errors, options); if (rule.whitespace === true) rules.whitespace(rule, value, source, errors, options); } } callback(errors); }; var method = function method(rule, value, callback, source, options) { var errors = []; if (rule.required || !rule.required && source.hasOwnProperty(rule.field)) { if (isEmptyValue(value) && !rule.required) return callback(); rules.required(rule, value, source, errors, options); if (value !== void 0) rules.type(rule, value, source, errors, options); } callback(errors); }; var number = function number(rule, value, callback, source, options) { var errors = []; if (rule.required || !rule.required && source.hasOwnProperty(rule.field)) { if (value === "") value = void 0; if (isEmptyValue(value) && !rule.required) return callback(); rules.required(rule, value, source, errors, options); if (value !== void 0) { rules.type(rule, value, source, errors, options); rules.range(rule, value, source, errors, options); } } callback(errors); }; var _boolean = function _boolean(rule, value, callback, source, options) { var errors = []; if (rule.required || !rule.required && source.hasOwnProperty(rule.field)) { if (isEmptyValue(value) && !rule.required) return callback(); rules.required(rule, value, source, errors, options); if (value !== void 0) rules.type(rule, value, source, errors, options); } callback(errors); }; var regexp = function regexp(rule, value, callback, source, options) { var errors = []; if (rule.required || !rule.required && source.hasOwnProperty(rule.field)) { if (isEmptyValue(value) && !rule.required) return callback(); rules.required(rule, value, source, errors, options); if (!isEmptyValue(value)) rules.type(rule, value, source, errors, options); } callback(errors); }; var integer = function integer(rule, value, callback, source, options) { var errors = []; if (rule.required || !rule.required && source.hasOwnProperty(rule.field)) { if (isEmptyValue(value) && !rule.required) return callback(); rules.required(rule, value, source, errors, options); if (value !== void 0) { rules.type(rule, value, source, errors, options); rules.range(rule, value, source, errors, options); } } callback(errors); }; var floatFn = function floatFn(rule, value, callback, source, options) { var errors = []; if (rule.required || !rule.required && source.hasOwnProperty(rule.field)) { if (isEmptyValue(value) && !rule.required) return callback(); rules.required(rule, value, source, errors, options); if (value !== void 0) { rules.type(rule, value, source, errors, options); rules.range(rule, value, source, errors, options); } } callback(errors); }; var array = function array(rule, value, callback, source, options) { var errors = []; if (rule.required || !rule.required && source.hasOwnProperty(rule.field)) { if ((value === void 0 || value === null) && !rule.required) return callback(); rules.required(rule, value, source, errors, options, "array"); if (value !== void 0 && value !== null) { rules.type(rule, value, source, errors, options); rules.range(rule, value, source, errors, options); } } callback(errors); }; var object = function object(rule, value, callback, source, options) { var errors = []; if (rule.required || !rule.required && source.hasOwnProperty(rule.field)) { if (isEmptyValue(value) && !rule.required) return callback(); rules.required(rule, value, source, errors, options); if (value !== void 0) rules.type(rule, value, source, errors, options); } callback(errors); }; var ENUM = "enum"; var enumerable = function enumerable(rule, value, callback, source, options) { var errors = []; if (rule.required || !rule.required && source.hasOwnProperty(rule.field)) { if (isEmptyValue(value) && !rule.required) return callback(); rules.required(rule, value, source, errors, options); if (value !== void 0) rules[ENUM](rule, value, source, errors, options); } callback(errors); }; var pattern = function pattern(rule, value, callback, source, options) { var errors = []; if (rule.required || !rule.required && source.hasOwnProperty(rule.field)) { if (isEmptyValue(value, "string") && !rule.required) return callback(); rules.required(rule, value, source, errors, options); if (!isEmptyValue(value, "string")) rules.pattern(rule, value, source, errors, options); } callback(errors); }; var date = function date(rule, value, callback, source, options) { var errors = []; if (rule.required || !rule.required && source.hasOwnProperty(rule.field)) { if (isEmptyValue(value, "date") && !rule.required) return callback(); rules.required(rule, value, source, errors, options); if (!isEmptyValue(value, "date")) { var dateObject; if (value instanceof Date) dateObject = value; else dateObject = new Date(value); rules.type(rule, dateObject, source, errors, options); if (dateObject) rules.range(rule, dateObject.getTime(), source, errors, options); } } callback(errors); }; var required = function required(rule, value, callback, source, options) { var errors = []; var type = Array.isArray(value) ? "array" : typeof value; rules.required(rule, value, source, errors, options, type); callback(errors); }; var type = function type(rule, value, callback, source, options) { var ruleType = rule.type; var errors = []; if (rule.required || !rule.required && source.hasOwnProperty(rule.field)) { if (isEmptyValue(value, ruleType) && !rule.required) return callback(); rules.required(rule, value, source, errors, options, ruleType); if (!isEmptyValue(value, ruleType)) rules.type(rule, value, source, errors, options); } callback(errors); }; var validators = { string, method, number, "boolean": _boolean, regexp, integer, "float": floatFn, array, object, "enum": enumerable, pattern, date, url: type, hex: type, email: type, required, any: function any(rule, value, callback, source, options) { var errors = []; if (rule.required || !rule.required && source.hasOwnProperty(rule.field)) { if (isEmptyValue(value) && !rule.required) return callback(); rules.required(rule, value, source, errors, options); } callback(errors); } }; function newMessages() { return { "default": "Validation error on field %s", required: "%s is required", "enum": "%s must be one of %s", whitespace: "%s cannot be empty", date: { format: "%s date %s is invalid for format %s", parse: "%s date could not be parsed, %s is invalid ", invalid: "%s date %s is invalid" }, types: { string: "%s is not a %s", method: "%s is not a %s (function)", array: "%s is not an %s", object: "%s is not an %s", number: "%s is not a %s", date: "%s is not a %s", "boolean": "%s is not a %s", integer: "%s is not an %s", "float": "%s is not a %s", regexp: "%s is not a valid %s", email: "%s is not a valid %s", url: "%s is not a valid %s", hex: "%s is not a valid %s" }, string: { len: "%s must be exactly %s characters", min: "%s must be at least %s characters", max: "%s cannot be longer than %s characters", range: "%s must be between %s and %s characters" }, number: { len: "%s must equal %s", min: "%s cannot be less than %s", max: "%s cannot be greater than %s", range: "%s must be between %s and %s" }, array: { len: "%s must be exactly %s in length", min: "%s cannot be less than %s in length", max: "%s cannot be greater than %s in length", range: "%s must be between %s and %s in length" }, pattern: { mismatch: "%s value %s does not match pattern %s" }, clone: function clone() { var cloned = JSON.parse(JSON.stringify(this)); cloned.clone = this.clone; return cloned; } }; } var messages = newMessages(); /** * Encapsulates a validation schema. * * @param descriptor An object declaring validation rules * for this schema. */ var Schema = /* @__PURE__ */ function() { function Schema(descriptor) { this.rules = null; this._messages = messages; this.define(descriptor); } var _proto = Schema.prototype; _proto.define = function define(rules) { var _this = this; if (!rules) throw new Error("Cannot configure a schema with no rules"); if (typeof rules !== "object" || Array.isArray(rules)) throw new Error("Rules must be an object"); this.rules = {}; Object.keys(rules).forEach(function(name) { var item = rules[name]; _this.rules[name] = Array.isArray(item) ? item : [item]; }); }; _proto.messages = function messages(_messages) { if (_messages) this._messages = deepMerge(newMessages(), _messages); return this._messages; }; _proto.validate = function validate(source_, o, oc) { var _this2 = this; if (o === void 0) o = {}; if (oc === void 0) oc = function oc() {}; var source = source_; var options = o; var callback = oc; if (typeof options === "function") { callback = options; options = {}; } if (!this.rules || Object.keys(this.rules).length === 0) { if (callback) callback(null, source); return Promise.resolve(source); } function complete(results) { var errors = []; var fields = {}; function add(e) { if (Array.isArray(e)) { var _errors; errors = (_errors = errors).concat.apply(_errors, e); } else errors.push(e); } for (var i = 0; i < results.length; i++) add(results[i]); if (!errors.length) callback(null, source); else { fields = convertFieldsError(errors); callback(errors, fields); } } if (options.messages) { var messages$1 = this.messages(); if (messages$1 === messages) messages$1 = newMessages(); deepMerge(messages$1, options.messages); options.messages = messages$1; } else options.messages = this.messages(); var series = {}; (options.keys || Object.keys(this.rules)).forEach(function(z) { var arr = _this2.rules[z]; var value = source[z]; arr.forEach(function(r) { var rule = r; if (typeof rule.transform === "function") { if (source === source_) source = _extends({}, source); value = source[z] = rule.transform(value); } if (typeof rule === "function") rule = { validator: rule }; else rule = _extends({}, rule); rule.validator = _this2.getValidationMethod(rule); if (!rule.validator) return; rule.field = z; rule.fullField = rule.fullField || z; rule.type = _this2.getType(rule); series[z] = series[z] || []; series[z].push({ rule, value, source, field: z }); }); }); var errorFields = {}; return asyncMap(series, options, function(data, doIt) { var rule = data.rule; var deep = (rule.type === "object" || rule.type === "array") && (typeof rule.fields === "object" || typeof rule.defaultField === "object"); deep = deep && (rule.required || !rule.required && data.value); rule.field = data.field; function addFullField(key, schema) { return _extends({}, schema, { fullField: rule.fullField + "." + key, fullFields: rule.fullFields ? [].concat(rule.fullFields, [key]) : [key] }); } function cb(e) { if (e === void 0) e = []; var errorList = Array.isArray(e) ? e : [e]; if (!options.suppressWarning && errorList.length) Schema.warning("async-validator:", errorList); if (errorList.length && rule.message !== void 0) errorList = [].concat(rule.message); var filledErrors = errorList.map(complementError(rule, source)); if (options.first && filledErrors.length) { errorFields[rule.field] = 1; return doIt(filledErrors); } if (!deep) doIt(filledErrors); else { if (rule.required && !data.value) { if (rule.message !== void 0) filledErrors = [].concat(rule.message).map(complementError(rule, source)); else if (options.error) filledErrors = [options.error(rule, format(options.messages.required, rule.field))]; return doIt(filledErrors); } var fieldsSchema = {}; if (rule.defaultField) Object.keys(data.value).map(function(key) { fieldsSchema[key] = rule.defaultField; }); fieldsSchema = _extends({}, fieldsSchema, data.rule.fields); var paredFieldsSchema = {}; Object.keys(fieldsSchema).forEach(function(field) { var fieldSchema = fieldsSchema[field]; paredFieldsSchema[field] = (Array.isArray(fieldSchema) ? fieldSchema : [fieldSchema]).map(addFullField.bind(null, field)); }); var schema = new Schema(paredFieldsSchema); schema.messages(options.messages); if (data.rule.options) { data.rule.options.messages = options.messages; data.rule.options.error = options.error; } schema.validate(data.value, data.rule.options || options, function(errs) { var finalErrors = []; if (filledErrors && filledErrors.length) finalErrors.push.apply(finalErrors, filledErrors); if (errs && errs.length) finalErrors.push.apply(finalErrors, errs); doIt(finalErrors.length ? finalErrors : null); }); } } var res; if (rule.asyncValidator) res = rule.asyncValidator(rule, data.value, cb, data.source, options); else if (rule.validator) { try { res = rule.validator(rule, data.value, cb, data.source, options); } catch (error) { console.error == null || console.error(error); if (!options.suppressValidatorError) setTimeout(function() { throw error; }, 0); cb(error.message); } if (res === true) cb(); else if (res === false) cb(typeof rule.message === "function" ? rule.message(rule.fullField || rule.field) : rule.message || (rule.fullField || rule.field) + " fails"); else if (res instanceof Array) cb(res); else if (res instanceof Error) cb(res.message); } if (res && res.then) res.then(function() { return cb(); }, function(e) { return cb(e); }); }, function(results) { complete(results); }, source); }; _proto.getType = function getType(rule) { if (rule.type === void 0 && rule.pattern instanceof RegExp) rule.type = "pattern"; if (typeof rule.validator !== "function" && rule.type && !validators.hasOwnProperty(rule.type)) throw new Error(format("Unknown rule type %s", rule.type)); return rule.type || "string"; }; _proto.getValidationMethod = function getValidationMethod(rule) { if (typeof rule.validator === "function") return rule.validator; var keys = Object.keys(rule); var messageIndex = keys.indexOf("message"); if (messageIndex !== -1) keys.splice(messageIndex, 1); if (keys.length === 1 && keys[0] === "required") return validators.required; return validators[this.getType(rule)] || void 0; }; return Schema; }(); Schema.register = function register(type, validator) { if (typeof validator !== "function") throw new Error("Cannot register a validator by type, validator is not a function"); validators[type] = validator; }; Schema.warning = warning; Schema.messages = messages; Schema.validators = validators; //#endregion //#region ../../packages/components/form/src/form-label-wrap.tsx const COMPONENT_NAME$20 = "ElLabelWrap"; var form_label_wrap_default = /* @__PURE__ */ defineComponent({ name: COMPONENT_NAME$20, props: { isAutoWidth: Boolean, updateAll: Boolean }, setup(props, { slots }) { const formContext = inject(formContextKey, void 0); const formItemContext = inject(formItemContextKey); if (!formItemContext) throwError(COMPONENT_NAME$20, "usage: "); const ns = useNamespace("form"); const el = ref(); const computedWidth = ref(0); const getLabelWidth = () => { if (el.value?.firstElementChild) { const width = window.getComputedStyle(el.value.firstElementChild).width; return Math.ceil(Number.parseFloat(width)); } else return 0; }; const updateLabelWidth = (action = "update") => { nextTick(() => { if (slots.default && props.isAutoWidth) { if (action === "update") computedWidth.value = getLabelWidth(); else if (action === "remove") formContext?.deregisterLabelWidth(computedWidth.value); } }); }; const updateLabelWidthFn = () => updateLabelWidth("update"); onMounted(() => { updateLabelWidthFn(); }); onBeforeUnmount(() => { updateLabelWidth("remove"); }); onUpdated(() => updateLabelWidthFn()); watch(computedWidth, (val, oldVal) => { if (props.updateAll) formContext?.registerLabelWidth(val, oldVal); }); useResizeObserver(computed(() => el.value?.firstElementChild ?? null), updateLabelWidthFn); return () => { if (!slots) return null; const { isAutoWidth } = props; if (isAutoWidth) { const autoLabelWidth = formContext?.autoLabelWidth; const hasLabel = formItemContext?.hasLabel; const style = {}; if (hasLabel && autoLabelWidth && autoLabelWidth !== "auto") { const marginWidth = Math.max(0, Number.parseInt(autoLabelWidth, 10) - computedWidth.value); const marginPosition = (formItemContext.labelPosition || formContext.labelPosition) === "left" ? "marginRight" : "marginLeft"; if (marginWidth) style[marginPosition] = `${marginWidth}px`; } return createVNode("div", { "ref": el, "class": [ns.be("item", "label-wrap")], "style": style }, [slots.default?.()]); } else return createVNode(Fragment, { "ref": el }, [slots.default?.()]); }; } }); //#endregion //#region ../../packages/components/form/src/form-item.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$79 = ["role", "aria-labelledby"]; var form_item_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElFormItem", __name: "form-item", props: formItemProps, setup(__props, { expose: __expose }) { const props = __props; const slots = useSlots(); const formContext = inject(formContextKey, void 0); const parentFormItemContext = inject(formItemContextKey, void 0); const _size = useFormSize(void 0, { formItem: false }); const ns = useNamespace("form-item"); const labelId = useId().value; const inputIds = ref([]); const validateState = ref(""); const validateStateDebounced = refDebounced(validateState, 100); const validateMessage = ref(""); const formItemRef = ref(); let initialValue = void 0; let isResettingField = false; const labelPosition = computed(() => props.labelPosition || formContext?.labelPosition); const labelStyle = computed(() => { if (labelPosition.value === "top") return {}; return { width: addUnit(props.labelWidth ?? formContext?.labelWidth) }; }); const contentStyle = computed(() => { if (labelPosition.value === "top" || formContext?.inline) return {}; if (!props.label && !props.labelWidth && isNested) return {}; const labelWidth = addUnit(props.labelWidth ?? formContext?.labelWidth); if (!props.label && !slots.label) return { marginLeft: labelWidth }; return {}; }); const formItemClasses = computed(() => [ ns.b(), ns.m(_size.value), ns.is("error", validateState.value === "error"), ns.is("validating", validateState.value === "validating"), ns.is("success", validateState.value === "success"), ns.is("required", isRequired.value || props.required), ns.is("no-asterisk", formContext?.hideRequiredAsterisk), formContext?.requireAsteriskPosition === "right" ? "asterisk-right" : "asterisk-left", { [ns.m("feedback")]: formContext?.statusIcon, [ns.m(`label-${labelPosition.value}`)]: labelPosition.value } ]); const _inlineMessage = computed(() => isBoolean(props.inlineMessage) ? props.inlineMessage : formContext?.inlineMessage || false); const validateClasses = computed(() => [ns.e("error"), { [ns.em("error", "inline")]: _inlineMessage.value }]); const propString = computed(() => { if (!props.prop) return ""; return isArray$1(props.prop) ? props.prop.join(".") : props.prop; }); const hasLabel = computed(() => { return !!(props.label || slots.label); }); const labelFor = computed(() => { return props.for ?? (inputIds.value.length === 1 ? inputIds.value[0] : void 0); }); const isGroup = computed(() => { return !labelFor.value && hasLabel.value; }); const isNested = !!parentFormItemContext; const fieldValue = computed(() => { const model = formContext?.model; if (!model || !props.prop) return; return getProp(model, props.prop).value; }); const normalizedRules = computed(() => { const { required } = props; const rules = []; if (props.rules) rules.push(...castArray$1(props.rules)); const formRules = formContext?.rules; if (formRules && props.prop) { const _rules = getProp(formRules, props.prop).value; if (_rules) rules.push(...castArray$1(_rules)); } if (required !== void 0) { const requiredRules = rules.map((rule, i) => [rule, i]).filter(([rule]) => "required" in rule); if (requiredRules.length > 0) for (const [rule, i] of requiredRules) { if (rule.required === required) continue; rules[i] = { ...rule, required }; } else rules.push({ required }); } return rules; }); const validateEnabled = computed(() => normalizedRules.value.length > 0); const getFilteredRule = (trigger) => { return normalizedRules.value.filter((rule) => { if (!rule.trigger || !trigger) return true; if (isArray$1(rule.trigger)) return rule.trigger.includes(trigger); else return rule.trigger === trigger; }).map(({ trigger, ...rule }) => rule); }; const isRequired = computed(() => normalizedRules.value.some((rule) => rule.required)); const shouldShowError = computed(() => validateStateDebounced.value === "error" && props.showMessage && (formContext?.showMessage ?? true)); const currentLabel = computed(() => `${props.label || ""}${formContext?.labelSuffix || ""}`); const setValidationState = (state) => { validateState.value = state; }; const onValidationFailed = (error) => { const { errors, fields } = error; if (!errors || !fields) console.error(error); setValidationState("error"); validateMessage.value = errors ? errors?.[0]?.message ?? `${props.prop} is required` : ""; formContext?.emit("validate", props.prop, false, validateMessage.value); }; const onValidationSucceeded = () => { setValidationState("success"); formContext?.emit("validate", props.prop, true, ""); }; const doValidate = async (rules) => { const modelName = propString.value; return new Schema({ [modelName]: rules }).validate({ [modelName]: fieldValue.value }, { firstFields: true }).then(() => { onValidationSucceeded(); return true; }).catch((err) => { onValidationFailed(err); return Promise.reject(err); }); }; const validate = async (trigger, callback) => { if (isResettingField || !props.prop) return false; const hasCallback = isFunction$1(callback); if (!validateEnabled.value) { callback?.(false); return false; } const rules = getFilteredRule(trigger); if (rules.length === 0) { callback?.(true); return true; } setValidationState("validating"); return doValidate(rules).then(() => { callback?.(true); return true; }).catch((err) => { const { fields } = err; callback?.(false, fields); return hasCallback ? false : Promise.reject(fields); }); }; const clearValidate = () => { setValidationState(""); validateMessage.value = ""; isResettingField = false; }; const resetField = async () => { const model = formContext?.model; if (!model || !props.prop) return; const computedValue = getProp(model, props.prop); isResettingField = true; computedValue.value = cloneDeep(initialValue); await nextTick(); clearValidate(); isResettingField = false; }; const addInputId = (id) => { if (!inputIds.value.includes(id)) inputIds.value.push(id); }; const removeInputId = (id) => { inputIds.value = inputIds.value.filter((listId) => listId !== id); }; const setInitialValue = (value) => { initialValue = cloneDeep(value); }; const getInitialValue = () => initialValue; watch(() => props.error, (val) => { validateMessage.value = val || ""; setValidationState(val ? "error" : ""); }, { immediate: true }); watch(() => props.validateStatus, (val) => setValidationState(val || "")); const context = reactive({ ...toRefs(props), $el: formItemRef, size: _size, validateMessage, validateState, labelId, inputIds, isGroup, hasLabel, fieldValue, addInputId, removeInputId, resetField, clearValidate, validate, propString, setInitialValue, getInitialValue }); provide(formItemContextKey, context); watch(propString, (newPropString, oldPropString) => { if (!formContext || !oldPropString) return; formContext.removeField(context, oldPropString); if (newPropString) { setInitialValue(fieldValue.value); formContext.addField(context); } }); onMounted(() => { if (props.prop) { setInitialValue(fieldValue.value); formContext?.addField(context); } }); onBeforeUnmount(() => { formContext?.removeField(context); }); __expose({ /** * @description Form item size. */ size: _size, /** * @description Validation message. */ validateMessage, /** * @description Validation state. */ validateState, /** * @description Validate form item. */ validate, /** * @description Remove validation status of the field. */ clearValidate, /** * @description Reset current field and remove validation result. */ resetField, /** * @description Set initial value for this field. When `resetField` is called, the field will reset to this value. */ setInitialValue }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { ref_key: "formItemRef", ref: formItemRef, class: normalizeClass(formItemClasses.value), role: isGroup.value ? "group" : void 0, "aria-labelledby": isGroup.value ? unref(labelId) : void 0 }, [createVNode(unref(form_label_wrap_default), { "is-auto-width": labelStyle.value.width === "auto", "update-all": unref(formContext)?.labelWidth === "auto" }, { default: withCtx(() => [!!(__props.label || _ctx.$slots.label) ? (openBlock(), createBlock(resolveDynamicComponent(labelFor.value ? "label" : "div"), { key: 0, id: unref(labelId), for: labelFor.value, class: normalizeClass(unref(ns).e("label")), style: normalizeStyle(labelStyle.value) }, { default: withCtx(() => [renderSlot(_ctx.$slots, "label", { label: currentLabel.value }, () => [createTextVNode(toDisplayString(currentLabel.value), 1)])]), _: 3 }, 8, [ "id", "for", "class", "style" ])) : createCommentVNode("v-if", true)]), _: 3 }, 8, ["is-auto-width", "update-all"]), createElementVNode("div", { class: normalizeClass(unref(ns).e("content")), style: normalizeStyle(contentStyle.value) }, [renderSlot(_ctx.$slots, "default"), createVNode(TransitionGroup, { name: `${unref(ns).namespace.value}-zoom-in-top` }, { default: withCtx(() => [shouldShowError.value ? renderSlot(_ctx.$slots, "error", { key: 0, error: validateMessage.value }, () => [createElementVNode("div", { class: normalizeClass(validateClasses.value) }, toDisplayString(validateMessage.value), 3)]) : createCommentVNode("v-if", true)]), _: 3 }, 8, ["name"])], 6)], 10, _hoisted_1$79); }; } }); //#endregion //#region ../../packages/components/form/src/form-item.vue var form_item_default = form_item_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/form/index.ts const ElForm = withInstall(form_default, { FormItem: form_item_default }); const ElFormItem = withNoopInstall(form_item_default); //#endregion //#region ../../packages/components/popper/src/utils.ts const buildPopperOptions = (props, modifiers = []) => { const { placement, strategy, popperOptions } = props; const options = { placement, strategy, ...popperOptions, modifiers: [...genModifiers(props), ...modifiers] }; deriveExtraModifiers(options, popperOptions?.modifiers); return options; }; const unwrapMeasurableEl = ($el) => { if (!isClient) return; return unrefElement($el); }; function genModifiers(options) { const { offset, gpuAcceleration, fallbackPlacements } = options; return [ { name: "offset", options: { offset: [0, offset ?? 12] } }, { name: "preventOverflow", options: { padding: { top: 0, bottom: 0, left: 0, right: 0 } } }, { name: "flip", options: { padding: 5, fallbackPlacements } }, { name: "computeStyles", options: { gpuAcceleration } } ]; } function deriveExtraModifiers(options, modifiers) { if (modifiers) options.modifiers = [...options.modifiers, ...modifiers ?? []]; } //#endregion //#region ../../packages/components/popper/src/composables/use-content.ts const DEFAULT_ARROW_OFFSET = 0; const usePopperContent = (props) => { const { popperInstanceRef, contentRef, triggerRef, role } = inject(POPPER_INJECTION_KEY, void 0); const arrowRef = ref(); const arrowOffset = computed(() => props.arrowOffset); const eventListenerModifier = computed(() => { return { name: "eventListeners", enabled: !!props.visible }; }); const arrowModifier = computed(() => { const arrowEl = unref(arrowRef); const offset = unref(arrowOffset) ?? DEFAULT_ARROW_OFFSET; return { name: "arrow", enabled: !isUndefined$1(arrowEl), options: { element: arrowEl, padding: offset } }; }); const options = computed(() => { return { onFirstUpdate: () => { update(); }, ...buildPopperOptions(props, [unref(arrowModifier), unref(eventListenerModifier)]) }; }); const computedReference = computed(() => unwrapMeasurableEl(props.referenceEl) || unref(triggerRef)); const { attributes, state, styles, update, forceUpdate, instanceRef } = usePopper(computedReference, contentRef, options); watch(instanceRef, (instance) => popperInstanceRef.value = instance, { flush: "sync" }); onMounted(() => { watch(() => unref(computedReference)?.getBoundingClientRect?.(), () => { update(); }); }); let stopResizeObserver; watch(() => props.visible, (visible) => { stopResizeObserver?.(); stopResizeObserver = void 0; if (visible) stopResizeObserver = useResizeObserver(contentRef, update).stop; }); onBeforeUnmount(() => { popperInstanceRef.value = void 0; stopResizeObserver?.(); stopResizeObserver = void 0; }); return { attributes, arrowRef, contentRef, instanceRef, state, styles, role, forceUpdate, update }; }; //#endregion //#region ../../packages/components/popper/src/composables/use-content-dom.ts const usePopperContentDOM = (props, { attributes, styles, role }) => { const { nextZIndex } = useZIndex(); const ns = useNamespace("popper"); const contentAttrs = computed(() => unref(attributes).popper); const contentZIndex = ref(isNumber(props.zIndex) ? props.zIndex : nextZIndex()); const contentClass = computed(() => [ ns.b(), ns.is("pure", props.pure), ns.is(props.effect), props.popperClass ]); const contentStyle = computed(() => { return [ { zIndex: unref(contentZIndex) }, unref(styles).popper, props.popperStyle || {} ]; }); const ariaModal = computed(() => role.value === "dialog" ? "false" : void 0); const arrowStyle = computed(() => unref(styles).arrow || {}); const updateZIndex = () => { contentZIndex.value = isNumber(props.zIndex) ? props.zIndex : nextZIndex(); }; return { ariaModal, arrowStyle, contentAttrs, contentClass, contentStyle, contentZIndex, updateZIndex }; }; //#endregion //#region ../../packages/components/popper/src/composables/use-focus-trap.ts const usePopperContentFocusTrap = (props, emit) => { const trapped = ref(false); const focusStartRef = ref(); const onFocusAfterTrapped = () => { emit("focus"); }; const onFocusAfterReleased = (event) => { if (event.detail?.focusReason !== "pointer") { focusStartRef.value = "first"; emit("blur"); } }; const onFocusInTrap = (event) => { if (props.visible && !trapped.value) { if (event.target) focusStartRef.value = event.target; trapped.value = true; } }; const onFocusoutPrevented = (event) => { if (!props.trapping) { if (event.detail.focusReason === "pointer") event.preventDefault(); trapped.value = false; } }; const onReleaseRequested = () => { trapped.value = false; emit("close"); }; onBeforeUnmount(() => { focusStartRef.value = void 0; }); return { focusStartRef, trapped, onFocusAfterReleased, onFocusAfterTrapped, onFocusInTrap, onFocusoutPrevented, onReleaseRequested }; }; //#endregion //#region ../../packages/components/popper/src/content.vue?vue&type=script&setup=true&lang.ts var content_vue_vue_type_script_setup_true_lang_default$2 = /* @__PURE__ */ defineComponent({ name: "ElPopperContent", __name: "content", props: popperContentProps, emits: popperContentEmits, setup(__props, { expose: __expose, emit: __emit }) { const emit = __emit; const props = __props; const { focusStartRef, trapped, onFocusAfterReleased, onFocusAfterTrapped, onFocusInTrap, onFocusoutPrevented, onReleaseRequested } = usePopperContentFocusTrap(props, emit); const { attributes, arrowRef, contentRef, styles, instanceRef, role, update } = usePopperContent(props); const { ariaModal, arrowStyle, contentAttrs, contentClass, contentStyle, updateZIndex } = usePopperContentDOM(props, { styles, attributes, role }); const formItemContext = inject(formItemContextKey, void 0); provide(POPPER_CONTENT_INJECTION_KEY, { arrowStyle, arrowRef }); if (formItemContext) provide(formItemContextKey, { ...formItemContext, addInputId: NOOP, removeInputId: NOOP }); let triggerTargetAriaStopWatch = void 0; const updatePopper = (shouldUpdateZIndex = true) => { update(); shouldUpdateZIndex && updateZIndex(); }; const togglePopperAlive = () => { updatePopper(false); if (props.visible && props.focusOnShow) trapped.value = true; else if (props.visible === false) trapped.value = false; }; onMounted(() => { watch(() => props.triggerTargetEl, (triggerTargetEl, prevTriggerTargetEl) => { triggerTargetAriaStopWatch?.(); triggerTargetAriaStopWatch = void 0; const el = unref(triggerTargetEl || contentRef.value); const prevEl = unref(prevTriggerTargetEl || contentRef.value); if (isElement$1(el)) triggerTargetAriaStopWatch = watch([ role, () => props.ariaLabel, ariaModal, () => props.id ], (watches) => { [ "role", "aria-label", "aria-modal", "id" ].forEach((key, idx) => { isNil(watches[idx]) ? el.removeAttribute(key) : el.setAttribute(key, watches[idx]); }); }, { immediate: true }); if (prevEl !== el && isElement$1(prevEl)) [ "role", "aria-label", "aria-modal", "id" ].forEach((key) => { prevEl.removeAttribute(key); }); }, { immediate: true }); watch(() => props.visible, togglePopperAlive, { immediate: true }); }); onBeforeUnmount(() => { triggerTargetAriaStopWatch?.(); triggerTargetAriaStopWatch = void 0; contentRef.value = void 0; }); __expose({ /** * @description popper content element */ popperContentRef: contentRef, /** * @description popperjs instance */ popperInstanceRef: instanceRef, /** * @description method for updating popper */ updatePopper, /** * @description content style */ contentStyle }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", mergeProps({ ref_key: "contentRef", ref: contentRef }, unref(contentAttrs), { style: unref(contentStyle), class: unref(contentClass), tabindex: "-1", onMouseenter: _cache[0] || (_cache[0] = (e) => _ctx.$emit("mouseenter", e)), onMouseleave: _cache[1] || (_cache[1] = (e) => _ctx.$emit("mouseleave", e)) }), [createVNode(unref(focus_trap_default), { loop: __props.loop, trapped: unref(trapped), "trap-on-focus-in": true, "focus-trap-el": unref(contentRef), "focus-start-el": unref(focusStartRef), onFocusAfterTrapped: unref(onFocusAfterTrapped), onFocusAfterReleased: unref(onFocusAfterReleased), onFocusin: unref(onFocusInTrap), onFocusoutPrevented: unref(onFocusoutPrevented), onReleaseRequested: unref(onReleaseRequested) }, { default: withCtx(() => [renderSlot(_ctx.$slots, "default")]), _: 3 }, 8, [ "loop", "trapped", "focus-trap-el", "focus-start-el", "onFocusAfterTrapped", "onFocusAfterReleased", "onFocusin", "onFocusoutPrevented", "onReleaseRequested" ])], 16); }; } }); //#endregion //#region ../../packages/components/popper/src/content.vue var content_default = content_vue_vue_type_script_setup_true_lang_default$2; //#endregion //#region ../../packages/components/popper/index.ts const ElPopper = withInstall(popper_default); //#endregion //#region ../../packages/components/tooltip/src/content.ts const useTooltipContentPropsDefaults = { ...useDelayedTogglePropsDefaults, ...popperContentPropsDefaults, content: "", visible: null, teleported: true }; /** * @deprecated Removed after 3.0.0, Use `ElTooltipContentProps` instead. */ const useTooltipContentProps = buildProps({ ...useDelayedToggleProps, ...popperContentProps, /** * @description which element the tooltip CONTENT appends to */ appendTo: { type: definePropType([String, Object]) }, /** * @description display content, can be overridden by `slot#content` */ content: { type: String, default: "" }, /** * @description whether `content` is treated as HTML string */ rawContent: Boolean, /** * @description when tooltip inactive and `persistent` is `false` , popconfirm will be destroyed */ persistent: Boolean, /** * @description visibility of Tooltip */ visible: { type: definePropType(Boolean), default: null }, /** * @description animation name */ transition: String, /** * @description whether tooltip content is teleported, if `true` it will be teleported to where `append-to` sets */ teleported: { type: Boolean, default: true }, /** * @description whether Tooltip is disabled */ disabled: Boolean, ...useAriaProps(["ariaLabel"]) }); //#endregion //#region ../../packages/components/tooltip/src/trigger.ts const useTooltipTriggerPropsDefaults = { trigger: "hover", triggerKeys: () => [ EVENT_CODE.enter, EVENT_CODE.numpadEnter, EVENT_CODE.space ] }; /** * @deprecated Removed after 3.0.0, Use `UseTooltipTriggerProps` instead. */ const useTooltipTriggerProps = buildProps({ ...popperTriggerProps, /** * @description whether Tooltip is disabled */ disabled: Boolean, /** * @description How should the tooltip be triggered (to show), not valid in controlled mode */ trigger: { type: definePropType([String, Array]), default: "hover" }, /** * @description When you click the mouse to focus on the trigger element, you can define a set of keyboard codes to control the display of tooltip through the keyboard, not valid in controlled mode */ triggerKeys: { type: definePropType(Array), default: () => [ EVENT_CODE.enter, EVENT_CODE.numpadEnter, EVENT_CODE.space ] }, /** * @description when triggering tooltips through hover, whether to focus the trigger element, which improves accessibility */ focusOnTarget: Boolean }); //#endregion //#region ../../packages/components/tooltip/src/tooltip.ts const { useModelToggleProps: useTooltipModelToggleProps, useModelToggleEmits: useTooltipModelToggleEmits, useModelToggle: useTooltipModelToggle } = createModelToggleComposable("visible"); /** * @deprecated Removed after 3.0.0, Use `UseTooltipProps` instead. */ const useTooltipProps = buildProps({ ...popperProps, ...useTooltipModelToggleProps, ...useTooltipContentProps, ...useTooltipTriggerProps, ...popperArrowProps, /** * @description whether the tooltip content has an arrow */ showArrow: { type: Boolean, default: true } }); const tooltipEmits = [ ...useTooltipModelToggleEmits, "before-show", "before-hide", "show", "hide", "open", "close" ]; //#endregion //#region ../../packages/components/tooltip/src/constants.ts const TOOLTIP_INJECTION_KEY = Symbol("elTooltip"); //#endregion //#region ../../packages/components/tooltip/src/utils.ts const isTriggerType = (trigger, type) => { if (isArray$1(trigger)) return trigger.includes(type); return trigger === type; }; const whenTrigger = (trigger, type, handler) => { return (e) => { isTriggerType(unref(trigger), type) && handler(e); }; }; //#endregion //#region ../../packages/components/tooltip/src/trigger.vue?vue&type=script&setup=true&lang.ts var trigger_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElTooltipTrigger", __name: "trigger", props: useTooltipTriggerProps, setup(__props, { expose: __expose }) { const props = __props; const ns = useNamespace("tooltip"); const { controlled, id, open, onOpen, onClose, onToggle } = inject(TOOLTIP_INJECTION_KEY, void 0); const triggerRef = ref(null); const stopWhenControlledOrDisabled = () => { if (unref(controlled) || props.disabled) return true; }; const trigger = toRef(props, "trigger"); const onMouseenter = composeEventHandlers(stopWhenControlledOrDisabled, whenTrigger(trigger, "hover", (e) => { onOpen(e); if (props.focusOnTarget && e.target) nextTick(() => { focusElement(e.target, { preventScroll: true }); }); })); const onMouseleave = composeEventHandlers(stopWhenControlledOrDisabled, whenTrigger(trigger, "hover", onClose)); const onClick = composeEventHandlers(stopWhenControlledOrDisabled, whenTrigger(trigger, "click", (e) => { if (e.button === 0) onToggle(e); })); const onFocus = composeEventHandlers(stopWhenControlledOrDisabled, whenTrigger(trigger, "focus", onOpen)); const onBlur = composeEventHandlers(stopWhenControlledOrDisabled, whenTrigger(trigger, "focus", onClose)); const onContextMenu = composeEventHandlers(stopWhenControlledOrDisabled, whenTrigger(trigger, "contextmenu", (e) => { e.preventDefault(); onToggle(e); })); const onKeydown = composeEventHandlers(stopWhenControlledOrDisabled, (e) => { const code = getEventCode(e); if (props.triggerKeys.includes(code)) { e.preventDefault(); onToggle(e); } }); __expose({ /** * @description trigger element */ triggerRef }); return (_ctx, _cache) => { return openBlock(), createBlock(unref(trigger_default), { id: unref(id), "virtual-ref": __props.virtualRef, open: unref(open), "virtual-triggering": __props.virtualTriggering, class: normalizeClass(unref(ns).e("trigger")), onBlur: unref(onBlur), onClick: unref(onClick), onContextmenu: unref(onContextMenu), onFocus: unref(onFocus), onMouseenter: unref(onMouseenter), onMouseleave: unref(onMouseleave), onKeydown: unref(onKeydown) }, { default: withCtx(() => [renderSlot(_ctx.$slots, "default")]), _: 3 }, 8, [ "id", "virtual-ref", "open", "virtual-triggering", "class", "onBlur", "onClick", "onContextmenu", "onFocus", "onMouseenter", "onMouseleave", "onKeydown" ]); }; } }); //#endregion //#region ../../packages/components/tooltip/src/trigger.vue var trigger_default$1 = trigger_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/tooltip/src/content.vue?vue&type=script&setup=true&lang.ts var content_vue_vue_type_script_setup_true_lang_default$1 = /* @__PURE__ */ defineComponent({ name: "ElTooltipContent", inheritAttrs: false, __name: "content", props: useTooltipContentProps, setup(__props, { expose: __expose }) { const props = __props; const { selector } = usePopperContainerId(); const ns = useNamespace("tooltip"); const contentRef = ref(); const popperContentRef = computedEager(() => contentRef.value?.popperContentRef); let stopHandle; const { controlled, id, open, trigger, onClose, onOpen, onShow, onHide, onBeforeShow, onBeforeHide } = inject(TOOLTIP_INJECTION_KEY, void 0); const transitionClass = computed(() => { return props.transition || `${ns.namespace.value}-fade-in-linear`; }); const persistentRef = computed(() => { return props.persistent; }); onBeforeUnmount(() => { stopHandle?.(); }); const shouldRender = computed(() => { return unref(persistentRef) ? true : unref(open); }); const shouldShow = computed(() => { return props.disabled ? false : unref(open); }); const appendTo = computed(() => { return props.appendTo || selector.value; }); const contentStyle = computed(() => props.style ?? {}); const ariaHidden = ref(true); const onTransitionLeave = () => { onHide(); isFocusInsideContent() && focusElement(document.body, { preventScroll: true }); ariaHidden.value = true; }; const stopWhenControlled = () => { if (unref(controlled)) return true; }; const onContentEnter = composeEventHandlers(stopWhenControlled, () => { if (props.enterable && isTriggerType(unref(trigger), "hover")) onOpen(); }); const onContentLeave = composeEventHandlers(stopWhenControlled, () => { if (isTriggerType(unref(trigger), "hover")) onClose(); }); const onBeforeEnter = () => { contentRef.value?.updatePopper?.(); onBeforeShow?.(); }; const onBeforeLeave = () => { onBeforeHide?.(); }; const onAfterShow = () => { onShow(); }; const onBlur = () => { if (!props.virtualTriggering) onClose(); }; const isFocusInsideContent = (event) => { const popperContent = contentRef.value?.popperContentRef; const activeElement = event?.relatedTarget || document.activeElement; return popperContent?.contains(activeElement); }; watch(() => unref(open), (val) => { if (!val) stopHandle?.(); else { ariaHidden.value = false; stopHandle = onClickOutside(popperContentRef, () => { if (unref(controlled)) return; if (castArray(unref(trigger)).every((item) => { return item !== "hover" && item !== "focus"; })) onClose(); }, { detectIframe: true }); } }, { flush: "post" }); __expose({ /** * @description el-popper-content component instance */ contentRef, /** * @description validate current focus event is trigger inside el-popper-content */ isFocusInsideContent }); return (_ctx, _cache) => { return openBlock(), createBlock(Teleport, { disabled: !__props.teleported, to: appendTo.value }, [shouldRender.value || !ariaHidden.value ? (openBlock(), createBlock(Transition, { key: 0, name: transitionClass.value, appear: !persistentRef.value, onAfterLeave: onTransitionLeave, onBeforeEnter, onAfterEnter: onAfterShow, onBeforeLeave, persisted: "" }, { default: withCtx(() => [withDirectives(createVNode(unref(content_default), mergeProps({ id: unref(id), ref_key: "contentRef", ref: contentRef }, _ctx.$attrs, { "aria-label": __props.ariaLabel, "aria-hidden": ariaHidden.value, "boundaries-padding": __props.boundariesPadding, "fallback-placements": __props.fallbackPlacements, "gpu-acceleration": __props.gpuAcceleration, offset: __props.offset, placement: __props.placement, "popper-options": __props.popperOptions, "arrow-offset": __props.arrowOffset, strategy: __props.strategy, effect: __props.effect, enterable: __props.enterable, pure: __props.pure, "popper-class": __props.popperClass, "popper-style": [__props.popperStyle, contentStyle.value], "reference-el": __props.referenceEl, "trigger-target-el": __props.triggerTargetEl, visible: shouldShow.value, "z-index": __props.zIndex, loop: __props.loop, onMouseenter: unref(onContentEnter), onMouseleave: unref(onContentLeave), onBlur, onClose: unref(onClose) }), { default: withCtx(() => [renderSlot(_ctx.$slots, "default")]), _: 3 }, 16, [ "id", "aria-label", "aria-hidden", "boundaries-padding", "fallback-placements", "gpu-acceleration", "offset", "placement", "popper-options", "arrow-offset", "strategy", "effect", "enterable", "pure", "popper-class", "popper-style", "reference-el", "trigger-target-el", "visible", "z-index", "loop", "onMouseenter", "onMouseleave", "onClose" ]), [[vShow, shouldShow.value]])]), _: 3 }, 8, ["name", "appear"])) : createCommentVNode("v-if", true)], 8, ["disabled", "to"]); }; } }); //#endregion //#region ../../packages/components/tooltip/src/content.vue var content_default$2 = content_vue_vue_type_script_setup_true_lang_default$1; //#endregion //#region ../../packages/components/tooltip/src/tooltip.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$78 = ["innerHTML"]; const _hoisted_2$44 = { key: 1 }; var tooltip_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElTooltip", __name: "tooltip", props: useTooltipProps, emits: tooltipEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; usePopperContainer(); const ns = useNamespace("tooltip"); const id = useId(); const popperRef = ref(); const contentRef = ref(); const updatePopper = () => { const popperComponent = unref(popperRef); if (popperComponent) popperComponent.popperInstanceRef?.update(); }; const open = ref(false); const toggleReason = ref(); const { show, hide, hasUpdateHandler } = useTooltipModelToggle({ indicator: open, toggleReason }); const { onOpen, onClose } = useDelayedToggle({ showAfter: toRef(props, "showAfter"), hideAfter: toRef(props, "hideAfter"), autoClose: toRef(props, "autoClose"), open: show, close: hide }); const controlled = computed(() => isBoolean(props.visible) && !hasUpdateHandler.value); const kls = computed(() => { return [ns.b(), props.popperClass]; }); provide(TOOLTIP_INJECTION_KEY, { controlled, id, open: readonly(open), trigger: toRef(props, "trigger"), onOpen, onClose, onToggle: (event) => { if (unref(open)) onClose(event); else onOpen(event); }, onShow: () => { emit("show", toggleReason.value); }, onHide: () => { emit("hide", toggleReason.value); }, onBeforeShow: () => { emit("before-show", toggleReason.value); }, onBeforeHide: () => { emit("before-hide", toggleReason.value); }, updatePopper }); watch(() => props.disabled, (disabled) => { if (disabled && open.value) open.value = false; if (!disabled && isBoolean(props.visible)) open.value = props.visible; }); const isFocusInsideContent = (event) => { return contentRef.value?.isFocusInsideContent(event); }; onDeactivated(() => open.value && hide()); onBeforeUnmount(() => { toggleReason.value = void 0; }); __expose({ /** * @description el-popper component instance */ popperRef, /** * @description el-tooltip-content component instance */ contentRef, /** * @description validate current focus event is trigger inside el-tooltip-content */ isFocusInsideContent, /** * @description update el-popper component instance */ updatePopper, /** * @description expose onOpen function to mange el-tooltip open state */ onOpen, /** * @description expose onClose function to manage el-tooltip close state */ onClose, /** * @description expose hide function */ hide }); return (_ctx, _cache) => { return openBlock(), createBlock(unref(ElPopper), { ref_key: "popperRef", ref: popperRef, role: __props.role }, { default: withCtx(() => [createVNode(trigger_default$1, { disabled: __props.disabled, trigger: __props.trigger, "trigger-keys": __props.triggerKeys, "virtual-ref": __props.virtualRef, "virtual-triggering": __props.virtualTriggering, "focus-on-target": __props.focusOnTarget }, { default: withCtx(() => [_ctx.$slots.default ? renderSlot(_ctx.$slots, "default", { key: 0 }) : createCommentVNode("v-if", true)]), _: 3 }, 8, [ "disabled", "trigger", "trigger-keys", "virtual-ref", "virtual-triggering", "focus-on-target" ]), createVNode(content_default$2, { ref_key: "contentRef", ref: contentRef, "aria-label": __props.ariaLabel, "boundaries-padding": __props.boundariesPadding, content: __props.content, disabled: __props.disabled, effect: __props.effect, enterable: __props.enterable, "fallback-placements": __props.fallbackPlacements, "hide-after": __props.hideAfter, "gpu-acceleration": __props.gpuAcceleration, offset: __props.offset, persistent: __props.persistent, "popper-class": kls.value, "popper-style": __props.popperStyle, placement: __props.placement, "popper-options": __props.popperOptions, "arrow-offset": __props.arrowOffset, pure: __props.pure, "raw-content": __props.rawContent, "reference-el": __props.referenceEl, "trigger-target-el": __props.triggerTargetEl, "show-after": __props.showAfter, strategy: __props.strategy, teleported: __props.teleported, transition: __props.transition, "virtual-triggering": __props.virtualTriggering, "z-index": __props.zIndex, "append-to": __props.appendTo, loop: __props.loop }, { default: withCtx(() => [renderSlot(_ctx.$slots, "content", {}, () => [__props.rawContent ? (openBlock(), createElementBlock("span", { key: 0, innerHTML: __props.content }, null, 8, _hoisted_1$78)) : (openBlock(), createElementBlock("span", _hoisted_2$44, toDisplayString(__props.content), 1))]), __props.showArrow ? (openBlock(), createBlock(unref(arrow_default), { key: 0 })) : createCommentVNode("v-if", true)]), _: 3 }, 8, [ "aria-label", "boundaries-padding", "content", "disabled", "effect", "enterable", "fallback-placements", "hide-after", "gpu-acceleration", "offset", "persistent", "popper-class", "popper-style", "placement", "popper-options", "arrow-offset", "pure", "raw-content", "reference-el", "trigger-target-el", "show-after", "strategy", "teleported", "transition", "virtual-triggering", "z-index", "append-to", "loop" ])]), _: 3 }, 8, ["role"]); }; } }); //#endregion //#region ../../packages/components/tooltip/src/tooltip.vue var tooltip_default = tooltip_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/tooltip/index.ts const ElTooltip = withInstall(tooltip_default); //#endregion //#region ../../packages/components/input/src/input.ts /** * @deprecated Removed after 3.0.0, Use `InputProps` instead. */ const inputProps = buildProps({ /** * @description native input id */ id: { type: String, default: void 0 }, /** * @description input box size */ size: useSizeProp, /** * @description whether to disable */ disabled: { type: Boolean, default: void 0 }, /** * @description binding value */ modelValue: { type: definePropType([ String, Number, Object ]), default: "" }, /** * @description v-model modifiers, reference [Vue modifiers](https://vuejs.org/guide/essentials/forms.html#modifiers) */ modelModifiers: { type: definePropType(Object), default: () => ({}) }, /** * @description same as `maxlength` in native input */ maxlength: { type: [String, Number] }, /** * @description same as `minlength` in native input */ minlength: { type: [String, Number] }, /** * @description type of input, see more in [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_%3Cinput%3E_types) */ type: { type: definePropType(String), default: "text" }, /** * @description control the resizability */ resize: { type: String, values: [ "none", "both", "horizontal", "vertical" ] }, /** * @description whether textarea has an adaptive height */ autosize: { type: definePropType([Boolean, Object]), default: false }, /** * @description native input autocomplete */ autocomplete: { type: definePropType(String), default: "off" }, /** * @description format content */ formatter: { type: Function }, /** * @description parse content */ parser: { type: Function }, /** * @description placeholder */ placeholder: { type: String }, /** * @description native input form */ form: { type: String }, /** * @description native input readonly */ readonly: Boolean, /** * @description whether to show clear button */ clearable: Boolean, /** * @description custom clear icon component */ clearIcon: { type: iconPropType, default: circle_close_default }, /** * @description toggleable password input */ showPassword: Boolean, /** * @description word count */ showWordLimit: Boolean, /** * @description word count position, valid when `show-word-limit` is true */ wordLimitPosition: { type: String, values: ["inside", "outside"], default: "inside" }, /** * @description suffix icon */ suffixIcon: { type: iconPropType }, /** * @description prefix icon */ prefixIcon: { type: iconPropType }, /** * @description container role, internal properties provided for use by the picker component */ containerRole: { type: String, default: void 0 }, /** * @description input tabindex */ tabindex: { type: [String, Number], default: 0 }, /** * @description whether to trigger form validation */ validateEvent: { type: Boolean, default: true }, /** * @description input or textarea element style */ inputStyle: { type: definePropType([ Object, Array, String, Boolean ]), default: () => mutable({}) }, /** * @description Count graphemes of input value. If it's set, native maxlength and minlength won't be used. */ countGraphemes: { type: definePropType(Function) }, /** * @description native input autofocus */ autofocus: Boolean, rows: { type: Number, default: 2 }, ...useAriaProps(["ariaLabel"]), /** * @description native input mode for virtual keyboards */ inputmode: { type: definePropType(String), default: void 0 }, /** * @description same as `name` in native input */ name: String }); const inputEmits = { [UPDATE_MODEL_EVENT]: (value) => isString(value), input: (value) => isString(value), change: (value, evt) => isString(value) && (evt instanceof Event || evt === void 0), focus: (evt) => evt instanceof FocusEvent, blur: (evt) => evt instanceof FocusEvent, clear: (evt) => evt === void 0 || evt instanceof MouseEvent, mouseleave: (evt) => evt instanceof MouseEvent, mouseenter: (evt) => evt instanceof MouseEvent, keydown: (evt) => evt instanceof Event, compositionstart: (evt) => evt instanceof CompositionEvent, compositionupdate: (evt) => evt instanceof CompositionEvent, compositionend: (evt) => evt instanceof CompositionEvent }; /** * @description default values for InputProps, used in components that extend InputProps like Autocomplete */ const inputPropsDefaults = { disabled: void 0, modelValue: "", modelModifiers: () => ({}), type: "text", autocomplete: "off", clearIcon: markRaw(circle_close_default), wordLimitPosition: "inside", tabindex: 0, validateEvent: true, inputStyle: () => ({}), rows: 2 }; //#endregion //#region ../../packages/components/input/src/utils.ts let hiddenTextarea = void 0; const HIDDEN_STYLE = { height: "0", visibility: "hidden", overflow: isFirefox() ? "" : "hidden", position: "absolute", "z-index": "-1000", top: "0", right: "0" }; const CONTEXT_STYLE = [ "letter-spacing", "line-height", "padding-top", "padding-bottom", "font-family", "font-weight", "font-size", "text-rendering", "text-transform", "width", "text-indent", "padding-left", "padding-right", "border-width", "box-sizing", "word-break" ]; const looseToNumber = (val) => { const n = Number.parseFloat(val); return Number.isNaN(n) ? val : n; }; function calculateNodeStyling(targetElement) { const style = window.getComputedStyle(targetElement); const boxSizing = style.getPropertyValue("box-sizing"); const paddingSize = Number.parseFloat(style.getPropertyValue("padding-bottom")) + Number.parseFloat(style.getPropertyValue("padding-top")); const borderSize = Number.parseFloat(style.getPropertyValue("border-bottom-width")) + Number.parseFloat(style.getPropertyValue("border-top-width")); return { contextStyle: CONTEXT_STYLE.map((name) => [name, style.getPropertyValue(name)]), paddingSize, borderSize, boxSizing }; } function calcTextareaHeight(targetElement, minRows = 1, maxRows) { if (!hiddenTextarea) { hiddenTextarea = document.createElement("textarea"); let hostNode = document.body; if (!isFirefox() && targetElement.parentNode) hostNode = targetElement.parentNode; hostNode.appendChild(hiddenTextarea); } const { paddingSize, borderSize, boxSizing, contextStyle } = calculateNodeStyling(targetElement); contextStyle.forEach(([key, value]) => hiddenTextarea?.style.setProperty(key, value)); Object.entries(HIDDEN_STYLE).forEach(([key, value]) => hiddenTextarea?.style.setProperty(key, value, "important")); hiddenTextarea.value = targetElement.value || targetElement.placeholder || ""; let height = hiddenTextarea.scrollHeight; const result = {}; if (boxSizing === "border-box") height = height + borderSize; else if (boxSizing === "content-box") height = height - paddingSize; hiddenTextarea.value = ""; const singleRowHeight = hiddenTextarea.scrollHeight - paddingSize; if (isNumber(minRows)) { let minHeight = singleRowHeight * minRows; if (boxSizing === "border-box") minHeight = minHeight + paddingSize + borderSize; height = Math.max(minHeight, height); result.minHeight = `${minHeight}px`; } if (isNumber(maxRows)) { let maxHeight = singleRowHeight * maxRows; if (boxSizing === "border-box") maxHeight = maxHeight + paddingSize + borderSize; height = Math.min(maxHeight, height); } result.height = `${height}px`; hiddenTextarea.parentNode?.removeChild(hiddenTextarea); hiddenTextarea = void 0; return result; } //#endregion //#region ../../packages/components/input/src/input.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$77 = [ "id", "name", "minlength", "maxlength", "type", "disabled", "readonly", "autocomplete", "tabindex", "aria-label", "placeholder", "form", "autofocus", "role", "inputmode" ]; const _hoisted_2$43 = [ "id", "name", "minlength", "maxlength", "tabindex", "disabled", "readonly", "autocomplete", "aria-label", "placeholder", "form", "autofocus", "rows", "role", "inputmode" ]; const COMPONENT_NAME$19 = "ElInput"; var input_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: COMPONENT_NAME$19, inheritAttrs: false, __name: "input", props: inputProps, emits: inputEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const rawAttrs = useAttrs$1(); const slots = useSlots(); const containerKls = computed(() => [ props.type === "textarea" ? nsTextarea.b() : nsInput.b(), nsInput.m(inputSize.value), nsInput.is("disabled", inputDisabled.value), nsInput.is("exceed", inputExceed.value), { [nsInput.b("group")]: slots.prepend || slots.append, [nsInput.m("prefix")]: slots.prefix || props.prefixIcon, [nsInput.m("suffix")]: slots.suffix || props.suffixIcon || props.clearable || props.showPassword, [nsInput.bm("suffix", "password-clear")]: showClear.value && showPwdVisible.value, [nsInput.b("hidden")]: props.type === "hidden" }, rawAttrs.class ]); const wrapperKls = computed(() => [nsInput.e("wrapper"), nsInput.is("focus", isFocused.value)]); const attrs = useAttrs(); const maxlength = computed(() => props.maxlength?.toString()); const { form: elForm, formItem: elFormItem } = useFormItem(); const { inputId } = useFormItemInputId(props, { formItemContext: elFormItem }); const inputSize = useFormSize(); const inputDisabled = useFormDisabled(); const nsInput = useNamespace("input"); const nsTextarea = useNamespace("textarea"); const input = shallowRef(); const textarea = shallowRef(); const hovering = ref(false); const passwordVisible = ref(false); const countStyle = ref(); const clearIconStyle = ref(); const textareaCalcStyle = shallowRef(props.inputStyle); const saveValue = ref(""); const textareaHeight = ref(); const _ref = computed(() => input.value || textarea.value); const { wrapperRef, isFocused, handleFocus, handleBlur } = useFocusController(_ref, { disabled: inputDisabled, afterBlur() { if (props.validateEvent) elFormItem?.validate?.("blur").catch(NOOP); } }); const needStatusIcon = computed(() => elForm?.statusIcon ?? false); const validateState = computed(() => elFormItem?.validateState || ""); const validateIcon = computed(() => validateState.value && ValidateComponentsMap[validateState.value]); const passwordIcon = computed(() => passwordVisible.value ? view_default : hide_default); const containerStyle = computed(() => [rawAttrs.style]); const textareaStyle = computed(() => [ props.inputStyle, textareaCalcStyle.value, { resize: props.resize }, textareaHeight.value ? { height: textareaHeight.value } : void 0 ]); const nativeInputValue = computed(() => isNil(props.modelValue) ? "" : String(props.modelValue)); const renderClear = computed(() => props.clearable && !inputDisabled.value && !props.readonly); const showClear = computed(() => renderClear.value && !!nativeInputValue.value && (isFocused.value || hovering.value)); const showPwdVisible = computed(() => props.showPassword && !inputDisabled.value && !!nativeInputValue.value); const isWordLimitVisible = computed(() => props.showWordLimit && !!maxlength.value && (props.type === "text" || props.type === "textarea") && !inputDisabled.value && !props.readonly && !props.showPassword); const textLength = computed(() => { if (props.countGraphemes && props.showWordLimit) return props.countGraphemes(nativeInputValue.value); return nativeInputValue.value.length; }); const inputExceed = computed(() => !!isWordLimitVisible.value && textLength.value > Number(maxlength.value)); const suffixVisible = computed(() => !!slots.suffix || !!props.suffixIcon || props.clearable || props.showPassword || isWordLimitVisible.value || !!validateState.value && needStatusIcon.value); const hasModelModifiers = computed(() => !!Object.keys(props.modelModifiers).length); const [recordCursor, setCursor] = useCursor(input); let rAFId; useResizeObserver(textarea, (entries) => { onceInitSizeTextarea(); if (!isWordLimitVisible.value && !renderClear.value || props.resize !== "both" && props.resize !== "horizontal") return; const { width } = entries[0].target.getBoundingClientRect(); const updateStyle = () => { rAFId = void 0; countStyle.value = { /** right: 100% - (width - right(10)) */ right: `calc(100% - ${width - 10}px)` }; clearIconStyle.value = { /** right: 100% - (width - right(11)) */ right: `calc(100% - ${width - 11}px)` }; }; rAFId && cAF(rAFId); rAFId = rAF(updateStyle); }); const resizeTextarea = () => { const { type, autosize } = props; if (!isClient || type !== "textarea" || !textarea.value) return; if (autosize) { const minRows = isObject$1(autosize) ? autosize.minRows : void 0; const maxRows = isObject$1(autosize) ? autosize.maxRows : void 0; const textareaStyle = calcTextareaHeight(textarea.value, minRows, maxRows); textareaCalcStyle.value = { overflowY: "hidden", ...textareaStyle }; nextTick(() => { textarea.value.offsetHeight; textareaCalcStyle.value = textareaStyle; }); } else textareaCalcStyle.value = { minHeight: calcTextareaHeight(textarea.value).minHeight }; }; const createOnceInitResize = (resizeTextarea) => { let isInit = false; return () => { if (isInit || !props.autosize) { if (props.resize !== "none") setTimeout(() => { textareaHeight.value = textarea.value?.style.height; }); return; } if (!(textarea.value?.offsetParent === null)) { setTimeout(resizeTextarea); isInit = true; } }; }; const onceInitSizeTextarea = createOnceInitResize(resizeTextarea); const setNativeInputValue = () => { const input = _ref.value; const formatterValue = props.formatter ? props.formatter(nativeInputValue.value) : nativeInputValue.value; if (!input || input.value === formatterValue || props.type === "file") return; input.value = formatterValue; }; const formatValue = (value) => { const { trim, number } = props.modelModifiers; if (trim) value = value.trim(); if (number) value = `${looseToNumber(value)}`; if (props.formatter && props.parser) value = props.parser(value); return value; }; const handleInput = async (event) => { if (isComposing.value) return; const { lazy } = props.modelModifiers; let { value } = event.target; let shouldForceNativeUpdate = false; if (lazy) { emit(INPUT_EVENT, value); return; } value = formatValue(value); if (props.countGraphemes && maxlength.value != null) { const limit = Number(maxlength.value); const graphemes = props.countGraphemes(value); const saveGraphemes = props.countGraphemes(saveValue.value); if (graphemes > limit && graphemes > saveGraphemes) if (saveGraphemes > limit) { value = saveValue.value; shouldForceNativeUpdate = true; } else { const prevValue = saveValue.value; const nextValue = value; let prefixLen = 0; while (prefixLen < prevValue.length && prefixLen < nextValue.length && prevValue[prefixLen] === nextValue[prefixLen]) prefixLen++; let prevSuffixIndex = prevValue.length; let nextSuffixIndex = nextValue.length; while (prevSuffixIndex > prefixLen && nextSuffixIndex > prefixLen && prevValue[prevSuffixIndex - 1] === nextValue[nextSuffixIndex - 1]) { prevSuffixIndex--; nextSuffixIndex--; } const before = nextValue.slice(0, prefixLen); const removed = prevValue.slice(prefixLen, prevSuffixIndex); const inserted = nextValue.slice(prefixLen, nextSuffixIndex); const after = nextValue.slice(nextSuffixIndex); const baseCount = saveGraphemes - props.countGraphemes(removed); const availableInserted = Math.max(0, limit - baseCount); let acceptedInserted = ""; if (availableInserted > 0) if (typeof Intl !== "undefined" && "Segmenter" in Intl) { const segmenter = new Intl.Segmenter(void 0, { granularity: "grapheme" }); for (const { segment } of segmenter.segment(inserted)) { const candidate = acceptedInserted + segment; if (props.countGraphemes(candidate) > availableInserted) break; acceptedInserted = candidate; } } else for (const char of Array.from(inserted)) { const candidate = acceptedInserted + char; if (props.countGraphemes(candidate) > availableInserted) break; acceptedInserted = candidate; } value = before + acceptedInserted + after; shouldForceNativeUpdate = true; } } if (String(value) === nativeInputValue.value) { if (props.formatter || shouldForceNativeUpdate) { const target = event.target; const blockedValue = target.value; const selectionStart = target.selectionStart; const selectionEnd = target.selectionEnd; setNativeInputValue(); if (shouldForceNativeUpdate && _ref.value && selectionStart != null && selectionEnd != null) { const restoredValue = _ref.value.value; const afterTxt = blockedValue.slice(Math.max(0, selectionEnd)); let caretPos = Math.min(selectionStart, restoredValue.length); if (afterTxt && restoredValue.endsWith(afterTxt)) caretPos = restoredValue.length - afterTxt.length; _ref.value.setSelectionRange(caretPos, caretPos); } } return; } saveValue.value = value; recordCursor(); emit(UPDATE_MODEL_EVENT, value); emit(INPUT_EVENT, value); await nextTick(); if (props.formatter && props.parser || !hasModelModifiers.value) setNativeInputValue(); setCursor(); }; const handleChange = async (event) => { let { value } = event.target; value = formatValue(value); if (props.modelModifiers.lazy) emit(UPDATE_MODEL_EVENT, value); emit(CHANGE_EVENT, value, event); await nextTick(); setNativeInputValue(); }; const { isComposing, handleCompositionStart, handleCompositionUpdate, handleCompositionEnd } = useComposition({ emit, afterComposition: handleInput }); const handlePasswordVisible = () => { passwordVisible.value = !passwordVisible.value; }; const focus = () => _ref.value?.focus(); const blur = () => _ref.value?.blur(); const handleMouseLeave = (evt) => { hovering.value = false; emit("mouseleave", evt); }; const handleMouseEnter = (evt) => { hovering.value = true; emit("mouseenter", evt); }; const handleKeydown = (evt) => { emit("keydown", evt); }; const select = () => { _ref.value?.select(); }; const clear = (evt) => { emit(UPDATE_MODEL_EVENT, ""); emit(CHANGE_EVENT, ""); emit("clear", evt); emit(INPUT_EVENT, ""); }; watch(() => props.modelValue, () => { nextTick(() => { resizeTextarea(); if (props.autosize) textareaHeight.value = void 0; }); if (props.validateEvent) elFormItem?.validate?.("change").catch(NOOP); }); watch(() => nativeInputValue.value, (val) => { saveValue.value = val; }, { immediate: true }); watch(nativeInputValue, (newValue) => { if (!_ref.value) return; const { trim, number } = props.modelModifiers; const elValue = _ref.value.value; const displayValue = (number || props.type === "number") && !/^0\d/.test(elValue) ? `${looseToNumber(elValue)}` : elValue; if (displayValue === newValue) return; if (document.activeElement === _ref.value && _ref.value.type !== "range") { if (trim && displayValue.trim() === newValue) return; } setNativeInputValue(); }); watch(() => props.type, async () => { await nextTick(); setNativeInputValue(); resizeTextarea(); }); onMounted(() => { if (!props.formatter && props.parser) /* @__PURE__ */ debugWarn(COMPONENT_NAME$19, "If you set the parser, you also need to set the formatter."); setNativeInputValue(); nextTick(resizeTextarea); }); onBeforeUnmount(() => { rAFId && cAF(rAFId); }); __expose({ /** @description HTML input element */ input, /** @description HTML textarea element */ textarea, /** @description HTML element, input or textarea */ ref: _ref, /** @description style of textarea. */ textareaStyle, /** @description from props (used on unit test) */ autosize: toRef(props, "autosize"), /** @description is input composing */ isComposing, /** @description whether the password is visible */ passwordVisible, /** @description HTML input element native method */ focus, /** @description HTML input element native method */ blur, /** @description HTML input element native method */ select, /** @description clear input value */ clear, /** @description resize textarea. */ resizeTextarea }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass([containerKls.value, { [unref(nsInput).bm("group", "append")]: _ctx.$slots.append, [unref(nsInput).bm("group", "prepend")]: _ctx.$slots.prepend }]), style: normalizeStyle(containerStyle.value), onMouseenter: handleMouseEnter, onMouseleave: handleMouseLeave }, [createCommentVNode(" input "), __props.type !== "textarea" ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [ createCommentVNode(" prepend slot "), _ctx.$slots.prepend ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(nsInput).be("group", "prepend")) }, [renderSlot(_ctx.$slots, "prepend")], 2)) : createCommentVNode("v-if", true), createElementVNode("div", { ref_key: "wrapperRef", ref: wrapperRef, class: normalizeClass(wrapperKls.value) }, [ createCommentVNode(" prefix slot "), _ctx.$slots.prefix || __props.prefixIcon ? (openBlock(), createElementBlock("span", { key: 0, class: normalizeClass(unref(nsInput).e("prefix")) }, [createElementVNode("span", { class: normalizeClass(unref(nsInput).e("prefix-inner")) }, [renderSlot(_ctx.$slots, "prefix"), __props.prefixIcon ? (openBlock(), createBlock(unref(ElIcon), { key: 0, class: normalizeClass(unref(nsInput).e("icon")) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(__props.prefixIcon)))]), _: 1 }, 8, ["class"])) : createCommentVNode("v-if", true)], 2)], 2)) : createCommentVNode("v-if", true), createElementVNode("input", mergeProps({ id: unref(inputId), ref_key: "input", ref: input, class: unref(nsInput).e("inner") }, unref(attrs), { name: __props.name, minlength: __props.countGraphemes ? void 0 : __props.minlength, maxlength: __props.countGraphemes ? void 0 : maxlength.value, type: __props.showPassword ? passwordVisible.value ? "text" : "password" : __props.type, disabled: unref(inputDisabled), readonly: __props.readonly, autocomplete: __props.autocomplete, tabindex: __props.tabindex, "aria-label": __props.ariaLabel, placeholder: __props.placeholder, style: __props.inputStyle, form: __props.form, autofocus: __props.autofocus, role: __props.containerRole, inputmode: __props.inputmode, onCompositionstart: _cache[0] || (_cache[0] = (...args) => unref(handleCompositionStart) && unref(handleCompositionStart)(...args)), onCompositionupdate: _cache[1] || (_cache[1] = (...args) => unref(handleCompositionUpdate) && unref(handleCompositionUpdate)(...args)), onCompositionend: _cache[2] || (_cache[2] = (...args) => unref(handleCompositionEnd) && unref(handleCompositionEnd)(...args)), onInput: handleInput, onChange: handleChange, onKeydown: handleKeydown }), null, 16, _hoisted_1$77), createCommentVNode(" suffix slot "), suffixVisible.value ? (openBlock(), createElementBlock("span", { key: 1, class: normalizeClass(unref(nsInput).e("suffix")) }, [createElementVNode("span", { class: normalizeClass(unref(nsInput).e("suffix-inner")) }, [ renderClear.value ? (openBlock(), createBlock(unref(ElIcon), { key: 0, class: normalizeClass([unref(nsInput).e("icon"), unref(nsInput).e("clear")]), style: normalizeStyle({ visibility: showClear.value ? "visible" : "hidden" }), onMousedown: withModifiers(unref(NOOP), ["prevent"]), onClick: clear }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(__props.clearIcon)))]), _: 1 }, 8, [ "class", "style", "onMousedown" ])) : createCommentVNode("v-if", true), !showClear.value || !showPwdVisible.value || !isWordLimitVisible.value ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [renderSlot(_ctx.$slots, "suffix"), __props.suffixIcon ? (openBlock(), createBlock(unref(ElIcon), { key: 0, class: normalizeClass(unref(nsInput).e("icon")) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(__props.suffixIcon)))]), _: 1 }, 8, ["class"])) : createCommentVNode("v-if", true)], 64)) : createCommentVNode("v-if", true), showPwdVisible.value ? (openBlock(), createBlock(unref(ElIcon), { key: 2, class: normalizeClass([unref(nsInput).e("icon"), unref(nsInput).e("password")]), onClick: handlePasswordVisible, onMousedown: withModifiers(unref(NOOP), ["prevent"]), onMouseup: withModifiers(unref(NOOP), ["prevent"]) }, { default: withCtx(() => [renderSlot(_ctx.$slots, "password-icon", { visible: passwordVisible.value }, () => [(openBlock(), createBlock(resolveDynamicComponent(passwordIcon.value)))])]), _: 3 }, 8, [ "class", "onMousedown", "onMouseup" ])) : createCommentVNode("v-if", true), isWordLimitVisible.value ? (openBlock(), createElementBlock("span", { key: 3, class: normalizeClass([unref(nsInput).e("count"), unref(nsInput).is("outside", __props.wordLimitPosition === "outside")]) }, [createElementVNode("span", { class: normalizeClass(unref(nsInput).e("count-inner")) }, toDisplayString(textLength.value) + " / " + toDisplayString(maxlength.value), 3)], 2)) : createCommentVNode("v-if", true), validateState.value && validateIcon.value && needStatusIcon.value ? (openBlock(), createBlock(unref(ElIcon), { key: 4, class: normalizeClass([ unref(nsInput).e("icon"), unref(nsInput).e("validateIcon"), unref(nsInput).is("loading", validateState.value === "validating") ]) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(validateIcon.value)))]), _: 1 }, 8, ["class"])) : createCommentVNode("v-if", true) ], 2)], 2)) : createCommentVNode("v-if", true) ], 2), createCommentVNode(" append slot "), _ctx.$slots.append ? (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass(unref(nsInput).be("group", "append")) }, [renderSlot(_ctx.$slots, "append")], 2)) : createCommentVNode("v-if", true) ], 64)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [ createCommentVNode(" textarea "), createElementVNode("textarea", mergeProps({ id: unref(inputId), ref_key: "textarea", ref: textarea, class: [ unref(nsTextarea).e("inner"), unref(nsInput).is("focus", unref(isFocused)), unref(nsTextarea).is("clearable", __props.clearable) ] }, unref(attrs), { name: __props.name, minlength: __props.countGraphemes ? void 0 : __props.minlength, maxlength: __props.countGraphemes ? void 0 : maxlength.value, tabindex: __props.tabindex, disabled: unref(inputDisabled), readonly: __props.readonly, autocomplete: __props.autocomplete, style: textareaStyle.value, "aria-label": __props.ariaLabel, placeholder: __props.placeholder, form: __props.form, autofocus: __props.autofocus, rows: __props.rows, role: __props.containerRole, inputmode: __props.inputmode, onCompositionstart: _cache[3] || (_cache[3] = (...args) => unref(handleCompositionStart) && unref(handleCompositionStart)(...args)), onCompositionupdate: _cache[4] || (_cache[4] = (...args) => unref(handleCompositionUpdate) && unref(handleCompositionUpdate)(...args)), onCompositionend: _cache[5] || (_cache[5] = (...args) => unref(handleCompositionEnd) && unref(handleCompositionEnd)(...args)), onInput: handleInput, onFocus: _cache[6] || (_cache[6] = (...args) => unref(handleFocus) && unref(handleFocus)(...args)), onBlur: _cache[7] || (_cache[7] = (...args) => unref(handleBlur) && unref(handleBlur)(...args)), onChange: handleChange, onKeydown: handleKeydown }), null, 16, _hoisted_2$43), showClear.value ? (openBlock(), createBlock(unref(ElIcon), { key: 0, class: normalizeClass([unref(nsTextarea).e("icon"), unref(nsTextarea).e("clear")]), style: normalizeStyle(clearIconStyle.value), onMousedown: withModifiers(unref(NOOP), ["prevent"]), onClick: clear }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(__props.clearIcon)))]), _: 1 }, 8, [ "class", "style", "onMousedown" ])) : createCommentVNode("v-if", true), isWordLimitVisible.value ? (openBlock(), createElementBlock("span", { key: 1, style: normalizeStyle(countStyle.value), class: normalizeClass([unref(nsInput).e("count"), unref(nsInput).is("outside", __props.wordLimitPosition === "outside")]) }, toDisplayString(textLength.value) + " / " + toDisplayString(maxlength.value), 7)) : createCommentVNode("v-if", true) ], 64))], 38); }; } }); //#endregion //#region ../../packages/components/input/src/input.vue var input_default = input_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/input/index.ts const ElInput = withInstall(input_default); //#endregion //#region ../../packages/components/autocomplete/src/autocomplete.ts /** * @deprecated Removed after 3.0.0, Use `AutocompleteProps` instead. */ const autocompleteProps = buildProps({ ...inputProps, /** * @description key name of the input suggestion object for display */ valueKey: { type: String, default: "value" }, /** * @description binding value */ modelValue: { type: [String, Number], default: "" }, /** * @description debounce delay when typing, in milliseconds */ debounce: { type: Number, default: 300 }, /** * @description placement of the popup menu */ placement: { type: definePropType(String), values: [ "top", "top-start", "top-end", "bottom", "bottom-start", "bottom-end" ], default: "bottom-start" }, /** * @description a method to fetch input suggestions. When suggestions are ready, invoke `callback(data:[])` to return them to Autocomplete */ fetchSuggestions: { type: definePropType([Function, Array]), default: NOOP }, /** * @description custom class name for autocomplete's dropdown */ popperClass: useTooltipContentProps.popperClass, /** * @description custom style for autocomplete's dropdown */ popperStyle: useTooltipContentProps.popperStyle, /** * @description [popper.js](https://popper.js.org/docs/v2/) parameters */ popperOptions: useTooltipContentProps.popperOptions, /** * @description determines whether the arrow is displayed */ showArrow: { type: Boolean, default: true }, /** * @description whether show suggestions when input focus */ triggerOnFocus: { type: Boolean, default: true }, /** * @description whether to emit a `select` event on enter when there is no autocomplete match */ selectWhenUnmatched: Boolean, /** * @description whether to hide the loading icon in remote search */ hideLoading: Boolean, /** * @description whether select dropdown is teleported to the body */ teleported: useTooltipContentProps.teleported, /** * @description which select dropdown appends to */ appendTo: useTooltipContentProps.appendTo, /** * @description whether to highlight first item in remote search suggestions by default */ highlightFirstItem: Boolean, /** * @description whether the width of the dropdown is the same as the input */ fitInputWidth: Boolean, /** * @description whether keyboard navigation loops from end to start */ loopNavigation: { type: Boolean, default: true } }); const autocompleteEmits = { [UPDATE_MODEL_EVENT]: (value) => isString(value) || isNumber(value), [INPUT_EVENT]: (value) => isString(value) || isNumber(value), [CHANGE_EVENT]: (value) => isString(value) || isNumber(value), focus: (evt) => evt instanceof FocusEvent, blur: (evt) => evt instanceof FocusEvent, clear: () => true, select: (item) => isObject$1(item) }; //#endregion //#region ../../packages/components/scrollbar/src/scrollbar.ts /** * @deprecated Removed after 3.0.0, Use `ScrollbarProps` instead. */ const scrollbarProps = buildProps({ /** * @description trigger distance(px) */ distance: { type: Number, default: 0 }, /** * @description height of scrollbar */ height: { type: [String, Number], default: "" }, /** * @description max height of scrollbar */ maxHeight: { type: [String, Number], default: "" }, /** * @description whether to use the native scrollbar */ native: Boolean, /** * @description style of wrap */ wrapStyle: { type: definePropType([ String, Object, Array, Boolean ]), default: "" }, /** * @description class of wrap */ wrapClass: { type: [String, Array], default: "" }, /** * @description class of view */ viewClass: { type: [String, Array], default: "" }, /** * @description style of view */ viewStyle: { type: definePropType([ String, Object, Array, Boolean ]), default: "" }, /** * @description do not respond to container size changes, if the container size does not change, it is better to set it to optimize performance */ noresize: Boolean, /** * @description element tag of the view */ tag: { type: String, default: "div" }, /** * @description always show */ always: Boolean, /** * @description minimum size of scrollbar */ minSize: { type: Number, default: 20 }, /** * @description Wrap tabindex */ tabindex: { type: [String, Number], default: void 0 }, /** * @description id of view */ id: String, /** * @description role of view */ role: String, ...useAriaProps(["ariaLabel", "ariaOrientation"]) }); const scrollbarEmits = { "end-reached": (direction) => [ "left", "right", "top", "bottom" ].includes(direction), scroll: ({ scrollTop, scrollLeft }) => [scrollTop, scrollLeft].every(isNumber) }; //#endregion //#region ../../packages/components/scrollbar/src/bar.ts /** * @deprecated Removed after 3.0.0, Use `BarProps` instead. */ const barProps = buildProps({ always: { type: Boolean, default: true }, minSize: { type: Number, required: true } }); //#endregion //#region ../../packages/components/scrollbar/src/util.ts const GAP = 4; const BAR_MAP = { vertical: { offset: "offsetHeight", scroll: "scrollTop", scrollSize: "scrollHeight", size: "height", key: "vertical", axis: "Y", client: "clientY", direction: "top" }, horizontal: { offset: "offsetWidth", scroll: "scrollLeft", scrollSize: "scrollWidth", size: "width", key: "horizontal", axis: "X", client: "clientX", direction: "left" } }; const renderThumbStyle = ({ move, size, bar }) => ({ [bar.size]: size, transform: `translate${bar.axis}(${move}%)` }); //#endregion //#region ../../packages/components/scrollbar/src/thumb.ts /** * @deprecated Removed after 3.0.0, Use `ThumbProps` instead. */ const thumbProps = buildProps({ vertical: Boolean, size: String, move: Number, ratio: { type: Number, required: true }, always: Boolean }); //#endregion //#region ../../packages/components/scrollbar/src/constants.ts const scrollbarContextKey = Symbol("scrollbarContextKey"); //#endregion //#region ../../packages/components/scrollbar/src/thumb.vue?vue&type=script&setup=true&lang.ts const COMPONENT_NAME$18 = "Thumb"; var thumb_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ __name: "thumb", props: thumbProps, setup(__props) { const props = __props; const scrollbar = inject(scrollbarContextKey); const ns = useNamespace("scrollbar"); if (!scrollbar) throwError(COMPONENT_NAME$18, "can not inject scrollbar context"); const instance = ref(); const thumb = ref(); const thumbState = ref({}); const visible = ref(false); let cursorDown = false; let cursorLeave = false; let baseScrollHeight = 0; let baseScrollWidth = 0; let originalOnSelectStart = isClient ? document.onselectstart : null; const bar = computed(() => BAR_MAP[props.vertical ? "vertical" : "horizontal"]); const thumbStyle = computed(() => renderThumbStyle({ size: props.size, move: props.move, bar: bar.value })); const offsetRatio = computed(() => instance.value[bar.value.offset] ** 2 / scrollbar.wrapElement[bar.value.scrollSize] / props.ratio / thumb.value[bar.value.offset]); const clickThumbHandler = (e) => { e.stopPropagation(); if (e.ctrlKey || [1, 2].includes(e.button)) return; window.getSelection()?.removeAllRanges(); startDrag(e); const el = e.currentTarget; if (!el) return; thumbState.value[bar.value.axis] = el[bar.value.offset] - (e[bar.value.client] - el.getBoundingClientRect()[bar.value.direction]); }; const clickTrackHandler = (e) => { if (!thumb.value || !instance.value || !scrollbar.wrapElement) return; const thumbPositionPercentage = (Math.abs(e.target.getBoundingClientRect()[bar.value.direction] - e[bar.value.client]) - thumb.value[bar.value.offset] / 2) * 100 * offsetRatio.value / instance.value[bar.value.offset]; scrollbar.wrapElement[bar.value.scroll] = thumbPositionPercentage * scrollbar.wrapElement[bar.value.scrollSize] / 100; }; const startDrag = (e) => { e.stopImmediatePropagation(); cursorDown = true; baseScrollHeight = scrollbar.wrapElement.scrollHeight; baseScrollWidth = scrollbar.wrapElement.scrollWidth; document.addEventListener("mousemove", mouseMoveDocumentHandler); document.addEventListener("mouseup", mouseUpDocumentHandler); originalOnSelectStart = document.onselectstart; document.onselectstart = () => false; }; const mouseMoveDocumentHandler = (e) => { if (!instance.value || !thumb.value) return; if (cursorDown === false) return; const prevPage = thumbState.value[bar.value.axis]; if (!prevPage) return; const thumbPositionPercentage = ((instance.value.getBoundingClientRect()[bar.value.direction] - e[bar.value.client]) * -1 - (thumb.value[bar.value.offset] - prevPage)) * 100 * offsetRatio.value / instance.value[bar.value.offset]; if (bar.value.scroll === "scrollLeft") scrollbar.wrapElement[bar.value.scroll] = thumbPositionPercentage * baseScrollWidth / 100; else scrollbar.wrapElement[bar.value.scroll] = thumbPositionPercentage * baseScrollHeight / 100; }; const mouseUpDocumentHandler = () => { cursorDown = false; thumbState.value[bar.value.axis] = 0; document.removeEventListener("mousemove", mouseMoveDocumentHandler); document.removeEventListener("mouseup", mouseUpDocumentHandler); restoreOnselectstart(); if (cursorLeave) visible.value = false; }; const mouseMoveScrollbarHandler = () => { cursorLeave = false; visible.value = !!props.size; }; const mouseLeaveScrollbarHandler = () => { cursorLeave = true; visible.value = cursorDown; }; onBeforeUnmount(() => { restoreOnselectstart(); document.removeEventListener("mouseup", mouseUpDocumentHandler); }); const restoreOnselectstart = () => { if (document.onselectstart !== originalOnSelectStart) document.onselectstart = originalOnSelectStart; }; useEventListener(toRef(scrollbar, "scrollbarElement"), "mousemove", mouseMoveScrollbarHandler); useEventListener(toRef(scrollbar, "scrollbarElement"), "mouseleave", mouseLeaveScrollbarHandler); return (_ctx, _cache) => { return openBlock(), createBlock(Transition, { name: unref(ns).b("fade"), persisted: "" }, { default: withCtx(() => [withDirectives(createElementVNode("div", { ref_key: "instance", ref: instance, class: normalizeClass([unref(ns).e("bar"), unref(ns).is(bar.value.key)]), onMousedown: clickTrackHandler, onClick: _cache[0] || (_cache[0] = withModifiers(() => {}, ["stop"])) }, [createElementVNode("div", { ref_key: "thumb", ref: thumb, class: normalizeClass(unref(ns).e("thumb")), style: normalizeStyle(thumbStyle.value), onMousedown: clickThumbHandler }, null, 38)], 34), [[vShow, __props.always || visible.value]])]), _: 1 }, 8, ["name"]); }; } }); //#endregion //#region ../../packages/components/scrollbar/src/thumb.vue var thumb_default = thumb_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/scrollbar/src/bar.vue?vue&type=script&setup=true&lang.ts var bar_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ __name: "bar", props: barProps, setup(__props, { expose: __expose }) { const props = __props; const scrollbar = inject(scrollbarContextKey); const moveX = ref(0); const moveY = ref(0); const sizeWidth = ref(""); const sizeHeight = ref(""); const ratioY = ref(1); const ratioX = ref(1); const handleScroll = (wrap) => { if (wrap) { const offsetHeight = wrap.offsetHeight - 4; const offsetWidth = wrap.offsetWidth - 4; moveY.value = wrap.scrollTop * 100 / offsetHeight * ratioY.value; moveX.value = wrap.scrollLeft * 100 / offsetWidth * ratioX.value; } }; const update = () => { const wrap = scrollbar?.wrapElement; if (!wrap) return; const offsetHeight = wrap.offsetHeight - 4; const offsetWidth = wrap.offsetWidth - 4; const originalHeight = offsetHeight ** 2 / wrap.scrollHeight; const originalWidth = offsetWidth ** 2 / wrap.scrollWidth; const height = Math.max(originalHeight, props.minSize); const width = Math.max(originalWidth, props.minSize); ratioY.value = originalHeight / (offsetHeight - originalHeight) / (height / (offsetHeight - height)); ratioX.value = originalWidth / (offsetWidth - originalWidth) / (width / (offsetWidth - width)); sizeHeight.value = height + 4 < offsetHeight ? `${height}px` : ""; sizeWidth.value = width + 4 < offsetWidth ? `${width}px` : ""; }; __expose({ handleScroll, update }); return (_ctx, _cache) => { return openBlock(), createElementBlock(Fragment, null, [createVNode(thumb_default, { move: moveX.value, ratio: ratioX.value, size: sizeWidth.value, always: __props.always }, null, 8, [ "move", "ratio", "size", "always" ]), createVNode(thumb_default, { move: moveY.value, ratio: ratioY.value, size: sizeHeight.value, vertical: "", always: __props.always }, null, 8, [ "move", "ratio", "size", "always" ])], 64); }; } }); //#endregion //#region ../../packages/components/scrollbar/src/bar.vue var bar_default = bar_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/scrollbar/src/scrollbar.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$76 = ["tabindex"]; const COMPONENT_NAME$17 = "ElScrollbar"; var scrollbar_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: COMPONENT_NAME$17, __name: "scrollbar", props: scrollbarProps, emits: scrollbarEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const ns = useNamespace("scrollbar"); let stopResizeObserver = void 0; let stopWrapResizeObserver = void 0; let stopResizeListener = void 0; let wrapScrollTop = 0; let wrapScrollLeft = 0; let direction = ""; const distanceScrollState = { bottom: false, top: false, right: false, left: false }; const scrollbarRef = ref(); const wrapRef = ref(); const resizeRef = ref(); const barRef = ref(); const wrapStyle = computed(() => { const style = {}; const height = addUnit(props.height); const maxHeight = addUnit(props.maxHeight); if (height) style.height = height; if (maxHeight) style.maxHeight = maxHeight; return [props.wrapStyle, style]; }); const wrapKls = computed(() => { return [ props.wrapClass, ns.e("wrap"), { [ns.em("wrap", "hidden-default")]: !props.native } ]; }); const resizeKls = computed(() => { return [ns.e("view"), props.viewClass]; }); const shouldSkipDirection = (direction) => { return distanceScrollState[direction] ?? false; }; const DIRECTION_PAIRS = { top: "bottom", bottom: "top", left: "right", right: "left" }; const updateTriggerStatus = (arrivedStates) => { const oppositeDirection = DIRECTION_PAIRS[direction]; if (!oppositeDirection) return; const arrived = arrivedStates[direction]; const oppositeArrived = arrivedStates[oppositeDirection]; if (arrived && !distanceScrollState[direction]) distanceScrollState[direction] = true; if (!oppositeArrived && distanceScrollState[oppositeDirection]) distanceScrollState[oppositeDirection] = false; }; const handleScroll = () => { if (wrapRef.value) { barRef.value?.handleScroll(wrapRef.value); const prevTop = wrapScrollTop; const prevLeft = wrapScrollLeft; wrapScrollTop = wrapRef.value.scrollTop; wrapScrollLeft = wrapRef.value.scrollLeft; const arrivedStates = { bottom: !isGreaterThan(wrapRef.value.scrollHeight - props.distance, wrapRef.value.clientHeight + wrapScrollTop), top: wrapScrollTop <= props.distance && prevTop !== 0, right: !isGreaterThan(wrapRef.value.scrollWidth - props.distance, wrapRef.value.clientWidth + wrapScrollLeft) && prevLeft !== wrapScrollLeft, left: wrapScrollLeft <= props.distance && prevLeft !== 0 }; emit("scroll", { scrollTop: wrapScrollTop, scrollLeft: wrapScrollLeft }); if (prevTop !== wrapScrollTop) direction = wrapScrollTop > prevTop ? "bottom" : "top"; if (prevLeft !== wrapScrollLeft) direction = wrapScrollLeft > prevLeft ? "right" : "left"; if (props.distance > 0) { if (shouldSkipDirection(direction)) return; updateTriggerStatus(arrivedStates); } if (arrivedStates[direction]) emit("end-reached", direction); } }; function scrollTo(arg1, arg2) { if (isObject$1(arg1)) wrapRef.value.scrollTo(arg1); else if (isNumber(arg1) && isNumber(arg2)) wrapRef.value.scrollTo(arg1, arg2); } const setScrollTop = (value) => { if (!isNumber(value)) { /* @__PURE__ */ debugWarn(COMPONENT_NAME$17, "value must be a number"); return; } wrapRef.value.scrollTop = value; }; const setScrollLeft = (value) => { if (!isNumber(value)) { /* @__PURE__ */ debugWarn(COMPONENT_NAME$17, "value must be a number"); return; } wrapRef.value.scrollLeft = value; }; const update = () => { barRef.value?.update(); distanceScrollState[direction] = false; if (wrapRef.value) barRef.value?.handleScroll(wrapRef.value); }; watch(() => props.noresize, (noresize) => { if (noresize) { stopResizeObserver?.(); stopWrapResizeObserver?.(); stopResizeListener?.(); } else { ({stop: stopResizeObserver} = useResizeObserver(resizeRef, update)); ({stop: stopWrapResizeObserver} = useResizeObserver(wrapRef, update)); stopResizeListener = useEventListener("resize", update); } }, { immediate: true }); watch(() => [props.maxHeight, props.height], () => { if (!props.native) nextTick(() => { update(); }); }); provide(scrollbarContextKey, reactive({ scrollbarElement: scrollbarRef, wrapElement: wrapRef })); onActivated(() => { if (wrapRef.value) { wrapRef.value.scrollTop = wrapScrollTop; wrapRef.value.scrollLeft = wrapScrollLeft; } }); onMounted(() => { if (!props.native) nextTick(() => { update(); }); }); onUpdated(() => update()); __expose({ /** @description scrollbar wrap ref */ wrapRef, /** @description update scrollbar state manually */ update, /** @description scrolls to a particular set of coordinates */ scrollTo, /** @description set distance to scroll top */ setScrollTop, /** @description set distance to scroll left */ setScrollLeft, /** @description handle scroll event */ handleScroll }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { ref_key: "scrollbarRef", ref: scrollbarRef, class: normalizeClass(unref(ns).b()) }, [createElementVNode("div", { ref_key: "wrapRef", ref: wrapRef, class: normalizeClass(wrapKls.value), style: normalizeStyle(wrapStyle.value), tabindex: __props.tabindex, onScroll: handleScroll }, [(openBlock(), createBlock(resolveDynamicComponent(__props.tag), { id: __props.id, ref_key: "resizeRef", ref: resizeRef, class: normalizeClass(resizeKls.value), style: normalizeStyle(__props.viewStyle), role: __props.role, "aria-label": __props.ariaLabel, "aria-orientation": __props.ariaOrientation }, { default: withCtx(() => [renderSlot(_ctx.$slots, "default")]), _: 3 }, 8, [ "id", "class", "style", "role", "aria-label", "aria-orientation" ]))], 46, _hoisted_1$76), !__props.native ? (openBlock(), createBlock(bar_default, { key: 0, ref_key: "barRef", ref: barRef, always: __props.always, "min-size": __props.minSize }, null, 8, ["always", "min-size"])) : createCommentVNode("v-if", true)], 2); }; } }); //#endregion //#region ../../packages/components/scrollbar/src/scrollbar.vue var scrollbar_default = scrollbar_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/scrollbar/index.ts const ElScrollbar = withInstall(scrollbar_default); //#endregion //#region ../../packages/components/autocomplete/src/autocomplete.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$75 = ["aria-expanded", "aria-owns"]; const _hoisted_2$42 = { key: 0 }; const _hoisted_3$19 = [ "id", "aria-selected", "onClick" ]; const COMPONENT_NAME$16 = "ElAutocomplete"; var autocomplete_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: COMPONENT_NAME$16, inheritAttrs: false, __name: "autocomplete", props: autocompleteProps, emits: autocompleteEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const passInputProps = computed(() => { const inputProps = ElInput.props ?? []; return pick(props, isArray$1(inputProps) ? inputProps : Object.keys(inputProps)); }); const rawAttrs = useAttrs$1(); const disabled = useFormDisabled(); const ns = useNamespace("autocomplete"); const inputRef = ref(); const regionRef = ref(); const popperRef = ref(); const listboxRef = ref(); let readonly = false; let ignoreFocusEvent = false; const suggestions = ref([]); const highlightedIndex = ref(-1); const dropdownWidth = ref(""); const activated = ref(false); const suggestionDisabled = ref(false); const loading = ref(false); const listboxId = useId(); const styles = computed(() => rawAttrs.style); const suggestionVisible = computed(() => { return (suggestions.value.length > 0 || loading.value) && activated.value; }); const suggestionLoading = computed(() => !props.hideLoading && loading.value); const refInput = computed(() => { if (inputRef.value) return Array.from(inputRef.value.$el.querySelectorAll("input")); return []; }); const onSuggestionShow = () => { if (suggestionVisible.value) dropdownWidth.value = `${inputRef.value.$el.offsetWidth}px`; }; const onHide = () => { highlightedIndex.value = -1; }; const getData = async (queryString) => { if (suggestionDisabled.value) return; const cb = (suggestionList) => { loading.value = false; if (suggestionDisabled.value) return; if (isArray$1(suggestionList)) { suggestions.value = suggestionList; highlightedIndex.value = props.highlightFirstItem ? 0 : -1; } else throwError(COMPONENT_NAME$16, "autocomplete suggestions must be an array"); }; loading.value = true; if (isArray$1(props.fetchSuggestions)) cb(props.fetchSuggestions); else { const result = await props.fetchSuggestions(queryString, cb); if (isArray$1(result)) cb(result); } }; const debouncedGetData = useDebounceFn(getData, computed(() => props.debounce)); const handleInput = (value) => { const valuePresented = !!value; emit(INPUT_EVENT, value); emit(UPDATE_MODEL_EVENT, value); suggestionDisabled.value = false; activated.value ||= valuePresented; if (!props.triggerOnFocus && !value) { suggestionDisabled.value = true; suggestions.value = []; return; } debouncedGetData(value); }; const handleMouseDown = (event) => { if (disabled.value) return; if (event.target?.tagName !== "INPUT" || refInput.value.includes(document.activeElement)) activated.value = true; }; const handleChange = (value) => { emit(CHANGE_EVENT, value); }; const handleFocus = (evt) => { if (!ignoreFocusEvent) { activated.value = true; emit("focus", evt); const queryString = props.modelValue ?? ""; if (props.triggerOnFocus && !readonly) debouncedGetData(String(queryString)); } else ignoreFocusEvent = false; }; const handleBlur = (evt) => { setTimeout(() => { if (popperRef.value?.isFocusInsideContent()) { ignoreFocusEvent = true; return; } activated.value && close(); emit("blur", evt); }); }; const handleClear = () => { activated.value = false; emit(UPDATE_MODEL_EVENT, ""); emit("clear"); }; const handleKeyEnter = async () => { if (inputRef.value?.isComposing) return; if (suggestionVisible.value && highlightedIndex.value >= 0 && highlightedIndex.value < suggestions.value.length) handleSelect(suggestions.value[highlightedIndex.value]); else { if (props.selectWhenUnmatched) { emit("select", { value: props.modelValue }); suggestions.value = []; highlightedIndex.value = -1; } activated.value = true; debouncedGetData(String(props.modelValue)); } }; const handleKeyEscape = (evt) => { if (suggestionVisible.value) { evt.preventDefault(); evt.stopPropagation(); close(); } }; const close = () => { activated.value = false; }; const focus = () => { inputRef.value?.focus(); }; const blur = () => { inputRef.value?.blur(); }; const handleSelect = async (item) => { emit(INPUT_EVENT, item[props.valueKey]); emit(UPDATE_MODEL_EVENT, item[props.valueKey]); emit("select", item); suggestions.value = []; highlightedIndex.value = -1; }; const highlight = (index) => { if (!suggestionVisible.value || loading.value) return; if (index < 0) { if (!props.loopNavigation) { highlightedIndex.value = -1; return; } index = suggestions.value.length - 1; } if (index >= suggestions.value.length) index = props.loopNavigation ? 0 : suggestions.value.length - 1; const [suggestion, suggestionList] = getSuggestionContext(); const highlightItem = suggestionList[index]; const scrollTop = suggestion.scrollTop; const { offsetTop, scrollHeight } = highlightItem; if (offsetTop + scrollHeight > scrollTop + suggestion.clientHeight) suggestion.scrollTop = offsetTop + scrollHeight - suggestion.clientHeight; if (offsetTop < scrollTop) suggestion.scrollTop = offsetTop; highlightedIndex.value = index; inputRef.value?.ref?.setAttribute("aria-activedescendant", `${listboxId.value}-item-${highlightedIndex.value}`); }; const getSuggestionContext = () => { const suggestion = regionRef.value.querySelector(`.${ns.be("suggestion", "wrap")}`); return [suggestion, suggestion.querySelectorAll(`.${ns.be("suggestion", "list")} li`)]; }; const stopHandle = onClickOutside(listboxRef, (event) => { if (popperRef.value?.isFocusInsideContent()) return; const hadIgnoredFocus = ignoreFocusEvent; ignoreFocusEvent = false; if (!suggestionVisible.value) return; if (hadIgnoredFocus) handleBlur(new FocusEvent("blur", event)); else close(); }); const handleKeydown = (e) => { switch (getEventCode(e)) { case EVENT_CODE.up: e.preventDefault(); highlight(highlightedIndex.value - 1); break; case EVENT_CODE.down: e.preventDefault(); highlight(highlightedIndex.value + 1); break; case EVENT_CODE.enter: case EVENT_CODE.numpadEnter: e.preventDefault(); handleKeyEnter(); break; case EVENT_CODE.tab: close(); break; case EVENT_CODE.esc: handleKeyEscape(e); break; case EVENT_CODE.home: e.preventDefault(); highlight(0); break; case EVENT_CODE.end: e.preventDefault(); highlight(suggestions.value.length - 1); break; case EVENT_CODE.pageUp: e.preventDefault(); highlight(Math.max(0, highlightedIndex.value - 10)); break; case EVENT_CODE.pageDown: e.preventDefault(); highlight(Math.min(suggestions.value.length - 1, highlightedIndex.value + 10)); break; } }; onBeforeUnmount(() => { stopHandle?.(); }); onMounted(() => { const inputElement = inputRef.value?.ref; if (!inputElement) return; [ { key: "role", value: "textbox" }, { key: "aria-autocomplete", value: "list" }, { key: "aria-controls", value: listboxId.value }, { key: "aria-activedescendant", value: `${listboxId.value}-item-${highlightedIndex.value}` } ].forEach(({ key, value }) => inputElement.setAttribute(key, value)); readonly = inputElement.hasAttribute("readonly"); }); __expose({ /** @description the index of the currently highlighted item */ highlightedIndex, /** @description autocomplete whether activated */ activated, /** @description remote search loading status */ loading, /** @description el-input component instance */ inputRef, /** @description el-tooltip component instance */ popperRef, /** @description fetch suggestions result */ suggestions, /** @description triggers when a suggestion is clicked */ handleSelect, /** @description handle keyboard enter event */ handleKeyEnter, /** @description focus the input element */ focus, /** @description blur the input element */ blur, /** @description close suggestion */ close, /** @description highlight an item in a suggestion */ highlight, /** @description loading suggestion list */ getData }); return (_ctx, _cache) => { return openBlock(), createBlock(unref(ElTooltip), { ref_key: "popperRef", ref: popperRef, visible: suggestionVisible.value, placement: __props.placement, "fallback-placements": ["bottom-start", "top-start"], "popper-class": [unref(ns).e("popper"), __props.popperClass], "popper-style": __props.popperStyle, "popper-options": __props.popperOptions, "show-arrow": __props.showArrow, teleported: __props.teleported, "append-to": __props.appendTo, "gpu-acceleration": false, pure: "", "manual-mode": "", effect: "light", trigger: "click", transition: `${unref(ns).namespace.value}-zoom-in-top`, persistent: "", role: "listbox", onBeforeShow: onSuggestionShow, onHide }, { content: withCtx(() => [createElementVNode("div", { ref_key: "regionRef", ref: regionRef, class: normalizeClass([unref(ns).b("suggestion"), unref(ns).is("loading", suggestionLoading.value)]), style: normalizeStyle({ [__props.fitInputWidth ? "width" : "minWidth"]: dropdownWidth.value, outline: "none" }), role: "region" }, [ _ctx.$slots.header ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ns).be("suggestion", "header")), onClick: _cache[0] || (_cache[0] = withModifiers(() => {}, ["stop"])) }, [renderSlot(_ctx.$slots, "header")], 2)) : createCommentVNode("v-if", true), createVNode(unref(ElScrollbar), { id: unref(listboxId), tag: "ul", "wrap-class": unref(ns).be("suggestion", "wrap"), "view-class": unref(ns).be("suggestion", "list"), role: "listbox" }, { default: withCtx(() => [suggestionLoading.value ? (openBlock(), createElementBlock("li", _hoisted_2$42, [renderSlot(_ctx.$slots, "loading", {}, () => [createVNode(unref(ElIcon), { class: normalizeClass(unref(ns).is("loading")) }, { default: withCtx(() => [createVNode(unref(loading_default))]), _: 1 }, 8, ["class"])])])) : (openBlock(true), createElementBlock(Fragment, { key: 1 }, renderList(suggestions.value, (item, index) => { return openBlock(), createElementBlock("li", { id: `${unref(listboxId)}-item-${index}`, key: index, class: normalizeClass({ highlighted: highlightedIndex.value === index }), role: "option", "aria-selected": highlightedIndex.value === index, onClick: ($event) => handleSelect(item) }, [renderSlot(_ctx.$slots, "default", { item }, () => [createTextVNode(toDisplayString(item[__props.valueKey]), 1)])], 10, _hoisted_3$19); }), 128))]), _: 3 }, 8, [ "id", "wrap-class", "view-class" ]), _ctx.$slots.footer ? (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass(unref(ns).be("suggestion", "footer")), onClick: _cache[1] || (_cache[1] = withModifiers(() => {}, ["stop"])) }, [renderSlot(_ctx.$slots, "footer")], 2)) : createCommentVNode("v-if", true) ], 6)]), default: withCtx(() => [createElementVNode("div", { ref_key: "listboxRef", ref: listboxRef, class: normalizeClass([unref(ns).b(), _ctx.$attrs.class]), style: normalizeStyle(styles.value), role: "combobox", "aria-haspopup": "listbox", "aria-expanded": suggestionVisible.value, "aria-owns": unref(listboxId) }, [createVNode(unref(ElInput), mergeProps({ ref_key: "inputRef", ref: inputRef }, mergeProps(passInputProps.value, _ctx.$attrs), { "model-value": __props.modelValue, disabled: unref(disabled), onInput: handleInput, onChange: handleChange, onFocus: handleFocus, onBlur: handleBlur, onClear: handleClear, onKeydown: handleKeydown, onMousedown: handleMouseDown }), createSlots({ _: 2 }, [ _ctx.$slots.prepend ? { name: "prepend", fn: withCtx(() => [renderSlot(_ctx.$slots, "prepend")]), key: "0" } : void 0, _ctx.$slots.append ? { name: "append", fn: withCtx(() => [renderSlot(_ctx.$slots, "append")]), key: "1" } : void 0, _ctx.$slots.prefix ? { name: "prefix", fn: withCtx(() => [renderSlot(_ctx.$slots, "prefix")]), key: "2" } : void 0, _ctx.$slots.suffix ? { name: "suffix", fn: withCtx(() => [renderSlot(_ctx.$slots, "suffix")]), key: "3" } : void 0 ]), 1040, ["model-value", "disabled"])], 14, _hoisted_1$75)]), _: 3 }, 8, [ "visible", "placement", "popper-class", "popper-style", "popper-options", "show-arrow", "teleported", "append-to", "transition" ]); }; } }); //#endregion //#region ../../packages/components/autocomplete/src/autocomplete.vue var autocomplete_default = autocomplete_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/autocomplete/index.ts const ElAutocomplete = withInstall(autocomplete_default); //#endregion //#region ../../packages/components/avatar/src/avatar.ts /** * @deprecated Removed after 3.0.0, Use `AvatarProps` instead. */ const avatarProps = buildProps({ /** * @description avatar size. */ size: { type: [Number, String], values: componentSizes, validator: (val) => isNumber(val) }, /** * @description avatar shape. */ shape: { type: String, values: ["circle", "square"] }, /** * @description representation type to icon, more info on icon component. */ icon: { type: iconPropType }, /** * @description the source of the image for an image avatar. */ src: { type: String, default: "" }, /** * @description native attribute `alt` of image avatar. */ alt: String, /** * @description native attribute srcset of image avatar. */ srcSet: String, /** * @description set how the image fit its container for an image avatar. */ fit: { type: definePropType(String), default: "cover" } }); const avatarEmits = { error: (evt) => evt instanceof Event }; //#endregion //#region ../../packages/components/avatar/src/constants.ts const avatarGroupContextKey = Symbol("avatarGroupContextKey"); //#endregion //#region ../../packages/components/avatar/src/avatar.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$74 = [ "src", "alt", "srcset" ]; var avatar_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElAvatar", __name: "avatar", props: avatarProps, emits: avatarEmits, setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const avatarGroupContext = inject(avatarGroupContextKey, void 0); const ns = useNamespace("avatar"); const hasLoadError = ref(false); const size = computed(() => props.size ?? avatarGroupContext?.size); const shape = computed(() => props.shape ?? avatarGroupContext?.shape ?? "circle"); const avatarClass = computed(() => { const { icon } = props; const classList = [ns.b()]; if (isString(size.value)) classList.push(ns.m(size.value)); if (icon) classList.push(ns.m("icon")); if (shape.value) classList.push(ns.m(shape.value)); return classList; }); const sizeStyle = computed(() => { return isNumber(size.value) ? ns.cssVarBlock({ size: addUnit(size.value) }) : void 0; }); const fitStyle = computed(() => ({ objectFit: props.fit })); watch(() => [props.src, props.srcSet], () => hasLoadError.value = false); function handleError(e) { hasLoadError.value = true; emit("error", e); } return (_ctx, _cache) => { return openBlock(), createElementBlock("span", { class: normalizeClass(avatarClass.value), style: normalizeStyle(sizeStyle.value) }, [(__props.src || __props.srcSet) && !hasLoadError.value ? (openBlock(), createElementBlock("img", { key: 0, src: __props.src, alt: __props.alt, srcset: __props.srcSet, style: normalizeStyle(fitStyle.value), onError: handleError }, null, 44, _hoisted_1$74)) : __props.icon ? (openBlock(), createBlock(unref(ElIcon), { key: 1 }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(__props.icon)))]), _: 1 })) : renderSlot(_ctx.$slots, "default", { key: 2 })], 6); }; } }); //#endregion //#region ../../packages/components/avatar/src/avatar.vue var avatar_default = avatar_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/avatar/src/avatar-group-props.ts const avatarGroupProps = { /** * @description control the size of avatars in this avatar-group */ size: { type: definePropType([Number, String]), values: componentSizes, validator: (val) => isNumber(val) }, /** * @description control the shape of avatars in this avatar-group */ shape: { type: definePropType(String), values: ["circle", "square"] }, /** * @description whether to collapse avatars */ collapseAvatars: Boolean, /** * @description whether show all collapsed avatars when mouse hover text of the collapse-avatar. To use this, `collapse-avatars` must be true */ collapseAvatarsTooltip: Boolean, /** * @description the max avatars number to be shown. To use this, `collapse-avatars` must be true */ maxCollapseAvatars: { type: Number, default: 1 }, /** * @description tooltip theme, built-in theme: `dark` / `light` */ effect: { type: definePropType(String), default: "light" }, /** * @description placement of tooltip */ placement: { type: definePropType(String), values: Ee, default: "top" }, /** * @description custom class name for tooltip */ popperClass: useTooltipContentProps.popperClass, /** * @description custom style for tooltip */ popperStyle: useTooltipContentProps.popperStyle, /** * @description custom class name for the collapse-avatar */ collapseClass: String, /** * @description custom style for the collapse-avatar */ collapseStyle: { type: definePropType([ String, Array, Object, Boolean ]), default: void 0 } }; //#endregion //#region ../../packages/components/avatar/src/avatar-group.tsx var avatar_group_default = /* @__PURE__ */ defineComponent({ name: "ElAvatarGroup", props: avatarGroupProps, setup(props, { slots }) { const ns = useNamespace("avatar-group"); provide(avatarGroupContextKey, reactive({ size: toRef(props, "size"), shape: toRef(props, "shape") })); return () => { const avatars = flattedChildren(slots.default?.() ?? []); let visibleAvatars = avatars; if (props.collapseAvatars && avatars.length > props.maxCollapseAvatars) { visibleAvatars = avatars.slice(0, props.maxCollapseAvatars); const hiddenAvatars = avatars.slice(props.maxCollapseAvatars); visibleAvatars.push(createVNode(ElTooltip, { "popperClass": props.popperClass, "popperStyle": props.popperStyle, "placement": props.placement, "effect": props.effect, "disabled": !props.collapseAvatarsTooltip }, { default: () => createVNode(avatar_default, { "size": props.size, "shape": props.shape, "class": props.collapseClass, "style": props.collapseStyle }, { default: () => [createTextVNode("+ "), hiddenAvatars.length] }), content: () => createVNode("div", { "class": ns.e("collapse-avatars") }, [hiddenAvatars.map((node, idx) => isVNode(node) ? cloneVNode(node, { key: node.key ?? idx }) : node)]) })); } return createVNode("div", { "class": ns.b() }, [visibleAvatars]); }; } }); //#endregion //#region ../../packages/components/avatar/index.ts const ElAvatar = withInstall(avatar_default, { AvatarGroup: avatar_group_default }); const ElAvatarGroup = withNoopInstall(avatar_group_default); //#endregion //#region ../../packages/components/backtop/src/backtop.ts /** * @deprecated Removed after 3.0.0, Use `BacktopProps` instead. */ const backtopProps = { /** * @description the button will not show until the scroll height reaches this value. */ visibilityHeight: { type: Number, default: 200 }, /** * @description the target to trigger scroll. */ target: { type: String, default: "" }, /** * @description right distance. */ right: { type: Number, default: 40 }, /** * @description bottom distance. */ bottom: { type: Number, default: 40 } }; const backtopEmits = { click: (evt) => evt instanceof MouseEvent }; //#endregion //#region ../../packages/components/backtop/src/use-backtop.ts const useBackTop = (props, emit, componentName) => { const el = shallowRef(); const container = shallowRef(); const visible = ref(false); const handleScroll = () => { if (el.value) visible.value = el.value.scrollTop >= props.visibilityHeight; }; const handleClick = (event) => { el.value?.scrollTo({ top: 0, behavior: "smooth" }); emit("click", event); }; useEventListener(container, "scroll", useThrottleFn(handleScroll, 300, true)); onMounted(() => { container.value = document; el.value = document.documentElement; if (props.target) { el.value = document.querySelector(props.target) ?? void 0; if (!el.value) throwError(componentName, `target does not exist: ${props.target}`); container.value = el.value; } handleScroll(); }); return { visible, handleClick }; }; //#endregion //#region ../../packages/components/backtop/src/backtop.vue?vue&type=script&setup=true&lang.ts const COMPONENT_NAME$15 = "ElBacktop"; var backtop_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: COMPONENT_NAME$15, __name: "backtop", props: backtopProps, emits: backtopEmits, setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const ns = useNamespace("backtop"); const { handleClick, visible } = useBackTop(props, emit, COMPONENT_NAME$15); const backTopStyle = computed(() => ({ right: `${props.right}px`, bottom: `${props.bottom}px` })); return (_ctx, _cache) => { return openBlock(), createBlock(Transition, { name: `${unref(ns).namespace.value}-fade-in` }, { default: withCtx(() => [unref(visible) ? (openBlock(), createElementBlock("div", { key: 0, style: normalizeStyle(backTopStyle.value), class: normalizeClass(unref(ns).b()), onClick: _cache[0] || (_cache[0] = withModifiers((...args) => unref(handleClick) && unref(handleClick)(...args), ["stop"])) }, [renderSlot(_ctx.$slots, "default", {}, () => [createVNode(unref(ElIcon), { class: normalizeClass(unref(ns).e("icon")) }, { default: withCtx(() => [createVNode(unref(caret_top_default))]), _: 1 }, 8, ["class"])])], 6)) : createCommentVNode("v-if", true)]), _: 3 }, 8, ["name"]); }; } }); //#endregion //#region ../../packages/components/backtop/src/backtop.vue var backtop_default = backtop_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/backtop/index.ts const ElBacktop = withInstall(backtop_default); //#endregion //#region ../../packages/components/badge/src/badge.ts /** * @deprecated Removed after 3.0.0, Use `BadgeProps` instead. */ const badgeProps = buildProps({ /** * @description display value. */ value: { type: [String, Number], default: "" }, /** * @description maximum value, shows `{max}+` when exceeded. Only works if value is a number. */ max: { type: Number, default: 99 }, /** * @description if a little dot is displayed. */ isDot: Boolean, /** * @description hidden badge. */ hidden: Boolean, /** * @description badge type. */ type: { type: String, values: [ "primary", "success", "warning", "info", "danger" ], default: "danger" }, /** * @description whether to show badge when value is zero. */ showZero: { type: Boolean, default: true }, /** * @description customize dot background color */ color: String, /** * @description CSS style of badge */ badgeStyle: { type: definePropType([ String, Object, Array, Boolean ]), default: void 0 }, /** * @description set offset of the badge */ offset: { type: definePropType(Array), default: () => [0, 0] }, /** * @description custom class name of badge */ badgeClass: { type: String } }); //#endregion //#region ../../packages/components/badge/src/badge.vue?vue&type=script&setup=true&lang.ts var badge_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElBadge", __name: "badge", props: badgeProps, setup(__props, { expose: __expose }) { const props = __props; const ns = useNamespace("badge"); const content = computed(() => { if (props.isDot) return ""; if (isNumber(props.value) && isNumber(props.max)) return props.max < props.value ? `${props.max}+` : `${props.value}`; return `${props.value}`; }); const style = computed(() => { return [{ backgroundColor: props.color, marginRight: addUnit(-props.offset[0]), marginTop: addUnit(props.offset[1]) }, props.badgeStyle ?? {}]; }); __expose({ /** @description badge content */ content }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass(unref(ns).b()) }, [renderSlot(_ctx.$slots, "default"), createVNode(Transition, { name: `${unref(ns).namespace.value}-zoom-in-center` }, { default: withCtx(() => [!__props.hidden && (content.value || __props.isDot || _ctx.$slots.content) ? (openBlock(), createElementBlock("sup", { key: 0, class: normalizeClass([ unref(ns).e("content"), unref(ns).em("content", __props.type), unref(ns).is("fixed", !!_ctx.$slots.default), unref(ns).is("dot", __props.isDot), unref(ns).is("hide-zero", !__props.showZero && __props.value === 0), __props.badgeClass ]), style: normalizeStyle(style.value) }, [renderSlot(_ctx.$slots, "content", { value: content.value }, () => [createTextVNode(toDisplayString(content.value), 1)])], 6)) : createCommentVNode("v-if", true)]), _: 3 }, 8, ["name"])], 2); }; } }); //#endregion //#region ../../packages/components/badge/src/badge.vue var badge_default = badge_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/badge/index.ts const ElBadge = withInstall(badge_default); //#endregion //#region ../../packages/components/breadcrumb/src/breadcrumb.ts /** * @deprecated Removed after 3.0.0, Use `BreadcrumbProps` instead. */ const breadcrumbProps = buildProps({ /** * @description separator character */ separator: { type: String, default: "/" }, /** * @description icon component of icon separator */ separatorIcon: { type: iconPropType } }); //#endregion //#region ../../packages/components/breadcrumb/src/constants.ts const breadcrumbKey = Symbol("breadcrumbKey"); //#endregion //#region ../../packages/components/breadcrumb/src/breadcrumb.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$73 = ["aria-label"]; var breadcrumb_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElBreadcrumb", __name: "breadcrumb", props: breadcrumbProps, setup(__props) { const { t } = useLocale(); const props = __props; const ns = useNamespace("breadcrumb"); const breadcrumb = ref(); provide(breadcrumbKey, props); onMounted(() => { const items = breadcrumb.value.querySelectorAll(`.${ns.e("item")}`); if (items.length) items[items.length - 1].setAttribute("aria-current", "page"); }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { ref_key: "breadcrumb", ref: breadcrumb, class: normalizeClass(unref(ns).b()), "aria-label": unref(t)("el.breadcrumb.label"), role: "navigation" }, [renderSlot(_ctx.$slots, "default")], 10, _hoisted_1$73); }; } }); //#endregion //#region ../../packages/components/breadcrumb/src/breadcrumb.vue var breadcrumb_default = breadcrumb_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/breadcrumb/src/breadcrumb-item.ts /** * @deprecated Removed after 3.0.0, Use `BreadcrumbItemProps` instead. */ const breadcrumbItemProps = buildProps({ /** * @description target route of the link, same as `to` of `vue-router` */ to: { type: definePropType([String, Object]), default: "" }, /** * @description if `true`, the navigation will not leave a history record */ replace: Boolean }); //#endregion //#region ../../packages/components/breadcrumb/src/breadcrumb-item.vue?vue&type=script&setup=true&lang.ts var breadcrumb_item_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElBreadcrumbItem", __name: "breadcrumb-item", props: breadcrumbItemProps, setup(__props) { const props = __props; const instance = getCurrentInstance(); const breadcrumbContext = inject(breadcrumbKey, void 0); const ns = useNamespace("breadcrumb"); const router = instance.appContext.config.globalProperties.$router; const onClick = () => { if (!props.to || !router) return; props.replace ? router.replace(props.to) : router.push(props.to); }; return (_ctx, _cache) => { return openBlock(), createElementBlock("span", { class: normalizeClass(unref(ns).e("item")) }, [createElementVNode("span", { class: normalizeClass([unref(ns).e("inner"), unref(ns).is("link", !!__props.to)]), role: "link", onClick }, [renderSlot(_ctx.$slots, "default")], 2), unref(breadcrumbContext)?.separatorIcon ? (openBlock(), createBlock(unref(ElIcon), { key: 0, class: normalizeClass(unref(ns).e("separator")) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(unref(breadcrumbContext).separatorIcon)))]), _: 1 }, 8, ["class"])) : (openBlock(), createElementBlock("span", { key: 1, class: normalizeClass(unref(ns).e("separator")), role: "presentation" }, toDisplayString(unref(breadcrumbContext)?.separator), 3))], 2); }; } }); //#endregion //#region ../../packages/components/breadcrumb/src/breadcrumb-item.vue var breadcrumb_item_default = breadcrumb_item_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/breadcrumb/index.ts const ElBreadcrumb = withInstall(breadcrumb_default, { BreadcrumbItem: breadcrumb_item_default }); const ElBreadcrumbItem = withNoopInstall(breadcrumb_item_default); //#endregion //#region ../../packages/components/button/src/button.ts const buttonTypes = [ "default", "primary", "success", "warning", "info", "danger", "text", "" ]; const buttonNativeTypes = [ "button", "submit", "reset" ]; /** * @deprecated Removed after 3.0.0, Use `ButtonProps` instead. */ const buttonProps = buildProps({ /** * @description button size */ size: useSizeProp, /** * @description disable the button */ disabled: { type: Boolean, default: void 0 }, /** * @description button type */ type: { type: String, values: buttonTypes, default: "" }, /** * @description icon component */ icon: { type: iconPropType }, /** * @description native button type */ nativeType: { type: String, values: buttonNativeTypes, default: "button" }, /** * @description determine whether it's loading */ loading: Boolean, /** * @description customize loading icon component */ loadingIcon: { type: iconPropType, default: () => loading_default }, /** * @description determine whether it's a plain button */ plain: { type: Boolean, default: void 0 }, /** * @description determine whether it's a text button */ text: { type: Boolean, default: void 0 }, /** * @description determine whether it's a link button */ link: Boolean, /** * @description determine whether the text button background color is always on */ bg: Boolean, /** * @description native button autofocus */ autofocus: Boolean, /** * @description determine whether it's a round button */ round: { type: Boolean, default: void 0 }, /** * @description determine whether it's a circle button */ circle: Boolean, /** * @description determine whether it's a dashed button */ dashed: { type: Boolean, default: void 0 }, /** * @description custom button color, automatically calculate `hover` and `active` color */ color: String, /** * @description dark mode, which automatically converts `color` to dark mode colors */ dark: Boolean, /** * @description automatically insert a space between two chinese characters */ autoInsertSpace: { type: Boolean, default: void 0 }, /** * @description custom element tag */ tag: { type: definePropType([String, Object]), default: "button" } }); const buttonEmits = { click: (evt) => evt instanceof MouseEvent }; //#endregion //#region ../../packages/components/button/src/constants.ts const buttonGroupContextKey = Symbol("buttonGroupContextKey"); //#endregion //#region ../../packages/components/button/src/use-button.ts const useButton = (props, emit) => { useDeprecated({ from: "type.text", replacement: "link", version: "3.0.0", scope: "props", ref: "https://element-plus.org/en-US/component/button.html#button-attributes" }, computed(() => props.type === "text")); const buttonGroupContext = inject(buttonGroupContextKey, void 0); const globalConfig = useGlobalConfig("button"); const { form } = useFormItem(); const _size = useFormSize(computed(() => buttonGroupContext?.size)); const _disabled = useFormDisabled(); const _ref = ref(); const slots = useSlots(); const _type = computed(() => props.type || buttonGroupContext?.type || globalConfig.value?.type || ""); const autoInsertSpace = computed(() => props.autoInsertSpace ?? globalConfig.value?.autoInsertSpace ?? false); const _plain = computed(() => props.plain ?? globalConfig.value?.plain ?? false); const _round = computed(() => props.round ?? globalConfig.value?.round ?? false); const _text = computed(() => props.text ?? globalConfig.value?.text ?? false); const _dashed = computed(() => props.dashed ?? globalConfig.value?.dashed ?? false); const _props = computed(() => { if (props.tag === "button") return { ariaDisabled: _disabled.value || props.loading, disabled: _disabled.value || props.loading, autofocus: props.autofocus, type: props.nativeType }; return {}; }); const shouldAddSpace = computed(() => { const defaultSlot = slots.default?.(); if (autoInsertSpace.value && defaultSlot?.length === 1) { const slot = defaultSlot[0]; if (slot?.type === Text) { const text = slot.children; return /^\p{Unified_Ideograph}{2}$/u.test(text.trim()); } } return false; }); const handleClick = (evt) => { if (_disabled.value || props.loading) { evt.stopPropagation(); return; } if (props.nativeType === "reset") form?.resetFields(); emit("click", evt); }; return { _disabled, _size, _type, _ref, _props, _plain, _round, _text, _dashed, shouldAddSpace, handleClick }; }; //#endregion //#region ../../node_modules/.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor/dist/module/util.js /** * Take input from [0, n] and return it as [0, 1] * @hidden */ function bound01(n, max) { if (isOnePointZero(n)) n = "100%"; const isPercent = isPercentage(n); n = max === 360 ? n : Math.min(max, Math.max(0, parseFloat(n))); if (isPercent) n = parseInt(String(n * max), 10) / 100; if (Math.abs(n - max) < 1e-6) return 1; if (max === 360) n = (n < 0 ? n % max + max : n % max) / parseFloat(String(max)); else n = n % max / parseFloat(String(max)); return n; } /** * Force a number between 0 and 1 * @hidden */ function clamp01(val) { return Math.min(1, Math.max(0, val)); } /** * Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1 * * @hidden */ function isOnePointZero(n) { return typeof n === "string" && n.indexOf(".") !== -1 && parseFloat(n) === 1; } /** * Check to see if string passed in is a percentage * @hidden */ function isPercentage(n) { return typeof n === "string" && n.indexOf("%") !== -1; } /** * Return a valid alpha value [0,1] with all invalid values being set to 1 * @hidden */ function boundAlpha(a) { a = parseFloat(a); if (isNaN(a) || a < 0 || a > 1) a = 1; return a; } /** * Replace a decimal with it's percentage value * @hidden */ function convertToPercentage(n) { if (Number(n) <= 1) return `${Number(n) * 100}%`; return n; } /** * Force a hex value to have 2 characters * @hidden */ function pad2(c) { return c.length === 1 ? "0" + c : String(c); } //#endregion //#region ../../node_modules/.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor/dist/module/conversion.js /** * Handle bounds / percentage checking to conform to CSS color spec * * *Assumes:* r, g, b in [0, 255] or [0, 1] * *Returns:* { r, g, b } in [0, 255] */ function rgbToRgb(r, g, b) { return { r: bound01(r, 255) * 255, g: bound01(g, 255) * 255, b: bound01(b, 255) * 255 }; } /** * Converts an RGB color value to HSL. * *Assumes:* r, g, and b are contained in [0, 255] or [0, 1] * *Returns:* { h, s, l } in [0,1] */ function rgbToHsl(r, g, b) { r = bound01(r, 255); g = bound01(g, 255); b = bound01(b, 255); const max = Math.max(r, g, b); const min = Math.min(r, g, b); let h = 0; let s = 0; const l = (max + min) / 2; if (max === min) { s = 0; h = 0; } else { const d = max - min; s = l > .5 ? d / (2 - max - min) : d / (max + min); switch (max) { case r: h = (g - b) / d + (g < b ? 6 : 0); break; case g: h = (b - r) / d + 2; break; case b: h = (r - g) / d + 4; break; default: break; } h /= 6; } return { h, s, l }; } function hue2rgb(p, q, t) { if (t < 0) t += 1; if (t > 1) t -= 1; if (t < 1 / 6) return p + (q - p) * (6 * t); if (t < 1 / 2) return q; if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; return p; } /** * Converts an HSL color value to RGB. * * *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100] * *Returns:* { r, g, b } in the set [0, 255] */ function hslToRgb(h, s, l) { let r; let g; let b; h = bound01(h, 360); s = bound01(s, 100); l = bound01(l, 100); if (s === 0) { g = l; b = l; r = l; } else { const q = l < .5 ? l * (1 + s) : l + s - l * s; const p = 2 * l - q; r = hue2rgb(p, q, h + 1 / 3); g = hue2rgb(p, q, h); b = hue2rgb(p, q, h - 1 / 3); } return { r: r * 255, g: g * 255, b: b * 255 }; } /** * Converts an RGB color value to HSV * * *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1] * *Returns:* { h, s, v } in [0,1] */ function rgbToHsv(r, g, b) { r = bound01(r, 255); g = bound01(g, 255); b = bound01(b, 255); const max = Math.max(r, g, b); const min = Math.min(r, g, b); let h = 0; const v = max; const d = max - min; const s = max === 0 ? 0 : d / max; if (max === min) h = 0; else { switch (max) { case r: h = (g - b) / d + (g < b ? 6 : 0); break; case g: h = (b - r) / d + 2; break; case b: h = (r - g) / d + 4; break; default: break; } h /= 6; } return { h, s, v }; } /** * Converts an HSV color value to RGB. * * *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100] * *Returns:* { r, g, b } in the set [0, 255] */ function hsvToRgb(h, s, v) { h = bound01(h, 360) * 6; s = bound01(s, 100); v = bound01(v, 100); const i = Math.floor(h); const f = h - i; const p = v * (1 - s); const q = v * (1 - f * s); const t = v * (1 - (1 - f) * s); const mod = i % 6; const r = [ v, q, p, p, t, v ][mod]; const g = [ t, v, v, q, p, p ][mod]; const b = [ p, p, t, v, v, q ][mod]; return { r: r * 255, g: g * 255, b: b * 255 }; } /** * Converts an RGB color to hex * * *Assumes:* r, g, and b are contained in the set [0, 255] * *Returns:* a 3 or 6 character hex */ function rgbToHex(r, g, b, allow3Char) { const hex = [ pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16)) ]; if (allow3Char && hex[0].startsWith(hex[0].charAt(1)) && hex[1].startsWith(hex[1].charAt(1)) && hex[2].startsWith(hex[2].charAt(1))) return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0); return hex.join(""); } /** * Converts an RGBA color plus alpha transparency to hex * * *Assumes:* r, g, b are contained in the set [0, 255] and a in [0, 1] * *Returns:* a 4 or 8 character rgba hex */ function rgbaToHex(r, g, b, a, allow4Char) { const hex = [ pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16)), pad2(convertDecimalToHex(a)) ]; if (allow4Char && hex[0].startsWith(hex[0].charAt(1)) && hex[1].startsWith(hex[1].charAt(1)) && hex[2].startsWith(hex[2].charAt(1)) && hex[3].startsWith(hex[3].charAt(1))) return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0); return hex.join(""); } /** * Converts CMYK to RBG * Assumes c, m, y, k are in the set [0, 100] */ function cmykToRgb(c, m, y, k) { const cConv = c / 100; const mConv = m / 100; const yConv = y / 100; const kConv = k / 100; return { r: 255 * (1 - cConv) * (1 - kConv), g: 255 * (1 - mConv) * (1 - kConv), b: 255 * (1 - yConv) * (1 - kConv) }; } function rgbToCmyk(r, g, b) { let c = 1 - r / 255; let m = 1 - g / 255; let y = 1 - b / 255; let k = Math.min(c, m, y); if (k === 1) { c = 0; m = 0; y = 0; } else { c = (c - k) / (1 - k) * 100; m = (m - k) / (1 - k) * 100; y = (y - k) / (1 - k) * 100; } k *= 100; return { c: Math.round(c), m: Math.round(m), y: Math.round(y), k: Math.round(k) }; } /** Converts a decimal to a hex value */ function convertDecimalToHex(d) { return Math.round(parseFloat(d) * 255).toString(16); } /** Converts a hex value to a decimal */ function convertHexToDecimal(h) { return parseIntFromHex(h) / 255; } /** Parse a base-16 hex value into a base-10 integer */ function parseIntFromHex(val) { return parseInt(val, 16); } function numberInputToObject(color) { return { r: color >> 16, g: (color & 65280) >> 8, b: color & 255 }; } //#endregion //#region ../../node_modules/.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor/dist/module/css-color-names.js /** * @hidden */ const names = { aliceblue: "#f0f8ff", antiquewhite: "#faebd7", aqua: "#00ffff", aquamarine: "#7fffd4", azure: "#f0ffff", beige: "#f5f5dc", bisque: "#ffe4c4", black: "#000000", blanchedalmond: "#ffebcd", blue: "#0000ff", blueviolet: "#8a2be2", brown: "#a52a2a", burlywood: "#deb887", cadetblue: "#5f9ea0", chartreuse: "#7fff00", chocolate: "#d2691e", coral: "#ff7f50", cornflowerblue: "#6495ed", cornsilk: "#fff8dc", crimson: "#dc143c", cyan: "#00ffff", darkblue: "#00008b", darkcyan: "#008b8b", darkgoldenrod: "#b8860b", darkgray: "#a9a9a9", darkgreen: "#006400", darkgrey: "#a9a9a9", darkkhaki: "#bdb76b", darkmagenta: "#8b008b", darkolivegreen: "#556b2f", darkorange: "#ff8c00", darkorchid: "#9932cc", darkred: "#8b0000", darksalmon: "#e9967a", darkseagreen: "#8fbc8f", darkslateblue: "#483d8b", darkslategray: "#2f4f4f", darkslategrey: "#2f4f4f", darkturquoise: "#00ced1", darkviolet: "#9400d3", deeppink: "#ff1493", deepskyblue: "#00bfff", dimgray: "#696969", dimgrey: "#696969", dodgerblue: "#1e90ff", firebrick: "#b22222", floralwhite: "#fffaf0", forestgreen: "#228b22", fuchsia: "#ff00ff", gainsboro: "#dcdcdc", ghostwhite: "#f8f8ff", goldenrod: "#daa520", gold: "#ffd700", gray: "#808080", green: "#008000", greenyellow: "#adff2f", grey: "#808080", honeydew: "#f0fff0", hotpink: "#ff69b4", indianred: "#cd5c5c", indigo: "#4b0082", ivory: "#fffff0", khaki: "#f0e68c", lavenderblush: "#fff0f5", lavender: "#e6e6fa", lawngreen: "#7cfc00", lemonchiffon: "#fffacd", lightblue: "#add8e6", lightcoral: "#f08080", lightcyan: "#e0ffff", lightgoldenrodyellow: "#fafad2", lightgray: "#d3d3d3", lightgreen: "#90ee90", lightgrey: "#d3d3d3", lightpink: "#ffb6c1", lightsalmon: "#ffa07a", lightseagreen: "#20b2aa", lightskyblue: "#87cefa", lightslategray: "#778899", lightslategrey: "#778899", lightsteelblue: "#b0c4de", lightyellow: "#ffffe0", lime: "#00ff00", limegreen: "#32cd32", linen: "#faf0e6", magenta: "#ff00ff", maroon: "#800000", mediumaquamarine: "#66cdaa", mediumblue: "#0000cd", mediumorchid: "#ba55d3", mediumpurple: "#9370db", mediumseagreen: "#3cb371", mediumslateblue: "#7b68ee", mediumspringgreen: "#00fa9a", mediumturquoise: "#48d1cc", mediumvioletred: "#c71585", midnightblue: "#191970", mintcream: "#f5fffa", mistyrose: "#ffe4e1", moccasin: "#ffe4b5", navajowhite: "#ffdead", navy: "#000080", oldlace: "#fdf5e6", olive: "#808000", olivedrab: "#6b8e23", orange: "#ffa500", orangered: "#ff4500", orchid: "#da70d6", palegoldenrod: "#eee8aa", palegreen: "#98fb98", paleturquoise: "#afeeee", palevioletred: "#db7093", papayawhip: "#ffefd5", peachpuff: "#ffdab9", peru: "#cd853f", pink: "#ffc0cb", plum: "#dda0dd", powderblue: "#b0e0e6", purple: "#800080", rebeccapurple: "#663399", red: "#ff0000", rosybrown: "#bc8f8f", royalblue: "#4169e1", saddlebrown: "#8b4513", salmon: "#fa8072", sandybrown: "#f4a460", seagreen: "#2e8b57", seashell: "#fff5ee", sienna: "#a0522d", silver: "#c0c0c0", skyblue: "#87ceeb", slateblue: "#6a5acd", slategray: "#708090", slategrey: "#708090", snow: "#fffafa", springgreen: "#00ff7f", steelblue: "#4682b4", tan: "#d2b48c", teal: "#008080", thistle: "#d8bfd8", tomato: "#ff6347", turquoise: "#40e0d0", violet: "#ee82ee", wheat: "#f5deb3", white: "#ffffff", whitesmoke: "#f5f5f5", yellow: "#ffff00", yellowgreen: "#9acd32" }; //#endregion //#region ../../node_modules/.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor/dist/module/format-input.js /** * Given a string or object, convert that input to RGB * * Possible string inputs: * ``` * "red" * "#f00" or "f00" * "#ff0000" or "ff0000" * "#ff000000" or "ff000000" * "rgb 255 0 0" or "rgb (255, 0, 0)" * "rgb 1.0 0 0" or "rgb (1, 0, 0)" * "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1" * "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1" * "hsl(0, 100%, 50%)" or "hsl 0 100% 50%" * "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1" * "hsv(0, 100%, 100%)" or "hsv 0 100% 100%" * "cmyk(0, 20, 0, 0)" or "cmyk 0 20 0 0" * ``` */ function inputToRGB(color) { let rgb = { r: 0, g: 0, b: 0 }; let a = 1; let s = null; let v = null; let l = null; let ok = false; let format = false; if (typeof color === "string") color = stringInputToObject(color); if (typeof color === "object") { if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) { rgb = rgbToRgb(color.r, color.g, color.b); ok = true; format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb"; } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) { s = convertToPercentage(color.s); v = convertToPercentage(color.v); rgb = hsvToRgb(color.h, s, v); ok = true; format = "hsv"; } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) { s = convertToPercentage(color.s); l = convertToPercentage(color.l); rgb = hslToRgb(color.h, s, l); ok = true; format = "hsl"; } else if (isValidCSSUnit(color.c) && isValidCSSUnit(color.m) && isValidCSSUnit(color.y) && isValidCSSUnit(color.k)) { rgb = cmykToRgb(color.c, color.m, color.y, color.k); ok = true; format = "cmyk"; } if (Object.prototype.hasOwnProperty.call(color, "a")) a = color.a; } a = boundAlpha(a); return { ok, format: color.format || format, r: Math.min(255, Math.max(rgb.r, 0)), g: Math.min(255, Math.max(rgb.g, 0)), b: Math.min(255, Math.max(rgb.b, 0)), a }; } const CSS_UNIT = "(?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?)"; const PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))\\s*\\)?"; const PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))\\s*\\)?"; const matchers = { CSS_UNIT: new RegExp(CSS_UNIT), rgb: new RegExp("rgb" + PERMISSIVE_MATCH3), rgba: new RegExp("rgba" + PERMISSIVE_MATCH4), hsl: new RegExp("hsl" + PERMISSIVE_MATCH3), hsla: new RegExp("hsla" + PERMISSIVE_MATCH4), hsv: new RegExp("hsv" + PERMISSIVE_MATCH3), hsva: new RegExp("hsva" + PERMISSIVE_MATCH4), cmyk: new RegExp("cmyk" + PERMISSIVE_MATCH4), hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/, hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/ }; /** * Permissive string parsing. Take in a number of formats, and output an object * based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}` or `{c, m, y, k}` or `{c, m, y, k, a}` */ function stringInputToObject(color) { color = color.trim().toLowerCase(); if (color.length === 0) return false; let named = false; if (names[color]) { color = names[color]; named = true; } else if (color === "transparent") return { r: 0, g: 0, b: 0, a: 0, format: "name" }; let match = matchers.rgb.exec(color); if (match) return { r: match[1], g: match[2], b: match[3] }; match = matchers.rgba.exec(color); if (match) return { r: match[1], g: match[2], b: match[3], a: match[4] }; match = matchers.hsl.exec(color); if (match) return { h: match[1], s: match[2], l: match[3] }; match = matchers.hsla.exec(color); if (match) return { h: match[1], s: match[2], l: match[3], a: match[4] }; match = matchers.hsv.exec(color); if (match) return { h: match[1], s: match[2], v: match[3] }; match = matchers.hsva.exec(color); if (match) return { h: match[1], s: match[2], v: match[3], a: match[4] }; match = matchers.cmyk.exec(color); if (match) return { c: match[1], m: match[2], y: match[3], k: match[4] }; match = matchers.hex8.exec(color); if (match) return { r: parseIntFromHex(match[1]), g: parseIntFromHex(match[2]), b: parseIntFromHex(match[3]), a: convertHexToDecimal(match[4]), format: named ? "name" : "hex8" }; match = matchers.hex6.exec(color); if (match) return { r: parseIntFromHex(match[1]), g: parseIntFromHex(match[2]), b: parseIntFromHex(match[3]), format: named ? "name" : "hex" }; match = matchers.hex4.exec(color); if (match) return { r: parseIntFromHex(match[1] + match[1]), g: parseIntFromHex(match[2] + match[2]), b: parseIntFromHex(match[3] + match[3]), a: convertHexToDecimal(match[4] + match[4]), format: named ? "name" : "hex8" }; match = matchers.hex3.exec(color); if (match) return { r: parseIntFromHex(match[1] + match[1]), g: parseIntFromHex(match[2] + match[2]), b: parseIntFromHex(match[3] + match[3]), format: named ? "name" : "hex" }; return false; } /** * Check to see if it looks like a CSS unit * (see `matchers` above for definition). */ function isValidCSSUnit(color) { if (typeof color === "number") return !Number.isNaN(color); return matchers.CSS_UNIT.test(color); } //#endregion //#region ../../node_modules/.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor/dist/module/index.js var TinyColor = class TinyColor { constructor(color = "", opts = {}) { if (color instanceof TinyColor) return color; if (typeof color === "number") color = numberInputToObject(color); this.originalInput = color; const rgb = inputToRGB(color); this.originalInput = color; this.r = rgb.r; this.g = rgb.g; this.b = rgb.b; this.a = rgb.a; this.roundA = Math.round(100 * this.a) / 100; this.format = opts.format ?? rgb.format; this.gradientType = opts.gradientType; if (this.r < 1) this.r = Math.round(this.r); if (this.g < 1) this.g = Math.round(this.g); if (this.b < 1) this.b = Math.round(this.b); this.isValid = rgb.ok; } isDark() { return this.getBrightness() < 128; } isLight() { return !this.isDark(); } /** * Returns the perceived brightness of the color, from 0-255. */ getBrightness() { const rgb = this.toRgb(); return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1e3; } /** * Returns the perceived luminance of a color, from 0-1. */ getLuminance() { const rgb = this.toRgb(); let R; let G; let B; const RsRGB = rgb.r / 255; const GsRGB = rgb.g / 255; const BsRGB = rgb.b / 255; if (RsRGB <= .03928) R = RsRGB / 12.92; else R = Math.pow((RsRGB + .055) / 1.055, 2.4); if (GsRGB <= .03928) G = GsRGB / 12.92; else G = Math.pow((GsRGB + .055) / 1.055, 2.4); if (BsRGB <= .03928) B = BsRGB / 12.92; else B = Math.pow((BsRGB + .055) / 1.055, 2.4); return .2126 * R + .7152 * G + .0722 * B; } /** * Returns the alpha value of a color, from 0-1. */ getAlpha() { return this.a; } /** * Sets the alpha value on the current color. * * @param alpha - The new alpha value. The accepted range is 0-1. */ setAlpha(alpha) { this.a = boundAlpha(alpha); this.roundA = Math.round(100 * this.a) / 100; return this; } /** * Returns whether the color is monochrome. */ isMonochrome() { const { s } = this.toHsl(); return s === 0; } /** * Returns the object as a HSVA object. */ toHsv() { const hsv = rgbToHsv(this.r, this.g, this.b); return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this.a }; } /** * Returns the hsva values interpolated into a string with the following format: * "hsva(xxx, xxx, xxx, xx)". */ toHsvString() { const hsv = rgbToHsv(this.r, this.g, this.b); const h = Math.round(hsv.h * 360); const s = Math.round(hsv.s * 100); const v = Math.round(hsv.v * 100); return this.a === 1 ? `hsv(${h}, ${s}%, ${v}%)` : `hsva(${h}, ${s}%, ${v}%, ${this.roundA})`; } /** * Returns the object as a HSLA object. */ toHsl() { const hsl = rgbToHsl(this.r, this.g, this.b); return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this.a }; } /** * Returns the hsla values interpolated into a string with the following format: * "hsla(xxx, xxx, xxx, xx)". */ toHslString() { const hsl = rgbToHsl(this.r, this.g, this.b); const h = Math.round(hsl.h * 360); const s = Math.round(hsl.s * 100); const l = Math.round(hsl.l * 100); return this.a === 1 ? `hsl(${h}, ${s}%, ${l}%)` : `hsla(${h}, ${s}%, ${l}%, ${this.roundA})`; } /** * Returns the hex value of the color. * @param allow3Char will shorten hex value to 3 char if possible */ toHex(allow3Char = false) { return rgbToHex(this.r, this.g, this.b, allow3Char); } /** * Returns the hex value of the color -with a # prefixed. * @param allow3Char will shorten hex value to 3 char if possible */ toHexString(allow3Char = false) { return "#" + this.toHex(allow3Char); } /** * Returns the hex 8 value of the color. * @param allow4Char will shorten hex value to 4 char if possible */ toHex8(allow4Char = false) { return rgbaToHex(this.r, this.g, this.b, this.a, allow4Char); } /** * Returns the hex 8 value of the color -with a # prefixed. * @param allow4Char will shorten hex value to 4 char if possible */ toHex8String(allow4Char = false) { return "#" + this.toHex8(allow4Char); } /** * Returns the shorter hex value of the color depends on its alpha -with a # prefixed. * @param allowShortChar will shorten hex value to 3 or 4 char if possible */ toHexShortString(allowShortChar = false) { return this.a === 1 ? this.toHexString(allowShortChar) : this.toHex8String(allowShortChar); } /** * Returns the object as a RGBA object. */ toRgb() { return { r: Math.round(this.r), g: Math.round(this.g), b: Math.round(this.b), a: this.a }; } /** * Returns the RGBA values interpolated into a string with the following format: * "RGBA(xxx, xxx, xxx, xx)". */ toRgbString() { const r = Math.round(this.r); const g = Math.round(this.g); const b = Math.round(this.b); return this.a === 1 ? `rgb(${r}, ${g}, ${b})` : `rgba(${r}, ${g}, ${b}, ${this.roundA})`; } /** * Returns the object as a RGBA object. */ toPercentageRgb() { const fmt = (x) => `${Math.round(bound01(x, 255) * 100)}%`; return { r: fmt(this.r), g: fmt(this.g), b: fmt(this.b), a: this.a }; } /** * Returns the RGBA relative values interpolated into a string */ toPercentageRgbString() { const rnd = (x) => Math.round(bound01(x, 255) * 100); return this.a === 1 ? `rgb(${rnd(this.r)}%, ${rnd(this.g)}%, ${rnd(this.b)}%)` : `rgba(${rnd(this.r)}%, ${rnd(this.g)}%, ${rnd(this.b)}%, ${this.roundA})`; } toCmyk() { return { ...rgbToCmyk(this.r, this.g, this.b) }; } toCmykString() { const { c, m, y, k } = rgbToCmyk(this.r, this.g, this.b); return `cmyk(${c}, ${m}, ${y}, ${k})`; } /** * The 'real' name of the color -if there is one. */ toName() { if (this.a === 0) return "transparent"; if (this.a < 1) return false; const hex = "#" + rgbToHex(this.r, this.g, this.b, false); for (const [key, value] of Object.entries(names)) if (hex === value) return key; return false; } toString(format) { const formatSet = Boolean(format); format = format ?? this.format; let formattedString = false; const hasAlpha = this.a < 1 && this.a >= 0; if (!formatSet && hasAlpha && (format.startsWith("hex") || format === "name")) { if (format === "name" && this.a === 0) return this.toName(); return this.toRgbString(); } if (format === "rgb") formattedString = this.toRgbString(); if (format === "prgb") formattedString = this.toPercentageRgbString(); if (format === "hex" || format === "hex6") formattedString = this.toHexString(); if (format === "hex3") formattedString = this.toHexString(true); if (format === "hex4") formattedString = this.toHex8String(true); if (format === "hex8") formattedString = this.toHex8String(); if (format === "name") formattedString = this.toName(); if (format === "hsl") formattedString = this.toHslString(); if (format === "hsv") formattedString = this.toHsvString(); if (format === "cmyk") formattedString = this.toCmykString(); return formattedString || this.toHexString(); } toNumber() { return (Math.round(this.r) << 16) + (Math.round(this.g) << 8) + Math.round(this.b); } clone() { return new TinyColor(this.toString()); } /** * Lighten the color a given amount. Providing 100 will always return white. * @param amount - valid between 1-100 */ lighten(amount = 10) { const hsl = this.toHsl(); hsl.l += amount / 100; hsl.l = clamp01(hsl.l); return new TinyColor(hsl); } /** * Brighten the color a given amount, from 0 to 100. * @param amount - valid between 1-100 */ brighten(amount = 10) { const rgb = this.toRgb(); rgb.r = Math.max(0, Math.min(255, rgb.r - Math.round(255 * -(amount / 100)))); rgb.g = Math.max(0, Math.min(255, rgb.g - Math.round(255 * -(amount / 100)))); rgb.b = Math.max(0, Math.min(255, rgb.b - Math.round(255 * -(amount / 100)))); return new TinyColor(rgb); } /** * Darken the color a given amount, from 0 to 100. * Providing 100 will always return black. * @param amount - valid between 1-100 */ darken(amount = 10) { const hsl = this.toHsl(); hsl.l -= amount / 100; hsl.l = clamp01(hsl.l); return new TinyColor(hsl); } /** * Mix the color with pure white, from 0 to 100. * Providing 0 will do nothing, providing 100 will always return white. * @param amount - valid between 1-100 */ tint(amount = 10) { return this.mix("white", amount); } /** * Mix the color with pure black, from 0 to 100. * Providing 0 will do nothing, providing 100 will always return black. * @param amount - valid between 1-100 */ shade(amount = 10) { return this.mix("black", amount); } /** * Desaturate the color a given amount, from 0 to 100. * Providing 100 will is the same as calling greyscale * @param amount - valid between 1-100 */ desaturate(amount = 10) { const hsl = this.toHsl(); hsl.s -= amount / 100; hsl.s = clamp01(hsl.s); return new TinyColor(hsl); } /** * Saturate the color a given amount, from 0 to 100. * @param amount - valid between 1-100 */ saturate(amount = 10) { const hsl = this.toHsl(); hsl.s += amount / 100; hsl.s = clamp01(hsl.s); return new TinyColor(hsl); } /** * Completely desaturates a color into greyscale. * Same as calling `desaturate(100)` */ greyscale() { return this.desaturate(100); } /** * Spin takes a positive or negative amount within [-360, 360] indicating the change of hue. * Values outside of this range will be wrapped into this range. */ spin(amount) { const hsl = this.toHsl(); const hue = (hsl.h + amount) % 360; hsl.h = hue < 0 ? 360 + hue : hue; return new TinyColor(hsl); } /** * Mix the current color a given amount with another color, from 0 to 100. * 0 means no mixing (return current color). */ mix(color, amount = 50) { const rgb1 = this.toRgb(); const rgb2 = new TinyColor(color).toRgb(); const p = amount / 100; return new TinyColor({ r: (rgb2.r - rgb1.r) * p + rgb1.r, g: (rgb2.g - rgb1.g) * p + rgb1.g, b: (rgb2.b - rgb1.b) * p + rgb1.b, a: (rgb2.a - rgb1.a) * p + rgb1.a }); } analogous(results = 6, slices = 30) { const hsl = this.toHsl(); const part = 360 / slices; const ret = [this]; for (hsl.h = (hsl.h - (part * results >> 1) + 720) % 360; --results;) { hsl.h = (hsl.h + part) % 360; ret.push(new TinyColor(hsl)); } return ret; } /** * taken from https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js */ complement() { const hsl = this.toHsl(); hsl.h = (hsl.h + 180) % 360; return new TinyColor(hsl); } monochromatic(results = 6) { const hsv = this.toHsv(); const { h } = hsv; const { s } = hsv; let { v } = hsv; const res = []; const modification = 1 / results; while (results--) { res.push(new TinyColor({ h, s, v })); v = (v + modification) % 1; } return res; } splitcomplement() { const hsl = this.toHsl(); const { h } = hsl; return [ this, new TinyColor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l }), new TinyColor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l }) ]; } /** * Compute how the color would appear on a background */ onBackground(background) { const fg = this.toRgb(); const bg = new TinyColor(background).toRgb(); const alpha = fg.a + bg.a * (1 - fg.a); return new TinyColor({ r: (fg.r * fg.a + bg.r * bg.a * (1 - fg.a)) / alpha, g: (fg.g * fg.a + bg.g * bg.a * (1 - fg.a)) / alpha, b: (fg.b * fg.a + bg.b * bg.a * (1 - fg.a)) / alpha, a: alpha }); } /** * Alias for `polyad(3)` */ triad() { return this.polyad(3); } /** * Alias for `polyad(4)` */ tetrad() { return this.polyad(4); } /** * Get polyad colors, like (for 1, 2, 3, 4, 5, 6, 7, 8, etc...) * monad, dyad, triad, tetrad, pentad, hexad, heptad, octad, etc... */ polyad(n) { const hsl = this.toHsl(); const { h } = hsl; const result = [this]; const increment = 360 / n; for (let i = 1; i < n; i++) result.push(new TinyColor({ h: (h + i * increment) % 360, s: hsl.s, l: hsl.l })); return result; } /** * compare color vs current color */ equals(color) { const comparedColor = new TinyColor(color); /** * RGB and CMYK do not have the same color gamut, so a CMYK conversion will never be 100%. * This means we need to compare CMYK to CMYK to ensure accuracy of the equals function. */ if (this.format === "cmyk" || comparedColor.format === "cmyk") return this.toCmykString() === comparedColor.toCmykString(); return this.toRgbString() === comparedColor.toRgbString(); } }; //#endregion //#region ../../packages/components/button/src/button-custom.ts function darken(color, amount = 20) { return color.mix("#141414", amount).toString(); } function useButtonCustomStyle(props) { const _disabled = useFormDisabled(); const ns = useNamespace("button"); return computed(() => { let styles = {}; let buttonColor = props.color; if (buttonColor) { const match = buttonColor.match(/var\((.*?)\)/); if (match) buttonColor = window.getComputedStyle(window.document.documentElement).getPropertyValue(match[1]); const color = new TinyColor(buttonColor); const activeBgColor = props.dark ? color.tint(20).toString() : darken(color, 20); if (props.plain) { styles = ns.cssVarBlock({ "bg-color": props.dark ? darken(color, 90) : color.tint(90).toString(), "text-color": buttonColor, "border-color": props.dark ? darken(color, 50) : color.tint(50).toString(), "hover-text-color": `var(${ns.cssVarName("color-white")})`, "hover-bg-color": buttonColor, "hover-border-color": buttonColor, "active-bg-color": activeBgColor, "active-text-color": `var(${ns.cssVarName("color-white")})`, "active-border-color": activeBgColor }); if (_disabled.value) { styles[ns.cssVarBlockName("disabled-bg-color")] = props.dark ? darken(color, 90) : color.tint(90).toString(); styles[ns.cssVarBlockName("disabled-text-color")] = props.dark ? darken(color, 50) : color.tint(50).toString(); styles[ns.cssVarBlockName("disabled-border-color")] = props.dark ? darken(color, 80) : color.tint(80).toString(); } } else if (props.link || props.text) { const hoverColor = props.dark ? darken(color, 30) : color.tint(30).toString(); styles = ns.cssVarBlock({ "text-color": buttonColor, "hover-text-color": hoverColor, "active-text-color": activeBgColor }); if (props.link) { styles[ns.cssVarBlockName("hover-link-text-color")] = hoverColor; styles[ns.cssVarBlockName("active-color")] = activeBgColor; } if (_disabled.value) { const disabledColor = props.dark ? darken(color, 50) : color.tint(50).toString(); styles[ns.cssVarBlockName("disabled-bg-color")] = "transparent"; styles[ns.cssVarBlockName("disabled-text-color")] = disabledColor; styles[ns.cssVarBlockName("disabled-border-color")] = "transparent"; } } else { const hoverBgColor = props.dark ? darken(color, 30) : color.tint(30).toString(); const textColor = color.isDark() ? `var(${ns.cssVarName("color-white")})` : `var(${ns.cssVarName("color-black")})`; styles = ns.cssVarBlock({ "bg-color": buttonColor, "text-color": textColor, "border-color": buttonColor, "hover-bg-color": hoverBgColor, "hover-text-color": textColor, "hover-border-color": hoverBgColor, "active-bg-color": activeBgColor, "active-border-color": activeBgColor }); if (_disabled.value) { const disabledButtonColor = props.dark ? darken(color, 50) : color.tint(50).toString(); styles[ns.cssVarBlockName("disabled-bg-color")] = disabledButtonColor; styles[ns.cssVarBlockName("disabled-text-color")] = props.dark ? "rgba(255, 255, 255, 0.5)" : `var(${ns.cssVarName("color-white")})`; styles[ns.cssVarBlockName("disabled-border-color")] = disabledButtonColor; } } } return styles; }); } //#endregion //#region ../../packages/components/button/src/button.vue?vue&type=script&setup=true&lang.ts var button_vue_vue_type_script_setup_true_lang_default$1 = /* @__PURE__ */ defineComponent({ name: "ElButton", __name: "button", props: buttonProps, emits: buttonEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const buttonStyle = useButtonCustomStyle(props); const ns = useNamespace("button"); const { _ref, _size, _type, _disabled, _props, _plain, _round, _text, _dashed, shouldAddSpace, handleClick } = useButton(props, emit); const buttonKls = computed(() => [ ns.b(), ns.m(_type.value), ns.m(_size.value), ns.is("disabled", _disabled.value), ns.is("loading", props.loading), ns.is("plain", _plain.value), ns.is("round", _round.value), ns.is("circle", props.circle), ns.is("text", _text.value), ns.is("dashed", _dashed.value), ns.is("link", props.link), ns.is("has-bg", props.bg) ]); __expose({ /** @description button html element */ ref: _ref, /** @description button size */ size: _size, /** @description button type */ type: _type, /** @description button disabled */ disabled: _disabled, /** @description whether adding space */ shouldAddSpace }); return (_ctx, _cache) => { return openBlock(), createBlock(resolveDynamicComponent(__props.tag), mergeProps({ ref_key: "_ref", ref: _ref }, unref(_props), { class: buttonKls.value, style: unref(buttonStyle), onClick: unref(handleClick) }), { default: withCtx(() => [__props.loading ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [_ctx.$slots.loading ? renderSlot(_ctx.$slots, "loading", { key: 0 }) : (openBlock(), createBlock(unref(ElIcon), { key: 1, class: normalizeClass(unref(ns).is("loading")) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(__props.loadingIcon)))]), _: 1 }, 8, ["class"]))], 64)) : __props.icon || _ctx.$slots.icon ? (openBlock(), createBlock(unref(ElIcon), { key: 1 }, { default: withCtx(() => [__props.icon ? (openBlock(), createBlock(resolveDynamicComponent(__props.icon), { key: 0 })) : renderSlot(_ctx.$slots, "icon", { key: 1 })]), _: 3 })) : createCommentVNode("v-if", true), _ctx.$slots.default ? (openBlock(), createElementBlock("span", { key: 2, class: normalizeClass({ [unref(ns).em("text", "expand")]: unref(shouldAddSpace) }) }, [renderSlot(_ctx.$slots, "default")], 2)) : createCommentVNode("v-if", true)]), _: 3 }, 16, [ "class", "style", "onClick" ]); }; } }); //#endregion //#region ../../packages/components/button/src/button.vue var button_default$1 = button_vue_vue_type_script_setup_true_lang_default$1; //#endregion //#region ../../packages/components/button/src/button-group.ts /** * @deprecated Removed after 3.0.0, Use `ButtonGroupProps` instead. */ const buttonGroupProps = { /** * @description control the size of buttons in this button-group */ size: buttonProps.size, /** * @description control the type of buttons in this button-group */ type: buttonProps.type, /** * @description display direction */ direction: { type: definePropType(String), values: ["horizontal", "vertical"], default: "horizontal" } }; //#endregion //#region ../../packages/components/button/src/button-group.vue?vue&type=script&setup=true&lang.ts var button_group_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElButtonGroup", __name: "button-group", props: buttonGroupProps, setup(__props) { const props = __props; provide(buttonGroupContextKey, reactive({ size: toRef(props, "size"), type: toRef(props, "type") })); const ns = useNamespace("button"); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass([unref(ns).b("group"), unref(ns).bm("group", props.direction)]) }, [renderSlot(_ctx.$slots, "default")], 2); }; } }); //#endregion //#region ../../packages/components/button/src/button-group.vue var button_group_default = button_group_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/button/index.ts const ElButton = withInstall(button_default$1, { ButtonGroup: button_group_default }); const ElButtonGroup = withNoopInstall(button_group_default); //#endregion //#region ../../packages/components/calendar/src/calendar.ts const isValidRange$1 = (range) => isArray$1(range) && range.length === 2 && range.every((item) => isDate(item)); /** * @deprecated Removed after 3.0.0, Use `CalendarProps` instead. */ const calendarProps = buildProps({ /** * @description binding value */ modelValue: { type: Date }, /** * @description time range, including start time and end time. * Start time must be start day of week, end time must be end day of week, the time span cannot exceed two months. */ range: { type: definePropType(Array), validator: isValidRange$1 }, /** * @description type of the controller for the Calendar header */ controllerType: { type: String, values: ["button", "select"], default: "button" }, /** * @description format label when `controller-type` is 'select' */ formatter: { type: definePropType(Function) } }); const calendarEmits = { [UPDATE_MODEL_EVENT]: (value) => isDate(value), [INPUT_EVENT]: (value) => isDate(value) }; //#endregion //#region ../../node_modules/.pnpm/dayjs@1.11.20/node_modules/dayjs/dayjs.min.js var require_dayjs_min = /* @__PURE__ */ __commonJSMin(((exports, module) => { (function(t, e) { "object" == typeof exports && "undefined" != typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : (t = "undefined" != typeof globalThis ? globalThis : t || self).dayjs = e(); })(exports, (function() { "use strict"; var t = 1e3, e = 6e4, n = 36e5, r = "millisecond", i = "second", s = "minute", u = "hour", a = "day", o = "week", c = "month", f = "quarter", h = "year", d = "date", l = "Invalid Date", $ = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/, y = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g, M = { name: "en", weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), months: "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), ordinal: function(t) { var e = [ "th", "st", "nd", "rd" ], n = t % 100; return "[" + t + (e[(n - 20) % 10] || e[n] || e[0]) + "]"; } }, m = function(t, e, n) { var r = String(t); return !r || r.length >= e ? t : "" + Array(e + 1 - r.length).join(n) + t; }, v = { s: m, z: function(t) { var e = -t.utcOffset(), n = Math.abs(e), r = Math.floor(n / 60), i = n % 60; return (e <= 0 ? "+" : "-") + m(r, 2, "0") + ":" + m(i, 2, "0"); }, m: function t(e, n) { if (e.date() < n.date()) return -t(n, e); var r = 12 * (n.year() - e.year()) + (n.month() - e.month()), i = e.clone().add(r, c), s = n - i < 0, u = e.clone().add(r + (s ? -1 : 1), c); return +(-(r + (n - i) / (s ? i - u : u - i)) || 0); }, a: function(t) { return t < 0 ? Math.ceil(t) || 0 : Math.floor(t); }, p: function(t) { return { M: c, y: h, w: o, d: a, D: d, h: u, m: s, s: i, ms: r, Q: f }[t] || String(t || "").toLowerCase().replace(/s$/, ""); }, u: function(t) { return void 0 === t; } }, g = "en", D = {}; D[g] = M; var p = "$isDayjsObject", S = function(t) { return t instanceof _ || !(!t || !t[p]); }, w = function t(e, n, r) { var i; if (!e) return g; if ("string" == typeof e) { var s = e.toLowerCase(); D[s] && (i = s), n && (D[s] = n, i = s); var u = e.split("-"); if (!i && u.length > 1) return t(u[0]); } else { var a = e.name; D[a] = e, i = a; } return !r && i && (g = i), i || !r && g; }, O = function(t, e) { if (S(t)) return t.clone(); var n = "object" == typeof e ? e : {}; return n.date = t, n.args = arguments, new _(n); }, b = v; b.l = w, b.i = S, b.w = function(t, e) { return O(t, { locale: e.$L, utc: e.$u, x: e.$x, $offset: e.$offset }); }; var _ = function() { function M(t) { this.$L = w(t.locale, null, !0), this.parse(t), this.$x = this.$x || t.x || {}, this[p] = !0; } var m = M.prototype; return m.parse = function(t) { this.$d = function(t) { var e = t.date, n = t.utc; if (null === e) return /* @__PURE__ */ new Date(NaN); if (b.u(e)) return /* @__PURE__ */ new Date(); if (e instanceof Date) return new Date(e); if ("string" == typeof e && !/Z$/i.test(e)) { var r = e.match($); if (r) { var i = r[2] - 1 || 0, s = (r[7] || "0").substring(0, 3); return n ? new Date(Date.UTC(r[1], i, r[3] || 1, r[4] || 0, r[5] || 0, r[6] || 0, s)) : new Date(r[1], i, r[3] || 1, r[4] || 0, r[5] || 0, r[6] || 0, s); } } return new Date(e); }(t), this.init(); }, m.init = function() { var t = this.$d; this.$y = t.getFullYear(), this.$M = t.getMonth(), this.$D = t.getDate(), this.$W = t.getDay(), this.$H = t.getHours(), this.$m = t.getMinutes(), this.$s = t.getSeconds(), this.$ms = t.getMilliseconds(); }, m.$utils = function() { return b; }, m.isValid = function() { return !(this.$d.toString() === l); }, m.isSame = function(t, e) { var n = O(t); return this.startOf(e) <= n && n <= this.endOf(e); }, m.isAfter = function(t, e) { return O(t) < this.startOf(e); }, m.isBefore = function(t, e) { return this.endOf(e) < O(t); }, m.$g = function(t, e, n) { return b.u(t) ? this[e] : this.set(n, t); }, m.unix = function() { return Math.floor(this.valueOf() / 1e3); }, m.valueOf = function() { return this.$d.getTime(); }, m.startOf = function(t, e) { var n = this, r = !!b.u(e) || e, f = b.p(t), l = function(t, e) { var i = b.w(n.$u ? Date.UTC(n.$y, e, t) : new Date(n.$y, e, t), n); return r ? i : i.endOf(a); }, $ = function(t, e) { return b.w(n.toDate()[t].apply(n.toDate("s"), (r ? [ 0, 0, 0, 0 ] : [ 23, 59, 59, 999 ]).slice(e)), n); }, y = this.$W, M = this.$M, m = this.$D, v = "set" + (this.$u ? "UTC" : ""); switch (f) { case h: return r ? l(1, 0) : l(31, 11); case c: return r ? l(1, M) : l(0, M + 1); case o: var g = this.$locale().weekStart || 0, D = (y < g ? y + 7 : y) - g; return l(r ? m - D : m + (6 - D), M); case a: case d: return $(v + "Hours", 0); case u: return $(v + "Minutes", 1); case s: return $(v + "Seconds", 2); case i: return $(v + "Milliseconds", 3); default: return this.clone(); } }, m.endOf = function(t) { return this.startOf(t, !1); }, m.$set = function(t, e) { var n, o = b.p(t), f = "set" + (this.$u ? "UTC" : ""), l = (n = {}, n[a] = f + "Date", n[d] = f + "Date", n[c] = f + "Month", n[h] = f + "FullYear", n[u] = f + "Hours", n[s] = f + "Minutes", n[i] = f + "Seconds", n[r] = f + "Milliseconds", n)[o], $ = o === a ? this.$D + (e - this.$W) : e; if (o === c || o === h) { var y = this.clone().set(d, 1); y.$d[l]($), y.init(), this.$d = y.set(d, Math.min(this.$D, y.daysInMonth())).$d; } else l && this.$d[l]($); return this.init(), this; }, m.set = function(t, e) { return this.clone().$set(t, e); }, m.get = function(t) { return this[b.p(t)](); }, m.add = function(r, f) { var d, l = this; r = Number(r); var $ = b.p(f), y = function(t) { var e = O(l); return b.w(e.date(e.date() + Math.round(t * r)), l); }; if ($ === c) return this.set(c, this.$M + r); if ($ === h) return this.set(h, this.$y + r); if ($ === a) return y(1); if ($ === o) return y(7); var M = (d = {}, d[s] = e, d[u] = n, d[i] = t, d)[$] || 1, m = this.$d.getTime() + r * M; return b.w(m, this); }, m.subtract = function(t, e) { return this.add(-1 * t, e); }, m.format = function(t) { var e = this, n = this.$locale(); if (!this.isValid()) return n.invalidDate || l; var r = t || "YYYY-MM-DDTHH:mm:ssZ", i = b.z(this), s = this.$H, u = this.$m, a = this.$M, o = n.weekdays, c = n.months, f = n.meridiem, h = function(t, n, i, s) { return t && (t[n] || t(e, r)) || i[n].slice(0, s); }, d = function(t) { return b.s(s % 12 || 12, t, "0"); }, $ = f || function(t, e, n) { var r = t < 12 ? "AM" : "PM"; return n ? r.toLowerCase() : r; }; return r.replace(y, (function(t, r) { return r || function(t) { switch (t) { case "YY": return String(e.$y).slice(-2); case "YYYY": return b.s(e.$y, 4, "0"); case "M": return a + 1; case "MM": return b.s(a + 1, 2, "0"); case "MMM": return h(n.monthsShort, a, c, 3); case "MMMM": return h(c, a); case "D": return e.$D; case "DD": return b.s(e.$D, 2, "0"); case "d": return String(e.$W); case "dd": return h(n.weekdaysMin, e.$W, o, 2); case "ddd": return h(n.weekdaysShort, e.$W, o, 3); case "dddd": return o[e.$W]; case "H": return String(s); case "HH": return b.s(s, 2, "0"); case "h": return d(1); case "hh": return d(2); case "a": return $(s, u, !0); case "A": return $(s, u, !1); case "m": return String(u); case "mm": return b.s(u, 2, "0"); case "s": return String(e.$s); case "ss": return b.s(e.$s, 2, "0"); case "SSS": return b.s(e.$ms, 3, "0"); case "Z": return i; } return null; }(t) || i.replace(":", ""); })); }, m.utcOffset = function() { return 15 * -Math.round(this.$d.getTimezoneOffset() / 15); }, m.diff = function(r, d, l) { var $, y = this, M = b.p(d), m = O(r), v = (m.utcOffset() - this.utcOffset()) * e, g = this - m, D = function() { return b.m(y, m); }; switch (M) { case h: $ = D() / 12; break; case c: $ = D(); break; case f: $ = D() / 3; break; case o: $ = (g - v) / 6048e5; break; case a: $ = (g - v) / 864e5; break; case u: $ = g / n; break; case s: $ = g / e; break; case i: $ = g / t; break; default: $ = g; } return l ? $ : b.a($); }, m.daysInMonth = function() { return this.endOf(c).$D; }, m.$locale = function() { return D[this.$L]; }, m.locale = function(t, e) { if (!t) return this.$L; var n = this.clone(), r = w(t, e, !0); return r && (n.$L = r), n; }, m.clone = function() { return b.w(this.$d, this); }, m.toDate = function() { return new Date(this.valueOf()); }, m.toJSON = function() { return this.isValid() ? this.toISOString() : null; }, m.toISOString = function() { return this.$d.toISOString(); }, m.toString = function() { return this.$d.toUTCString(); }, M; }(), k = _.prototype; return O.prototype = k, [ ["$ms", r], ["$s", i], ["$m", s], ["$H", u], ["$W", a], ["$M", c], ["$y", h], ["$D", d] ].forEach((function(t) { k[t[1]] = function(e) { return this.$g(e, t[0], t[1]); }; })), O.extend = function(t, e) { return t.$i || (t(e, _, O), t.$i = !0), O; }, O.locale = w, O.isDayjs = S, O.unix = function(t) { return O(1e3 * t); }, O.en = D[g], O.Ls = D, O.p = {}, O; })); })); //#endregion //#region ../../node_modules/.pnpm/dayjs@1.11.20/node_modules/dayjs/plugin/customParseFormat.js var require_customParseFormat = /* @__PURE__ */ __commonJSMin(((exports, module) => { (function(e, t) { "object" == typeof exports && "undefined" != typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define(t) : (e = "undefined" != typeof globalThis ? globalThis : e || self).dayjs_plugin_customParseFormat = t(); })(exports, (function() { "use strict"; var e = { LTS: "h:mm:ss A", LT: "h:mm A", L: "MM/DD/YYYY", LL: "MMMM D, YYYY", LLL: "MMMM D, YYYY h:mm A", LLLL: "dddd, MMMM D, YYYY h:mm A" }, t = /(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g, n = /\d/, r = /\d\d/, i = /\d\d?/, o = /\d*[^-_:/,()\s\d]+/, s = {}, a = function(e) { return (e = +e) + (e > 68 ? 1900 : 2e3); }; var f = function(e) { return function(t) { this[e] = +t; }; }, h = [/[+-]\d\d:?(\d\d)?|Z/, function(e) { (this.zone || (this.zone = {})).offset = function(e) { if (!e) return 0; if ("Z" === e) return 0; var t = e.match(/([+-]|\d\d)/g), n = 60 * t[1] + (+t[2] || 0); return 0 === n ? 0 : "+" === t[0] ? -n : n; }(e); }], u = function(e) { var t = s[e]; return t && (t.indexOf ? t : t.s.concat(t.f)); }, d = function(e, t) { var n, r = s.meridiem; if (r) { for (var i = 1; i <= 24; i += 1) if (e.indexOf(r(i, 0, t)) > -1) { n = i > 12; break; } } else n = e === (t ? "pm" : "PM"); return n; }, c = { A: [o, function(e) { this.afternoon = d(e, !1); }], a: [o, function(e) { this.afternoon = d(e, !0); }], Q: [n, function(e) { this.month = 3 * (e - 1) + 1; }], S: [n, function(e) { this.milliseconds = 100 * +e; }], SS: [r, function(e) { this.milliseconds = 10 * +e; }], SSS: [/\d{3}/, function(e) { this.milliseconds = +e; }], s: [i, f("seconds")], ss: [i, f("seconds")], m: [i, f("minutes")], mm: [i, f("minutes")], H: [i, f("hours")], h: [i, f("hours")], HH: [i, f("hours")], hh: [i, f("hours")], D: [i, f("day")], DD: [r, f("day")], Do: [o, function(e) { var t = s.ordinal, n = e.match(/\d+/); if (this.day = n[0], t) for (var r = 1; r <= 31; r += 1) t(r).replace(/\[|\]/g, "") === e && (this.day = r); }], w: [i, f("week")], ww: [r, f("week")], M: [i, f("month")], MM: [r, f("month")], MMM: [o, function(e) { var t = u("months"), n = (u("monthsShort") || t.map((function(e) { return e.slice(0, 3); }))).indexOf(e) + 1; if (n < 1) throw new Error(); this.month = n % 12 || n; }], MMMM: [o, function(e) { var t = u("months").indexOf(e) + 1; if (t < 1) throw new Error(); this.month = t % 12 || t; }], Y: [/[+-]?\d+/, f("year")], YY: [r, function(e) { this.year = a(e); }], YYYY: [/\d{4}/, f("year")], Z: h, ZZ: h }; function l(n) { var r = n, i = s && s.formats; for (var o = (n = r.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g, (function(t, n, r) { var o = r && r.toUpperCase(); return n || i[r] || e[r] || i[o].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g, (function(e, t, n) { return t || n.slice(1); })); }))).match(t), a = o.length, f = 0; f < a; f += 1) { var h = o[f], u = c[h], d = u && u[0], l = u && u[1]; o[f] = l ? { regex: d, parser: l } : h.replace(/^\[|\]$/g, ""); } return function(e) { for (var t = {}, n = 0, r = 0; n < a; n += 1) { var i = o[n]; if ("string" == typeof i) r += i.length; else { var s = i.regex, f = i.parser, h = e.slice(r), u = s.exec(h)[0]; f.call(t, u), e = e.replace(u, ""); } } return function(e) { var t = e.afternoon; if (void 0 !== t) { var n = e.hours; t ? n < 12 && (e.hours += 12) : 12 === n && (e.hours = 0), delete e.afternoon; } }(t), t; }; } return function(e, t, n) { n.p.customParseFormat = !0, e && e.parseTwoDigitYear && (a = e.parseTwoDigitYear); var r = t.prototype, i = r.parse; r.parse = function(e) { var t = e.date, r = e.utc, o = e.args; this.$u = r; var a = o[1]; if ("string" == typeof a) { var f = !0 === o[2], h = !0 === o[3], u = f || h, d = o[2]; h && (d = o[2]), s = this.$locale(), !f && d && (s = n.Ls[d]), this.$d = function(e, t, n, r) { try { if (["x", "X"].indexOf(t) > -1) return /* @__PURE__ */ new Date(("X" === t ? 1e3 : 1) * e); var i = l(t)(e), o = i.year, s = i.month, a = i.day, f = i.hours, h = i.minutes, u = i.seconds, d = i.milliseconds, c = i.zone, m = i.week, M = /* @__PURE__ */ new Date(), Y = a || (o || s ? 1 : M.getDate()), p = o || M.getFullYear(), v = 0; o && !s || (v = s > 0 ? s - 1 : M.getMonth()); var D, w = f || 0, g = h || 0, y = u || 0, L = d || 0; return c ? new Date(Date.UTC(p, v, Y, w, g, y, L + 60 * c.offset * 1e3)) : n ? new Date(Date.UTC(p, v, Y, w, g, y, L)) : (D = new Date(p, v, Y, w, g, y, L), m && (D = r(D).week(m).toDate()), D); } catch (e) { return /* @__PURE__ */ new Date(""); } }(t, a, r, n), this.init(), d && !0 !== d && (this.$L = this.locale(d).$L), u && t != this.format(a) && (this.$d = /* @__PURE__ */ new Date("")), s = {}; } else if (a instanceof Array) for (var c = a.length, m = 1; m <= c; m += 1) { o[1] = a[m - 1]; var M = n.apply(this, o); if (M.isValid()) { this.$d = M.$d, this.$L = M.$L, this.init(); break; } m === c && (this.$d = /* @__PURE__ */ new Date("")); } else i.call(this, e); }; }; })); })); //#endregion //#region ../../packages/components/time-picker/src/constants.ts var import_dayjs_min = /* @__PURE__ */ __toESM(require_dayjs_min()); var import_customParseFormat = /* @__PURE__ */ __toESM(require_customParseFormat()); const timeUnits = [ "hours", "minutes", "seconds" ]; const PICKER_BASE_INJECTION_KEY = "EP_PICKER_BASE"; const PICKER_POPPER_OPTIONS_INJECTION_KEY = "ElPopperOptions"; const ROOT_COMMON_PICKER_INJECTION_KEY = Symbol("commonPickerContextKey"); const DEFAULT_FORMATS_TIME = "HH:mm:ss"; const DEFAULT_FORMATS_DATE = "YYYY-MM-DD"; const DEFAULT_FORMATS_DATEPICKER = { date: DEFAULT_FORMATS_DATE, dates: DEFAULT_FORMATS_DATE, week: "gggg[w]ww", year: "YYYY", years: "YYYY", month: "YYYY-MM", months: "YYYY-MM", datetime: `${DEFAULT_FORMATS_DATE} ${DEFAULT_FORMATS_TIME}`, monthrange: "YYYY-MM", yearrange: "YYYY", daterange: DEFAULT_FORMATS_DATE, datetimerange: `${DEFAULT_FORMATS_DATE} ${DEFAULT_FORMATS_TIME}` }; //#endregion //#region ../../packages/components/time-picker/src/utils.ts const buildTimeList = (value, bound) => { return [ value > 0 ? value - 1 : void 0, value, value < bound ? value + 1 : void 0 ]; }; const rangeArr = (n) => Array.from(Array.from({ length: n }).keys()); const extractDateFormat = (format) => { return format.replace(/\W?m{1,2}|\W?ZZ/g, "").replace(/\W?h{1,2}|\W?s{1,3}|\W?a/gi, "").trim(); }; const extractTimeFormat = (format) => { return format.replace(/\W?D{1,2}|\W?Do|\W?d{1,4}|\W?M{1,4}|\W?Y{2,4}/g, "").trim(); }; const dateEquals = function(a, b) { const aIsDate = isDate(a); const bIsDate = isDate(b); if (aIsDate && bIsDate) return a.getTime() === b.getTime(); if (!aIsDate && !bIsDate) return a === b; return false; }; const valueEquals = function(a, b) { const aIsArray = isArray$1(a); const bIsArray = isArray$1(b); if (aIsArray && bIsArray) { if (a.length !== b.length) return false; return a.every((item, index) => dateEquals(item, b[index])); } if (!aIsArray && !bIsArray) return dateEquals(a, b); return false; }; const parseDate = function(date, format, lang) { const day = isEmpty(format) || format === "x" ? (0, import_dayjs_min.default)(date).locale(lang) : (0, import_dayjs_min.default)(date, format).locale(lang); return day.isValid() ? day : void 0; }; const formatter = function(date, format, lang) { if (isEmpty(format)) return date; if (format === "x") return +date; return (0, import_dayjs_min.default)(date).locale(lang).format(format); }; const makeList = (total, method) => { const arr = []; const disabledArr = method?.(); for (let i = 0; i < total; i++) arr.push(disabledArr?.includes(i) ?? false); return arr; }; const dayOrDaysToDate = (dayOrDays) => { return isArray$1(dayOrDays) ? dayOrDays.map((d) => d.toDate()) : dayOrDays.toDate(); }; //#endregion //#region ../../packages/components/time-picker/src/composables/use-common-picker.ts const useCommonPicker = (props, emit) => { const { lang } = useLocale(); const pickerVisible = ref(false); const pickerActualVisible = ref(false); const userInput = ref(null); const valueIsEmpty = computed(() => { const { modelValue } = props; return !modelValue || isArray$1(modelValue) && !modelValue.filter(Boolean).length; }); const emitInput = (input) => { if (!valueEquals(props.modelValue, input)) { let formatted; if (isArray$1(input)) formatted = input.map((item) => formatter(item, props.valueFormat, lang.value)); else if (input) formatted = formatter(input, props.valueFormat, lang.value); emit(UPDATE_MODEL_EVENT, input ? formatted : input, lang.value); } }; const parsedValue = computed(() => { let dayOrDays; if (valueIsEmpty.value) { if (pickerOptions.value.getDefaultValue) dayOrDays = pickerOptions.value.getDefaultValue(); } else if (isArray$1(props.modelValue)) dayOrDays = props.modelValue.map((d) => parseDate(d, props.valueFormat, lang.value)); else dayOrDays = parseDate(props.modelValue ?? "", props.valueFormat, lang.value); if (pickerOptions.value.getRangeAvailableTime) { const availableResult = pickerOptions.value.getRangeAvailableTime(dayOrDays); if (!isEqual$1(availableResult, dayOrDays)) { dayOrDays = availableResult; if (!valueIsEmpty.value) emitInput(dayOrDaysToDate(dayOrDays)); } } if (isArray$1(dayOrDays) && dayOrDays.some((day) => !day)) dayOrDays = []; return dayOrDays; }); const pickerOptions = ref({}); const onSetPickerOption = (e) => { pickerOptions.value[e[0]] = e[1]; pickerOptions.value.panelReady = true; }; const onCalendarChange = (e) => { emit("calendar-change", e); }; const onPanelChange = (value, mode, view) => { emit("panel-change", value, mode, view); }; const onPick = (date = "", visible = false) => { pickerVisible.value = visible; let result; if (isArray$1(date)) result = date.map((_) => _.toDate()); else result = date ? date.toDate() : date; userInput.value = null; emitInput(result); }; return { parsedValue, pickerActualVisible, pickerOptions, pickerVisible, userInput, valueIsEmpty, emitInput, onCalendarChange, onPanelChange, onPick, onSetPickerOption }; }; //#endregion //#region ../../packages/components/time-picker/src/props/shared.ts const disabledTimeListsProps = buildProps({ /** * @description To specify the array of hours that cannot be selected */ disabledHours: { type: definePropType(Function) }, /** * @description To specify the array of minutes that cannot be selected */ disabledMinutes: { type: definePropType(Function) }, /** * @description To specify the array of seconds that cannot be selected */ disabledSeconds: { type: definePropType(Function) } }); const timePanelSharedProps = buildProps({ visible: Boolean, actualVisible: { type: Boolean, default: void 0 }, format: { type: String, default: "" } }); //#endregion //#region ../../packages/components/time-picker/src/common/props.ts const timePickerDefaultProps = buildProps({ /** * @description this prop decides if the date picker panel pops up when the input is focused */ automaticDropdown: { type: Boolean, default: true }, /** * @description same as `id` in native input */ id: { type: definePropType([Array, String]) }, /** * @description same as `name` in native input */ name: { type: definePropType([Array, String]) }, /** * @description custom class name for TimePicker's dropdown */ popperClass: useTooltipContentProps.popperClass, /** * @description custom style for TimePicker's dropdown */ popperStyle: useTooltipContentProps.popperStyle, /** * @description format of the displayed value in the input box */ format: String, /** * @description optional, format of binding value. If not specified, the binding value will be a Date object */ valueFormat: String, /** * @description optional, format of the date displayed in input's inner panel */ dateFormat: String, /** * @description optional, format of the time displayed in input's inner panel */ timeFormat: String, /** * @description type of the picker */ type: { type: String, default: "" }, /** * @description whether to show clear button */ clearable: { type: Boolean, default: true }, /** * @description Custom clear icon component */ clearIcon: { type: definePropType([String, Object]), default: circle_close_default }, /** * @description whether the input is editable */ editable: { type: Boolean, default: true }, /** * @description Whether to auto-fill the input with the current time on focus when no value is selected. */ saveOnBlur: { type: Boolean, default: true }, /** * @description Custom prefix icon component */ prefixIcon: { type: definePropType([String, Object]), default: "" }, /** * @description size of Input */ size: useSizeProp, /** * @description whether TimePicker is read only */ readonly: Boolean, /** * @description whether TimePicker is disabled */ disabled: { type: Boolean, default: void 0 }, /** * @description placeholder in non-range mode */ placeholder: { type: String, default: "" }, /** * @description [popper.js](https://popper.js.org/docs/v2/) parameters */ popperOptions: { type: definePropType(Object), default: () => ({}) }, /** * @description binding value, if it is an array, the length should be 2 */ modelValue: { type: definePropType([ Date, Array, String, Number ]), default: "" }, /** * @description range separator */ rangeSeparator: { type: String, default: "-" }, /** * @description placeholder for the start date in range mode */ startPlaceholder: String, /** * @description placeholder for the end date in range mode */ endPlaceholder: String, /** * @description optional, default date of the calendar */ defaultValue: { type: definePropType([Date, Array]) }, /** * @description optional, the time value to use when selecting date range */ defaultTime: { type: definePropType([Date, Array]) }, /** * @description whether to pick a time range */ isRange: Boolean, ...disabledTimeListsProps, /** * @description a function determining if a date is disabled with that date as its parameter. Should return a Boolean */ disabledDate: { type: Function }, /** * @description set custom className */ cellClassName: { type: Function }, /** * @description an object array to set shortcut options */ shortcuts: { type: Array, default: () => [] }, /** * @description whether to pick time using arrow buttons */ arrowControl: Boolean, /** * @description input tabindex */ tabindex: { type: definePropType([String, Number]), default: 0 }, /** * @description whether to trigger form validation */ validateEvent: { type: Boolean, default: true }, /** * @description unlink two date-panels in range-picker */ unlinkPanels: Boolean, /** * @description show only one panel in range-picker */ singlePanel: Boolean, /** * @description position of dropdown */ placement: { type: definePropType(String), values: Ee, default: "bottom" }, /** * @description list of possible positions for dropdown */ fallbackPlacements: { type: definePropType(Array), default: [ "bottom", "top", "right", "left" ] }, ...useEmptyValuesProps, ...useAriaProps(["ariaLabel"]), /** * @description whether to show the now button */ showNow: { type: Boolean, default: true }, /** * @description whether to show footer */ showConfirm: { type: Boolean, default: true }, /** * @description whether to show footer */ showFooter: { type: Boolean, default: true }, /** * @description whether to show the number of the calendar week */ showWeekNumber: Boolean }); const timePickerRangeTriggerProps = buildProps({ id: { type: definePropType(Array) }, name: { type: definePropType(Array) }, modelValue: { type: definePropType([Array, String]) }, startPlaceholder: String, endPlaceholder: String, disabled: Boolean }); /** * @deprecated Use `timePickerRangeTriggerProps` instead. This will be removed in future versions. */ const timePickerRngeTriggerProps = timePickerRangeTriggerProps; //#endregion //#region ../../packages/components/time-picker/src/common/picker-range-trigger.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$72 = [ "id", "name", "placeholder", "value", "disabled" ]; const _hoisted_2$41 = [ "id", "name", "placeholder", "value", "disabled" ]; var picker_range_trigger_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "PickerRangeTrigger", inheritAttrs: false, __name: "picker-range-trigger", props: timePickerRangeTriggerProps, emits: [ "mouseenter", "mouseleave", "click", "touchstart", "focus", "blur", "startInput", "endInput", "startChange", "endChange" ], setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const { formItem } = useFormItem(); const { inputId } = useFormItemInputId(reactive({ id: computed(() => props.id?.[0]) }), { formItemContext: formItem }); const attrs = useAttrs(); const nsDate = useNamespace("date"); const nsRange = useNamespace("range"); const inputRef = ref(); const endInputRef = ref(); const { wrapperRef, isFocused } = useFocusController(inputRef, { disabled: computed(() => props.disabled) }); const handleClick = (evt) => { emit("click", evt); }; const handleMouseEnter = (evt) => { emit("mouseenter", evt); }; const handleMouseLeave = (evt) => { emit("mouseleave", evt); }; const handleTouchStart = (evt) => { emit("touchstart", evt); }; const handleStartInput = (evt) => { emit("startInput", evt); }; const handleEndInput = (evt) => { emit("endInput", evt); }; const handleStartChange = (evt) => { emit("startChange", evt); }; const handleEndChange = (evt) => { emit("endChange", evt); }; const focus = () => { inputRef.value?.focus(); }; const blur = () => { inputRef.value?.blur(); endInputRef.value?.blur(); }; __expose({ focus, blur }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { ref_key: "wrapperRef", ref: wrapperRef, class: normalizeClass([unref(nsDate).is("active", unref(isFocused)), _ctx.$attrs.class]), style: normalizeStyle(_ctx.$attrs.style), onClick: handleClick, onMouseenter: handleMouseEnter, onMouseleave: handleMouseLeave, onTouchstartPassive: handleTouchStart }, [ renderSlot(_ctx.$slots, "prefix"), createElementVNode("input", mergeProps(unref(attrs), { id: unref(inputId), ref_key: "inputRef", ref: inputRef, name: _ctx.name && _ctx.name[0], placeholder: _ctx.startPlaceholder, value: _ctx.modelValue && _ctx.modelValue[0], class: unref(nsRange).b("input"), disabled: _ctx.disabled, onInput: handleStartInput, onChange: handleStartChange }), null, 16, _hoisted_1$72), renderSlot(_ctx.$slots, "range-separator"), createElementVNode("input", mergeProps(unref(attrs), { id: _ctx.id && _ctx.id[1], ref_key: "endInputRef", ref: endInputRef, name: _ctx.name && _ctx.name[1], placeholder: _ctx.endPlaceholder, value: _ctx.modelValue && _ctx.modelValue[1], class: unref(nsRange).b("input"), disabled: _ctx.disabled, onInput: handleEndInput, onChange: handleEndChange }), null, 16, _hoisted_2$41), renderSlot(_ctx.$slots, "suffix") ], 38); }; } }); //#endregion //#region ../../packages/components/time-picker/src/common/picker-range-trigger.vue var picker_range_trigger_default = picker_range_trigger_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/time-picker/src/common/picker.vue?vue&type=script&setup=true&lang.ts var picker_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "Picker", __name: "picker", props: timePickerDefaultProps, emits: [ UPDATE_MODEL_EVENT, CHANGE_EVENT, "focus", "blur", "clear", "calendar-change", "panel-change", "visible-change", "keydown" ], setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const attrs = useAttrs$1(); const nsDate = useNamespace("date"); const nsInput = useNamespace("input"); const nsRange = useNamespace("range"); const { formItem } = useFormItem(); const elPopperOptions = inject(PICKER_POPPER_OPTIONS_INJECTION_KEY, {}); const emptyValues = useEmptyValues(props, null); const refPopper = ref(); const inputRef = ref(); const valueOnOpen = ref(null); let hasJustTabExitedInput = false; const pickerDisabled = useFormDisabled(); const commonPicker = useCommonPicker(props, emit); const { parsedValue, pickerActualVisible, userInput, pickerVisible, pickerOptions, valueIsEmpty, emitInput, onPick, onSetPickerOption, onCalendarChange, onPanelChange } = commonPicker; const { isFocused, handleFocus, handleBlur } = useFocusController(inputRef, { disabled: pickerDisabled, beforeFocus() { return props.readonly; }, afterFocus() { if (!props.automaticDropdown) return; pickerVisible.value = true; }, beforeBlur(event) { return !hasJustTabExitedInput && refPopper.value?.isFocusInsideContent(event); }, afterBlur() { if (isTimePicker.value && !props.saveOnBlur) { if (!valueIsEmpty.value) pickerOptions.value.handleCancel?.(); } else handleChange(); pickerVisible.value = false; hasJustTabExitedInput = false; props.validateEvent && formItem?.validate("blur").catch(NOOP); } }); const hovering = ref(false); const rangeInputKls = computed(() => [ nsDate.b("editor"), nsDate.bm("editor", props.type), nsInput.e("wrapper"), nsDate.is("disabled", pickerDisabled.value), nsDate.is("active", pickerVisible.value), nsRange.b("editor"), pickerSize ? nsRange.bm("editor", pickerSize.value) : "", attrs.class ]); const clearIconKls = computed(() => [ nsInput.e("icon"), nsRange.e("close-icon"), !showClearBtn.value ? nsRange.em("close-icon", "hidden") : "" ]); watch(pickerVisible, (val) => { if (!val) { userInput.value = null; nextTick(() => { emitChange(props.modelValue); }); } else nextTick(() => { if (val) valueOnOpen.value = props.modelValue; }); }); const emitChange = (val, isClear) => { if (isClear || !valueEquals(val, valueOnOpen.value)) { emit(CHANGE_EVENT, val); isClear && (valueOnOpen.value = val); props.validateEvent && formItem?.validate("change").catch(NOOP); } }; const emitKeydown = (e) => { emit("keydown", e); }; const refInput = computed(() => { if (inputRef.value) return Array.from(inputRef.value.$el.querySelectorAll("input")); return []; }); const setSelectionRange = (start, end, pos) => { const _inputs = refInput.value; if (!_inputs.length) return; if (!pos || pos === "min") { _inputs[0].setSelectionRange(start, end); _inputs[0].focus(); } else if (pos === "max") { _inputs[1].setSelectionRange(start, end); _inputs[1].focus(); } }; const onBeforeShow = () => { pickerActualVisible.value = true; }; const onShow = () => { emit("visible-change", true); }; const onHide = () => { pickerActualVisible.value = false; pickerVisible.value = false; emit("visible-change", false); }; const handleOpen = () => { pickerVisible.value = true; }; const handleClose = () => { pickerVisible.value = false; }; const displayValue = computed(() => { const formattedValue = formatToString(parsedValue.value); if (isArray$1(userInput.value)) return [userInput.value[0] ?? (formattedValue && formattedValue[0]) ?? "", userInput.value[1] ?? (formattedValue && formattedValue[1]) ?? ""]; else if (userInput.value !== null) return userInput.value; if (isTimePicker.value && valueIsEmpty.value && !props.saveOnBlur) return ""; if (!isTimePicker.value && valueIsEmpty.value) return ""; if (!pickerVisible.value && valueIsEmpty.value) return ""; if (formattedValue) return isDatesPicker.value || isMonthsPicker.value || isYearsPicker.value ? formattedValue.join(", ") : formattedValue; return ""; }); const isTimeLikePicker = computed(() => props.type.includes("time")); const isTimePicker = computed(() => props.type.startsWith("time")); const isDatesPicker = computed(() => props.type === "dates"); const isMonthsPicker = computed(() => props.type === "months"); const isYearsPicker = computed(() => props.type === "years"); const triggerIcon = computed(() => props.prefixIcon || (isTimeLikePicker.value ? clock_default : calendar_default$1)); const showClearBtn = computed(() => props.clearable && !pickerDisabled.value && !props.readonly && !valueIsEmpty.value && (hovering.value || isFocused.value)); const onClear = (event) => { if (props.readonly || pickerDisabled.value) return; if (showClearBtn.value) { event?.stopPropagation(); if (pickerOptions.value.handleClear) pickerOptions.value.handleClear(); else emitInput(emptyValues.valueOnClear.value); emitChange(emptyValues.valueOnClear.value, true); onHide(); } emit("clear"); }; const onMouseDownInput = async (event) => { if (props.readonly || pickerDisabled.value) return; if (event.target?.tagName !== "INPUT" || isFocused.value || !props.automaticDropdown) pickerVisible.value = true; }; const onMouseEnter = () => { if (props.readonly || pickerDisabled.value) return; if (!valueIsEmpty.value && props.clearable) hovering.value = true; }; const onMouseLeave = () => { hovering.value = false; }; const onTouchStartInput = (event) => { if (props.readonly || pickerDisabled.value) return; if (event.touches[0].target?.tagName !== "INPUT" || isFocused.value || !props.automaticDropdown) pickerVisible.value = true; }; const isRangeInput = computed(() => { return props.type.includes("range"); }); const pickerSize = useFormSize(); const popperEl = computed(() => unref(refPopper)?.popperRef?.contentRef); const stophandle = onClickOutside(inputRef, (e) => { const unrefedPopperEl = unref(popperEl); const inputEl = unrefElement(inputRef); if (unrefedPopperEl && (e.target === unrefedPopperEl || e.composedPath().includes(unrefedPopperEl)) || e.target === inputEl || inputEl && e.composedPath().includes(inputEl)) return; pickerVisible.value = false; }); onBeforeUnmount(() => { stophandle?.(); }); const handleChange = () => { if (isTimePicker.value && !props.saveOnBlur) return; const isRangeEmpty = isArray$1(userInput.value) && userInput.value.every((v) => v === ""); if (userInput.value && !isRangeEmpty) { const value = parseUserInputToDayjs(displayValue.value); if (value) { if (isValidValue(value)) emitInput(dayOrDaysToDate(value)); userInput.value = null; } } if (userInput.value === "" || isRangeEmpty) { emitInput(emptyValues.valueOnClear.value); emitChange(emptyValues.valueOnClear.value, true); userInput.value = null; } }; const parseUserInputToDayjs = (value) => { if (!value) return null; return pickerOptions.value.parseUserInput(value); }; const formatToString = (value) => { if (!value) return null; return isArray$1(value) ? value.map((_) => _.format(props.format)) : value.format(props.format); }; const isValidValue = (value) => { return pickerOptions.value.isValidValue(value); }; const handleKeydownInput = async (event) => { if (props.readonly || pickerDisabled.value) return; const code = getEventCode(event); emitKeydown(event); if (code === EVENT_CODE.esc) { if (pickerVisible.value === true) { pickerVisible.value = false; event.preventDefault(); event.stopPropagation(); } return; } if (code === EVENT_CODE.down) { if (pickerOptions.value.handleFocusPicker) { event.preventDefault(); event.stopPropagation(); } if (pickerVisible.value === false) { pickerVisible.value = true; await nextTick(); } if (pickerOptions.value.handleFocusPicker) { pickerOptions.value.handleFocusPicker(); return; } } if (code === EVENT_CODE.tab) { hasJustTabExitedInput = true; return; } if (code === EVENT_CODE.enter || code === EVENT_CODE.numpadEnter) { if (!pickerVisible.value) pickerVisible.value = true; else if (userInput.value === null || userInput.value === "" || isValidValue(parseUserInputToDayjs(displayValue.value))) { handleChange(); pickerVisible.value = false; } event.preventDefault(); event.stopPropagation(); return; } if (userInput.value) { event.stopPropagation(); return; } if (pickerOptions.value.handleKeydownInput) pickerOptions.value.handleKeydownInput(event); }; const onUserInput = (e) => { userInput.value = e; if (!pickerVisible.value) pickerVisible.value = true; }; const handleStartInput = (event) => { const target = event.target; if (userInput.value) userInput.value = [target.value, userInput.value[1]]; else userInput.value = [target.value, null]; }; const handleEndInput = (event) => { const target = event.target; if (userInput.value) userInput.value = [userInput.value[0], target.value]; else userInput.value = [null, target.value]; }; const handleStartChange = () => { const values = userInput.value; const value = parseUserInputToDayjs(values && values[0]); const parsedVal = unref(parsedValue); if (value && value.isValid()) { userInput.value = [formatToString(value), displayValue.value?.[1] || null]; const newValue = [value, parsedVal && (parsedVal[1] || null)]; if (isValidValue(newValue)) { emitInput(dayOrDaysToDate(newValue)); userInput.value = null; } } }; const handleEndChange = () => { const values = unref(userInput); const value = parseUserInputToDayjs(values && values[1]); const parsedVal = unref(parsedValue); if (value && value.isValid()) { userInput.value = [unref(displayValue)?.[0] || null, formatToString(value)]; const newValue = [parsedVal && parsedVal[0], value]; if (isValidValue(newValue)) { emitInput(dayOrDaysToDate(newValue)); userInput.value = null; } } }; const focus = () => { inputRef.value?.focus(); }; const blur = () => { inputRef.value?.blur(); }; provide(PICKER_BASE_INJECTION_KEY, { props, emptyValues }); provide(ROOT_COMMON_PICKER_INJECTION_KEY, commonPicker); __expose({ /** * @description focus input box. */ focus, /** * @description blur input box. */ blur, /** * @description opens picker */ handleOpen, /** * @description closes picker */ handleClose, /** * @description pick item manually */ onPick }); return (_ctx, _cache) => { return openBlock(), createBlock(unref(ElTooltip), mergeProps({ ref_key: "refPopper", ref: refPopper, visible: unref(pickerVisible), effect: "light", pure: "", trigger: "click" }, _ctx.$attrs, { role: "dialog", teleported: "", transition: `${unref(nsDate).namespace.value}-zoom-in-top`, "popper-class": [`${unref(nsDate).namespace.value}-picker__popper`, _ctx.popperClass], "popper-style": _ctx.popperStyle, "popper-options": unref(elPopperOptions), "fallback-placements": _ctx.fallbackPlacements, "gpu-acceleration": false, placement: _ctx.placement, "stop-popper-mouse-event": false, "hide-after": 0, persistent: "", onBeforeShow, onShow, onHide }), { default: withCtx(() => [!isRangeInput.value ? (openBlock(), createBlock(unref(ElInput), { key: 0, id: _ctx.id, ref_key: "inputRef", ref: inputRef, "container-role": "combobox", "model-value": displayValue.value, name: _ctx.name, size: unref(pickerSize), disabled: unref(pickerDisabled), placeholder: _ctx.placeholder, class: normalizeClass([ unref(nsDate).b("editor"), unref(nsDate).bm("editor", _ctx.type), unref(nsDate).is("focus", unref(pickerVisible)), _ctx.$attrs.class ]), style: normalizeStyle(_ctx.$attrs.style), readonly: !_ctx.editable || _ctx.readonly || isDatesPicker.value || isMonthsPicker.value || isYearsPicker.value || _ctx.type === "week", "aria-label": _ctx.ariaLabel, tabindex: _ctx.tabindex, "validate-event": false, onInput: onUserInput, onFocus: unref(handleFocus), onBlur: unref(handleBlur), onKeydown: handleKeydownInput, onChange: handleChange, onMousedown: onMouseDownInput, onMouseenter: onMouseEnter, onMouseleave: onMouseLeave, onTouchstartPassive: onTouchStartInput, onClick: _cache[0] || (_cache[0] = withModifiers(() => {}, ["stop"])) }, { prefix: withCtx(() => [triggerIcon.value ? (openBlock(), createBlock(unref(ElIcon), { key: 0, class: normalizeClass(unref(nsInput).e("icon")), onMousedown: withModifiers(onMouseDownInput, ["prevent"]), onTouchstartPassive: onTouchStartInput }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(triggerIcon.value)))]), _: 1 }, 8, ["class"])) : createCommentVNode("v-if", true)]), suffix: withCtx(() => [showClearBtn.value && _ctx.clearIcon ? (openBlock(), createBlock(unref(ElIcon), { key: 0, class: normalizeClass(`${unref(nsInput).e("icon")} clear-icon`), onMousedown: withModifiers(unref(NOOP), ["prevent"]), onClick: onClear }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(_ctx.clearIcon)))]), _: 1 }, 8, ["class", "onMousedown"])) : createCommentVNode("v-if", true)]), _: 1 }, 8, [ "id", "model-value", "name", "size", "disabled", "placeholder", "class", "style", "readonly", "aria-label", "tabindex", "onFocus", "onBlur" ])) : (openBlock(), createBlock(picker_range_trigger_default, { key: 1, id: _ctx.id, ref_key: "inputRef", ref: inputRef, "model-value": displayValue.value, name: _ctx.name, disabled: unref(pickerDisabled), readonly: !_ctx.editable || _ctx.readonly, "start-placeholder": _ctx.startPlaceholder, "end-placeholder": _ctx.endPlaceholder, class: normalizeClass(rangeInputKls.value), style: normalizeStyle(_ctx.$attrs.style), "aria-label": _ctx.ariaLabel, tabindex: _ctx.tabindex, autocomplete: "off", role: "combobox", onClick: onMouseDownInput, onFocus: unref(handleFocus), onBlur: unref(handleBlur), onStartInput: handleStartInput, onStartChange: handleStartChange, onEndInput: handleEndInput, onEndChange: handleEndChange, onMousedown: onMouseDownInput, onMouseenter: onMouseEnter, onMouseleave: onMouseLeave, onTouchstartPassive: onTouchStartInput, onKeydown: handleKeydownInput }, { prefix: withCtx(() => [triggerIcon.value ? (openBlock(), createBlock(unref(ElIcon), { key: 0, class: normalizeClass([unref(nsInput).e("icon"), unref(nsRange).e("icon")]) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(triggerIcon.value)))]), _: 1 }, 8, ["class"])) : createCommentVNode("v-if", true)]), "range-separator": withCtx(() => [renderSlot(_ctx.$slots, "range-separator", {}, () => [createElementVNode("span", { class: normalizeClass(unref(nsRange).b("separator")) }, toDisplayString(_ctx.rangeSeparator), 3)])]), suffix: withCtx(() => [_ctx.clearIcon ? (openBlock(), createBlock(unref(ElIcon), { key: 0, class: normalizeClass(clearIconKls.value), onMousedown: withModifiers(unref(NOOP), ["prevent"]), onClick: onClear }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(_ctx.clearIcon)))]), _: 1 }, 8, ["class", "onMousedown"])) : createCommentVNode("v-if", true)]), _: 3 }, 8, [ "id", "model-value", "name", "disabled", "readonly", "start-placeholder", "end-placeholder", "class", "style", "aria-label", "tabindex", "onFocus", "onBlur" ]))]), content: withCtx(() => [renderSlot(_ctx.$slots, "default", { visible: unref(pickerVisible), actualVisible: unref(pickerActualVisible), parsedValue: unref(parsedValue), format: _ctx.format, dateFormat: _ctx.dateFormat, timeFormat: _ctx.timeFormat, unlinkPanels: _ctx.unlinkPanels, type: _ctx.type, defaultValue: _ctx.defaultValue, showNow: _ctx.showNow, showConfirm: _ctx.showConfirm, showFooter: _ctx.showFooter, showWeekNumber: _ctx.showWeekNumber, singlePanel: _ctx.singlePanel, onPick: _cache[1] || (_cache[1] = (...args) => unref(onPick) && unref(onPick)(...args)), onSelectRange: setSelectionRange, onSetPickerOption: _cache[2] || (_cache[2] = (...args) => unref(onSetPickerOption) && unref(onSetPickerOption)(...args)), onCalendarChange: _cache[3] || (_cache[3] = (...args) => unref(onCalendarChange) && unref(onCalendarChange)(...args)), onClear, onPanelChange: _cache[4] || (_cache[4] = (...args) => unref(onPanelChange) && unref(onPanelChange)(...args)), onMousedown: _cache[5] || (_cache[5] = withModifiers(() => {}, ["stop"])) })]), _: 3 }, 16, [ "visible", "transition", "popper-class", "popper-style", "popper-options", "fallback-placements", "placement" ]); }; } }); //#endregion //#region ../../packages/components/time-picker/src/common/picker.vue var picker_default = picker_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/time-picker/src/props/panel-time-picker.ts const panelTimePickerProps = buildProps({ ...timePanelSharedProps, datetimeRole: String, parsedValue: { type: definePropType(Object) } }); //#endregion //#region ../../packages/components/time-picker/src/composables/use-time-panel.ts const useTimePanel = ({ getAvailableHours, getAvailableMinutes, getAvailableSeconds }) => { const getAvailableTime = (date, role, first, compareDate) => { const availableTimeGetters = { hour: getAvailableHours, minute: getAvailableMinutes, second: getAvailableSeconds }; let result = date; [ "hour", "minute", "second" ].forEach((type) => { if (availableTimeGetters[type]) { let availableTimeSlots; const method = availableTimeGetters[type]; switch (type) { case "minute": availableTimeSlots = method(result.hour(), role, compareDate); break; case "second": availableTimeSlots = method(result.hour(), result.minute(), role, compareDate); break; default: availableTimeSlots = method(role, compareDate); break; } if (availableTimeSlots?.length && !availableTimeSlots.includes(result[type]())) { const pos = first ? 0 : availableTimeSlots.length - 1; result = result[type](availableTimeSlots[pos]); } } }); return result; }; const timePickerOptions = {}; const onSetOption = ([key, val]) => { timePickerOptions[key] = val; }; return { timePickerOptions, getAvailableTime, onSetOption }; }; //#endregion //#region ../../packages/components/time-picker/src/composables/use-time-picker.ts const makeAvailableArr = (disabledList) => { const trueOrNumber = (isDisabled, index) => isDisabled || index; const getNumber = (predicate) => predicate !== true; return disabledList.map(trueOrNumber).filter(getNumber); }; const getTimeLists = (disabledHours, disabledMinutes, disabledSeconds) => { const getHoursList = (role, compare) => { return makeList(24, disabledHours && (() => disabledHours?.(role, compare))); }; const getMinutesList = (hour, role, compare) => { return makeList(60, disabledMinutes && (() => disabledMinutes?.(hour, role, compare))); }; const getSecondsList = (hour, minute, role, compare) => { return makeList(60, disabledSeconds && (() => disabledSeconds?.(hour, minute, role, compare))); }; return { getHoursList, getMinutesList, getSecondsList }; }; const buildAvailableTimeSlotGetter = (disabledHours, disabledMinutes, disabledSeconds) => { const { getHoursList, getMinutesList, getSecondsList } = getTimeLists(disabledHours, disabledMinutes, disabledSeconds); const getAvailableHours = (role, compare) => { return makeAvailableArr(getHoursList(role, compare)); }; const getAvailableMinutes = (hour, role, compare) => { return makeAvailableArr(getMinutesList(hour, role, compare)); }; const getAvailableSeconds = (hour, minute, role, compare) => { return makeAvailableArr(getSecondsList(hour, minute, role, compare)); }; return { getAvailableHours, getAvailableMinutes, getAvailableSeconds }; }; const useOldValue = (props, options) => { const oldValue = ref(props.parsedValue); watch(() => props.visible, (val) => { const modelValue = toValue(options.modelValue); const valueOnClear = toValue(options.valueOnClear); if (val && modelValue === valueOnClear) { oldValue.value = valueOnClear; return; } if (!val) oldValue.value = props.parsedValue; }); return oldValue; }; //#endregion //#region ../../packages/directives/click-outside/index.ts const nodeList = /* @__PURE__ */ new Map(); if (isClient) { let startClick; document.addEventListener("mousedown", (e) => startClick = e); document.addEventListener("mouseup", (e) => { if (startClick) { for (const handlers of nodeList.values()) for (const { documentHandler } of handlers) documentHandler(e, startClick); startClick = void 0; } }); } function createDocumentHandler(el, binding) { let excludes = []; if (isArray$1(binding.arg)) excludes = binding.arg; else if (isElement$1(binding.arg)) excludes.push(binding.arg); return function(mouseup, mousedown) { const popperRef = binding.instance.popperRef; const mouseUpTarget = mouseup.target; const mouseDownTarget = mousedown?.target; const isBound = !binding || !binding.instance; const isTargetExists = !mouseUpTarget || !mouseDownTarget; const isContainedByEl = el.contains(mouseUpTarget) || el.contains(mouseDownTarget); const isSelf = el === mouseUpTarget; const isTargetExcluded = excludes.length && excludes.some((item) => item?.contains(mouseUpTarget)) || excludes.length && excludes.includes(mouseDownTarget); const isContainedByPopper = popperRef && (popperRef.contains(mouseUpTarget) || popperRef.contains(mouseDownTarget)); if (isBound || isTargetExists || isContainedByEl || isSelf || isTargetExcluded || isContainedByPopper) return; binding.value(mouseup, mousedown); }; } const ClickOutside = { beforeMount(el, binding) { if (!nodeList.has(el)) nodeList.set(el, []); nodeList.get(el).push({ documentHandler: createDocumentHandler(el, binding), bindingFn: binding.value }); }, updated(el, binding) { if (!nodeList.has(el)) nodeList.set(el, []); const handlers = nodeList.get(el); const oldHandlerIndex = handlers.findIndex((item) => item.bindingFn === binding.oldValue); const newHandler = { documentHandler: createDocumentHandler(el, binding), bindingFn: binding.value }; if (oldHandlerIndex >= 0) handlers.splice(oldHandlerIndex, 1, newHandler); else handlers.push(newHandler); }, unmounted(el) { nodeList.delete(el); } }; //#endregion //#region ../../packages/directives/repeat-click/index.ts const REPEAT_INTERVAL = 100; const REPEAT_DELAY = 600; const SCOPE$6 = "_RepeatClick"; const vRepeatClick = { beforeMount(el, binding) { const value = binding.value; const { interval = 100, delay = 600 } = isFunction$1(value) ? {} : value; let intervalId; let delayId; const handler = () => isFunction$1(value) ? value() : value.handler(); const clear = () => { if (delayId) { clearTimeout(delayId); delayId = void 0; } if (intervalId) { clearInterval(intervalId); intervalId = void 0; } }; const start = (evt) => { if (evt.button !== 0) return; clear(); handler(); document.addEventListener("mouseup", clear, { once: true }); delayId = setTimeout(() => { intervalId = setInterval(() => { handler(); }, interval); }, delay); }; el[SCOPE$6] = { start, clear }; el.addEventListener("mousedown", start); }, unmounted(el) { if (!el[SCOPE$6]) return; const { start, clear } = el[SCOPE$6]; if (start) el.removeEventListener("mousedown", start); if (clear) { clear(); document.removeEventListener("mouseup", clear); } el[SCOPE$6] = null; } }; //#endregion //#region ../../packages/directives/trap-focus/index.ts const FOCUSABLE_CHILDREN = "_trap-focus-children"; const FOCUS_STACK = []; const FOCUS_HANDLER = (e) => { if (FOCUS_STACK.length === 0) return; const code = getEventCode(e); const focusableElement = FOCUS_STACK[FOCUS_STACK.length - 1][FOCUSABLE_CHILDREN]; if (focusableElement.length > 0 && code === EVENT_CODE.tab) { if (focusableElement.length === 1) { e.preventDefault(); if (document.activeElement !== focusableElement[0]) focusableElement[0].focus(); return; } const goingBackward = e.shiftKey; const isFirst = e.target === focusableElement[0]; const isLast = e.target === focusableElement[focusableElement.length - 1]; if (isFirst && goingBackward) { e.preventDefault(); focusableElement[focusableElement.length - 1].focus(); } if (isLast && !goingBackward) { e.preventDefault(); focusableElement[0].focus(); } } }; const TrapFocus = { beforeMount(el) { el[FOCUSABLE_CHILDREN] = obtainAllFocusableElements$1(el); FOCUS_STACK.push(el); if (FOCUS_STACK.length <= 1) document.addEventListener("keydown", FOCUS_HANDLER); }, updated(el) { nextTick(() => { el[FOCUSABLE_CHILDREN] = obtainAllFocusableElements$1(el); }); }, unmounted() { FOCUS_STACK.shift(); if (FOCUS_STACK.length === 0) document.removeEventListener("keydown", FOCUS_HANDLER); } }; //#endregion //#region ../../node_modules/.pnpm/normalize-wheel-es@1.2.0/node_modules/normalize-wheel-es/dist/index.mjs var v = !1, o, f, s, u, d, N, l, p, m, w, D, x, E, M, F; function a() { if (!v) { v = !0; var e = navigator.userAgent, n = /(?:MSIE.(\d+\.\d+))|(?:(?:Firefox|GranParadiso|Iceweasel).(\d+\.\d+))|(?:Opera(?:.+Version.|.)(\d+\.\d+))|(?:AppleWebKit.(\d+(?:\.\d+)?))|(?:Trident\/\d+\.\d+.*rv:(\d+\.\d+))/.exec(e), i = /(Mac OS X)|(Windows)|(Linux)/.exec(e); if (x = /\b(iPhone|iP[ao]d)/.exec(e), E = /\b(iP[ao]d)/.exec(e), w = /Android/i.exec(e), M = /FBAN\/\w+;/i.exec(e), F = /Mobile/i.exec(e), D = !!/Win64/.exec(e), n) { o = n[1] ? parseFloat(n[1]) : n[5] ? parseFloat(n[5]) : NaN, o && document && document.documentMode && (o = document.documentMode); var r = /(?:Trident\/(\d+.\d+))/.exec(e); N = r ? parseFloat(r[1]) + 4 : o, f = n[2] ? parseFloat(n[2]) : NaN, s = n[3] ? parseFloat(n[3]) : NaN, u = n[4] ? parseFloat(n[4]) : NaN, u ? (n = /(?:Chrome\/(\d+\.\d+))/.exec(e), d = n && n[1] ? parseFloat(n[1]) : NaN) : d = NaN; } else o = f = s = d = u = NaN; if (i) { if (i[1]) { var t = /(?:Mac OS X (\d+(?:[._]\d+)?))/.exec(e); l = t ? parseFloat(t[1].replace("_", ".")) : !0; } else l = !1; p = !!i[2], m = !!i[3]; } else l = p = m = !1; } } var _ = { ie: function() { return a() || o; }, ieCompatibilityMode: function() { return a() || N > o; }, ie64: function() { return _.ie() && D; }, firefox: function() { return a() || f; }, opera: function() { return a() || s; }, webkit: function() { return a() || u; }, safari: function() { return _.webkit(); }, chrome: function() { return a() || d; }, windows: function() { return a() || p; }, osx: function() { return a() || l; }, linux: function() { return a() || m; }, iphone: function() { return a() || x; }, mobile: function() { return a() || x || E || w || F; }, nativeApp: function() { return a() || M; }, android: function() { return a() || w; }, ipad: function() { return a() || E; } }, A = _; var c = !!(typeof window < "u" && window.document && window.document.createElement), h$1 = { canUseDOM: c, canUseWorkers: typeof Worker < "u", canUseEventListeners: c && !!(window.addEventListener || window.attachEvent), canUseViewport: c && !!window.screen, isInWorker: !c }; var X; h$1.canUseDOM && (X = document.implementation && document.implementation.hasFeature && document.implementation.hasFeature("", "") !== !0); function S(e, n) { if (!h$1.canUseDOM || n && !("addEventListener" in document)) return !1; var i = "on" + e, r = i in document; if (!r) { var t = document.createElement("div"); t.setAttribute(i, "return;"), r = typeof t[i] == "function"; } return !r && X && e === "wheel" && (r = document.implementation.hasFeature("Events.wheel", "3.0")), r; } var b = S; var O = 10, I = 40, P = 800; function T(e) { var n = 0, i = 0, r = 0, t = 0; return "detail" in e && (i = e.detail), "wheelDelta" in e && (i = -e.wheelDelta / 120), "wheelDeltaY" in e && (i = -e.wheelDeltaY / 120), "wheelDeltaX" in e && (n = -e.wheelDeltaX / 120), "axis" in e && e.axis === e.HORIZONTAL_AXIS && (n = i, i = 0), r = n * O, t = i * O, "deltaY" in e && (t = e.deltaY), "deltaX" in e && (r = e.deltaX), (r || t) && e.deltaMode && (e.deltaMode == 1 ? (r *= I, t *= I) : (r *= P, t *= P)), r && !n && (n = r < 1 ? -1 : 1), t && !i && (i = t < 1 ? -1 : 1), { spinX: n, spinY: i, pixelX: r, pixelY: t }; } T.getEventType = function() { return A.firefox() ? "DOMMouseScroll" : b("wheel") ? "wheel" : "mousewheel"; }; var Y = T; /** * Checks if an event is supported in the current execution environment. * * NOTE: This will not work correctly for non-generic events such as `change`, * `reset`, `load`, `error`, and `select`. * * Borrows from Modernizr. * * @param {string} eventNameSuffix Event name, e.g. "click". * @param {?boolean} capture Check if the capture phase is supported. * @return {boolean} True if the event is supported. * @internal * @license Modernizr 3.0.0pre (Custom Build) | MIT */ //#endregion //#region ../../packages/directives/mousewheel/index.ts const SCOPE$5 = "_Mousewheel"; const mousewheel = function(element, callback) { if (element && element.addEventListener) { removeWheelHandler(element); const fn = function(event) { const normalized = Y(event); callback && Reflect.apply(callback, this, [event, normalized]); }; element[SCOPE$5] = { wheelHandler: fn }; element.addEventListener("wheel", fn, { passive: true }); } }; const removeWheelHandler = (element) => { if (element["_Mousewheel"]?.wheelHandler) { element.removeEventListener("wheel", element[SCOPE$5].wheelHandler); element[SCOPE$5] = null; } }; const Mousewheel = { beforeMount(el, binding) { mousewheel(el, binding.value); }, unmounted(el) { removeWheelHandler(el); }, updated(el, binding) { if (binding.value !== binding.oldValue) mousewheel(el, binding.value); } }; //#endregion //#region ../../packages/components/time-picker/src/props/basic-time-spinner.ts const basicTimeSpinnerProps = buildProps({ role: { type: String, required: true }, spinnerDate: { type: definePropType(Object), required: true }, showSeconds: { type: Boolean, default: true }, arrowControl: Boolean, amPmMode: { type: definePropType(String), default: "" }, ...disabledTimeListsProps }); //#endregion //#region ../../packages/components/time-picker/src/time-picker-com/basic-time-spinner.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$71 = ["onClick"]; const _hoisted_2$40 = ["onMouseenter"]; var basic_time_spinner_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ __name: "basic-time-spinner", props: basicTimeSpinnerProps, emits: [ CHANGE_EVENT, "select-range", "set-option" ], setup(__props, { emit: __emit }) { const props = __props; const { isRange, format, saveOnBlur } = inject(PICKER_BASE_INJECTION_KEY).props; const emit = __emit; const ns = useNamespace("time"); const { getHoursList, getMinutesList, getSecondsList } = getTimeLists(props.disabledHours, props.disabledMinutes, props.disabledSeconds); let isScrolling = false; const ignoreScroll = { hours: false, minutes: false, seconds: false }; const currentScrollbar = ref(); const listRefsMap = { hours: ref(), minutes: ref(), seconds: ref() }; const spinnerItems = computed(() => { return props.showSeconds ? timeUnits : timeUnits.slice(0, 2); }); const timePartials = computed(() => { const { spinnerDate } = props; return { hours: spinnerDate.hour(), minutes: spinnerDate.minute(), seconds: spinnerDate.second() }; }); const timeList = computed(() => { const { hours, minutes } = unref(timePartials); const { role, spinnerDate } = props; const compare = !isRange ? spinnerDate : void 0; return { hours: getHoursList(role, compare), minutes: getMinutesList(hours, role, compare), seconds: getSecondsList(hours, minutes, role, compare) }; }); const arrowControlTimeList = computed(() => { const { hours, minutes, seconds } = unref(timePartials); return { hours: buildTimeList(hours, 23), minutes: buildTimeList(minutes, 59), seconds: buildTimeList(seconds, 59) }; }); const debouncedResetScroll = debounce((type) => { isScrolling = false; adjustCurrentSpinner(type); }, 200); const getAmPmFlag = (hour) => { if (!!!props.amPmMode) return ""; const isCapital = props.amPmMode === "A"; let content = hour < 12 ? " am" : " pm"; if (isCapital) content = content.toUpperCase(); return content; }; const emitSelectRange = (type) => { let range = [0, 0]; const actualFormat = format || "HH:mm:ss"; const hourIndex = actualFormat.indexOf("HH"); const minuteIndex = actualFormat.indexOf("mm"); const secondIndex = actualFormat.indexOf("ss"); switch (type) { case "hours": if (hourIndex !== -1) range = [hourIndex, hourIndex + 2]; break; case "minutes": if (minuteIndex !== -1) range = [minuteIndex, minuteIndex + 2]; break; case "seconds": if (secondIndex !== -1) range = [secondIndex, secondIndex + 2]; break; } const [left, right] = range; emit("select-range", left, right); currentScrollbar.value = type; }; const adjustCurrentSpinner = (type) => { adjustSpinner(type, unref(timePartials)[type]); }; const adjustSpinners = () => { adjustCurrentSpinner("hours"); adjustCurrentSpinner("minutes"); adjustCurrentSpinner("seconds"); }; const getScrollbarElement = (el) => el.querySelector(`.${ns.namespace.value}-scrollbar__wrap`); const adjustSpinner = (type, value) => { if (props.arrowControl) return; const scrollbar = unref(listRefsMap[type]); if (scrollbar && scrollbar.$el) { if (!saveOnBlur) { ignoreScroll[type] = true; rAF(() => { ignoreScroll[type] = false; }); } getScrollbarElement(scrollbar.$el).scrollTop = Math.max(0, value * typeItemHeight(type)); } }; const typeItemHeight = (type) => { const listItem = unref(listRefsMap[type])?.$el.querySelector("li"); if (listItem) return Number.parseFloat(getStyle(listItem, "height")) || 0; return 0; }; const onIncrement = () => { scrollDown(1); }; const onDecrement = () => { scrollDown(-1); }; const scrollDown = (step) => { if (!currentScrollbar.value) emitSelectRange("hours"); const label = currentScrollbar.value; const now = unref(timePartials)[label]; const next = findNextUnDisabled(label, now, step, currentScrollbar.value === "hours" ? 24 : 60); modifyDateField(label, next); adjustSpinner(label, next); nextTick(() => emitSelectRange(label)); }; const findNextUnDisabled = (type, now, step, total) => { let next = (now + step + total) % total; const list = unref(timeList)[type]; while (list[next] && next !== now) next = (next + step + total) % total; return next; }; const modifyDateField = (type, value) => { if (unref(timeList)[type][value]) return; const { hours, minutes, seconds } = unref(timePartials); let changeTo; switch (type) { case "hours": changeTo = props.spinnerDate.hour(value).minute(minutes).second(seconds); break; case "minutes": changeTo = props.spinnerDate.hour(hours).minute(value).second(seconds); break; case "seconds": changeTo = props.spinnerDate.hour(hours).minute(minutes).second(value); break; } emit(CHANGE_EVENT, changeTo); }; const handleClick = (type, { value, disabled }) => { if (!disabled) { modifyDateField(type, value); emitSelectRange(type); adjustSpinner(type, value); } }; const handleScroll = (type) => { if (!saveOnBlur && ignoreScroll[type]) return; const scrollbar = unref(listRefsMap[type]); if (!scrollbar) return; isScrolling = true; debouncedResetScroll(type); modifyDateField(type, Math.min(Math.round((getScrollbarElement(scrollbar.$el).scrollTop - (scrollBarHeight(type) * .5 - 10) / typeItemHeight(type) + 3) / typeItemHeight(type)), type === "hours" ? 23 : 59)); }; const scrollBarHeight = (type) => { return unref(listRefsMap[type]).$el.offsetHeight; }; const bindScrollEvent = () => { const bindFunction = (type) => { const scrollbar = unref(listRefsMap[type]); if (scrollbar && scrollbar.$el) getScrollbarElement(scrollbar.$el).onscroll = () => { handleScroll(type); }; }; bindFunction("hours"); bindFunction("minutes"); bindFunction("seconds"); }; onMounted(() => { nextTick(() => { !props.arrowControl && bindScrollEvent(); adjustSpinners(); if (props.role === "start") emitSelectRange("hours"); }); }); const setRef = (scrollbar, type) => { listRefsMap[type].value = scrollbar ?? void 0; }; emit("set-option", [`${props.role}_scrollDown`, scrollDown]); emit("set-option", [`${props.role}_emitSelectRange`, emitSelectRange]); watch(() => props.spinnerDate, () => { if (isScrolling) return; adjustSpinners(); }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass([unref(ns).b("spinner"), { "has-seconds": _ctx.showSeconds }]) }, [!_ctx.arrowControl ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(spinnerItems.value, (item) => { return openBlock(), createBlock(unref(ElScrollbar), { key: item, ref_for: true, ref: (scrollbar) => setRef(scrollbar, item), class: normalizeClass(unref(ns).be("spinner", "wrapper")), "wrap-style": "max-height: inherit;", "view-class": unref(ns).be("spinner", "list"), noresize: "", tag: "ul", onMouseenter: ($event) => emitSelectRange(item), onMousemove: ($event) => adjustCurrentSpinner(item) }, { default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(timeList.value[item], (disabled, key) => { return openBlock(), createElementBlock("li", { key, class: normalizeClass([ unref(ns).be("spinner", "item"), unref(ns).is("active", key === timePartials.value[item]), unref(ns).is("disabled", disabled) ]), onClick: ($event) => handleClick(item, { value: key, disabled }) }, [item === "hours" ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createTextVNode(toDisplayString(("0" + (_ctx.amPmMode ? key % 12 || 12 : key)).slice(-2)) + toDisplayString(getAmPmFlag(key)), 1)], 64)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [createTextVNode(toDisplayString(("0" + key).slice(-2)), 1)], 64))], 10, _hoisted_1$71); }), 128))]), _: 2 }, 1032, [ "class", "view-class", "onMouseenter", "onMousemove" ]); }), 128)) : createCommentVNode("v-if", true), _ctx.arrowControl ? (openBlock(true), createElementBlock(Fragment, { key: 1 }, renderList(spinnerItems.value, (item) => { return openBlock(), createElementBlock("div", { key: item, class: normalizeClass([unref(ns).be("spinner", "wrapper"), unref(ns).is("arrow")]), onMouseenter: ($event) => emitSelectRange(item) }, [ withDirectives((openBlock(), createBlock(unref(ElIcon), { class: normalizeClass(["arrow-up", unref(ns).be("spinner", "arrow")]) }, { default: withCtx(() => [createVNode(unref(arrow_up_default))]), _: 1 }, 8, ["class"])), [[unref(vRepeatClick), onDecrement]]), withDirectives((openBlock(), createBlock(unref(ElIcon), { class: normalizeClass(["arrow-down", unref(ns).be("spinner", "arrow")]) }, { default: withCtx(() => [createVNode(unref(arrow_down_default))]), _: 1 }, 8, ["class"])), [[unref(vRepeatClick), onIncrement]]), createElementVNode("ul", { class: normalizeClass(unref(ns).be("spinner", "list")) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(arrowControlTimeList.value[item], (time, key) => { return openBlock(), createElementBlock("li", { key, class: normalizeClass([ unref(ns).be("spinner", "item"), unref(ns).is("active", time === timePartials.value[item]), unref(ns).is("disabled", timeList.value[item][time]) ]) }, [unref(isNumber)(time) ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [item === "hours" ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createTextVNode(toDisplayString(("0" + (_ctx.amPmMode ? time % 12 || 12 : time)).slice(-2)) + toDisplayString(getAmPmFlag(time)), 1)], 64)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [createTextVNode(toDisplayString(("0" + time).slice(-2)), 1)], 64))], 64)) : createCommentVNode("v-if", true)], 2); }), 128))], 2) ], 42, _hoisted_2$40); }), 128)) : createCommentVNode("v-if", true)], 2); }; } }); //#endregion //#region ../../packages/components/time-picker/src/time-picker-com/basic-time-spinner.vue var basic_time_spinner_default = basic_time_spinner_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/time-picker/src/time-picker-com/panel-time-pick.vue?vue&type=script&setup=true&lang.ts var panel_time_pick_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ __name: "panel-time-pick", props: panelTimePickerProps, emits: [ "pick", "select-range", "set-picker-option" ], setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const pickerBase = inject(PICKER_BASE_INJECTION_KEY); const { arrowControl, disabledHours, disabledMinutes, disabledSeconds, defaultValue } = pickerBase.props; const { getAvailableHours, getAvailableMinutes, getAvailableSeconds } = buildAvailableTimeSlotGetter(disabledHours, disabledMinutes, disabledSeconds); const ns = useNamespace("time"); const { t, lang } = useLocale(); const selectionRange = ref([0, 2]); const oldValue = useOldValue(props, { modelValue: computed(() => pickerBase.props.modelValue), valueOnClear: computed(() => pickerBase?.emptyValues ? pickerBase.emptyValues.valueOnClear.value : null) }); const transitionName = computed(() => { return isUndefined(props.actualVisible) ? `${ns.namespace.value}-zoom-in-top` : ""; }); const showSeconds = computed(() => { return props.format.includes("ss"); }); const amPmMode = computed(() => { if (props.format.includes("A")) return "A"; if (props.format.includes("a")) return "a"; return ""; }); const isValidValue = (_date) => { const parsedDate = (0, import_dayjs_min.default)(_date).locale(lang.value); const result = getRangeAvailableTime(parsedDate); return parsedDate.isSame(result); }; const handleCancel = () => { const old = oldValue.value; emit("pick", old, false); nextTick(() => { oldValue.value = old; }); }; const handleConfirm = (visible = false, first = false) => { if (first) return; emit("pick", props.parsedValue, visible); }; const handleChange = (_date) => { if (!props.visible) return; emit("pick", getRangeAvailableTime(_date).millisecond(0), true); }; const setSelectionRange = (start, end) => { emit("select-range", start, end); selectionRange.value = [start, end]; }; const changeSelectionRange = (step) => { const actualFormat = props.format; const hourIndex = actualFormat.indexOf("HH"); const minuteIndex = actualFormat.indexOf("mm"); const secondIndex = actualFormat.indexOf("ss"); const list = []; const mapping = []; if (hourIndex !== -1) { list.push(hourIndex); mapping.push("hours"); } if (minuteIndex !== -1) { list.push(minuteIndex); mapping.push("minutes"); } if (secondIndex !== -1 && showSeconds.value) { list.push(secondIndex); mapping.push("seconds"); } const next = (list.indexOf(selectionRange.value[0]) + step + list.length) % list.length; timePickerOptions["start_emitSelectRange"](mapping[next]); }; const handleKeydown = (event) => { const code = getEventCode(event); const { left, right, up, down } = EVENT_CODE; if ([left, right].includes(code)) { changeSelectionRange(code === left ? -1 : 1); event.preventDefault(); return; } if ([up, down].includes(code)) { const step = code === up ? -1 : 1; timePickerOptions["start_scrollDown"](step); event.preventDefault(); return; } }; const { timePickerOptions, onSetOption, getAvailableTime } = useTimePanel({ getAvailableHours, getAvailableMinutes, getAvailableSeconds }); const getRangeAvailableTime = (date) => { return getAvailableTime(date, props.datetimeRole || "", true); }; const parseUserInput = (value) => { if (!value) return null; return (0, import_dayjs_min.default)(value, props.format).locale(lang.value); }; const getDefaultValue = () => { return (0, import_dayjs_min.default)(defaultValue).locale(lang.value); }; emit("set-picker-option", ["isValidValue", isValidValue]); emit("set-picker-option", ["parseUserInput", parseUserInput]); emit("set-picker-option", ["handleKeydownInput", handleKeydown]); emit("set-picker-option", ["getRangeAvailableTime", getRangeAvailableTime]); emit("set-picker-option", ["getDefaultValue", getDefaultValue]); emit("set-picker-option", ["handleCancel", handleCancel]); return (_ctx, _cache) => { return openBlock(), createBlock(Transition, { name: transitionName.value }, { default: withCtx(() => [_ctx.actualVisible || _ctx.visible ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ns).b("panel")) }, [createElementVNode("div", { class: normalizeClass([unref(ns).be("panel", "content"), { "has-seconds": showSeconds.value }]) }, [createVNode(basic_time_spinner_default, { ref: "spinner", role: _ctx.datetimeRole || "start", "arrow-control": unref(arrowControl), "show-seconds": showSeconds.value, "am-pm-mode": amPmMode.value, "spinner-date": _ctx.parsedValue, "disabled-hours": unref(disabledHours), "disabled-minutes": unref(disabledMinutes), "disabled-seconds": unref(disabledSeconds), onChange: handleChange, onSetOption: unref(onSetOption), onSelectRange: setSelectionRange }, null, 8, [ "role", "arrow-control", "show-seconds", "am-pm-mode", "spinner-date", "disabled-hours", "disabled-minutes", "disabled-seconds", "onSetOption" ])], 2), createElementVNode("div", { class: normalizeClass(unref(ns).be("panel", "footer")) }, [createElementVNode("button", { type: "button", class: normalizeClass([unref(ns).be("panel", "btn"), "cancel"]), onClick: handleCancel }, toDisplayString(unref(t)("el.datepicker.cancel")), 3), createElementVNode("button", { type: "button", class: normalizeClass([unref(ns).be("panel", "btn"), "confirm"]), onClick: _cache[0] || (_cache[0] = ($event) => handleConfirm()) }, toDisplayString(unref(t)("el.datepicker.confirm")), 3)], 2)], 2)) : createCommentVNode("v-if", true)]), _: 1 }, 8, ["name"]); }; } }); //#endregion //#region ../../packages/components/time-picker/src/time-picker-com/panel-time-pick.vue var panel_time_pick_default = panel_time_pick_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/time-picker/src/props/panel-time-range.ts const panelTimeRangeProps = buildProps({ ...timePanelSharedProps, parsedValue: { type: definePropType(Array) } }); //#endregion //#region ../../packages/components/time-picker/src/time-picker-com/panel-time-range.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$70 = ["disabled"]; var panel_time_range_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ __name: "panel-time-range", props: panelTimeRangeProps, emits: [ "pick", "select-range", "set-picker-option" ], setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const makeSelectRange = (start, end) => { const result = []; for (let i = start; i <= end; i++) result.push(i); return result; }; const { t, lang } = useLocale(); const nsTime = useNamespace("time"); const nsPicker = useNamespace("picker"); const pickerBase = inject(PICKER_BASE_INJECTION_KEY); const { arrowControl, disabledHours, disabledMinutes, disabledSeconds, defaultValue } = pickerBase.props; const startContainerKls = computed(() => [ nsTime.be("range-picker", "body"), nsTime.be("panel", "content"), nsTime.is("arrow", arrowControl), showSeconds.value ? "has-seconds" : "" ]); const endContainerKls = computed(() => [ nsTime.be("range-picker", "body"), nsTime.be("panel", "content"), nsTime.is("arrow", arrowControl), showSeconds.value ? "has-seconds" : "" ]); const startTime = computed(() => props.parsedValue[0]); const endTime = computed(() => props.parsedValue[1]); const oldValue = useOldValue(props, { modelValue: computed(() => pickerBase.props.modelValue), valueOnClear: computed(() => pickerBase?.emptyValues ? pickerBase.emptyValues.valueOnClear.value : null) }); const handleCancel = () => { const old = oldValue.value; emit("pick", old, false); nextTick(() => { oldValue.value = old; }); }; const showSeconds = computed(() => { return props.format.includes("ss"); }); const amPmMode = computed(() => { if (props.format.includes("A")) return "A"; if (props.format.includes("a")) return "a"; return ""; }); const handleConfirm = (visible = false) => { emit("pick", [startTime.value, endTime.value], visible); }; const handleMinChange = (date) => { handleChange(date.millisecond(0), endTime.value); }; const handleMaxChange = (date) => { handleChange(startTime.value, date.millisecond(0)); }; const isValidValue = (_date) => { const parsedDate = _date.map((_) => (0, import_dayjs_min.default)(_).locale(lang.value)); const result = getRangeAvailableTime(parsedDate); return parsedDate[0].isSame(result[0]) && parsedDate[1].isSame(result[1]); }; const handleChange = (start, end) => { if (!props.visible) return; emit("pick", [start, end], true); }; const btnConfirmDisabled = computed(() => { return startTime.value > endTime.value; }); const selectionRange = ref([0, 2]); const setMinSelectionRange = (start, end) => { emit("select-range", start, end, "min"); selectionRange.value = [start, end]; }; const offset = computed(() => showSeconds.value ? 11 : 8); const setMaxSelectionRange = (start, end) => { emit("select-range", start, end, "max"); const _offset = unref(offset); selectionRange.value = [start + _offset, end + _offset]; }; const changeSelectionRange = (step) => { const list = showSeconds.value ? [ 0, 3, 6, 11, 14, 17 ] : [ 0, 3, 8, 11 ]; const mapping = ["hours", "minutes"].concat(showSeconds.value ? ["seconds"] : []); const next = (list.indexOf(selectionRange.value[0]) + step + list.length) % list.length; const half = list.length / 2; if (next < half) timePickerOptions["start_emitSelectRange"](mapping[next]); else timePickerOptions["end_emitSelectRange"](mapping[next - half]); }; const handleKeydown = (event) => { const code = getEventCode(event); const { left, right, up, down } = EVENT_CODE; if ([left, right].includes(code)) { changeSelectionRange(code === left ? -1 : 1); event.preventDefault(); return; } if ([up, down].includes(code)) { const step = code === up ? -1 : 1; timePickerOptions[`${selectionRange.value[0] < offset.value ? "start" : "end"}_scrollDown`](step); event.preventDefault(); return; } }; const disabledHours_ = (role, compare) => { const defaultDisable = disabledHours ? disabledHours(role) : []; const isStart = role === "start"; const compareHour = (compare || (isStart ? endTime.value : startTime.value)).hour(); return union(defaultDisable, isStart ? makeSelectRange(compareHour + 1, 23) : makeSelectRange(0, compareHour - 1)); }; const disabledMinutes_ = (hour, role, compare) => { const defaultDisable = disabledMinutes ? disabledMinutes(hour, role) : []; const isStart = role === "start"; const compareDate = compare || (isStart ? endTime.value : startTime.value); if (hour !== compareDate.hour()) return defaultDisable; const compareMinute = compareDate.minute(); return union(defaultDisable, isStart ? makeSelectRange(compareMinute + 1, 59) : makeSelectRange(0, compareMinute - 1)); }; const disabledSeconds_ = (hour, minute, role, compare) => { const defaultDisable = disabledSeconds ? disabledSeconds(hour, minute, role) : []; const isStart = role === "start"; const compareDate = compare || (isStart ? endTime.value : startTime.value); const compareHour = compareDate.hour(); const compareMinute = compareDate.minute(); if (hour !== compareHour || minute !== compareMinute) return defaultDisable; const compareSecond = compareDate.second(); return union(defaultDisable, isStart ? makeSelectRange(compareSecond + 1, 59) : makeSelectRange(0, compareSecond - 1)); }; const getRangeAvailableTime = ([start, end]) => { return [getAvailableTime(start, "start", true, end), getAvailableTime(end, "end", false, start)]; }; const { getAvailableHours, getAvailableMinutes, getAvailableSeconds } = buildAvailableTimeSlotGetter(disabledHours_, disabledMinutes_, disabledSeconds_); const { timePickerOptions, getAvailableTime, onSetOption } = useTimePanel({ getAvailableHours, getAvailableMinutes, getAvailableSeconds }); const parseUserInput = (days) => { if (!days) return null; if (isArray$1(days)) return days.map((d) => (0, import_dayjs_min.default)(d, props.format).locale(lang.value)); return (0, import_dayjs_min.default)(days, props.format).locale(lang.value); }; const getDefaultValue = () => { if (isArray$1(defaultValue)) return defaultValue.map((d) => (0, import_dayjs_min.default)(d).locale(lang.value)); const defaultDay = (0, import_dayjs_min.default)(defaultValue).locale(lang.value); return [defaultDay, defaultDay.add(60, "m")]; }; emit("set-picker-option", ["parseUserInput", parseUserInput]); emit("set-picker-option", ["isValidValue", isValidValue]); emit("set-picker-option", ["handleKeydownInput", handleKeydown]); emit("set-picker-option", ["getDefaultValue", getDefaultValue]); emit("set-picker-option", ["getRangeAvailableTime", getRangeAvailableTime]); emit("set-picker-option", ["handleCancel", handleCancel]); return (_ctx, _cache) => { return _ctx.actualVisible ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass([unref(nsTime).b("range-picker"), unref(nsPicker).b("panel")]) }, [createElementVNode("div", { class: normalizeClass(unref(nsTime).be("range-picker", "content")) }, [createElementVNode("div", { class: normalizeClass(unref(nsTime).be("range-picker", "cell")) }, [createElementVNode("div", { class: normalizeClass(unref(nsTime).be("range-picker", "header")) }, toDisplayString(unref(t)("el.datepicker.startTime")), 3), createElementVNode("div", { class: normalizeClass(startContainerKls.value) }, [createVNode(basic_time_spinner_default, { ref: "minSpinner", role: "start", "show-seconds": showSeconds.value, "am-pm-mode": amPmMode.value, "arrow-control": unref(arrowControl), "spinner-date": startTime.value, "disabled-hours": disabledHours_, "disabled-minutes": disabledMinutes_, "disabled-seconds": disabledSeconds_, onChange: handleMinChange, onSetOption: unref(onSetOption), onSelectRange: setMinSelectionRange }, null, 8, [ "show-seconds", "am-pm-mode", "arrow-control", "spinner-date", "onSetOption" ])], 2)], 2), createElementVNode("div", { class: normalizeClass(unref(nsTime).be("range-picker", "cell")) }, [createElementVNode("div", { class: normalizeClass(unref(nsTime).be("range-picker", "header")) }, toDisplayString(unref(t)("el.datepicker.endTime")), 3), createElementVNode("div", { class: normalizeClass(endContainerKls.value) }, [createVNode(basic_time_spinner_default, { ref: "maxSpinner", role: "end", "show-seconds": showSeconds.value, "am-pm-mode": amPmMode.value, "arrow-control": unref(arrowControl), "spinner-date": endTime.value, "disabled-hours": disabledHours_, "disabled-minutes": disabledMinutes_, "disabled-seconds": disabledSeconds_, onChange: handleMaxChange, onSetOption: unref(onSetOption), onSelectRange: setMaxSelectionRange }, null, 8, [ "show-seconds", "am-pm-mode", "arrow-control", "spinner-date", "onSetOption" ])], 2)], 2)], 2), createElementVNode("div", { class: normalizeClass(unref(nsTime).be("panel", "footer")) }, [createElementVNode("button", { type: "button", class: normalizeClass([unref(nsTime).be("panel", "btn"), "cancel"]), onClick: _cache[0] || (_cache[0] = ($event) => handleCancel()) }, toDisplayString(unref(t)("el.datepicker.cancel")), 3), createElementVNode("button", { type: "button", class: normalizeClass([unref(nsTime).be("panel", "btn"), "confirm"]), disabled: btnConfirmDisabled.value, onClick: _cache[1] || (_cache[1] = ($event) => handleConfirm()) }, toDisplayString(unref(t)("el.datepicker.confirm")), 11, _hoisted_1$70)], 2)], 2)) : createCommentVNode("v-if", true); }; } }); //#endregion //#region ../../packages/components/time-picker/src/time-picker-com/panel-time-range.vue var panel_time_range_default = panel_time_range_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/time-picker/src/time-picker.tsx import_dayjs_min.default.extend(import_customParseFormat.default); var time_picker_default = /* @__PURE__ */ defineComponent({ name: "ElTimePicker", install: null, props: { ...timePickerDefaultProps, /** * @description whether to pick a time range */ isRange: Boolean }, emits: [UPDATE_MODEL_EVENT], setup(props, ctx) { const commonPicker = ref(); const [type, Panel] = props.isRange ? ["timerange", panel_time_range_default] : ["time", panel_time_pick_default]; const modelUpdater = (value) => ctx.emit(UPDATE_MODEL_EVENT, value); provide(PICKER_POPPER_OPTIONS_INJECTION_KEY, props.popperOptions); ctx.expose({ /** * @description focus the Input component */ focus: () => { commonPicker.value?.focus(); }, /** * @description blur the Input component */ blur: () => { commonPicker.value?.blur(); }, /** * @description open the TimePicker popper */ handleOpen: () => { commonPicker.value?.handleOpen(); }, /** * @description close the TimePicker popper */ handleClose: () => { commonPicker.value?.handleClose(); } }); return () => { return createVNode(picker_default, mergeProps(props, { "ref": commonPicker, "type": type, "format": props.format ?? "HH:mm:ss", "onUpdate:modelValue": modelUpdater }), { default: (props) => createVNode(Panel, props, null) }); }; } }); //#endregion //#region ../../packages/components/time-picker/index.ts const ElTimePicker = withInstall(time_picker_default); //#endregion //#region ../../packages/components/calendar/src/date-table.ts const getPrevMonthLastDays = (date, count) => { const lastDay = date.subtract(1, "month").endOf("month").date(); return rangeArr(count).map((_, index) => lastDay - (count - index - 1)); }; const getMonthDays = (date) => { return rangeArr(date.daysInMonth()).map((_, index) => index + 1); }; const toNestedArr = (days) => rangeArr(days.length / 7).map((index) => { const start = index * 7; return days.slice(start, start + 7); }); /** * @deprecated Removed after 3.0.0, Use `DateTableProps` instead. */ const dateTableProps = buildProps({ selectedDay: { type: definePropType(Object) }, range: { type: definePropType(Array) }, date: { type: definePropType(Object), required: true }, hideHeader: { type: Boolean } }); const dateTableEmits = { pick: (value) => isObject$1(value) }; //#endregion //#region ../../node_modules/.pnpm/dayjs@1.11.20/node_modules/dayjs/plugin/localeData.js var require_localeData = /* @__PURE__ */ __commonJSMin(((exports, module) => { (function(n, e) { "object" == typeof exports && "undefined" != typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : (n = "undefined" != typeof globalThis ? globalThis : n || self).dayjs_plugin_localeData = e(); })(exports, (function() { "use strict"; return function(n, e, t) { var r = e.prototype, o = function(n) { return n && (n.indexOf ? n : n.s); }, u = function(n, e, t, r, u) { var i = n.name ? n : n.$locale(), a = o(i[e]), s = o(i[t]), f = a || s.map((function(n) { return n.slice(0, r); })); if (!u) return f; var d = i.weekStart; return f.map((function(n, e) { return f[(e + (d || 0)) % 7]; })); }, i = function() { return t.Ls[t.locale()]; }, a = function(n, e) { return n.formats[e] || function(n) { return n.replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g, (function(n, e, t) { return e || t.slice(1); })); }(n.formats[e.toUpperCase()]); }, s = function() { var n = this; return { months: function(e) { return e ? e.format("MMMM") : u(n, "months"); }, monthsShort: function(e) { return e ? e.format("MMM") : u(n, "monthsShort", "months", 3); }, firstDayOfWeek: function() { return n.$locale().weekStart || 0; }, weekdays: function(e) { return e ? e.format("dddd") : u(n, "weekdays"); }, weekdaysMin: function(e) { return e ? e.format("dd") : u(n, "weekdaysMin", "weekdays", 2); }, weekdaysShort: function(e) { return e ? e.format("ddd") : u(n, "weekdaysShort", "weekdays", 3); }, longDateFormat: function(e) { return a(n.$locale(), e); }, meridiem: this.$locale().meridiem, ordinal: this.$locale().ordinal }; }; r.localeData = function() { return s.bind(this)(); }, t.localeData = function() { var n = i(); return { firstDayOfWeek: function() { return n.weekStart || 0; }, weekdays: function() { return t.weekdays(); }, weekdaysShort: function() { return t.weekdaysShort(); }, weekdaysMin: function() { return t.weekdaysMin(); }, months: function() { return t.months(); }, monthsShort: function() { return t.monthsShort(); }, longDateFormat: function(e) { return a(n, e); }, meridiem: n.meridiem, ordinal: n.ordinal }; }, t.months = function() { return u(i(), "months"); }, t.monthsShort = function() { return u(i(), "monthsShort", "months", 3); }, t.weekdays = function(n) { return u(i(), "weekdays", null, null, n); }, t.weekdaysShort = function(n) { return u(i(), "weekdaysShort", "weekdays", 3, n); }, t.weekdaysMin = function(n) { return u(i(), "weekdaysMin", "weekdays", 2, n); }; }; })); })); //#endregion //#region ../../packages/components/calendar/src/use-date-table.ts var import_localeData = /* @__PURE__ */ __toESM(require_localeData()); const useDateTable = (props, emit) => { import_dayjs_min.default.extend(import_localeData.default); const firstDayOfWeek = import_dayjs_min.default.localeData().firstDayOfWeek(); const { t, lang } = useLocale(); const now = (0, import_dayjs_min.default)().locale(lang.value); const isInRange = computed(() => !!props.range && !!props.range.length); const rows = computed(() => { let days = []; if (isInRange.value) { const [start, end] = props.range; const currentMonthRange = rangeArr(end.date() - start.date() + 1).map((index) => ({ text: start.date() + index, type: "current" })); let remaining = currentMonthRange.length % 7; remaining = remaining === 0 ? 0 : 7 - remaining; const nextMonthRange = rangeArr(remaining).map((_, index) => ({ text: index + 1, type: "next" })); days = currentMonthRange.concat(nextMonthRange); } else { const firstDay = props.date.startOf("month").day(); const prevMonthDays = getPrevMonthLastDays(props.date, (firstDay - firstDayOfWeek + 7) % 7).map((day) => ({ text: day, type: "prev" })); const currentMonthDays = getMonthDays(props.date).map((day) => ({ text: day, type: "current" })); days = [...prevMonthDays, ...currentMonthDays]; const nextMonthDays = rangeArr(7 - (days.length % 7 || 7)).map((_, index) => ({ text: index + 1, type: "next" })); days = days.concat(nextMonthDays); } return toNestedArr(days); }); const weekDays = computed(() => { const start = firstDayOfWeek; if (start === 0) return WEEK_DAYS.map((_) => t(`el.datepicker.weeks.${_}`)); else return WEEK_DAYS.slice(start).concat(WEEK_DAYS.slice(0, start)).map((_) => t(`el.datepicker.weeks.${_}`)); }); const getFormattedDate = (day, type) => { switch (type) { case "prev": return props.date.startOf("month").subtract(1, "month").date(day); case "next": return props.date.startOf("month").add(1, "month").date(day); case "current": return props.date.date(day); } }; const handlePickDay = ({ text, type }) => { emit("pick", getFormattedDate(text, type)); }; const getSlotData = ({ text, type }) => { const day = getFormattedDate(text, type); return { isSelected: day.isSame(props.selectedDay), type: `${type}-month`, day: day.format(DEFAULT_FORMATS_DATE), date: day.toDate() }; }; return { now, isInRange, rows, weekDays, getFormattedDate, handlePickDay, getSlotData }; }; //#endregion //#region ../../packages/components/calendar/src/date-table.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$69 = { key: 0 }; const _hoisted_2$39 = ["onClick"]; var date_table_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "DateTable", __name: "date-table", props: dateTableProps, emits: dateTableEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const { isInRange, now, rows, weekDays, getFormattedDate, handlePickDay, getSlotData } = useDateTable(props, __emit); const nsTable = useNamespace("calendar-table"); const nsDay = useNamespace("calendar-day"); const getCellClass = ({ text, type }) => { const classes = [type]; if (type === "current") { const date = getFormattedDate(text, type); if (date.isSame(props.selectedDay, "day")) classes.push(nsDay.is("selected")); if (date.isSame(now, "day")) classes.push(nsDay.is("today")); } return classes; }; __expose({ /** @description toggle date panel */ getFormattedDate }); return (_ctx, _cache) => { return openBlock(), createElementBlock("table", { class: normalizeClass([unref(nsTable).b(), unref(nsTable).is("range", unref(isInRange))]), cellspacing: "0", cellpadding: "0" }, [!__props.hideHeader ? (openBlock(), createElementBlock("thead", _hoisted_1$69, [createElementVNode("tr", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(weekDays), (day) => { return openBlock(), createElementBlock("th", { key: day, scope: "col" }, toDisplayString(day), 1); }), 128))])])) : createCommentVNode("v-if", true), createElementVNode("tbody", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(rows), (row, index) => { return openBlock(), createElementBlock("tr", { key: index, class: normalizeClass({ [unref(nsTable).e("row")]: true, [unref(nsTable).em("row", "hide-border")]: index === 0 && __props.hideHeader }) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(row, (cell, key) => { return openBlock(), createElementBlock("td", { key, class: normalizeClass(getCellClass(cell)), onClick: ($event) => unref(handlePickDay)(cell) }, [createElementVNode("div", { class: normalizeClass(unref(nsDay).b()) }, [renderSlot(_ctx.$slots, "date-cell", { data: unref(getSlotData)(cell) }, () => [createElementVNode("span", null, toDisplayString(cell.text), 1)])], 2)], 10, _hoisted_2$39); }), 128))], 2); }), 128))])], 2); }; } }); //#endregion //#region ../../packages/components/calendar/src/date-table.vue var date_table_default = date_table_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/calendar/src/use-calendar.ts const adjacentMonth = (start, end) => { const firstMonthLastDay = start.endOf("month"); const lastMonthFirstDay = end.startOf("month"); const lastMonthStartDay = firstMonthLastDay.isSame(lastMonthFirstDay, "week") ? lastMonthFirstDay.add(1, "week") : lastMonthFirstDay; return [[start, firstMonthLastDay], [lastMonthStartDay.startOf("week"), end]]; }; const threeConsecutiveMonth = (start, end) => { const firstMonthLastDay = start.endOf("month"); const secondMonthFirstDay = start.add(1, "month").startOf("month"); const secondMonthStartDay = firstMonthLastDay.isSame(secondMonthFirstDay, "week") ? secondMonthFirstDay.add(1, "week") : secondMonthFirstDay; const secondMonthLastDay = secondMonthStartDay.endOf("month"); const lastMonthFirstDay = end.startOf("month"); const lastMonthStartDay = secondMonthLastDay.isSame(lastMonthFirstDay, "week") ? lastMonthFirstDay.add(1, "week") : lastMonthFirstDay; return [ [start, firstMonthLastDay], [secondMonthStartDay.startOf("week"), secondMonthLastDay], [lastMonthStartDay.startOf("week"), end] ]; }; const useCalendar = (props, emit, componentName) => { const { lang } = useLocale(); const selectedDay = ref(); const now = (0, import_dayjs_min.default)().locale(lang.value); const realSelectedDay = computed({ get() { if (!props.modelValue) return selectedDay.value; return date.value; }, set(val) { if (!val) return; selectedDay.value = val; const result = val.toDate(); emit(INPUT_EVENT, result); emit(UPDATE_MODEL_EVENT, result); } }); const validatedRange = computed(() => { if (!props.range || !isArray$1(props.range) || props.range.length !== 2 || props.range.some((item) => !isDate(item))) return []; const [startDayjs, endDayjs] = props.range.map((_) => (0, import_dayjs_min.default)(_).locale(lang.value)); if (startDayjs.isAfter(endDayjs)) { /* @__PURE__ */ debugWarn(componentName, "end time should be greater than start time"); return []; } if (startDayjs.isSame(endDayjs, "month")) return calculateValidatedDateRange(startDayjs, endDayjs); else { if (startDayjs.add(1, "month").month() !== endDayjs.month()) { /* @__PURE__ */ debugWarn(componentName, "start time and end time interval must not exceed two months"); return []; } return calculateValidatedDateRange(startDayjs, endDayjs); } }); const date = computed(() => { if (!props.modelValue) return realSelectedDay.value || (validatedRange.value.length ? validatedRange.value[0][0] : now); else return (0, import_dayjs_min.default)(props.modelValue).locale(lang.value); }); const prevMonthDayjs = computed(() => date.value.subtract(1, "month").date(1)); const nextMonthDayjs = computed(() => date.value.add(1, "month").date(1)); const prevYearDayjs = computed(() => date.value.subtract(1, "year").date(1)); const nextYearDayjs = computed(() => date.value.add(1, "year").date(1)); const calculateValidatedDateRange = (startDayjs, endDayjs) => { const firstDay = startDayjs.startOf("week"); const lastDay = endDayjs.endOf("week"); const firstMonth = firstDay.get("month"); const lastMonth = lastDay.get("month"); if (firstMonth === lastMonth) return [[firstDay, lastDay]]; else if ((firstMonth + 1) % 12 === lastMonth) return adjacentMonth(firstDay, lastDay); else if (firstMonth + 2 === lastMonth || (firstMonth + 1) % 11 === lastMonth) return threeConsecutiveMonth(firstDay, lastDay); else { /* @__PURE__ */ debugWarn(componentName, "start time and end time interval must not exceed two months"); return []; } }; const pickDay = (day) => { realSelectedDay.value = day; }; const selectDate = (type) => { const day = { "prev-month": prevMonthDayjs.value, "next-month": nextMonthDayjs.value, "prev-year": prevYearDayjs.value, "next-year": nextYearDayjs.value, today: now }[type]; if (!day.isSame(date.value, "day")) pickDay(day); }; const handleDateChange = (date) => { if (date === "today") selectDate("today"); else pickDay(date); }; return { calculateValidatedDateRange, date, realSelectedDay, pickDay, selectDate, validatedRange, handleDateChange }; }; //#endregion //#region ../../packages/components/calendar/src/select-controller.ts /** * @deprecated Removed after 3.0.0, Use `SelectControllerProps` instead. */ const selectControllerProps = buildProps({ date: { type: definePropType(Object), required: true }, formatter: { type: definePropType(Function) } }); const selectControllerEmits = { "date-change": (date) => isObject$1(date) || isString(date) }; //#endregion //#region ../../packages/components/tag/src/tag.ts /** * @deprecated Removed after 3.0.0, Use `TagProps` instead. */ const tagProps = buildProps({ /** * @description type of Tag */ type: { type: String, values: [ "primary", "success", "info", "warning", "danger" ], default: "primary" }, /** * @description whether Tag can be removed */ closable: Boolean, /** * @description whether to disable animations */ disableTransitions: Boolean, /** * @description whether Tag has a highlighted border */ hit: Boolean, /** * @description background color of the Tag */ color: String, /** * @description size of Tag */ size: { type: String, values: componentSizes }, /** * @description theme of Tag */ effect: { type: String, values: [ "dark", "light", "plain" ], default: "light" }, /** * @description whether Tag is rounded */ round: Boolean }); const tagEmits = { close: (evt) => evt instanceof MouseEvent, click: (evt) => evt instanceof MouseEvent }; //#endregion //#region ../../packages/components/tag/src/tag.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$68 = ["aria-label"]; const _hoisted_2$38 = ["aria-label"]; var tag_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElTag", __name: "tag", props: tagProps, emits: tagEmits, setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const tagSize = useFormSize(); const { t } = useLocale(); const ns = useNamespace("tag"); const containerKls = computed(() => { const { type, hit, effect, closable, round } = props; return [ ns.b(), ns.is("closable", closable), ns.m(type || "primary"), ns.m(tagSize.value), ns.m(effect), ns.is("hit", hit), ns.is("round", round) ]; }); const handleClose = (event) => { emit("close", event); }; const handleClick = (event) => { emit("click", event); }; const handleVNodeMounted = (vnode) => { if (vnode?.component?.subTree?.component?.bum) vnode.component.subTree.component.bum = null; }; return (_ctx, _cache) => { return __props.disableTransitions ? (openBlock(), createElementBlock("span", { key: 0, class: normalizeClass(containerKls.value), style: normalizeStyle({ backgroundColor: __props.color }), onClick: handleClick }, [createElementVNode("span", { class: normalizeClass(unref(ns).e("content")) }, [renderSlot(_ctx.$slots, "default")], 2), __props.closable ? (openBlock(), createElementBlock("button", { key: 0, "aria-label": unref(t)("el.tag.close"), class: normalizeClass(unref(ns).e("close")), type: "button", onClick: withModifiers(handleClose, ["stop"]) }, [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(close_default))]), _: 1 })], 10, _hoisted_1$68)) : createCommentVNode("v-if", true)], 6)) : (openBlock(), createBlock(Transition, { key: 1, name: `${unref(ns).namespace.value}-zoom-in-center`, appear: "", onVnodeMounted: handleVNodeMounted }, { default: withCtx(() => [createElementVNode("span", { class: normalizeClass(containerKls.value), style: normalizeStyle({ backgroundColor: __props.color }), onClick: handleClick }, [createElementVNode("span", { class: normalizeClass(unref(ns).e("content")) }, [renderSlot(_ctx.$slots, "default")], 2), __props.closable ? (openBlock(), createElementBlock("button", { key: 0, "aria-label": unref(t)("el.tag.close"), class: normalizeClass(unref(ns).e("close")), type: "button", onClick: withModifiers(handleClose, ["stop"]) }, [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(close_default))]), _: 1 })], 10, _hoisted_2$38)) : createCommentVNode("v-if", true)], 6)]), _: 3 }, 8, ["name"])); }; } }); //#endregion //#region ../../packages/components/tag/src/tag.vue var tag_default = tag_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/tag/index.ts const ElTag = withInstall(tag_default); //#endregion //#region ../../packages/components/select-v2/src/useProps.ts const defaultProps$2 = { label: "label", value: "value", disabled: "disabled", options: "options" }; function useProps(props) { const aliasProps = ref({ ...defaultProps$2, ...props.props }); let cache = { ...props.props }; watch(() => props.props, (val) => { if (!isEqual$1(val, cache)) { aliasProps.value = { ...defaultProps$2, ...val }; cache = { ...val }; } }, { deep: true }); const getLabel = (option) => get(option, aliasProps.value.label); const getValue = (option) => get(option, aliasProps.value.value); const getDisabled = (option) => get(option, aliasProps.value.disabled); const getOptions = (option) => get(option, aliasProps.value.options); return { aliasProps, getLabel, getValue, getDisabled, getOptions }; } //#endregion //#region ../../packages/components/select/src/token.ts const selectGroupKey = Symbol("ElSelectGroup"); const selectKey = Symbol("ElSelect"); //#endregion //#region ../../packages/components/select/src/option.ts const COMPONENT_NAME$14 = "ElOption"; const optionProps = buildProps({ /** * @description value of option */ value: { type: [ String, Number, Boolean, Object ], required: true }, /** * @description label of option, same as `value` if omitted */ label: { type: [String, Number] }, created: Boolean, /** * @description whether option is disabled */ disabled: Boolean }); //#endregion //#region ../../packages/components/select/src/useOption.ts function useOption$1(props, states) { const select = inject(selectKey); if (!select) throwError(COMPONENT_NAME$14, "usage: "); const selectGroup = inject(selectGroupKey, { disabled: false }); const itemSelected = computed(() => { return contains(castArray$1(select.props.modelValue), props.value); }); const limitReached = computed(() => { if (select.props.multiple) { const modelValue = castArray$1(select.props.modelValue ?? []); return !itemSelected.value && modelValue.length >= select.props.multipleLimit && select.props.multipleLimit > 0; } else return false; }); const currentLabel = computed(() => { return props.label ?? (isObject$1(props.value) ? "" : props.value); }); const currentValue = computed(() => { return props.value || props.label || ""; }); const isDisabled = computed(() => { return props.disabled || states.groupDisabled || limitReached.value; }); const instance = getCurrentInstance(); const contains = (arr = [], target) => { if (!isObject$1(props.value)) return arr && arr.includes(target); else { const valueKey = select.props.valueKey; return arr && arr.some((item) => { return toRaw(get(item, valueKey)) === get(target, valueKey); }); } }; const hoverItem = () => { if (!isDisabled.value) select.states.hoveringIndex = select.optionsArray.indexOf(instance.proxy); }; const updateOption = (query) => { states.visible = new RegExp(escapeStringRegexp(query), "i").test(String(currentLabel.value)) || props.created; }; watch(() => currentLabel.value, () => { if (!props.created && !select.props.remote) select.setSelected(); }); watch(() => props.value, (val, oldVal) => { const { remote, valueKey } = select.props; if (remote ? val !== oldVal : !isEqual$1(val, oldVal)) { select.onOptionDestroy(oldVal, instance.proxy); select.onOptionCreate(instance.proxy); } if (!props.created && !remote) { if (valueKey && isObject$1(val) && isObject$1(oldVal) && val[valueKey] === oldVal[valueKey]) return; select.setSelected(); } }); watch(() => selectGroup.disabled, () => { states.groupDisabled = selectGroup.disabled; }, { immediate: true }); return { select, currentLabel, currentValue, itemSelected, isDisabled, hoverItem, updateOption }; } //#endregion //#region ../../packages/components/select/src/option.vue?vue&type=script&lang.ts var option_vue_vue_type_script_lang_default = defineComponent({ name: COMPONENT_NAME$14, componentName: COMPONENT_NAME$14, props: optionProps, setup(props) { const ns = useNamespace("select"); const id = useId(); const containerKls = computed(() => [ ns.be("dropdown", "item"), ns.is("disabled", unref(isDisabled)), ns.is("selected", unref(itemSelected)), ns.is("hovering", unref(hover)) ]); const states = reactive({ index: -1, groupDisabled: false, visible: true, hover: false }); const { currentLabel, itemSelected, isDisabled, select, hoverItem, updateOption } = useOption$1(props, states); const { visible, hover } = toRefs(states); const vm = getCurrentInstance().proxy; select.onOptionCreate(vm); onBeforeUnmount(() => { const key = vm.value; nextTick(() => { const { selected: selectedOptions } = select.states; const doesSelected = selectedOptions.some((item) => { return item.value === vm.value; }); if (select.states.cachedOptions.get(key) === vm && !doesSelected) select.states.cachedOptions.delete(key); }); select.onOptionDestroy(key, vm); }); function selectOptionClick() { if (!isDisabled.value) select.handleOptionSelect(vm); } const handleMousedown = (event) => { let target = event.target; const currentTarget = event.currentTarget; while (target && target !== currentTarget) { if (isFocusable(target)) return; target = target.parentElement; } event.preventDefault(); }; return { ns, id, containerKls, currentLabel, itemSelected, isDisabled, select, visible, hover, states, hoverItem, handleMousedown, updateOption, selectOptionClick }; } }); //#endregion //#region ../../packages/components/select/src/option.vue const _hoisted_1$67 = [ "id", "aria-disabled", "aria-selected" ]; function _sfc_render$20(_ctx, _cache, $props, $setup, $data, $options) { return withDirectives((openBlock(), createElementBlock("li", { id: _ctx.id, class: normalizeClass(_ctx.containerKls), role: "option", "aria-disabled": _ctx.isDisabled || void 0, "aria-selected": _ctx.itemSelected, onMousemove: _cache[0] || (_cache[0] = (...args) => _ctx.hoverItem && _ctx.hoverItem(...args)), onMousedown: _cache[1] || (_cache[1] = (...args) => _ctx.handleMousedown && _ctx.handleMousedown(...args)), onClick: _cache[2] || (_cache[2] = withModifiers((...args) => _ctx.selectOptionClick && _ctx.selectOptionClick(...args), ["stop"])) }, [renderSlot(_ctx.$slots, "default", {}, () => [createElementVNode("span", null, toDisplayString(_ctx.currentLabel), 1)])], 42, _hoisted_1$67)), [[vShow, _ctx.visible]]); } var option_default = /* @__PURE__ */ _plugin_vue_export_helper_default(option_vue_vue_type_script_lang_default, [["render", _sfc_render$20]]); //#endregion //#region ../../packages/components/select/src/select-dropdown.vue?vue&type=script&lang.ts var select_dropdown_vue_vue_type_script_lang_default = defineComponent({ name: "ElSelectDropdown", componentName: "ElSelectDropdown", setup() { const select = inject(selectKey); const ns = useNamespace("select"); const popperClass = computed(() => select.props.popperClass); const isMultiple = computed(() => select.props.multiple); const isFitInputWidth = computed(() => select.props.fitInputWidth); const minWidth = ref(""); function updateMinWidth() { const offsetWidth = select.selectRef?.offsetWidth; if (offsetWidth) minWidth.value = `${offsetWidth - 2}px`; else minWidth.value = ""; } onMounted(() => { updateMinWidth(); useResizeObserver(select.selectRef, updateMinWidth); }); return { ns, minWidth, popperClass, isMultiple, isFitInputWidth }; } }); //#endregion //#region ../../packages/components/select/src/select-dropdown.vue function _sfc_render$19(_ctx, _cache, $props, $setup, $data, $options) { return openBlock(), createElementBlock("div", { class: normalizeClass([ _ctx.ns.b("dropdown"), _ctx.ns.is("multiple", _ctx.isMultiple), _ctx.popperClass ]), style: normalizeStyle({ [_ctx.isFitInputWidth ? "width" : "minWidth"]: _ctx.minWidth }) }, [ _ctx.$slots.header ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(_ctx.ns.be("dropdown", "header")) }, [renderSlot(_ctx.$slots, "header")], 2)) : createCommentVNode("v-if", true), renderSlot(_ctx.$slots, "default"), _ctx.$slots.footer ? (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass(_ctx.ns.be("dropdown", "footer")) }, [renderSlot(_ctx.$slots, "footer")], 2)) : createCommentVNode("v-if", true) ], 6); } var select_dropdown_default$1 = /* @__PURE__ */ _plugin_vue_export_helper_default(select_dropdown_vue_vue_type_script_lang_default, [["render", _sfc_render$19]]); //#endregion //#region ../../packages/components/select/src/useSelect.ts const useSelect$2 = (props, emit) => { const { t } = useLocale(); const slots = useSlots(); const contentId = useId(); const nsSelect = useNamespace("select"); const nsInput = useNamespace("input"); const states = reactive({ inputValue: "", options: /* @__PURE__ */ new Map(), cachedOptions: /* @__PURE__ */ new Map(), optionValues: [], selected: [], selectionWidth: 0, collapseItemWidth: 0, selectedLabel: "", hoveringIndex: -1, previousQuery: null, inputHovering: false, menuVisibleOnFocus: false, isBeforeHide: false }); const selectRef = ref(); const selectionRef = ref(); const tooltipRef = ref(); const tagTooltipRef = ref(); const inputRef = ref(); const prefixRef = ref(); const suffixRef = ref(); const menuRef = ref(); const tagMenuRef = ref(); const collapseItemRef = ref(); const scrollbarRef = ref(); const expanded = ref(false); const hoverOption = ref(); const debouncing = ref(false); const { form, formItem } = useFormItem(); const { inputId } = useFormItemInputId(props, { formItemContext: formItem }); const { valueOnClear, isEmptyValue } = useEmptyValues(props); const { isComposing, handleCompositionStart, handleCompositionUpdate, handleCompositionEnd } = useComposition({ afterComposition: (e) => onInput(e) }); const selectDisabled = useFormDisabled(); const { wrapperRef, isFocused, handleBlur } = useFocusController(inputRef, { disabled: selectDisabled, afterFocus() { if (props.automaticDropdown && !expanded.value) { expanded.value = true; states.menuVisibleOnFocus = true; } }, beforeBlur(event) { return tooltipRef.value?.isFocusInsideContent(event) || tagTooltipRef.value?.isFocusInsideContent(event); }, afterBlur() { expanded.value = false; states.menuVisibleOnFocus = false; if (props.validateEvent) formItem?.validate?.("blur").catch(NOOP); } }); const hasModelValue = computed(() => { return isArray$1(props.modelValue) ? props.modelValue.length > 0 : !isEmptyValue(props.modelValue); }); const needStatusIcon = computed(() => form?.statusIcon ?? false); const showClearBtn = computed(() => { return props.clearable && !selectDisabled.value && hasModelValue.value && (isFocused.value || states.inputHovering); }); const iconComponent = computed(() => props.remote && props.filterable && !props.remoteShowSuffix ? "" : props.suffixIcon); const iconReverse = computed(() => nsSelect.is("reverse", !!(iconComponent.value && expanded.value))); const validateState = computed(() => formItem?.validateState || ""); const validateIcon = computed(() => validateState.value && ValidateComponentsMap[validateState.value]); const debounce = computed(() => props.remote ? props.debounce : 0); const isRemoteSearchEmpty = computed(() => props.remote && !states.inputValue && states.options.size === 0); const emptyText = computed(() => { if (props.loading) return props.loadingText || t("el.select.loading"); else { if (props.filterable && states.inputValue && states.options.size > 0 && filteredOptionsCount.value === 0) return props.noMatchText || t("el.select.noMatch"); if (states.options.size === 0) return props.noDataText || t("el.select.noData"); } return null; }); const filteredOptionsCount = computed(() => optionsArray.value.filter((option) => option.visible).length); const optionsArray = computed(() => { const list = Array.from(states.options.values()); const newList = []; states.optionValues.forEach((item) => { const index = list.findIndex((i) => i.value === item); if (index > -1) newList.push(list[index]); }); return newList.length >= list.length ? newList : list; }); const cachedOptionsArray = computed(() => Array.from(states.cachedOptions.values())); const showNewOption = computed(() => { const hasExistingOption = optionsArray.value.filter((option) => { return !option.created; }).some((option) => { return option.currentLabel === states.inputValue; }); return props.filterable && props.allowCreate && states.inputValue !== "" && !hasExistingOption; }); const updateOptions = () => { if (props.filterable && isFunction$1(props.filterMethod)) return; if (props.filterable && props.remote && isFunction$1(props.remoteMethod)) return; optionsArray.value.forEach((option) => { option.updateOption?.(states.inputValue); }); }; const selectSize = useFormSize(); const collapseTagSize = computed(() => ["small"].includes(selectSize.value) ? "small" : "default"); const dropdownMenuVisible = computed({ get() { return expanded.value && (props.loading || !isRemoteSearchEmpty.value || props.remote && !!slots.empty) && (!debouncing.value || !isEmpty(states.previousQuery) || states.options.size > 0); }, set(val) { expanded.value = val; } }); const shouldShowPlaceholder = computed(() => { if (props.multiple && !isUndefined(props.modelValue)) return castArray$1(props.modelValue).length === 0 && !states.inputValue; const value = isArray$1(props.modelValue) ? props.modelValue[0] : props.modelValue; return props.filterable || isUndefined(value) ? !states.inputValue : true; }); const currentPlaceholder = computed(() => { const _placeholder = props.placeholder ?? t("el.select.placeholder"); return props.multiple || !hasModelValue.value ? _placeholder : states.selectedLabel; }); const mouseEnterEventName = isIOS ? null : "mouseenter"; watch(() => props.modelValue, (val, oldVal) => { if (props.multiple) { if (props.filterable && !props.reserveKeyword) { states.inputValue = ""; handleQueryChange(""); } } setSelected(); if (!isEqual$1(val, oldVal) && props.validateEvent) formItem?.validate("change").catch(NOOP); }, { flush: "post", deep: true }); watch(() => expanded.value, (val) => { if (val) handleQueryChange(states.inputValue); else { states.inputValue = ""; states.previousQuery = null; states.isBeforeHide = true; states.menuVisibleOnFocus = false; } }); watch(() => states.options.entries(), () => { if (!isClient) return; setSelected(); if (props.defaultFirstOption && (props.filterable || props.remote) && filteredOptionsCount.value) checkDefaultFirstOption(); }, { flush: "post" }); watch([() => states.hoveringIndex, optionsArray], ([val]) => { if (isNumber(val) && val > -1) hoverOption.value = optionsArray.value[val] || {}; else hoverOption.value = {}; optionsArray.value.forEach((option) => { option.hover = hoverOption.value === option; }); }); watchEffect(() => { if (states.isBeforeHide) return; updateOptions(); }); const handleQueryChange = (val) => { if (states.previousQuery === val || isComposing.value) return; states.previousQuery = val; if (props.filterable && isFunction$1(props.filterMethod)) props.filterMethod(val); else if (props.filterable && props.remote && isFunction$1(props.remoteMethod)) props.remoteMethod(val); if (props.defaultFirstOption && (props.filterable || props.remote) && filteredOptionsCount.value) nextTick(checkDefaultFirstOption); else nextTick(updateHoveringIndex); }; /** * find and highlight first option as default selected * @remark * - if the first option in dropdown list is user-created, * it would be at the end of the optionsArray * so find it and set hover. * (NOTE: there must be only one user-created option in dropdown list with query) * - if there's no user-created option in list, just find the first one as usual * (NOTE: exclude options that are disabled or in disabled-group) */ const checkDefaultFirstOption = () => { const optionsInDropdown = optionsArray.value.filter((n) => n.visible && !n.disabled && !n.states.groupDisabled); const userCreatedOption = optionsInDropdown.find((n) => n.created); const firstOriginOption = optionsInDropdown[0]; states.hoveringIndex = getValueIndex(optionsArray.value.map((item) => item.value), userCreatedOption || firstOriginOption); }; const setSelected = () => { if (!props.multiple) { const option = getOption(isArray$1(props.modelValue) ? props.modelValue[0] : props.modelValue); states.selectedLabel = option.currentLabel; states.selected = [option]; return; } else states.selectedLabel = ""; const result = []; if (!isUndefined(props.modelValue)) castArray$1(props.modelValue).forEach((value) => { result.push(getOption(value)); }); states.selected = result; }; const getOption = (value) => { let option; const isObjectValue = isPlainObject$1(value); for (let i = states.cachedOptions.size - 1; i >= 0; i--) { const cachedOption = cachedOptionsArray.value[i]; if (isObjectValue ? get(cachedOption.value, props.valueKey) === get(value, props.valueKey) : cachedOption.value === value) { option = { index: optionsArray.value.filter((opt) => !opt.created).indexOf(cachedOption), value, currentLabel: cachedOption.currentLabel, get isDisabled() { return cachedOption.isDisabled; } }; break; } } if (option) return option; const existingSelected = states.selected.find((item) => isObjectValue ? get(item.value, props.valueKey) === get(value, props.valueKey) : item.value === value); return { index: -1, value, currentLabel: isObjectValue ? value.label : existingSelected ? existingSelected.currentLabel : value ?? "" }; }; const updateHoveringIndex = () => { const length = states.selected.length; if (length > 0) { const lastOption = states.selected[length - 1]; states.hoveringIndex = optionsArray.value.findIndex((item) => getValueKey(lastOption) === getValueKey(item)); } else states.hoveringIndex = -1; }; const resetSelectionWidth = () => { states.selectionWidth = Number.parseFloat(window.getComputedStyle(selectionRef.value).width); }; const resetCollapseItemWidth = () => { states.collapseItemWidth = collapseItemRef.value.getBoundingClientRect().width; }; const updateTooltip = () => { tooltipRef.value?.updatePopper?.(); }; const updateTagTooltip = () => { tagTooltipRef.value?.updatePopper?.(); }; const onInputChange = () => { if (states.inputValue.length > 0 && !expanded.value) expanded.value = true; handleQueryChange(states.inputValue); }; const onInput = (event) => { states.inputValue = event.target.value; if (props.remote) { debouncing.value = true; debouncedOnInputChange(); } else return onInputChange(); }; const debouncedOnInputChange = useDebounceFn(() => { onInputChange(); debouncing.value = false; }, debounce); const emitChange = (val) => { if (!isEqual$1(props.modelValue, val)) emit(CHANGE_EVENT, val); }; const getLastNotDisabledIndex = (value) => findLastIndex(value, (it) => { const option = states.cachedOptions.get(it); return !option?.disabled && !option?.states.groupDisabled; }); const deletePrevTag = (e) => { const code = getEventCode(e); if (!props.multiple) return; if (code === EVENT_CODE.delete) return; if (e.target.value.length <= 0) { const value = castArray$1(props.modelValue).slice(); const lastNotDisabledIndex = getLastNotDisabledIndex(value); if (lastNotDisabledIndex < 0) return; const removeTagValue = value[lastNotDisabledIndex]; value.splice(lastNotDisabledIndex, 1); emit(UPDATE_MODEL_EVENT, value); emitChange(value); emit("remove-tag", removeTagValue); } }; const deleteTag = (event, tag) => { const index = states.selected.indexOf(tag); if (index > -1 && !selectDisabled.value) { const value = castArray$1(props.modelValue).slice(); value.splice(index, 1); emit(UPDATE_MODEL_EVENT, value); emitChange(value); emit("remove-tag", tag.value); } event.stopPropagation(); focus(); }; const deleteSelected = (event) => { event.stopPropagation(); const value = props.multiple ? [] : valueOnClear.value; if (props.multiple) { for (const item of states.selected) if (item.isDisabled) value.push(item.value); } emit(UPDATE_MODEL_EVENT, value); emitChange(value); states.hoveringIndex = -1; expanded.value = false; emit("clear"); focus(); }; const handleOptionSelect = (option) => { if (props.multiple) { const value = castArray$1(props.modelValue ?? []).slice(); const optionIndex = getValueIndex(value, option); if (optionIndex > -1) value.splice(optionIndex, 1); else if (props.multipleLimit <= 0 || value.length < props.multipleLimit) value.push(option.value); emit(UPDATE_MODEL_EVENT, value); emitChange(value); if (option.created) handleQueryChange(""); if (props.filterable && (option.created || !props.reserveKeyword)) states.inputValue = ""; } else { !isEqual$1(props.modelValue, option.value) && emit("update:modelValue", option.value); emitChange(option.value); expanded.value = false; } focus(); if (expanded.value) return; nextTick(() => { scrollToOption(option); }); }; const getValueIndex = (arr, option) => { if (isUndefined(option)) return -1; if (!isObject$1(option.value)) return arr.indexOf(option.value); return arr.findIndex((item) => { return isEqual$1(get(item, props.valueKey), getValueKey(option)); }); }; const scrollToOption = (option) => { const targetOption = isArray$1(option) ? option[option.length - 1] : option; let target = null; if (!isNil(targetOption?.value)) { const options = optionsArray.value.filter((item) => item.value === targetOption.value); if (options.length > 0) target = options[0].$el; } if (tooltipRef.value && target) { const menu = tooltipRef.value?.popperRef?.contentRef?.querySelector?.(`.${nsSelect.be("dropdown", "wrap")}`); if (menu) scrollIntoView(menu, target); } scrollbarRef.value?.handleScroll(); }; const onOptionCreate = (vm) => { states.options.set(vm.value, vm); states.cachedOptions.set(vm.value, vm); }; const onOptionDestroy = (key, vm) => { if (states.options.get(key) === vm) states.options.delete(key); }; const popperRef = computed(() => { return tooltipRef.value?.popperRef?.contentRef; }); const handleMenuEnter = () => { states.isBeforeHide = false; nextTick(() => { scrollbarRef.value?.update(); scrollToOption(states.selected); }); }; const focus = () => { inputRef.value?.focus(); }; const blur = () => { if (expanded.value) { expanded.value = false; nextTick(() => inputRef.value?.blur()); return; } inputRef.value?.blur(); }; const handleClearClick = (event) => { deleteSelected(event); }; const handleClickOutside = (event) => { expanded.value = false; if (isFocused.value) { const _event = new FocusEvent("blur", event); nextTick(() => handleBlur(_event)); } }; const handleEsc = () => { if (states.inputValue.length > 0) states.inputValue = ""; else expanded.value = false; }; const toggleMenu = (event) => { if (selectDisabled.value || props.filterable && expanded.value && event && !suffixRef.value?.contains(event.target)) return; if (isIOS) states.inputHovering = true; if (states.menuVisibleOnFocus) states.menuVisibleOnFocus = false; else expanded.value = !expanded.value; }; const selectOption = () => { if (!expanded.value) toggleMenu(); else { const option = optionsArray.value[states.hoveringIndex]; if (option && !option.isDisabled) handleOptionSelect(option); } }; const getValueKey = (item) => { return isObject$1(item.value) ? get(item.value, props.valueKey) : item.value; }; const optionsAllDisabled = computed(() => optionsArray.value.filter((option) => option.visible).every((option) => option.isDisabled)); const showTagList = computed(() => { if (!props.multiple) return []; return props.collapseTags ? states.selected.slice(0, props.maxCollapseTags) : states.selected; }); const collapseTagList = computed(() => { if (!props.multiple) return []; return props.collapseTags ? states.selected.slice(props.maxCollapseTags) : []; }); const navigateOptions = (direction) => { if (!expanded.value) { expanded.value = true; return; } if (states.options.size === 0 || filteredOptionsCount.value === 0 || isComposing.value) return; if (!optionsAllDisabled.value) { if (direction === "next") { states.hoveringIndex++; if (states.hoveringIndex === states.options.size) states.hoveringIndex = 0; } else if (direction === "prev") { states.hoveringIndex--; if (states.hoveringIndex < 0) states.hoveringIndex = states.options.size - 1; } const option = optionsArray.value[states.hoveringIndex]; if (option.isDisabled || !option.visible) navigateOptions(direction); nextTick(() => scrollToOption(hoverOption.value)); } }; const findFocusableIndex = (arr, start, step, len) => { for (let i = start; i >= 0 && i < len; i += step) { const obj = arr[i]; if (!obj?.isDisabled && obj?.visible) return i; } return null; }; const focusOption = (targetIndex, mode) => { const len = states.options.size; if (len === 0) return; const start = clamp$1(targetIndex, 0, len - 1); const options = optionsArray.value; const direction = mode === "up" ? -1 : 1; const newIndex = findFocusableIndex(options, start, direction, len) ?? findFocusableIndex(options, start - direction, -direction, len); if (newIndex != null) { states.hoveringIndex = newIndex; nextTick(() => scrollToOption(hoverOption.value)); } }; const handleKeydown = (e) => { const code = getEventCode(e); let isPreventDefault = true; switch (code) { case EVENT_CODE.up: navigateOptions("prev"); break; case EVENT_CODE.down: navigateOptions("next"); break; case EVENT_CODE.enter: case EVENT_CODE.numpadEnter: if (!isComposing.value) selectOption(); break; case EVENT_CODE.esc: handleEsc(); break; case EVENT_CODE.backspace: isPreventDefault = false; deletePrevTag(e); return; case EVENT_CODE.home: if (!expanded.value) return; focusOption(0, "down"); break; case EVENT_CODE.end: if (!expanded.value) return; focusOption(states.options.size - 1, "up"); break; case EVENT_CODE.pageUp: if (!expanded.value) return; focusOption(states.hoveringIndex - 10, "up"); break; case EVENT_CODE.pageDown: if (!expanded.value) return; focusOption(states.hoveringIndex + 10, "down"); break; default: isPreventDefault = false; break; } if (isPreventDefault) { e.preventDefault(); e.stopPropagation(); } }; const getGapWidth = () => { if (!selectionRef.value) return 0; const style = window.getComputedStyle(selectionRef.value); return Number.parseFloat(style.gap || "6px"); }; const tagStyle = computed(() => { const gapWidth = getGapWidth(); const inputSlotWidth = props.filterable ? gapWidth + 11 : 0; return { maxWidth: `${collapseItemRef.value && props.maxCollapseTags === 1 ? states.selectionWidth - states.collapseItemWidth - gapWidth - inputSlotWidth : states.selectionWidth - inputSlotWidth}px` }; }); const collapseTagStyle = computed(() => { return { maxWidth: `${states.selectionWidth}px` }; }); const popupScroll = (data) => { emit("popup-scroll", data); }; const endReached = (direction) => { emit("end-reached", direction); }; useResizeObserver(selectionRef, resetSelectionWidth); useResizeObserver(wrapperRef, updateTooltip); useResizeObserver(tagMenuRef, updateTagTooltip); useResizeObserver(collapseItemRef, resetCollapseItemWidth); let stop; watch(() => dropdownMenuVisible.value, (newVal) => { if (newVal) stop = useResizeObserver(menuRef, updateTooltip).stop; else { stop?.(); stop = void 0; } emit("visible-change", newVal); }); onMounted(() => { setSelected(); }); return { inputId, contentId, nsSelect, nsInput, states, isFocused, expanded, optionsArray, hoverOption, selectSize, filteredOptionsCount, updateTooltip, updateTagTooltip, debouncedOnInputChange, onInput, deletePrevTag, deleteTag, deleteSelected, handleOptionSelect, scrollToOption, hasModelValue, shouldShowPlaceholder, currentPlaceholder, mouseEnterEventName, needStatusIcon, showClearBtn, iconComponent, iconReverse, validateState, validateIcon, showNewOption, updateOptions, collapseTagSize, setSelected, selectDisabled, emptyText, handleCompositionStart, handleCompositionUpdate, handleCompositionEnd, handleKeydown, onOptionCreate, onOptionDestroy, handleMenuEnter, focus, blur, handleClearClick, handleClickOutside, handleEsc, toggleMenu, selectOption, getValueKey, navigateOptions, dropdownMenuVisible, showTagList, collapseTagList, popupScroll, getOption, endReached, tagStyle, collapseTagStyle, popperRef, inputRef, tooltipRef, tagTooltipRef, prefixRef, suffixRef, selectRef, wrapperRef, selectionRef, scrollbarRef, menuRef, tagMenuRef, collapseItemRef }; }; //#endregion //#region ../../packages/components/select/src/options.ts var options_default = defineComponent({ name: "ElOptions", setup(_, { slots }) { const select = inject(selectKey); let cachedValueList = []; return () => { const children = slots.default?.(); const valueList = []; function filterOptions(children) { if (!isArray$1(children)) return; children.forEach((item) => { const name = (item?.type || {})?.name; if (name === "ElOptionGroup") filterOptions(!isString(item.children) && !isArray$1(item.children) && isFunction$1(item.children?.default) ? item.children?.default() : item.children); else if (name === "ElOption") valueList.push(item.props?.value); else if (isArray$1(item.children)) filterOptions(item.children); }); } if (children.length) filterOptions(children[0]?.children); if (!isEqual$1(valueList, cachedValueList)) { cachedValueList = valueList; if (select) select.states.optionValues = valueList; } return children; }; } }); //#endregion //#region ../../packages/components/select/src/select.ts const selectProps = buildProps({ /** * @description the name attribute of select input */ name: String, /** * @description native input id */ id: String, /** * @description binding value */ modelValue: { type: definePropType([ Array, String, Number, Boolean, Object ]), default: void 0 }, /** * @description the autocomplete attribute of select input */ autocomplete: { type: String, default: "off" }, /** * @description for non-filterable Select, this prop decides if the option menu pops up when the input is focused */ automaticDropdown: Boolean, /** * @description size of Input */ size: useSizeProp, /** * @description tooltip theme, built-in theme: `dark` / `light` */ effect: { type: definePropType(String), default: "light" }, /** * @description whether Select is disabled */ disabled: { type: Boolean, default: void 0 }, /** * @description whether select can be cleared */ clearable: Boolean, /** * @description whether Select is filterable */ filterable: Boolean, /** * @description whether creating new items is allowed. To use this, `filterable` must be true */ allowCreate: Boolean, /** * @description whether Select is loading data from server */ loading: Boolean, /** * @description custom class name for Select's dropdown */ popperClass: { type: String, default: "" }, /** * @description custom style for Select's dropdown */ popperStyle: { type: definePropType([String, Object]) }, /** * @description [popper.js](https://popper.js.org/docs/v2/) parameters */ popperOptions: { type: definePropType(Object), default: () => ({}) }, /** * @description whether options are loaded from server */ remote: Boolean, /** * @description debounce delay during remote search, in milliseconds */ debounce: { type: Number, default: 300 }, /** * @description displayed text while loading data from server, default is 'Loading' */ loadingText: String, /** * @description displayed text when no data matches the filtering query, you can also use slot `empty`, default is 'No matching data' */ noMatchText: String, /** * @description displayed text when there is no options, you can also use slot `empty`, default is 'No data' */ noDataText: String, /** * @description function that gets called when the input value changes. Its parameter is the current input value. To use this, `filterable` must be true */ remoteMethod: { type: definePropType(Function) }, /** * @description custom filter method, the first parameter is the current input value. To use this, `filterable` must be true */ filterMethod: { type: definePropType(Function) }, /** * @description whether multiple-select is activated */ multiple: Boolean, /** * @description maximum number of options user can select when `multiple` is `true`. No limit when set to 0 */ multipleLimit: { type: Number, default: 0 }, /** * @description placeholder, default is 'Select' */ placeholder: { type: String }, /** * @description select first matching option on enter key. Use with `filterable` or `remote` */ defaultFirstOption: Boolean, /** * @description when `multiple` and `filter` is true, whether to reserve current keyword after selecting an option */ reserveKeyword: { type: Boolean, default: true }, /** * @description unique identity key name for value, required when value is an object */ valueKey: { type: String, default: "value" }, /** * @description whether to collapse tags to a text when multiple selecting */ collapseTags: Boolean, /** * @description whether show all selected tags when mouse hover text of collapse-tags. To use this, `collapse-tags` must be true */ collapseTagsTooltip: Boolean, /** * @description configuration object for the collapse-tags tooltip. To use this, `collapse-tags` and `collapse-tags-tooltip` must be true */ tagTooltip: { type: definePropType(Object), default: () => ({}) }, /** * @description the max tags number to be shown. To use this, `collapse-tags` must be true */ maxCollapseTags: { type: Number, default: 1 }, /** * @description whether select dropdown is teleported, if `true` it will be teleported to where `append-to` sets */ teleported: useTooltipContentProps.teleported, /** * @description when select dropdown is inactive and `persistent` is `false`, select dropdown will be destroyed */ persistent: { type: Boolean, default: true }, /** * @description custom clear icon component */ clearIcon: { type: iconPropType, default: circle_close_default }, /** * @description whether the width of the dropdown is the same as the input */ fitInputWidth: Boolean, /** * @description custom suffix icon component */ suffixIcon: { type: iconPropType, default: arrow_down_default }, /** * @description tag type */ tagType: { ...tagProps.type, default: "info" }, /** * @description tag effect */ tagEffect: { ...tagProps.effect, default: "light" }, /** * @description whether to trigger form validation */ validateEvent: { type: Boolean, default: true }, /** * @description in remote search method show suffix icon */ remoteShowSuffix: Boolean, /** * @description determines whether the arrow is displayed */ showArrow: { type: Boolean, default: true }, /** * @description offset of the dropdown */ offset: { type: Number, default: 12 }, /** * @description position of dropdown */ placement: { type: definePropType(String), values: Ee, default: "bottom-start" }, /** * @description list of possible positions for dropdown */ fallbackPlacements: { type: definePropType(Array), default: [ "bottom-start", "top-start", "right", "left" ] }, /** * @description tabindex for input */ tabindex: { type: [String, Number], default: 0 }, /** * @description which element the selection dropdown appends to */ appendTo: useTooltipContentProps.appendTo, options: { type: definePropType(Array) }, props: { type: definePropType(Object), default: () => defaultProps$2 }, ...useEmptyValuesProps, ...useAriaProps(["ariaLabel"]) }); const selectEmits = { [UPDATE_MODEL_EVENT]: (val) => true, [CHANGE_EVENT]: (val) => true, "popup-scroll": scrollbarEmits.scroll, "end-reached": scrollbarEmits["end-reached"], "remove-tag": (val) => true, "visible-change": (visible) => true, focus: (evt) => evt instanceof FocusEvent, blur: (evt) => evt instanceof FocusEvent, clear: () => true }; //#endregion //#region ../../packages/components/select/src/option-group.vue?vue&type=script&lang.ts var option_group_vue_vue_type_script_lang_default = defineComponent({ name: "ElOptionGroup", componentName: "ElOptionGroup", props: { /** * @description name of the group */ label: String, /** * @description whether to disable all options in this group */ disabled: Boolean }, setup(props) { const ns = useNamespace("select"); const groupRef = ref(); const instance = getCurrentInstance(); const children = ref([]); provide(selectGroupKey, reactive({ ...toRefs(props) })); const visible = computed(() => children.value.some((option) => option.visible === true)); const isOption = (node) => node.type.name === "ElOption" && !!node.component?.proxy; const flattedChildren = (node) => { const nodes = castArray$1(node); const children = []; nodes.forEach((child) => { if (!isVNode(child)) return; if (isOption(child)) children.push(child.component.proxy); else if (isArray$1(child.children) && child.children.length) children.push(...flattedChildren(child.children)); else if (child.component?.subTree) children.push(...flattedChildren(child.component.subTree)); }); return children; }; const updateChildren = () => { children.value = flattedChildren(instance.subTree); }; onMounted(() => { updateChildren(); }); useMutationObserver(groupRef, updateChildren, { attributes: true, subtree: true, childList: true }); return { groupRef, visible, ns }; } }); //#endregion //#region ../../packages/components/select/src/option-group.vue function _sfc_render$18(_ctx, _cache, $props, $setup, $data, $options) { return withDirectives((openBlock(), createElementBlock("ul", { ref: "groupRef", class: normalizeClass(_ctx.ns.be("group", "wrap")) }, [createElementVNode("li", { class: normalizeClass(_ctx.ns.be("group", "title")) }, toDisplayString(_ctx.label), 3), createElementVNode("li", null, [createElementVNode("ul", { class: normalizeClass(_ctx.ns.b("group")) }, [renderSlot(_ctx.$slots, "default")], 2)])], 2)), [[vShow, _ctx.visible]]); } var option_group_default = /* @__PURE__ */ _plugin_vue_export_helper_default(option_group_vue_vue_type_script_lang_default, [["render", _sfc_render$18]]); //#endregion //#region ../../packages/components/select/src/select.vue?vue&type=script&lang.ts const COMPONENT_NAME$13 = "ElSelect"; const warnHandlerMap = /* @__PURE__ */ new WeakMap(); const createSelectWarnHandler = (appContext) => { return (...args) => { const message = args[0]; if (!message || message.includes("Slot \"default\" invoked outside of the render function") && args[2]?.includes("ElTreeSelect")) return; const original = warnHandlerMap.get(appContext)?.originalWarnHandler; if (original) { original(...args); return; } console.warn(...args); }; }; const getWarnHandlerRecord = (appContext) => { let record = warnHandlerMap.get(appContext); if (!record) { record = { originalWarnHandler: appContext.config.warnHandler, handler: createSelectWarnHandler(appContext), count: 0 }; warnHandlerMap.set(appContext, record); } return record; }; var select_vue_vue_type_script_lang_default$1 = defineComponent({ name: COMPONENT_NAME$13, componentName: COMPONENT_NAME$13, components: { ElSelectMenu: select_dropdown_default$1, ElOption: option_default, ElOptions: options_default, ElOptionGroup: option_group_default, ElTag, ElScrollbar, ElTooltip, ElIcon }, directives: { ClickOutside }, props: selectProps, emits: selectEmits, setup(props, { emit, slots }) { const instance = getCurrentInstance(); const warnRecord = getWarnHandlerRecord(instance.appContext); warnRecord.count += 1; instance.appContext.config.warnHandler = warnRecord.handler; const modelValue = computed(() => { const { modelValue: rawModelValue, multiple } = props; const fallback = multiple ? [] : void 0; if (isArray$1(rawModelValue)) return multiple ? rawModelValue : fallback; return multiple ? fallback : rawModelValue; }); const _props = reactive({ ...toRefs(props), modelValue }); const API = useSelect$2(_props, emit); const { calculatorRef, inputStyle } = useCalcInputWidth(); const { getLabel, getValue, getOptions, getDisabled } = useProps(props); const getOptionProps = (option) => ({ label: getLabel(option), value: getValue(option), disabled: getDisabled(option) }); const flatTreeSelectData = (data) => { return data.reduce((acc, item) => { acc.push(item); if (item.children && item.children.length > 0) acc.push(...flatTreeSelectData(item.children)); return acc; }, []); }; const manuallyRenderSlots = (vnodes) => { flattedChildren(vnodes || []).forEach((item) => { if (isObject$1(item) && (item.type.name === "ElOption" || item.type.name === "ElTree")) { const _name = item.type.name; if (_name === "ElTree") flatTreeSelectData(item.props?.data || []).forEach((treeItem) => { treeItem.currentLabel = treeItem.label ?? (isObject$1(treeItem.value) ? "" : treeItem.value); API.onOptionCreate(treeItem); }); else if (_name === "ElOption") { const obj = { ...item.props }; obj.currentLabel = obj.label ?? (isObject$1(obj.value) ? "" : obj.value); API.onOptionCreate(obj); } } }); }; watch(() => [props.persistent || API.expanded.value || !slots.default ? void 0 : slots.default?.(), modelValue.value], () => { if (props.persistent || API.expanded.value) return; if (!slots.default) return; API.states.options.clear(); manuallyRenderSlots(slots.default?.()); }, { immediate: true }); provide(selectKey, reactive({ props: _props, states: API.states, selectRef: API.selectRef, optionsArray: API.optionsArray, setSelected: API.setSelected, handleOptionSelect: API.handleOptionSelect, onOptionCreate: API.onOptionCreate, onOptionDestroy: API.onOptionDestroy })); const selectedLabel = computed(() => { if (!props.multiple) return API.states.selectedLabel; return API.states.selected.map((i) => i.currentLabel); }); onBeforeUnmount(() => { const record = warnHandlerMap.get(instance.appContext); if (!record) return; record.count -= 1; if (record.count <= 0) { instance.appContext.config.warnHandler = record.originalWarnHandler; warnHandlerMap.delete(instance.appContext); } }); return { ...API, modelValue, selectedLabel, calculatorRef, inputStyle, getLabel, getValue, getOptions, getDisabled, getOptionProps }; } }); //#endregion //#region ../../packages/components/select/src/select.vue const _hoisted_1$66 = [ "id", "value", "name", "disabled", "autocomplete", "tabindex", "readonly", "aria-activedescendant", "aria-controls", "aria-expanded", "aria-label" ]; const _hoisted_2$37 = ["textContent"]; const _hoisted_3$18 = { key: 1 }; function _sfc_render$17(_ctx, _cache, $props, $setup, $data, $options) { const _component_el_tag = resolveComponent("el-tag"); const _component_el_tooltip = resolveComponent("el-tooltip"); const _component_el_icon = resolveComponent("el-icon"); const _component_el_option = resolveComponent("el-option"); const _component_el_option_group = resolveComponent("el-option-group"); const _component_el_options = resolveComponent("el-options"); const _component_el_scrollbar = resolveComponent("el-scrollbar"); const _component_el_select_menu = resolveComponent("el-select-menu"); const _directive_click_outside = resolveDirective("click-outside"); return withDirectives((openBlock(), createElementBlock("div", mergeProps({ ref: "selectRef", class: [_ctx.nsSelect.b(), _ctx.nsSelect.m(_ctx.selectSize)] }, { [toHandlerKey(_ctx.mouseEnterEventName)]: _cache[11] || (_cache[11] = ($event) => _ctx.states.inputHovering = true) }, { onMouseleave: _cache[12] || (_cache[12] = ($event) => _ctx.states.inputHovering = false) }), [createVNode(_component_el_tooltip, { ref: "tooltipRef", visible: _ctx.dropdownMenuVisible, placement: _ctx.placement, teleported: _ctx.teleported, "popper-class": [_ctx.nsSelect.e("popper"), _ctx.popperClass], "popper-style": _ctx.popperStyle, "popper-options": _ctx.popperOptions, "fallback-placements": _ctx.fallbackPlacements, effect: _ctx.effect, pure: "", trigger: "click", transition: `${_ctx.nsSelect.namespace.value}-zoom-in-top`, "stop-popper-mouse-event": false, "gpu-acceleration": false, persistent: _ctx.persistent, "append-to": _ctx.appendTo, "show-arrow": _ctx.showArrow, offset: _ctx.offset, onBeforeShow: _ctx.handleMenuEnter, onHide: _cache[10] || (_cache[10] = ($event) => _ctx.states.isBeforeHide = false) }, { default: withCtx(() => [createElementVNode("div", { ref: "wrapperRef", class: normalizeClass([ _ctx.nsSelect.e("wrapper"), _ctx.nsSelect.is("focused", _ctx.isFocused), _ctx.nsSelect.is("hovering", _ctx.states.inputHovering), _ctx.nsSelect.is("filterable", _ctx.filterable), _ctx.nsSelect.is("disabled", _ctx.selectDisabled) ]), onClick: _cache[7] || (_cache[7] = withModifiers((...args) => _ctx.toggleMenu && _ctx.toggleMenu(...args), ["prevent"])) }, [ _ctx.$slots.prefix ? (openBlock(), createElementBlock("div", { key: 0, ref: "prefixRef", class: normalizeClass(_ctx.nsSelect.e("prefix")) }, [renderSlot(_ctx.$slots, "prefix")], 2)) : createCommentVNode("v-if", true), createElementVNode("div", { ref: "selectionRef", class: normalizeClass([_ctx.nsSelect.e("selection"), _ctx.nsSelect.is("near", _ctx.multiple && !_ctx.$slots.prefix && !!_ctx.states.selected.length)]) }, [ _ctx.multiple ? renderSlot(_ctx.$slots, "tag", { key: 0, data: _ctx.states.selected, deleteTag: _ctx.deleteTag, selectDisabled: _ctx.selectDisabled }, () => [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.showTagList, (item) => { return openBlock(), createElementBlock("div", { key: _ctx.getValueKey(item), class: normalizeClass(_ctx.nsSelect.e("selected-item")) }, [createVNode(_component_el_tag, { closable: !_ctx.selectDisabled && !item.isDisabled, size: _ctx.collapseTagSize, type: _ctx.tagType, effect: _ctx.tagEffect, "disable-transitions": "", style: normalizeStyle(_ctx.tagStyle), onClose: ($event) => _ctx.deleteTag($event, item) }, { default: withCtx(() => [createElementVNode("span", { class: normalizeClass(_ctx.nsSelect.e("tags-text")) }, [renderSlot(_ctx.$slots, "label", { index: item.index, label: item.currentLabel, value: item.value }, () => [createTextVNode(toDisplayString(item.currentLabel), 1)])], 2)]), _: 2 }, 1032, [ "closable", "size", "type", "effect", "style", "onClose" ])], 2); }), 128)), _ctx.collapseTags && _ctx.states.selected.length > _ctx.maxCollapseTags ? (openBlock(), createBlock(_component_el_tooltip, { key: 0, ref: "tagTooltipRef", disabled: _ctx.dropdownMenuVisible || !_ctx.collapseTagsTooltip, "fallback-placements": _ctx.tagTooltip?.fallbackPlacements ?? [ "bottom", "top", "right", "left" ], effect: _ctx.tagTooltip?.effect ?? _ctx.effect, placement: _ctx.tagTooltip?.placement ?? "bottom", "popper-class": _ctx.tagTooltip?.popperClass ?? _ctx.popperClass, "popper-style": _ctx.tagTooltip?.popperStyle ?? _ctx.popperStyle, teleported: _ctx.tagTooltip?.teleported ?? _ctx.teleported, "append-to": _ctx.tagTooltip?.appendTo ?? _ctx.appendTo, "popper-options": _ctx.tagTooltip?.popperOptions ?? _ctx.popperOptions, transition: _ctx.tagTooltip?.transition, "show-after": _ctx.tagTooltip?.showAfter, "hide-after": _ctx.tagTooltip?.hideAfter, "auto-close": _ctx.tagTooltip?.autoClose, offset: _ctx.tagTooltip?.offset }, { default: withCtx(() => [createElementVNode("div", { ref: "collapseItemRef", class: normalizeClass(_ctx.nsSelect.e("selected-item")) }, [createVNode(_component_el_tag, { closable: false, size: _ctx.collapseTagSize, type: _ctx.tagType, effect: _ctx.tagEffect, "disable-transitions": "", style: normalizeStyle(_ctx.collapseTagStyle) }, { default: withCtx(() => [createElementVNode("span", { class: normalizeClass(_ctx.nsSelect.e("tags-text")) }, " + " + toDisplayString(_ctx.states.selected.length - _ctx.maxCollapseTags), 3)]), _: 1 }, 8, [ "size", "type", "effect", "style" ])], 2)]), content: withCtx(() => [createElementVNode("div", { ref: "tagMenuRef", class: normalizeClass(_ctx.nsSelect.e("selection")) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.collapseTagList, (item) => { return openBlock(), createElementBlock("div", { key: _ctx.getValueKey(item), class: normalizeClass(_ctx.nsSelect.e("selected-item")) }, [createVNode(_component_el_tag, { class: "in-tooltip", closable: !_ctx.selectDisabled && !item.isDisabled, size: _ctx.collapseTagSize, type: _ctx.tagType, effect: _ctx.tagEffect, "disable-transitions": "", onClose: ($event) => _ctx.deleteTag($event, item) }, { default: withCtx(() => [createElementVNode("span", { class: normalizeClass(_ctx.nsSelect.e("tags-text")) }, [renderSlot(_ctx.$slots, "label", { index: item.index, label: item.currentLabel, value: item.value }, () => [createTextVNode(toDisplayString(item.currentLabel), 1)])], 2)]), _: 2 }, 1032, [ "closable", "size", "type", "effect", "onClose" ])], 2); }), 128))], 2)]), _: 3 }, 8, [ "disabled", "fallback-placements", "effect", "placement", "popper-class", "popper-style", "teleported", "append-to", "popper-options", "transition", "show-after", "hide-after", "auto-close", "offset" ])) : createCommentVNode("v-if", true)]) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass([ _ctx.nsSelect.e("selected-item"), _ctx.nsSelect.e("input-wrapper"), _ctx.nsSelect.is("hidden", !_ctx.filterable || _ctx.selectDisabled || !_ctx.states.inputValue && !_ctx.isFocused) ]) }, [createElementVNode("input", { id: _ctx.inputId, ref: "inputRef", value: _ctx.states.inputValue, type: "text", name: _ctx.name, class: normalizeClass([_ctx.nsSelect.e("input"), _ctx.nsSelect.is(_ctx.selectSize)]), disabled: _ctx.selectDisabled, autocomplete: _ctx.autocomplete, style: normalizeStyle(_ctx.inputStyle), tabindex: _ctx.tabindex, role: "combobox", readonly: !_ctx.filterable, spellcheck: "false", "aria-activedescendant": _ctx.hoverOption?.id || "", "aria-controls": _ctx.contentId, "aria-expanded": _ctx.dropdownMenuVisible, "aria-label": _ctx.ariaLabel, "aria-autocomplete": "none", "aria-haspopup": "listbox", onKeydown: _cache[0] || (_cache[0] = (...args) => _ctx.handleKeydown && _ctx.handleKeydown(...args)), onCompositionstart: _cache[1] || (_cache[1] = (...args) => _ctx.handleCompositionStart && _ctx.handleCompositionStart(...args)), onCompositionupdate: _cache[2] || (_cache[2] = (...args) => _ctx.handleCompositionUpdate && _ctx.handleCompositionUpdate(...args)), onCompositionend: _cache[3] || (_cache[3] = (...args) => _ctx.handleCompositionEnd && _ctx.handleCompositionEnd(...args)), onInput: _cache[4] || (_cache[4] = (...args) => _ctx.onInput && _ctx.onInput(...args)), onChange: _cache[5] || (_cache[5] = withModifiers(() => {}, ["stop"])), onClick: _cache[6] || (_cache[6] = withModifiers((...args) => _ctx.toggleMenu && _ctx.toggleMenu(...args), ["stop"])) }, null, 46, _hoisted_1$66), _ctx.filterable ? (openBlock(), createElementBlock("span", { key: 0, ref: "calculatorRef", "aria-hidden": "true", class: normalizeClass(_ctx.nsSelect.e("input-calculator")), textContent: toDisplayString(_ctx.states.inputValue) }, null, 10, _hoisted_2$37)) : createCommentVNode("v-if", true)], 2), _ctx.shouldShowPlaceholder ? (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass([ _ctx.nsSelect.e("selected-item"), _ctx.nsSelect.e("placeholder"), _ctx.nsSelect.is("transparent", !_ctx.hasModelValue || _ctx.expanded && !_ctx.states.inputValue) ]) }, [_ctx.hasModelValue ? renderSlot(_ctx.$slots, "label", { key: 0, index: _ctx.getOption(_ctx.modelValue).index, label: _ctx.currentPlaceholder, value: _ctx.modelValue }, () => [createElementVNode("span", null, toDisplayString(_ctx.currentPlaceholder), 1)]) : (openBlock(), createElementBlock("span", _hoisted_3$18, toDisplayString(_ctx.currentPlaceholder), 1))], 2)) : createCommentVNode("v-if", true) ], 2), createElementVNode("div", { ref: "suffixRef", class: normalizeClass(_ctx.nsSelect.e("suffix")) }, [ _ctx.iconComponent && !_ctx.showClearBtn ? (openBlock(), createBlock(_component_el_icon, { key: 0, class: normalizeClass([ _ctx.nsSelect.e("caret"), _ctx.nsSelect.e("icon"), _ctx.iconReverse ]) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(_ctx.iconComponent)))]), _: 1 }, 8, ["class"])) : createCommentVNode("v-if", true), _ctx.showClearBtn && _ctx.clearIcon ? (openBlock(), createBlock(_component_el_icon, { key: 1, class: normalizeClass([ _ctx.nsSelect.e("caret"), _ctx.nsSelect.e("icon"), _ctx.nsSelect.e("clear") ]), onClick: _ctx.handleClearClick }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(_ctx.clearIcon)))]), _: 1 }, 8, ["class", "onClick"])) : createCommentVNode("v-if", true), _ctx.validateState && _ctx.validateIcon && _ctx.needStatusIcon ? (openBlock(), createBlock(_component_el_icon, { key: 2, class: normalizeClass([ _ctx.nsInput.e("icon"), _ctx.nsInput.e("validateIcon"), _ctx.nsInput.is("loading", _ctx.validateState === "validating") ]) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(_ctx.validateIcon)))]), _: 1 }, 8, ["class"])) : createCommentVNode("v-if", true) ], 2) ], 2)]), content: withCtx(() => [createVNode(_component_el_select_menu, { ref: "menuRef" }, { default: withCtx(() => [ _ctx.$slots.header ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(_ctx.nsSelect.be("dropdown", "header")), onClick: _cache[8] || (_cache[8] = withModifiers(() => {}, ["stop"])) }, [renderSlot(_ctx.$slots, "header")], 2)) : createCommentVNode("v-if", true), withDirectives(createVNode(_component_el_scrollbar, { id: _ctx.contentId, ref: "scrollbarRef", tag: "ul", "wrap-class": _ctx.nsSelect.be("dropdown", "wrap"), "view-class": _ctx.nsSelect.be("dropdown", "list"), class: normalizeClass([_ctx.nsSelect.is("empty", _ctx.filteredOptionsCount === 0)]), role: "listbox", "aria-label": _ctx.ariaLabel, "aria-orientation": "vertical", onScroll: _ctx.popupScroll, onEndReached: _ctx.endReached }, { default: withCtx(() => [_ctx.showNewOption ? (openBlock(), createBlock(_component_el_option, { key: 0, value: _ctx.states.inputValue, created: true }, null, 8, ["value"])) : createCommentVNode("v-if", true), createVNode(_component_el_options, null, { default: withCtx(() => [renderSlot(_ctx.$slots, "default", {}, () => [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.options, (option, index) => { return openBlock(), createElementBlock(Fragment, { key: index }, [_ctx.getOptions(option)?.length ? (openBlock(), createBlock(_component_el_option_group, { key: 0, label: _ctx.getLabel(option), disabled: _ctx.getDisabled(option) }, { default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.getOptions(option), (item) => { return openBlock(), createBlock(_component_el_option, mergeProps({ key: _ctx.getValue(item) }, { ref_for: true }, _ctx.getOptionProps(item)), null, 16); }), 128))]), _: 2 }, 1032, ["label", "disabled"])) : (openBlock(), createBlock(_component_el_option, mergeProps({ key: 1, ref_for: true }, _ctx.getOptionProps(option)), null, 16))], 64); }), 128))])]), _: 3 })]), _: 3 }, 8, [ "id", "wrap-class", "view-class", "class", "aria-label", "onScroll", "onEndReached" ]), [[vShow, _ctx.states.options.size > 0 && !_ctx.loading]]), _ctx.$slots.loading && _ctx.loading ? (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass(_ctx.nsSelect.be("dropdown", "loading")) }, [renderSlot(_ctx.$slots, "loading")], 2)) : _ctx.loading || _ctx.filteredOptionsCount === 0 ? (openBlock(), createElementBlock("div", { key: 2, class: normalizeClass(_ctx.nsSelect.be("dropdown", "empty")) }, [renderSlot(_ctx.$slots, "empty", {}, () => [createElementVNode("span", null, toDisplayString(_ctx.emptyText), 1)])], 2)) : createCommentVNode("v-if", true), _ctx.$slots.footer ? (openBlock(), createElementBlock("div", { key: 3, class: normalizeClass(_ctx.nsSelect.be("dropdown", "footer")), onClick: _cache[9] || (_cache[9] = withModifiers(() => {}, ["stop"])) }, [renderSlot(_ctx.$slots, "footer")], 2)) : createCommentVNode("v-if", true) ]), _: 3 }, 512)]), _: 3 }, 8, [ "visible", "placement", "teleported", "popper-class", "popper-style", "popper-options", "fallback-placements", "effect", "transition", "persistent", "append-to", "show-arrow", "offset", "onBeforeShow" ])], 16)), [[ _directive_click_outside, _ctx.handleClickOutside, _ctx.popperRef ]]); } var select_default$1 = /* @__PURE__ */ _plugin_vue_export_helper_default(select_vue_vue_type_script_lang_default$1, [["render", _sfc_render$17]]); //#endregion //#region ../../packages/components/select/index.ts const ElSelect = withInstall(select_default$1, { Option: option_default, OptionGroup: option_group_default }); const ElOption = withNoopInstall(option_default); const ElOptionGroup = withNoopInstall(option_group_default); //#endregion //#region ../../packages/components/calendar/src/select-controller.vue?vue&type=script&setup=true&lang.ts var select_controller_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "SelectController", __name: "select-controller", props: selectControllerProps, emits: selectControllerEmits, setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const nsSelect = useNamespace("calendar-select"); const { t, lang } = useLocale(); const monthOptions = Array.from({ length: 12 }, (_, index) => { const actualMonth = index + 1; return { value: actualMonth, label: isFunction$1(props.formatter) ? props.formatter(actualMonth, "month") : actualMonth }; }); const yearValue = computed(() => props.date.year()); const monthValue = computed(() => props.date.month() + 1); const yearOptions = computed(() => { const years = []; for (let i = -10; i < 10; i++) { const year = yearValue.value + i; if (year > 0) { const label = isFunction$1(props.formatter) ? props.formatter(year, "year") : year; years.push({ value: year, label }); } } return years; }); const handleYearChange = (year) => { emit("date-change", (0, import_dayjs_min.default)(new Date(year, monthValue.value - 1, 1)).locale(lang.value)); }; const handleMonthChange = (month) => { emit("date-change", (0, import_dayjs_min.default)(new Date(yearValue.value, month - 1, 1)).locale(lang.value)); }; const selectToday = () => { emit("date-change", "today"); }; return (_ctx, _cache) => { return openBlock(), createElementBlock(Fragment, null, [ createVNode(unref(ElSelect), { "model-value": yearValue.value, size: "small", class: normalizeClass(unref(nsSelect).e("year")), "validate-event": false, options: yearOptions.value, onChange: handleYearChange }, null, 8, [ "model-value", "class", "options" ]), createVNode(unref(ElSelect), { "model-value": monthValue.value, size: "small", class: normalizeClass(unref(nsSelect).e("month")), "validate-event": false, options: unref(monthOptions), onChange: handleMonthChange }, null, 8, [ "model-value", "class", "options" ]), createVNode(unref(ElButton), { size: "small", onClick: selectToday }, { default: withCtx(() => [createTextVNode(toDisplayString(unref(t)("el.datepicker.today")), 1)]), _: 1 }) ], 64); }; } }); //#endregion //#region ../../packages/components/calendar/src/select-controller.vue var select_controller_default = select_controller_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/calendar/src/calendar.vue?vue&type=script&setup=true&lang.ts const COMPONENT_NAME$12 = "ElCalendar"; var calendar_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: COMPONENT_NAME$12, __name: "calendar", props: calendarProps, emits: calendarEmits, setup(__props, { expose: __expose, emit: __emit }) { const ns = useNamespace("calendar"); const { calculateValidatedDateRange, date, pickDay, realSelectedDay, selectDate, validatedRange, handleDateChange } = useCalendar(__props, __emit, COMPONENT_NAME$12); const { t } = useLocale(); const i18nDate = computed(() => { const pickedMonth = `el.datepicker.month${date.value.format("M")}`; return `${date.value.year()} ${t("el.datepicker.year")} ${t(pickedMonth)}`; }); __expose({ /** @description currently selected date */ selectedDay: realSelectedDay, /** @description select a specific date */ pickDay, /** @description select date */ selectDate, /** @description Calculate the validate date range according to the start and end dates */ calculateValidatedDateRange }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass(unref(ns).b()) }, [createElementVNode("div", { class: normalizeClass(unref(ns).e("header")) }, [renderSlot(_ctx.$slots, "header", { date: i18nDate.value }, () => [createElementVNode("div", { class: normalizeClass(unref(ns).e("title")) }, toDisplayString(i18nDate.value), 3), unref(validatedRange).length === 0 && __props.controllerType === "button" ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ns).e("button-group")) }, [createVNode(unref(ElButtonGroup), null, { default: withCtx(() => [ createVNode(unref(ElButton), { size: "small", onClick: _cache[0] || (_cache[0] = ($event) => unref(selectDate)("prev-month")) }, { default: withCtx(() => [createTextVNode(toDisplayString(unref(t)("el.datepicker.prevMonth")), 1)]), _: 1 }), createVNode(unref(ElButton), { size: "small", onClick: _cache[1] || (_cache[1] = ($event) => unref(selectDate)("today")) }, { default: withCtx(() => [createTextVNode(toDisplayString(unref(t)("el.datepicker.today")), 1)]), _: 1 }), createVNode(unref(ElButton), { size: "small", onClick: _cache[2] || (_cache[2] = ($event) => unref(selectDate)("next-month")) }, { default: withCtx(() => [createTextVNode(toDisplayString(unref(t)("el.datepicker.nextMonth")), 1)]), _: 1 }) ]), _: 1 })], 2)) : unref(validatedRange).length === 0 && __props.controllerType === "select" ? (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass(unref(ns).e("select-controller")) }, [createVNode(select_controller_default, { date: unref(date), formatter: __props.formatter, onDateChange: unref(handleDateChange) }, null, 8, [ "date", "formatter", "onDateChange" ])], 2)) : createCommentVNode("v-if", true)])], 2), unref(validatedRange).length === 0 ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ns).e("body")) }, [createVNode(date_table_default, { date: unref(date), "selected-day": unref(realSelectedDay), onPick: unref(pickDay) }, createSlots({ _: 2 }, [_ctx.$slots["date-cell"] ? { name: "date-cell", fn: withCtx((data) => [renderSlot(_ctx.$slots, "date-cell", normalizeProps(guardReactiveProps(data)))]), key: "0" } : void 0]), 1032, [ "date", "selected-day", "onPick" ])], 2)) : (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass(unref(ns).e("body")) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(validatedRange), (range_, index) => { return openBlock(), createBlock(date_table_default, { key: index, date: range_[0], "selected-day": unref(realSelectedDay), range: range_, "hide-header": index !== 0, onPick: unref(pickDay) }, createSlots({ _: 2 }, [_ctx.$slots["date-cell"] ? { name: "date-cell", fn: withCtx((data) => [renderSlot(_ctx.$slots, "date-cell", mergeProps({ ref_for: true }, data))]), key: "0" } : void 0]), 1032, [ "date", "selected-day", "range", "hide-header", "onPick" ]); }), 128))], 2))], 2); }; } }); //#endregion //#region ../../packages/components/calendar/src/calendar.vue var calendar_default = calendar_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/calendar/index.ts const ElCalendar = withInstall(calendar_default); //#endregion //#region ../../packages/components/card/src/card.ts /** * @deprecated Removed after 3.0.0, Use `CardProps` instead. */ const cardProps = buildProps({ /** * @description title of the card. Also accepts a DOM passed by `slot#header` */ header: { type: String, default: "" }, /** * @description content of footer. Also accepts a DOM passed by `slot#footer` */ footer: { type: String, default: "" }, /** * @description CSS style of card body */ bodyStyle: { type: definePropType([ String, Object, Array, Boolean ]), default: "" }, /** * @description custom class name of card footer */ headerClass: String, /** * @description custom class name of card body */ bodyClass: String, /** * @description custom class name of card footer */ footerClass: String, /** * @description when to show card shadows */ shadow: { type: String, values: [ "always", "hover", "never" ], default: void 0 } }); const cardContextKey = Symbol("cardContextKey"); //#endregion //#region ../../packages/components/card/src/card.vue?vue&type=script&setup=true&lang.ts var card_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElCard", __name: "card", props: cardProps, setup(__props) { const globalConfig = useGlobalConfig("card"); const ns = useNamespace("card"); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass([unref(ns).b(), unref(ns).is(`${__props.shadow || unref(globalConfig)?.shadow || "always"}-shadow`)]) }, [ _ctx.$slots.header || __props.header ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass([unref(ns).e("header"), __props.headerClass]) }, [renderSlot(_ctx.$slots, "header", {}, () => [createTextVNode(toDisplayString(__props.header), 1)])], 2)) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass([unref(ns).e("body"), __props.bodyClass]), style: normalizeStyle(__props.bodyStyle) }, [renderSlot(_ctx.$slots, "default")], 6), _ctx.$slots.footer || __props.footer ? (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass([unref(ns).e("footer"), __props.footerClass]) }, [renderSlot(_ctx.$slots, "footer", {}, () => [createTextVNode(toDisplayString(__props.footer), 1)])], 2)) : createCommentVNode("v-if", true) ], 2); }; } }); //#endregion //#region ../../packages/components/card/src/card.vue var card_default = card_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/card/index.ts const ElCard = withInstall(card_default); //#endregion //#region ../../packages/components/carousel/src/carousel.ts /** * @deprecated Removed after 3.0.0, Use `CarouselProps` instead. */ const carouselProps = buildProps({ /** * @description index of the initially active slide (starting from 0) */ initialIndex: { type: Number, default: 0 }, /** * @description height of the carousel */ height: { type: String, default: "" }, /** * @description how indicators are triggered */ trigger: { type: String, values: ["hover", "click"], default: "hover" }, /** * @description whether automatically loop the slides */ autoplay: { type: Boolean, default: true }, /** * @description interval of the auto loop, in milliseconds */ interval: { type: Number, default: 3e3 }, /** * @description position of the indicators */ indicatorPosition: { type: String, values: [ "", "none", "outside" ], default: "" }, /** * @description when arrows are shown */ arrow: { type: String, values: [ "always", "hover", "never" ], default: "hover" }, /** * @description type of the Carousel */ type: { type: String, values: ["", "card"], default: "" }, /** * @description when type is card, scaled size of secondary cards */ cardScale: { type: Number, default: .83 }, /** * @description display the items in loop */ loop: { type: Boolean, default: true }, /** * @description display direction */ direction: { type: String, values: ["horizontal", "vertical"], default: "horizontal" }, /** * @description pause autoplay when hover */ pauseOnHover: { type: Boolean, default: true }, /** * @description infuse dynamism and smoothness into the carousel */ motionBlur: Boolean }); const carouselEmits = { /** * @description triggers when the active slide switches * @param current index of the new active slide * @param prev index of the old active slide */ change: (current, prev) => [current, prev].every(isNumber) }; //#endregion //#region ../../packages/components/carousel/src/constants.ts const carouselContextKey = Symbol("carouselContextKey"); const CAROUSEL_ITEM_NAME = "ElCarouselItem"; //#endregion //#region ../../packages/components/carousel/src/use-carousel.ts const THROTTLE_TIME = 300; const useCarousel = (props, emit, componentName) => { const { children: items, addChild: addItem, removeChild: removeItem, ChildrenSorter: ItemsSorter } = useOrderedChildren(getCurrentInstance(), CAROUSEL_ITEM_NAME); const slots = useSlots(); const activeIndex = ref(-1); const timer = ref(null); const hover = ref(false); const root = ref(); const containerHeight = ref(0); const isItemsTwoLength = ref(true); const arrowDisplay = computed(() => props.arrow !== "never" && !unref(isVertical)); const hasLabel = computed(() => { return items.value.some((item) => item.props.label.toString().length > 0); }); const isCardType = computed(() => props.type === "card"); const isVertical = computed(() => props.direction === "vertical"); const containerStyle = computed(() => { if (props.height !== "auto") return { height: props.height }; return { height: `${containerHeight.value}px`, overflow: "hidden" }; }); const throttledArrowClick = throttle((index) => { setActiveItem(index); }, THROTTLE_TIME, { trailing: true }); const throttledIndicatorHover = throttle((index) => { handleIndicatorHover(index); }, THROTTLE_TIME); const isTwoLengthShow = (index) => { if (!isItemsTwoLength.value) return true; return activeIndex.value <= 1 ? index <= 1 : index > 1; }; function pauseTimer() { if (timer.value) { clearInterval(timer.value); timer.value = null; } } function startTimer() { if (props.interval <= 0 || !props.autoplay || timer.value) return; timer.value = setInterval(() => playSlides(), props.interval); } const playSlides = () => { if (activeIndex.value < items.value.length - 1) activeIndex.value = activeIndex.value + 1; else if (props.loop) activeIndex.value = 0; }; function setActiveItem(index) { if (isString(index)) { const filteredItems = items.value.filter((item) => item.props.name === index); if (filteredItems.length > 0) index = items.value.indexOf(filteredItems[0]); } index = Number(index); if (Number.isNaN(index) || index !== Math.floor(index)) { /* @__PURE__ */ debugWarn(componentName, "index must be integer."); return; } const itemCount = items.value.length; const oldIndex = activeIndex.value; if (index < 0) activeIndex.value = props.loop ? itemCount - 1 : 0; else if (index >= itemCount) activeIndex.value = props.loop ? 0 : itemCount - 1; else activeIndex.value = index; if (oldIndex === activeIndex.value) resetItemPosition(oldIndex); resetTimer(); } function resetItemPosition(oldIndex) { items.value.forEach((item, index) => { item.translateItem(index, activeIndex.value, oldIndex); }); } function itemInStage(item, index) { const _items = unref(items); const itemCount = _items.length; if (itemCount === 0 || !item.states.inStage) return false; const nextItemIndex = index + 1; const prevItemIndex = index - 1; const lastItemIndex = itemCount - 1; const isLastItemActive = _items[lastItemIndex].states.active; const isFirstItemActive = _items[0].states.active; const isNextItemActive = _items[nextItemIndex]?.states?.active; const isPrevItemActive = _items[prevItemIndex]?.states?.active; if (index === lastItemIndex && isFirstItemActive || isNextItemActive) return "left"; else if (index === 0 && isLastItemActive || isPrevItemActive) return "right"; return false; } function handleMouseEnter() { hover.value = true; if (props.pauseOnHover) pauseTimer(); } function handleMouseLeave() { hover.value = false; startTimer(); } function handleButtonEnter(arrow) { if (unref(isVertical)) return; items.value.forEach((item, index) => { if (arrow === itemInStage(item, index)) item.states.hover = true; }); } function handleButtonLeave() { if (unref(isVertical)) return; items.value.forEach((item) => { item.states.hover = false; }); } function handleIndicatorClick(index) { activeIndex.value = index; } function handleIndicatorHover(index) { if (props.trigger === "hover" && index !== activeIndex.value) activeIndex.value = index; } function prev() { setActiveItem(activeIndex.value - 1); } function next() { setActiveItem(activeIndex.value + 1); } function resetTimer() { pauseTimer(); if (!props.pauseOnHover || !hover.value) startTimer(); } function setContainerHeight(height) { if (props.height !== "auto") return; containerHeight.value = height; } function PlaceholderItem() { const defaultSlots = slots.default?.(); if (!defaultSlots) return null; const normalizeSlots = flattedChildren(defaultSlots).filter((slot) => { return isVNode(slot) && slot.type.name === "ElCarouselItem"; }); if (normalizeSlots?.length === 2 && props.loop && !isCardType.value) { isItemsTwoLength.value = true; return normalizeSlots; } isItemsTwoLength.value = false; return null; } watch(() => activeIndex.value, (current, prev) => { resetItemPosition(prev); if (isItemsTwoLength.value) { current = current % 2; prev = prev % 2; } if (prev > -1) emit(CHANGE_EVENT, current, prev); }); const exposeActiveIndex = computed({ get: () => { return isItemsTwoLength.value ? activeIndex.value % 2 : activeIndex.value; }, set: (value) => activeIndex.value = value }); watch(() => props.autoplay, (autoplay) => { autoplay ? startTimer() : pauseTimer(); }); watch(() => props.loop, () => { setActiveItem(activeIndex.value); }); watch(() => props.interval, () => { resetTimer(); }); const resizeObserver = shallowRef(); onMounted(() => { watch(() => items.value, () => { if (items.value.length > 0) setActiveItem(props.initialIndex); }, { immediate: true }); resizeObserver.value = useResizeObserver(root.value, () => { resetItemPosition(); }); startTimer(); }); onBeforeUnmount(() => { pauseTimer(); if (root.value && resizeObserver.value) resizeObserver.value.stop(); }); provide(carouselContextKey, { root, isCardType, isVertical, items, loop: props.loop, cardScale: props.cardScale, addItem, removeItem, setActiveItem, setContainerHeight }); return { root, activeIndex, exposeActiveIndex, arrowDisplay, hasLabel, hover, isCardType, items, isVertical, containerStyle, isItemsTwoLength, handleButtonEnter, handleButtonLeave, handleIndicatorClick, handleMouseEnter, handleMouseLeave, setActiveItem, prev, next, PlaceholderItem, isTwoLengthShow, ItemsSorter, throttledArrowClick, throttledIndicatorHover }; }; //#endregion //#region ../../packages/components/carousel/src/carousel.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$65 = ["aria-label"]; const _hoisted_2$36 = ["aria-label"]; const _hoisted_3$17 = ["onMouseenter", "onClick"]; const _hoisted_4$12 = ["aria-label"]; const _hoisted_5$9 = { key: 0 }; const _hoisted_6$4 = { key: 2, xmlns: "http://www.w3.org/2000/svg", version: "1.1", style: { "display": "none" } }; const COMPONENT_NAME$11 = "ElCarousel"; var carousel_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: COMPONENT_NAME$11, __name: "carousel", props: carouselProps, emits: carouselEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const { root, activeIndex, exposeActiveIndex, arrowDisplay, hasLabel, hover, isCardType, items, isVertical, containerStyle, handleButtonEnter, handleButtonLeave, handleIndicatorClick, handleMouseEnter, handleMouseLeave, setActiveItem, prev, next, PlaceholderItem, isTwoLengthShow, ItemsSorter, throttledArrowClick, throttledIndicatorHover } = useCarousel(props, __emit, COMPONENT_NAME$11); const ns = useNamespace("carousel"); const { t } = useLocale(); const carouselClasses = computed(() => { const classes = [ns.b(), ns.m(props.direction)]; if (unref(isCardType)) classes.push(ns.m("card")); classes.push(ns.is("vertical-outside", unref(isVertical) && props.indicatorPosition === "outside")); return classes; }); const indicatorsClasses = computed(() => { const classes = [ns.e("indicators"), ns.em("indicators", props.direction)]; if (unref(hasLabel)) classes.push(ns.em("indicators", "labels")); if (props.indicatorPosition === "outside") classes.push(ns.em("indicators", "outside")); if (unref(isVertical)) classes.push(ns.em("indicators", "right")); return classes; }); function handleTransitionStart(e) { if (!props.motionBlur) return; const kls = unref(isVertical) ? `${ns.namespace.value}-transitioning-vertical` : `${ns.namespace.value}-transitioning`; e.currentTarget.classList.add(kls); } function handleTransitionEnd(e) { if (!props.motionBlur) return; const kls = unref(isVertical) ? `${ns.namespace.value}-transitioning-vertical` : `${ns.namespace.value}-transitioning`; e.currentTarget.classList.remove(kls); } __expose({ /** @description active slide index */ activeIndex: exposeActiveIndex, /** @description manually switch slide, index of the slide to be switched to, starting from 0; or the `name` of corresponding `el-carousel-item` */ setActiveItem, /** @description switch to the previous slide */ prev, /** @description switch to the next slide */ next }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { ref_key: "root", ref: root, class: normalizeClass(carouselClasses.value), onMouseenter: _cache[6] || (_cache[6] = withModifiers((...args) => unref(handleMouseEnter) && unref(handleMouseEnter)(...args), ["stop"])), onMouseleave: _cache[7] || (_cache[7] = withModifiers((...args) => unref(handleMouseLeave) && unref(handleMouseLeave)(...args), ["stop"])) }, [ unref(arrowDisplay) ? (openBlock(), createBlock(Transition, { key: 0, name: "carousel-arrow-left", persisted: "" }, { default: withCtx(() => [withDirectives(createElementVNode("button", { type: "button", class: normalizeClass([unref(ns).e("arrow"), unref(ns).em("arrow", "left")]), "aria-label": unref(t)("el.carousel.leftArrow"), onMouseenter: _cache[0] || (_cache[0] = ($event) => unref(handleButtonEnter)("left")), onMouseleave: _cache[1] || (_cache[1] = (...args) => unref(handleButtonLeave) && unref(handleButtonLeave)(...args)), onClick: _cache[2] || (_cache[2] = withModifiers(($event) => unref(throttledArrowClick)(unref(activeIndex) - 1), ["stop"])) }, [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(arrow_left_default))]), _: 1 })], 42, _hoisted_1$65), [[vShow, (__props.arrow === "always" || unref(hover)) && (__props.loop || unref(activeIndex) > 0)]])]), _: 1 })) : createCommentVNode("v-if", true), unref(arrowDisplay) ? (openBlock(), createBlock(Transition, { key: 1, name: "carousel-arrow-right", persisted: "" }, { default: withCtx(() => [withDirectives(createElementVNode("button", { type: "button", class: normalizeClass([unref(ns).e("arrow"), unref(ns).em("arrow", "right")]), "aria-label": unref(t)("el.carousel.rightArrow"), onMouseenter: _cache[3] || (_cache[3] = ($event) => unref(handleButtonEnter)("right")), onMouseleave: _cache[4] || (_cache[4] = (...args) => unref(handleButtonLeave) && unref(handleButtonLeave)(...args)), onClick: _cache[5] || (_cache[5] = withModifiers(($event) => unref(throttledArrowClick)(unref(activeIndex) + 1), ["stop"])) }, [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(arrow_right_default))]), _: 1 })], 42, _hoisted_2$36), [[vShow, (__props.arrow === "always" || unref(hover)) && (__props.loop || unref(activeIndex) < unref(items).length - 1)]])]), _: 1 })) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass(unref(ns).e("container")), style: normalizeStyle(unref(containerStyle)), onTransitionstart: handleTransitionStart, onTransitionend: handleTransitionEnd }, [createVNode(unref(PlaceholderItem)), renderSlot(_ctx.$slots, "default")], 38), createVNode(unref(ItemsSorter), null, { default: withCtx(() => [__props.indicatorPosition !== "none" ? (openBlock(), createElementBlock("ul", { key: 0, class: normalizeClass(indicatorsClasses.value) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(items), (item, index) => { return withDirectives((openBlock(), createElementBlock("li", { key: index, class: normalizeClass([ unref(ns).e("indicator"), unref(ns).em("indicator", __props.direction), unref(ns).is("active", index === unref(activeIndex)) ]), onMouseenter: ($event) => unref(throttledIndicatorHover)(index), onClick: withModifiers(($event) => unref(handleIndicatorClick)(index), ["stop"]) }, [createElementVNode("button", { class: normalizeClass(unref(ns).e("button")), "aria-label": unref(t)("el.carousel.indicator", { index: index + 1 }) }, [unref(hasLabel) ? (openBlock(), createElementBlock("span", _hoisted_5$9, toDisplayString(item.props.label), 1)) : createCommentVNode("v-if", true)], 10, _hoisted_4$12)], 42, _hoisted_3$17)), [[vShow, unref(isTwoLengthShow)(index)]]); }), 128))], 2)) : createCommentVNode("v-if", true)]), _: 1 }), __props.motionBlur ? (openBlock(), createElementBlock("svg", _hoisted_6$4, [..._cache[8] || (_cache[8] = [createElementVNode("defs", null, [createElementVNode("filter", { id: "elCarouselHorizontal" }, [createElementVNode("feGaussianBlur", { in: "SourceGraphic", stdDeviation: "12,0" })]), createElementVNode("filter", { id: "elCarouselVertical" }, [createElementVNode("feGaussianBlur", { in: "SourceGraphic", stdDeviation: "0,10" })])], -1)])])) : createCommentVNode("v-if", true) ], 34); }; } }); //#endregion //#region ../../packages/components/carousel/src/carousel.vue var carousel_default = carousel_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/carousel/src/carousel-item.ts /** * @deprecated Removed after 3.0.0, Use `CarouselItemProps` instead. */ const carouselItemProps = buildProps({ /** * @description name of the item, can be used in `setActiveItem` */ name: { type: String, default: "" }, /** * @description text content for the corresponding indicator */ label: { type: [String, Number], default: "" } }); //#endregion //#region ../../packages/components/carousel/src/use-carousel-item.ts const useCarouselItem = (props) => { const carouselContext = inject(carouselContextKey); const instance = getCurrentInstance(); if (!carouselContext) /* @__PURE__ */ debugWarn(CAROUSEL_ITEM_NAME, "usage: "); if (!instance) /* @__PURE__ */ debugWarn(CAROUSEL_ITEM_NAME, "compositional hook can only be invoked inside setups"); const carouselItemRef = ref(); const hover = ref(false); const translate = ref(0); const scale = ref(1); const active = ref(false); const ready = ref(false); const inStage = ref(false); const animating = ref(false); const { isCardType, isVertical, cardScale } = carouselContext; function processIndex(index, activeIndex, length) { const lastItemIndex = length - 1; const prevItemIndex = activeIndex - 1; const nextItemIndex = activeIndex + 1; const halfItemIndex = length / 2; if (activeIndex === 0 && index === lastItemIndex) return -1; else if (activeIndex === lastItemIndex && index === 0) return length; else if (index < prevItemIndex && activeIndex - index >= halfItemIndex) return length + 1; else if (index > nextItemIndex && index - activeIndex >= halfItemIndex) return -2; return index; } function calcCardTranslate(index, activeIndex) { const parentWidth = unref(isVertical) ? carouselContext.root.value?.offsetHeight || 0 : carouselContext.root.value?.offsetWidth || 0; if (inStage.value) return parentWidth * ((2 - cardScale) * (index - activeIndex) + 1) / 4; else if (index < activeIndex) return -(1 + cardScale) * parentWidth / 4; else return (3 + cardScale) * parentWidth / 4; } function calcTranslate(index, activeIndex, isVertical) { const rootEl = carouselContext.root.value; if (!rootEl) return 0; return ((isVertical ? rootEl.offsetHeight : rootEl.offsetWidth) || 0) * (index - activeIndex); } const translateItem = (index, activeIndex, oldIndex) => { const _isCardType = unref(isCardType); const carouselItemLength = carouselContext.items.value.length ?? NaN; const isActive = index === activeIndex; if (!_isCardType && !isUndefined(oldIndex)) animating.value = isActive || index === oldIndex; if (!isActive && carouselItemLength > 2 && carouselContext.loop) index = processIndex(index, activeIndex, carouselItemLength); const _isVertical = unref(isVertical); active.value = isActive; if (_isCardType) { inStage.value = Math.round(Math.abs(index - activeIndex)) <= 1; translate.value = calcCardTranslate(index, activeIndex); scale.value = unref(active) ? 1 : cardScale; } else translate.value = calcTranslate(index, activeIndex, _isVertical); ready.value = true; if (isActive && carouselItemRef.value) carouselContext.setContainerHeight(carouselItemRef.value.offsetHeight); }; function handleItemClick() { if (carouselContext && unref(isCardType)) { const index = carouselContext.items.value.findIndex(({ uid }) => uid === instance.uid); carouselContext.setActiveItem(index); } } const carouselItemContext = { props, states: reactive({ hover, translate, scale, active, ready, inStage, animating }), uid: instance.uid, getVnode: () => instance.vnode, translateItem }; carouselContext.addItem(carouselItemContext); onBeforeUnmount(() => { carouselContext.removeItem(carouselItemContext); }); return { carouselItemRef, active, animating, hover, inStage, isVertical, translate, isCardType, scale, ready, handleItemClick }; }; //#endregion //#region ../../packages/components/carousel/src/carousel-item.vue?vue&type=script&setup=true&lang.ts var carousel_item_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: CAROUSEL_ITEM_NAME, __name: "carousel-item", props: carouselItemProps, setup(__props) { const props = __props; const ns = useNamespace("carousel"); const { carouselItemRef, active, animating, hover, inStage, isVertical, translate, isCardType, scale, ready, handleItemClick } = useCarouselItem(props); const itemKls = computed(() => [ ns.e("item"), ns.is("active", active.value), ns.is("in-stage", inStage.value), ns.is("hover", hover.value), ns.is("animating", animating.value), { [ns.em("item", "card")]: isCardType.value, [ns.em("item", "card-vertical")]: isCardType.value && isVertical.value } ]); const itemStyle = computed(() => { return { transform: [`${`translate${unref(isVertical) ? "Y" : "X"}`}(${unref(translate)}px)`, `scale(${unref(scale)})`].join(" ") }; }); return (_ctx, _cache) => { return withDirectives((openBlock(), createElementBlock("div", { ref_key: "carouselItemRef", ref: carouselItemRef, class: normalizeClass(itemKls.value), style: normalizeStyle(itemStyle.value), onClick: _cache[0] || (_cache[0] = (...args) => unref(handleItemClick) && unref(handleItemClick)(...args)) }, [unref(isCardType) ? withDirectives((openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ns).e("mask")) }, null, 2)), [[vShow, !unref(active)]]) : createCommentVNode("v-if", true), renderSlot(_ctx.$slots, "default")], 6)), [[vShow, unref(ready)]]); }; } }); //#endregion //#region ../../packages/components/carousel/src/carousel-item.vue var carousel_item_default = carousel_item_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/carousel/index.ts const ElCarousel = withInstall(carousel_default, { CarouselItem: carousel_item_default }); const ElCarouselItem = withNoopInstall(carousel_item_default); //#endregion //#region ../../packages/components/cascader-panel/src/config.ts /** * @description node height for virtual scrolling */ const CASCADER_PANEL_ITEM_SIZE = 34; /** * @description menu height for virtual scrolling */ const CASCADER_PANEL_HEIGHT = 204; const CommonProps = buildProps({ /** * @description specify which key of node object is used as the node's value */ modelValue: { type: definePropType([ Number, String, Array, Object ]) }, /** * @description data of the options, the key of `value` and `label` can be customize by `CascaderProps`. */ options: { type: definePropType(Array), default: () => [] }, /** * @description configuration options, see the following `CascaderProps` table. */ props: { type: definePropType(Object), default: () => ({}) }, /** * @description whether to enable virtual scrolling */ virtualScroll: Boolean, /** * @description node height for virtual scrolling */ itemSize: { type: Number, default: 34 }, /** * @description menu height for virtual scrolling */ height: { type: Number, default: 204 } }); const DefaultProps = { /** * @description trigger mode of expanding options */ expandTrigger: "click", /** * @description whether multiple selection is enabled */ multiple: false, /** * @description whether checked state of a node not affects its parent and child nodes */ checkStrictly: false, /** * @description when checked nodes change, whether to emit an array of node's path, if false, only emit the value of node. */ emitPath: true, /** * @description whether to dynamic load child nodes, use with `lazyload` attribute */ lazy: false, /** * @description method for loading child nodes data, only works when `lazy` is true */ lazyLoad: NOOP, /** * @description specify which key of node object is used as the node's value */ value: "value", /** * @description specify which key of node object is used as the node's label */ label: "label", /** * @description specify which key of node object is used as the node's children */ children: "children", /** * @description specify which key of node object is used as the node's leaf */ leaf: "leaf", /** * @description specify which key of node object is used as the node's disabled */ disabled: "disabled", /** * @description hover threshold of expanding options */ hoverThreshold: 500, /** * @description whether to check or uncheck node when clicking on the node */ checkOnClickNode: false, /** * @description whether to check or uncheck node when clicking on leaf node (last children). */ checkOnClickLeaf: true, /** * @description whether to show the radio or checkbox prefix */ showPrefix: true }; /** * @deprecated Removed after 3.0.0, Use `CascaderPanelProps` instead. */ const cascaderPanelProps = buildProps({ ...CommonProps, border: { type: Boolean, default: true }, renderLabel: { type: Function } }); const emitChangeFn$2 = (value) => true; const cascaderPanelEmits = { [UPDATE_MODEL_EVENT]: emitChangeFn$2, [CHANGE_EVENT]: emitChangeFn$2, close: () => true, "expand-change": (value) => value }; const useCascaderConfig = (props) => { return computed(() => ({ ...DefaultProps, ...props.props })); }; //#endregion //#region ../../node_modules/.pnpm/memoize-one@6.0.0/node_modules/memoize-one/dist/memoize-one.esm.js var safeIsNaN = Number.isNaN || function ponyfill(value) { return typeof value === "number" && value !== value; }; function isEqual(first, second) { if (first === second) return true; if (safeIsNaN(first) && safeIsNaN(second)) return true; return false; } function areInputsEqual(newInputs, lastInputs) { if (newInputs.length !== lastInputs.length) return false; for (var i = 0; i < newInputs.length; i++) if (!isEqual(newInputs[i], lastInputs[i])) return false; return true; } function memoizeOne(resultFn, isEqual) { if (isEqual === void 0) isEqual = areInputsEqual; var cache = null; function memoized() { var newArgs = []; for (var _i = 0; _i < arguments.length; _i++) newArgs[_i] = arguments[_i]; if (cache && cache.lastThis === this && isEqual(newArgs, cache.lastArgs)) return cache.lastResult; var lastResult = resultFn.apply(this, newArgs); cache = { lastResult, lastArgs: newArgs, lastThis: this }; return lastResult; } memoized.clear = function clear() { cache = null; }; return memoized; } //#endregion //#region ../../packages/components/virtual-list/src/hooks/use-cache.ts const useCache = () => { const props = getCurrentInstance().proxy.$props; return computed(() => { const _getItemStyleCache = (_, __, ___) => ({}); return props.perfMode ? memoize(_getItemStyleCache) : memoizeOne(_getItemStyleCache); }); }; //#endregion //#region ../../packages/components/virtual-list/src/defaults.ts const ITEM_RENDER_EVT = "itemRendered"; const SCROLL_EVT = "scroll"; const END_REACHED_EVT = "end-reached"; const FORWARD = "forward"; const BACKWARD = "backward"; const AUTO_ALIGNMENT = "auto"; const SMART_ALIGNMENT = "smart"; const START_ALIGNMENT = "start"; const CENTERED_ALIGNMENT = "center"; const HORIZONTAL = "horizontal"; const VERTICAL = "vertical"; const RTL_OFFSET_NAG = "negative"; const RTL_OFFSET_POS_ASC = "positive-ascending"; const RTL_OFFSET_POS_DESC = "positive-descending"; const ScrollbarDirKey = { [HORIZONTAL]: "left", [VERTICAL]: "top" }; //#endregion //#region ../../packages/components/virtual-list/src/hooks/use-wheel.ts const useWheel = ({ atEndEdge, atStartEdge, layout }, onWheelDelta) => { let frameHandle; let offset = 0; const hasReachedEdge = (offset) => { return offset < 0 && atStartEdge.value || offset > 0 && atEndEdge.value; }; const onWheel = (e) => { cAF(frameHandle); let { deltaX, deltaY } = e; if (e.shiftKey && deltaY !== 0) { deltaX = deltaY; deltaY = 0; } const newOffset = layout.value === "horizontal" ? deltaX : deltaY; if (hasReachedEdge(newOffset)) return; offset += newOffset; if (!isFirefox() && newOffset !== 0) e.preventDefault(); frameHandle = rAF(() => { onWheelDelta(offset); offset = 0; }); }; return { hasReachedEdge, onWheel }; }; //#endregion //#region ../../packages/components/virtual-list/src/props.ts const itemSize$1 = buildProp({ type: definePropType([Number, Function]), required: true }); const estimatedItemSize = buildProp({ type: Number }); const cache = buildProp({ type: Number, default: 2 }); const direction = buildProp({ type: String, values: ["ltr", "rtl"], default: "ltr" }); const initScrollOffset = buildProp({ type: Number, default: 0 }); const total = buildProp({ type: Number, required: true }); const layout = buildProp({ type: String, values: ["horizontal", "vertical"], default: VERTICAL }); const virtualizedProps = buildProps({ className: { type: String, default: "" }, containerElement: { type: definePropType([String, Object]), default: "div" }, data: { type: definePropType(Array), default: () => mutable([]) }, /** * @description controls the horizontal direction. */ direction, height: { type: [String, Number], required: true }, innerElement: { type: [String, Object], default: "div" }, innerProps: { type: definePropType(Object), default: () => ({}) }, style: { type: definePropType([ Object, String, Array, Boolean ]), default: void 0 }, useIsScrolling: Boolean, width: { type: [Number, String], required: false }, innerWidth: { type: [Number, String], required: false }, perfMode: { type: Boolean, default: true }, scrollbarAlwaysOn: Boolean }); const virtualizedListProps = buildProps({ /** * @description describes how many items should be pre rendered to the head * and the tail of the window */ cache, estimatedItemSize, /** * @description controls the list's orientation */ layout, initScrollOffset, /** * @description describes the total number of the list. */ total, itemSize: itemSize$1, ...virtualizedProps }); const scrollbarSize = { type: Number, default: 6 }; const startGap = { type: Number, default: 0 }; const endGap = { type: Number, default: 2 }; const virtualizedGridProps = buildProps({ columnCache: cache, columnWidth: itemSize$1, estimatedColumnWidth: estimatedItemSize, estimatedRowHeight: estimatedItemSize, initScrollLeft: initScrollOffset, initScrollTop: initScrollOffset, itemKey: { type: definePropType(Function), default: ({ columnIndex, rowIndex }) => `${rowIndex}:${columnIndex}` }, rowCache: cache, rowHeight: itemSize$1, totalColumn: total, totalRow: total, hScrollbarSize: scrollbarSize, vScrollbarSize: scrollbarSize, scrollbarStartGap: startGap, scrollbarEndGap: endGap, role: String, ...virtualizedProps }); const virtualizedScrollbarProps = buildProps({ alwaysOn: Boolean, class: String, layout, total, ratio: { type: Number, required: true }, clientSize: { type: Number, required: true }, scrollFrom: { type: Number, required: true }, scrollbarSize, startGap, endGap, visible: Boolean }); //#endregion //#region ../../packages/components/virtual-list/src/utils.ts const getScrollDir = (prev, cur) => prev < cur ? FORWARD : BACKWARD; const isHorizontal = (dir) => dir === "ltr" || dir === "rtl" || dir === "horizontal"; const isRTL = (dir) => dir === "rtl"; let cachedRTLResult = null; function getRTLOffsetType(recalculate = false) { if (cachedRTLResult === null || recalculate) { const outerDiv = document.createElement("div"); const outerStyle = outerDiv.style; outerStyle.width = "50px"; outerStyle.height = "50px"; outerStyle.overflow = "scroll"; outerStyle.direction = "rtl"; const innerDiv = document.createElement("div"); const innerStyle = innerDiv.style; innerStyle.width = "100px"; innerStyle.height = "100px"; outerDiv.appendChild(innerDiv); document.body.appendChild(outerDiv); if (outerDiv.scrollLeft > 0) cachedRTLResult = RTL_OFFSET_POS_DESC; else { outerDiv.scrollLeft = 1; if (outerDiv.scrollLeft === 0) cachedRTLResult = RTL_OFFSET_NAG; else cachedRTLResult = RTL_OFFSET_POS_ASC; } document.body.removeChild(outerDiv); return cachedRTLResult; } return cachedRTLResult; } function renderThumbStyle$1({ move, size, bar }, layout) { const style = {}; const translate = `translate${bar.axis}(${move}px)`; style[bar.size] = size; style.transform = translate; if (layout === "horizontal") style.height = "100%"; else style.width = "100%"; return style; } //#endregion //#region ../../packages/components/virtual-list/src/components/scrollbar.ts const ScrollBar = defineComponent({ name: "ElVirtualScrollBar", props: virtualizedScrollbarProps, emits: [ "scroll", "start-move", "stop-move" ], setup(props, { emit }) { const GAP = computed(() => props.startGap + props.endGap); const nsVirtualScrollbar = useNamespace("virtual-scrollbar"); const nsScrollbar = useNamespace("scrollbar"); const trackRef = ref(); const thumbRef = ref(); let frameHandle = null; let onselectstartStore = null; const state = reactive({ isDragging: false, traveled: 0 }); const bar = computed(() => BAR_MAP[props.layout]); const trackSize = computed(() => props.clientSize - unref(GAP)); const trackStyle = computed(() => ({ position: "absolute", width: `${"horizontal" === props.layout ? trackSize.value : props.scrollbarSize}px`, height: `${"horizontal" === props.layout ? props.scrollbarSize : trackSize.value}px`, [ScrollbarDirKey[props.layout]]: "2px", right: "2px", bottom: "2px", borderRadius: "4px" })); const thumbSize = computed(() => { const ratio = props.ratio; if (ratio >= 100) return Number.POSITIVE_INFINITY; if (ratio >= 50) return ratio * trackSize.value / 100; const SCROLLBAR_MAX_SIZE = trackSize.value / 3; return Math.floor(Math.min(Math.max(ratio * trackSize.value / 100, 20), SCROLLBAR_MAX_SIZE)); }); const thumbStyle = computed(() => { if (!Number.isFinite(thumbSize.value)) return { display: "none" }; const thumb = `${thumbSize.value}px`; return renderThumbStyle$1({ bar: bar.value, size: thumb, move: state.traveled }, props.layout); }); const totalSteps = computed(() => Math.ceil(props.clientSize - thumbSize.value - unref(GAP))); const attachEvents = () => { window.addEventListener("mousemove", onMouseMove); window.addEventListener("mouseup", onMouseUp); const thumbEl = unref(thumbRef); if (!thumbEl) return; onselectstartStore = document.onselectstart; document.onselectstart = () => false; thumbEl.addEventListener("touchmove", onMouseMove, { passive: true }); thumbEl.addEventListener("touchend", onMouseUp); }; const detachEvents = () => { window.removeEventListener("mousemove", onMouseMove); window.removeEventListener("mouseup", onMouseUp); document.onselectstart = onselectstartStore; onselectstartStore = null; const thumbEl = unref(thumbRef); if (!thumbEl) return; thumbEl.removeEventListener("touchmove", onMouseMove); thumbEl.removeEventListener("touchend", onMouseUp); }; const onThumbMouseDown = (e) => { e.stopImmediatePropagation(); if (e.ctrlKey || [1, 2].includes(e.button)) return; state.isDragging = true; state[bar.value.axis] = e.currentTarget[bar.value.offset] - (e[bar.value.client] - e.currentTarget.getBoundingClientRect()[bar.value.direction]); emit("start-move"); attachEvents(); }; const onMouseUp = () => { state.isDragging = false; state[bar.value.axis] = 0; emit("stop-move"); detachEvents(); }; const onMouseMove = (e) => { const { isDragging } = state; if (!isDragging) return; if (!thumbRef.value || !trackRef.value) return; const prevPage = state[bar.value.axis]; if (!prevPage) return; cAF(frameHandle); /** * +--------------+ +--------------+ * | - <--------- thumb.offsetTop | | * | |+| <--+ | | * | - | | | * | Content | | | | * | | | | | * | | | | | * | | | | - * | | +--> | |+| * | | | - * +--------------+ +--------------+ */ const distance = (trackRef.value.getBoundingClientRect()[bar.value.direction] - e[bar.value.client]) * -1 - (thumbRef.value[bar.value.offset] - prevPage); frameHandle = rAF(() => { state.traveled = Math.max(0, Math.min(distance, totalSteps.value)); emit("scroll", distance, totalSteps.value); }); }; const clickTrackHandler = (e) => { const distance = Math.abs(e.target.getBoundingClientRect()[bar.value.direction] - e[bar.value.client]) - thumbRef.value[bar.value.offset] / 2; state.traveled = Math.max(0, Math.min(distance, totalSteps.value)); emit("scroll", distance, totalSteps.value); }; watch(() => props.scrollFrom, (v) => { if (state.isDragging) return; /** * this is simply mapping the current scrollbar offset * * formula 1: * v = scrollOffset / (estimatedTotalSize - clientSize) * traveled = v * (clientSize - thumbSize - GAP) --> v * totalSteps * * formula 2: * traveled = (v * clientSize) / (clientSize / totalSteps) --> (v * clientSize) * (totalSteps / clientSize) --> v * totalSteps */ state.traveled = Math.ceil(v * totalSteps.value); }); onBeforeUnmount(() => { detachEvents(); }); return () => { return h("div", { role: "presentation", ref: trackRef, class: [ nsVirtualScrollbar.b(), props.class, (props.alwaysOn || state.isDragging) && "always-on" ], style: trackStyle.value, onMousedown: withModifiers(clickTrackHandler, ["stop", "prevent"]), onTouchstartPrevent: onThumbMouseDown }, h("div", { ref: thumbRef, class: nsScrollbar.e("thumb"), style: thumbStyle.value, onMousedown: onThumbMouseDown }, [])); }; } }); //#endregion //#region ../../packages/components/virtual-list/src/builders/build-list.ts const createList = ({ name, getOffset, getItemSize, getItemOffset, getEstimatedTotalSize, getStartIndexForOffset, getStopIndexForStartIndex, initCache, clearCache, validateProps }) => { return defineComponent({ name: name ?? "ElVirtualList", props: virtualizedListProps, emits: [ ITEM_RENDER_EVT, SCROLL_EVT, END_REACHED_EVT ], setup(props, { emit, expose }) { validateProps(props); const instance = getCurrentInstance(); const ns = useNamespace("vl"); const dynamicSizeCache = ref(initCache(props, instance)); const getItemStyleCache = useCache(); const windowRef = ref(); const innerRef = ref(); const scrollbarRef = ref(); const states = ref({ isScrolling: false, scrollDir: FORWARD, scrollOffset: isNumber(props.initScrollOffset) ? props.initScrollOffset : 0, updateRequested: false, isScrollbarDragging: false }); const itemsToRender = computed(() => { const { total, cache } = props; const { isScrolling, scrollDir, scrollOffset } = unref(states); if (total === 0) return [ 0, 0, 0, 0 ]; const startIndex = getStartIndexForOffset(props, scrollOffset, unref(dynamicSizeCache)); const stopIndex = getStopIndexForStartIndex(props, startIndex, scrollOffset, unref(dynamicSizeCache)); const cacheBackward = !isScrolling || scrollDir === "backward" ? Math.max(1, cache) : 1; const cacheForward = !isScrolling || scrollDir === "forward" ? Math.max(1, cache) : 1; return [ Math.max(0, startIndex - cacheBackward), Math.max(0, Math.min(total - 1, stopIndex + cacheForward)), startIndex, stopIndex ]; }); const estimatedTotalSize = computed(() => getEstimatedTotalSize(props, unref(dynamicSizeCache))); const _isHorizontal = computed(() => isHorizontal(props.layout)); const windowStyle = computed(() => [ { position: "relative", [`overflow-${_isHorizontal.value ? "x" : "y"}`]: "scroll", WebkitOverflowScrolling: "touch", willChange: "transform" }, { direction: props.direction, height: isNumber(props.height) ? `${props.height}px` : props.height, width: isNumber(props.width) ? `${props.width}px` : props.width }, props.style ]); const innerStyle = computed(() => { const size = unref(estimatedTotalSize); const horizontal = unref(_isHorizontal); const innerWidth = props.innerWidth; return { height: horizontal ? "100%" : `${size}px`, pointerEvents: unref(states).isScrolling ? "none" : void 0, width: horizontal ? `${size}px` : innerWidth !== void 0 ? isNumber(innerWidth) ? `${innerWidth}px` : innerWidth : "100%", margin: 0, boxSizing: "border-box" }; }); const clientSize = computed(() => _isHorizontal.value ? props.width : props.height); const maxOffset = computed(() => Math.max(0, estimatedTotalSize.value - clientSize.value)); const normalizeOffset = (offset) => clamp$2(offset, 0, maxOffset.value); const EDGE_TOLERANCE = 1; const getEdgeState = (normalizedOffset) => ({ start: !isGreaterThan(normalizedOffset, 0, EDGE_TOLERANCE), end: !isGreaterThan(maxOffset.value, normalizedOffset, EDGE_TOLERANCE) }); const normalizedScrollOffset = computed(() => normalizeOffset(states.value.scrollOffset)); const currentEdgeState = computed(() => getEdgeState(normalizedScrollOffset.value)); let edgeState = currentEdgeState.value; const { onWheel } = useWheel({ atStartEdge: computed(() => currentEdgeState.value.start), atEndEdge: computed(() => currentEdgeState.value.end), layout: computed(() => props.layout) }, (offset) => { scrollbarRef.value.onMouseUp?.(); scrollTo(Math.min(states.value.scrollOffset + offset, maxOffset.value)); }); useEventListener(windowRef, "wheel", onWheel, { passive: false }); const emitEvents = () => { const { total } = props; if (total > 0) { const [cacheStart, cacheEnd, visibleStart, visibleEnd] = unref(itemsToRender); emit(ITEM_RENDER_EVT, cacheStart, cacheEnd, visibleStart, visibleEnd); } const { scrollDir, scrollOffset, updateRequested } = unref(states); emit(SCROLL_EVT, scrollDir, scrollOffset, updateRequested); }; const emitEndReached = (direction, offset) => { const nextEdgeState = getEdgeState(offset); const horizontalEnd = props.direction === "rtl" ? "left" : "right"; const horizontalStart = props.direction === "rtl" ? "right" : "left"; if (direction === "forward" && nextEdgeState.end && !edgeState.end) emit(END_REACHED_EVT, _isHorizontal.value ? horizontalEnd : "bottom"); if (direction === "backward" && nextEdgeState.start && !edgeState.start) emit(END_REACHED_EVT, _isHorizontal.value ? horizontalStart : "top"); edgeState = nextEdgeState; }; const updateScrollOffset = (offset, { isScrolling, updateRequested }) => { const currentState = unref(states); const nextOffset = Math.max(offset, 0); if (nextOffset === currentState.scrollOffset) return; const scrollDir = getScrollDir(currentState.scrollOffset, nextOffset); states.value = { ...currentState, isScrolling, scrollDir, scrollOffset: nextOffset, updateRequested }; emitEndReached(scrollDir, normalizeOffset(nextOffset)); nextTick(resetIsScrolling); }; const scrollVertically = (e) => { const { clientHeight, scrollHeight, scrollTop } = e.currentTarget; if (unref(states).scrollOffset === scrollTop) return; updateScrollOffset(Math.min(scrollTop, scrollHeight - clientHeight), { isScrolling: true, updateRequested: false }); }; const scrollHorizontally = (e) => { const { clientWidth, scrollLeft, scrollWidth } = e.currentTarget; if (unref(states).scrollOffset === scrollLeft) return; const { direction } = props; let scrollOffset = scrollLeft; if (direction === "rtl") switch (getRTLOffsetType()) { case RTL_OFFSET_NAG: scrollOffset = -scrollLeft; break; case RTL_OFFSET_POS_DESC: scrollOffset = scrollWidth - clientWidth - scrollLeft; break; } updateScrollOffset(Math.min(scrollOffset, scrollWidth - clientWidth), { isScrolling: true, updateRequested: false }); }; const onScroll = (e) => { unref(_isHorizontal) ? scrollHorizontally(e) : scrollVertically(e); emitEvents(); }; const onScrollbarScroll = (distanceToGo, totalSteps) => { const offset = maxOffset.value / totalSteps * distanceToGo; scrollTo(Math.min(maxOffset.value, offset)); }; const scrollTo = (offset) => { updateScrollOffset(offset, { isScrolling: unref(states).isScrolling, updateRequested: true }); }; const scrollToItem = (idx, alignment = AUTO_ALIGNMENT) => { const { scrollOffset } = unref(states); idx = Math.max(0, Math.min(idx, props.total - 1)); scrollTo(getOffset(props, idx, alignment, scrollOffset, unref(dynamicSizeCache))); }; const getItemStyle = (idx) => { const { direction, itemSize, layout } = props; const itemStyleCache = getItemStyleCache.value(clearCache && itemSize, clearCache && layout, clearCache && direction); let style; if (hasOwn(itemStyleCache, String(idx))) style = itemStyleCache[idx]; else { const offset = getItemOffset(props, idx, unref(dynamicSizeCache)); const size = getItemSize(props, idx, unref(dynamicSizeCache)); const horizontal = unref(_isHorizontal); const isRtl = direction === "rtl"; const offsetHorizontal = horizontal ? offset : 0; itemStyleCache[idx] = style = { position: "absolute", left: isRtl ? void 0 : `${offsetHorizontal}px`, right: isRtl ? `${offsetHorizontal}px` : void 0, top: !horizontal ? `${offset}px` : 0, height: !horizontal ? `${size}px` : "100%", width: horizontal ? `${size}px` : "100%" }; } return style; }; const resetIsScrolling = () => { states.value.isScrolling = false; nextTick(() => { getItemStyleCache.value(-1, null, null); }); }; const resetScrollTop = () => { const window = windowRef.value; if (window) window.scrollTop = 0; }; onMounted(() => { if (!isClient) return; const { initScrollOffset } = props; const windowElement = unref(windowRef); if (isNumber(initScrollOffset) && windowElement) if (unref(_isHorizontal)) windowElement.scrollLeft = initScrollOffset; else windowElement.scrollTop = initScrollOffset; emitEvents(); }); onUpdated(() => { const { direction, layout } = props; const { scrollOffset, updateRequested } = unref(states); const windowElement = unref(windowRef); if (updateRequested && windowElement) if (layout === "horizontal") if (direction === "rtl") switch (getRTLOffsetType()) { case RTL_OFFSET_NAG: windowElement.scrollLeft = -scrollOffset; break; case RTL_OFFSET_POS_ASC: windowElement.scrollLeft = scrollOffset; break; default: { const { clientWidth, scrollWidth } = windowElement; windowElement.scrollLeft = scrollWidth - clientWidth - scrollOffset; break; } } else windowElement.scrollLeft = scrollOffset; else windowElement.scrollTop = scrollOffset; }); onActivated(() => { unref(windowRef).scrollTop = unref(states).scrollOffset; }); watch(maxOffset, () => { edgeState = currentEdgeState.value; }); const api = { ns, clientSize, estimatedTotalSize, windowStyle, windowRef, innerRef, innerStyle, itemsToRender, scrollbarRef, states, getItemStyle, onScroll, onScrollbarScroll, onWheel, scrollTo, scrollToItem, resetScrollTop }; expose({ windowRef, innerRef, getItemStyleCache, scrollTo, scrollToItem, resetScrollTop, states }); return api; }, render(ctx) { const { $slots, className, clientSize, containerElement, data, getItemStyle, innerElement, itemsToRender, innerStyle, layout, scrollbarAlwaysOn, total, onScroll, onScrollbarScroll, states, useIsScrolling, windowStyle, ns } = ctx; const [start, end] = itemsToRender; const Container = resolveDynamicComponent(containerElement); const Inner = resolveDynamicComponent(innerElement); const children = []; if (total > 0) for (let i = start; i <= end; i++) children.push(h(Fragment, { key: i }, $slots.default?.({ data, index: i, isScrolling: useIsScrolling ? states.isScrolling : void 0, style: getItemStyle(i) }))); const InnerNode = [h(Inner, mergeProps(ctx.innerProps, { style: innerStyle, ref: "innerRef" }), !isString(Inner) ? { default: () => children } : children)]; const scrollbar = h(ScrollBar, { ref: "scrollbarRef", clientSize, layout, onScroll: onScrollbarScroll, ratio: clientSize * 100 / this.estimatedTotalSize, scrollFrom: states.scrollOffset / (this.estimatedTotalSize - clientSize), total, alwaysOn: scrollbarAlwaysOn }); const listContainer = h(Container, { class: [ns.e("window"), className], style: windowStyle, onScroll, ref: "windowRef", key: 0 }, !isString(Container) ? { default: () => [InnerNode] } : [InnerNode]); return h("div", { key: 0, class: [ns.e("wrapper"), scrollbarAlwaysOn ? "always-on" : ""] }, [listContainer, scrollbar]); } }); }; //#endregion //#region ../../packages/components/virtual-list/src/components/fixed-size-list.ts const FixedSizeList = createList({ name: "ElFixedSizeList", getItemOffset: ({ itemSize }, index) => index * itemSize, getItemSize: ({ itemSize }) => itemSize, getEstimatedTotalSize: ({ total, itemSize }) => itemSize * total, getOffset: ({ height, total, itemSize, layout, width }, index, alignment, scrollOffset) => { const size = isHorizontal(layout) ? width : height; const lastItemOffset = Math.max(0, total * itemSize - size); const maxOffset = Math.min(lastItemOffset, index * itemSize); const minOffset = Math.max(0, (index + 1) * itemSize - size); if (alignment === "smart") if (scrollOffset >= minOffset - size && scrollOffset <= maxOffset + size) alignment = AUTO_ALIGNMENT; else alignment = CENTERED_ALIGNMENT; switch (alignment) { case START_ALIGNMENT: return maxOffset; case "end": return minOffset; case CENTERED_ALIGNMENT: { const middleOffset = Math.round(minOffset + (maxOffset - minOffset) / 2); if (middleOffset < Math.ceil(size / 2)) return 0; else if (middleOffset > lastItemOffset + Math.floor(size / 2)) return lastItemOffset; else return middleOffset; } case AUTO_ALIGNMENT: default: if (scrollOffset >= minOffset && scrollOffset <= maxOffset) return scrollOffset; else if (scrollOffset < minOffset) return minOffset; else return maxOffset; } }, getStartIndexForOffset: ({ total, itemSize }, offset) => Math.max(0, Math.min(total - 1, Math.floor(offset / itemSize))), getStopIndexForStartIndex: ({ height, total, itemSize, layout, width }, startIndex, scrollOffset) => { const offset = startIndex * itemSize; const size = isHorizontal(layout) ? width : height; const numVisibleItems = Math.ceil((size + scrollOffset - offset) / itemSize); return Math.max(0, Math.min(total - 1, startIndex + numVisibleItems - 1)); }, /** * Fixed size list does not need this cache * Using any to bypass it, TODO: Using type inference to fix this. */ initCache() {}, clearCache: true, validateProps() {} }); //#endregion //#region ../../packages/components/virtual-list/src/components/dynamic-size-list.ts const getItemFromCache$1 = (props, index, listCache) => { const { itemSize } = props; const { items, lastVisitedIndex } = listCache; if (index > lastVisitedIndex) { let offset = 0; if (lastVisitedIndex >= 0) { const item = items[lastVisitedIndex]; offset = item.offset + item.size; } for (let i = lastVisitedIndex + 1; i <= index; i++) { const size = itemSize(i); items[i] = { offset, size }; offset += size; } listCache.lastVisitedIndex = index; } return items[index]; }; const findItem$1 = (props, listCache, offset) => { const { items, lastVisitedIndex } = listCache; if ((lastVisitedIndex > 0 ? items[lastVisitedIndex].offset : 0) >= offset) return bs$1(props, listCache, 0, lastVisitedIndex, offset); return es$1(props, listCache, Math.max(0, lastVisitedIndex), offset); }; const bs$1 = (props, listCache, low, high, offset) => { while (low <= high) { const mid = low + Math.floor((high - low) / 2); const currentOffset = getItemFromCache$1(props, mid, listCache).offset; if (currentOffset === offset) return mid; else if (currentOffset < offset) low = mid + 1; else if (currentOffset > offset) high = mid - 1; } return Math.max(0, low - 1); }; const es$1 = (props, listCache, index, offset) => { const { total } = props; let exponent = 1; while (index < total && getItemFromCache$1(props, index, listCache).offset < offset) { index += exponent; exponent *= 2; } return bs$1(props, listCache, Math.floor(index / 2), Math.min(index, total - 1), offset); }; const getEstimatedTotalSize = ({ total }, { items, estimatedItemSize, lastVisitedIndex }) => { let totalSizeOfMeasuredItems = 0; if (lastVisitedIndex >= total) lastVisitedIndex = total - 1; if (lastVisitedIndex >= 0) { const item = items[lastVisitedIndex]; totalSizeOfMeasuredItems = item.offset + item.size; } const totalSizeOfUnmeasuredItems = (total - lastVisitedIndex - 1) * estimatedItemSize; return totalSizeOfMeasuredItems + totalSizeOfUnmeasuredItems; }; const DynamicSizeList = createList({ name: "ElDynamicSizeList", getItemOffset: (props, index, listCache) => getItemFromCache$1(props, index, listCache).offset, getItemSize: (_, index, { items }) => items[index].size, getEstimatedTotalSize, getOffset: (props, index, alignment, scrollOffset, listCache) => { const { height, layout, width } = props; const size = isHorizontal(layout) ? width : height; const item = getItemFromCache$1(props, index, listCache); const estimatedTotalSize = getEstimatedTotalSize(props, listCache); const maxOffset = Math.max(0, Math.min(estimatedTotalSize - size, item.offset)); const minOffset = Math.max(0, item.offset - size + item.size); if (alignment === "smart") if (scrollOffset >= minOffset - size && scrollOffset <= maxOffset + size) alignment = AUTO_ALIGNMENT; else alignment = CENTERED_ALIGNMENT; switch (alignment) { case START_ALIGNMENT: return maxOffset; case "end": return minOffset; case CENTERED_ALIGNMENT: return Math.round(minOffset + (maxOffset - minOffset) / 2); case AUTO_ALIGNMENT: default: if (scrollOffset >= minOffset && scrollOffset <= maxOffset) return scrollOffset; else if (scrollOffset < minOffset) return minOffset; else return maxOffset; } }, getStartIndexForOffset: (props, offset, listCache) => findItem$1(props, listCache, offset), getStopIndexForStartIndex: (props, startIndex, scrollOffset, listCache) => { const { height, total, layout, width } = props; const size = isHorizontal(layout) ? width : height; const item = getItemFromCache$1(props, startIndex, listCache); const maxOffset = scrollOffset + size; let offset = item.offset + item.size; let stopIndex = startIndex; while (stopIndex < total - 1 && offset < maxOffset) { stopIndex++; offset += getItemFromCache$1(props, stopIndex, listCache).size; } return stopIndex; }, initCache({ estimatedItemSize = 50 }, instance) { const cache = { items: {}, estimatedItemSize, lastVisitedIndex: -1 }; cache.clearCacheAfterIndex = (index, forceUpdate = true) => { cache.lastVisitedIndex = Math.min(cache.lastVisitedIndex, index - 1); instance.exposed?.getItemStyleCache(-1); if (forceUpdate) instance.proxy?.$forceUpdate(); }; return cache; }, clearCache: false, validateProps: ({ itemSize }) => {} }); //#endregion //#region ../../packages/components/virtual-list/src/hooks/use-grid-wheel.ts const useGridWheel = ({ atXEndEdge, atXStartEdge, atYEndEdge, atYStartEdge }, onWheelDelta) => { let frameHandle = null; let xOffset = 0; let yOffset = 0; const hasReachedEdge = (x, y) => { const xEdgeReached = x < 0 && atXStartEdge.value || x > 0 && atXEndEdge.value; const yEdgeReached = y < 0 && atYStartEdge.value || y > 0 && atYEndEdge.value; return xEdgeReached || yEdgeReached; }; const onWheel = (e) => { cAF(frameHandle); let x = e.deltaX; let y = e.deltaY; if (Math.abs(x) > Math.abs(y)) y = 0; else x = 0; if (e.shiftKey && y !== 0) { x = y; y = 0; } if (hasReachedEdge(x, y)) { if (e.deltaX !== 0 && x === 0) e.preventDefault(); return; } xOffset += x; yOffset += y; e.preventDefault(); frameHandle = rAF(() => { onWheelDelta(xOffset, yOffset); xOffset = 0; yOffset = 0; }); }; return { hasReachedEdge, onWheel }; }; //#endregion //#region ../../packages/components/virtual-list/src/hooks/use-grid-touch.ts const useGridTouch = (windowRef, states, scrollTo, estimatedTotalWidth, estimatedTotalHeight, parsedWidth, parsedHeight) => { const touchStartX = ref(0); const touchStartY = ref(0); let frameHandle; let deltaX = 0; let deltaY = 0; const handleTouchStart = (event) => { cAF(frameHandle); touchStartX.value = event.touches[0].clientX; touchStartY.value = event.touches[0].clientY; deltaX = 0; deltaY = 0; }; const handleTouchMove = (event) => { event.preventDefault(); cAF(frameHandle); deltaX += touchStartX.value - event.touches[0].clientX; deltaY += touchStartY.value - event.touches[0].clientY; touchStartX.value = event.touches[0].clientX; touchStartY.value = event.touches[0].clientY; frameHandle = rAF(() => { const maxScrollLeft = estimatedTotalWidth.value - unref(parsedWidth); const maxScrollTop = estimatedTotalHeight.value - unref(parsedHeight); scrollTo({ scrollLeft: Math.min(states.value.scrollLeft + deltaX, maxScrollLeft), scrollTop: Math.min(states.value.scrollTop + deltaY, maxScrollTop) }); deltaX = 0; deltaY = 0; }); }; useEventListener(windowRef, "touchstart", handleTouchStart, { passive: true }); useEventListener(windowRef, "touchmove", handleTouchMove, { passive: false }); return { touchStartX, touchStartY, handleTouchStart, handleTouchMove }; }; //#endregion //#region ../../packages/components/virtual-list/src/builders/build-grid.ts const createGrid = ({ name, clearCache, getColumnPosition, getColumnStartIndexForOffset, getColumnStopIndexForStartIndex, getEstimatedTotalHeight, getEstimatedTotalWidth, getColumnOffset, getRowOffset, getRowPosition, getRowStartIndexForOffset, getRowStopIndexForStartIndex, initCache, injectToInstance, validateProps }) => { return defineComponent({ name: name ?? "ElVirtualList", props: virtualizedGridProps, emits: [ITEM_RENDER_EVT, SCROLL_EVT], setup(props, { emit, expose, slots }) { const ns = useNamespace("vl"); validateProps(props); const instance = getCurrentInstance(); const cache = ref(initCache(props, instance)); injectToInstance?.(instance, cache); const windowRef = ref(); const hScrollbar = ref(); const vScrollbar = ref(); const innerRef = ref(); const states = ref({ isScrolling: false, scrollLeft: isNumber(props.initScrollLeft) ? props.initScrollLeft : 0, scrollTop: isNumber(props.initScrollTop) ? props.initScrollTop : 0, updateRequested: false, xAxisScrollDir: FORWARD, yAxisScrollDir: FORWARD }); const getItemStyleCache = useCache(); const parsedHeight = computed(() => Number.parseInt(`${props.height}`, 10)); const parsedWidth = computed(() => Number.parseInt(`${props.width}`, 10)); const columnsToRender = computed(() => { const { totalColumn, totalRow, columnCache } = props; const { isScrolling, xAxisScrollDir, scrollLeft } = unref(states); if (totalColumn === 0 || totalRow === 0) return [ 0, 0, 0, 0 ]; const startIndex = getColumnStartIndexForOffset(props, scrollLeft, unref(cache)); const stopIndex = getColumnStopIndexForStartIndex(props, startIndex, scrollLeft, unref(cache)); const cacheBackward = !isScrolling || xAxisScrollDir === "backward" ? Math.max(1, columnCache) : 1; const cacheForward = !isScrolling || xAxisScrollDir === "forward" ? Math.max(1, columnCache) : 1; return [ Math.max(0, startIndex - cacheBackward), Math.max(0, Math.min(totalColumn - 1, stopIndex + cacheForward)), startIndex, stopIndex ]; }); const rowsToRender = computed(() => { const { totalColumn, totalRow, rowCache } = props; const { isScrolling, yAxisScrollDir, scrollTop } = unref(states); if (totalColumn === 0 || totalRow === 0) return [ 0, 0, 0, 0 ]; const startIndex = getRowStartIndexForOffset(props, scrollTop, unref(cache)); const stopIndex = getRowStopIndexForStartIndex(props, startIndex, scrollTop, unref(cache)); const cacheBackward = !isScrolling || yAxisScrollDir === "backward" ? Math.max(1, rowCache) : 1; const cacheForward = !isScrolling || yAxisScrollDir === "forward" ? Math.max(1, rowCache) : 1; return [ Math.max(0, startIndex - cacheBackward), Math.max(0, Math.min(totalRow - 1, stopIndex + cacheForward)), startIndex, stopIndex ]; }); const estimatedTotalHeight = computed(() => getEstimatedTotalHeight(props, unref(cache))); const estimatedTotalWidth = computed(() => getEstimatedTotalWidth(props, unref(cache))); const windowStyle = computed(() => [ { position: "relative", overflow: "hidden", WebkitOverflowScrolling: "touch", willChange: "transform" }, { direction: props.direction, height: isNumber(props.height) ? `${props.height}px` : props.height, width: isNumber(props.width) ? `${props.width}px` : props.width }, props.style ?? {} ]); const innerStyle = computed(() => { const width = `${unref(estimatedTotalWidth)}px`; return { height: `${unref(estimatedTotalHeight)}px`, pointerEvents: unref(states).isScrolling ? "none" : void 0, width, margin: 0, boxSizing: "border-box" }; }); const emitEvents = () => { const { totalColumn, totalRow } = props; if (totalColumn > 0 && totalRow > 0) { const [columnCacheStart, columnCacheEnd, columnVisibleStart, columnVisibleEnd] = unref(columnsToRender); const [rowCacheStart, rowCacheEnd, rowVisibleStart, rowVisibleEnd] = unref(rowsToRender); emit(ITEM_RENDER_EVT, { columnCacheStart, columnCacheEnd, rowCacheStart, rowCacheEnd, columnVisibleStart, columnVisibleEnd, rowVisibleStart, rowVisibleEnd }); } const { scrollLeft, scrollTop, updateRequested, xAxisScrollDir, yAxisScrollDir } = unref(states); emit(SCROLL_EVT, { xAxisScrollDir, scrollLeft, yAxisScrollDir, scrollTop, updateRequested }); }; const onScroll = (e) => { const { clientHeight, clientWidth, scrollHeight, scrollLeft, scrollTop, scrollWidth } = e.currentTarget; const _states = unref(states); if (_states.scrollTop === scrollTop && _states.scrollLeft === scrollLeft) return; let _scrollLeft = scrollLeft; if (isRTL(props.direction)) switch (getRTLOffsetType()) { case RTL_OFFSET_NAG: _scrollLeft = -scrollLeft; break; case RTL_OFFSET_POS_DESC: _scrollLeft = scrollWidth - clientWidth - scrollLeft; break; } states.value = { ..._states, isScrolling: true, scrollLeft: _scrollLeft, scrollTop: Math.max(0, Math.min(scrollTop, scrollHeight - clientHeight)), updateRequested: true, xAxisScrollDir: getScrollDir(_states.scrollLeft, _scrollLeft), yAxisScrollDir: getScrollDir(_states.scrollTop, scrollTop) }; nextTick(() => resetIsScrolling()); onUpdated(); emitEvents(); }; const onVerticalScroll = (distance, totalSteps) => { const height = unref(parsedHeight); const offset = (estimatedTotalHeight.value - height) / totalSteps * distance; scrollTo({ scrollTop: Math.min(estimatedTotalHeight.value - height, offset) }); }; const onHorizontalScroll = (distance, totalSteps) => { const width = unref(parsedWidth); const offset = (estimatedTotalWidth.value - width) / totalSteps * distance; scrollTo({ scrollLeft: Math.min(estimatedTotalWidth.value - width, offset) }); }; const { onWheel } = useGridWheel({ atXStartEdge: computed(() => states.value.scrollLeft <= 0), atXEndEdge: computed(() => states.value.scrollLeft >= estimatedTotalWidth.value - unref(parsedWidth)), atYStartEdge: computed(() => states.value.scrollTop <= 0), atYEndEdge: computed(() => states.value.scrollTop >= estimatedTotalHeight.value - unref(parsedHeight)) }, (x, y) => { hScrollbar.value?.onMouseUp?.(); vScrollbar.value?.onMouseUp?.(); const width = unref(parsedWidth); const height = unref(parsedHeight); scrollTo({ scrollLeft: Math.min(states.value.scrollLeft + x, estimatedTotalWidth.value - width), scrollTop: Math.min(states.value.scrollTop + y, estimatedTotalHeight.value - height) }); }); useEventListener(windowRef, "wheel", onWheel, { passive: false }); const scrollTo = ({ scrollLeft = states.value.scrollLeft, scrollTop = states.value.scrollTop }) => { scrollLeft = Math.max(scrollLeft, 0); scrollTop = Math.max(scrollTop, 0); const _states = unref(states); if (scrollTop === _states.scrollTop && scrollLeft === _states.scrollLeft) return; states.value = { ..._states, xAxisScrollDir: getScrollDir(_states.scrollLeft, scrollLeft), yAxisScrollDir: getScrollDir(_states.scrollTop, scrollTop), scrollLeft, scrollTop, updateRequested: true }; nextTick(() => resetIsScrolling()); onUpdated(); emitEvents(); }; const { touchStartX, touchStartY, handleTouchStart, handleTouchMove } = useGridTouch(windowRef, states, scrollTo, estimatedTotalWidth, estimatedTotalHeight, parsedWidth, parsedHeight); const scrollToItem = (rowIndex = 0, columnIdx = 0, alignment = AUTO_ALIGNMENT) => { const _states = unref(states); columnIdx = Math.max(0, Math.min(columnIdx, props.totalColumn - 1)); rowIndex = Math.max(0, Math.min(rowIndex, props.totalRow - 1)); const scrollBarWidth = getScrollBarWidth(ns.namespace.value); const _cache = unref(cache); const estimatedHeight = getEstimatedTotalHeight(props, _cache); const estimatedWidth = getEstimatedTotalWidth(props, _cache); scrollTo({ scrollLeft: getColumnOffset(props, columnIdx, alignment, _states.scrollLeft, _cache, estimatedWidth > props.width ? scrollBarWidth : 0), scrollTop: getRowOffset(props, rowIndex, alignment, _states.scrollTop, _cache, estimatedHeight > props.height ? scrollBarWidth : 0) }); }; const getItemStyle = (rowIndex, columnIndex) => { const { columnWidth, direction, rowHeight } = props; const itemStyleCache = getItemStyleCache.value(clearCache && columnWidth, clearCache && rowHeight, clearCache && direction); const key = `${rowIndex},${columnIndex}`; if (hasOwn(itemStyleCache, key)) return itemStyleCache[key]; else { const [, left] = getColumnPosition(props, columnIndex, unref(cache)); const _cache = unref(cache); const rtl = isRTL(direction); const [height, top] = getRowPosition(props, rowIndex, _cache); const [width] = getColumnPosition(props, columnIndex, _cache); itemStyleCache[key] = { position: "absolute", left: rtl ? void 0 : `${left}px`, right: rtl ? `${left}px` : void 0, top: `${top}px`, height: `${height}px`, width: `${width}px` }; return itemStyleCache[key]; } }; const resetIsScrolling = () => { states.value.isScrolling = false; nextTick(() => { getItemStyleCache.value(-1, null, null); }); }; onMounted(() => { if (!isClient) return; const { initScrollLeft, initScrollTop } = props; const windowElement = unref(windowRef); if (windowElement) { if (isNumber(initScrollLeft)) windowElement.scrollLeft = initScrollLeft; if (isNumber(initScrollTop)) windowElement.scrollTop = initScrollTop; } emitEvents(); }); const onUpdated = () => { const { direction } = props; const { scrollLeft, scrollTop, updateRequested } = unref(states); const windowElement = unref(windowRef); if (updateRequested && windowElement) { if (direction === "rtl") switch (getRTLOffsetType()) { case RTL_OFFSET_NAG: windowElement.scrollLeft = -scrollLeft; break; case RTL_OFFSET_POS_ASC: windowElement.scrollLeft = scrollLeft; break; default: { const { clientWidth, scrollWidth } = windowElement; windowElement.scrollLeft = scrollWidth - clientWidth - scrollLeft; break; } } else windowElement.scrollLeft = Math.max(0, scrollLeft); windowElement.scrollTop = Math.max(0, scrollTop); } }; const { resetAfterColumnIndex, resetAfterRowIndex, resetAfter } = instance.proxy; expose({ windowRef, innerRef, getItemStyleCache, touchStartX, touchStartY, handleTouchStart, handleTouchMove, scrollTo, scrollToItem, states, resetAfterColumnIndex, resetAfterRowIndex, resetAfter }); const renderScrollbars = () => { const { scrollbarAlwaysOn, scrollbarStartGap, scrollbarEndGap, totalColumn, totalRow } = props; const width = unref(parsedWidth); const height = unref(parsedHeight); const estimatedWidth = unref(estimatedTotalWidth); const estimatedHeight = unref(estimatedTotalHeight); const { scrollLeft, scrollTop } = unref(states); return { horizontalScrollbar: h(ScrollBar, { ref: hScrollbar, alwaysOn: scrollbarAlwaysOn, startGap: scrollbarStartGap, endGap: scrollbarEndGap, class: ns.e("horizontal"), clientSize: width, layout: "horizontal", onScroll: onHorizontalScroll, ratio: width * 100 / estimatedWidth, scrollFrom: scrollLeft / (estimatedWidth - width), total: totalRow, visible: true }), verticalScrollbar: h(ScrollBar, { ref: vScrollbar, alwaysOn: scrollbarAlwaysOn, startGap: scrollbarStartGap, endGap: scrollbarEndGap, class: ns.e("vertical"), clientSize: height, layout: "vertical", onScroll: onVerticalScroll, ratio: height * 100 / estimatedHeight, scrollFrom: scrollTop / (estimatedHeight - height), total: totalColumn, visible: true }) }; }; const renderItems = () => { const [columnStart, columnEnd] = unref(columnsToRender); const [rowStart, rowEnd] = unref(rowsToRender); const { data, totalColumn, totalRow, useIsScrolling, itemKey } = props; const children = []; if (totalRow > 0 && totalColumn > 0) for (let row = rowStart; row <= rowEnd; row++) for (let column = columnStart; column <= columnEnd; column++) { const key = itemKey({ columnIndex: column, data, rowIndex: row }); children.push(h(Fragment, { key }, slots.default?.({ columnIndex: column, data, isScrolling: useIsScrolling ? unref(states).isScrolling : void 0, style: getItemStyle(row, column), rowIndex: row }))); } return children; }; const renderInner = () => { const Inner = resolveDynamicComponent(props.innerElement); const children = renderItems(); return [h(Inner, mergeProps(props.innerProps, { style: unref(innerStyle), ref: innerRef }), !isString(Inner) ? { default: () => children } : children)]; }; const renderWindow = () => { const Container = resolveDynamicComponent(props.containerElement); const { horizontalScrollbar, verticalScrollbar } = renderScrollbars(); const Inner = renderInner(); return h("div", { key: 0, class: ns.e("wrapper"), role: props.role }, [ h(Container, { class: props.className, style: unref(windowStyle), onScroll, ref: windowRef }, !isString(Container) ? { default: () => Inner } : Inner), horizontalScrollbar, verticalScrollbar ]); }; return renderWindow; } }); }; //#endregion //#region ../../packages/components/virtual-list/src/components/fixed-size-grid.ts const FixedSizeGrid = createGrid({ name: "ElFixedSizeGrid", getColumnPosition: ({ columnWidth }, index) => [columnWidth, index * columnWidth], getRowPosition: ({ rowHeight }, index) => [rowHeight, index * rowHeight], getEstimatedTotalHeight: ({ totalRow, rowHeight }) => rowHeight * totalRow, getEstimatedTotalWidth: ({ totalColumn, columnWidth }) => columnWidth * totalColumn, getColumnOffset: ({ totalColumn, columnWidth, width }, columnIndex, alignment, scrollLeft, _, scrollBarWidth) => { width = Number(width); const lastColumnOffset = Math.max(0, totalColumn * columnWidth - width); const maxOffset = Math.min(lastColumnOffset, columnIndex * columnWidth); const minOffset = Math.max(0, columnIndex * columnWidth - width + scrollBarWidth + columnWidth); if (alignment === "smart") if (scrollLeft >= minOffset - width && scrollLeft <= maxOffset + width) alignment = AUTO_ALIGNMENT; else alignment = CENTERED_ALIGNMENT; switch (alignment) { case START_ALIGNMENT: return maxOffset; case "end": return minOffset; case CENTERED_ALIGNMENT: { const middleOffset = Math.round(minOffset + (maxOffset - minOffset) / 2); if (middleOffset < Math.ceil(width / 2)) return 0; else if (middleOffset > lastColumnOffset + Math.floor(width / 2)) return lastColumnOffset; else return middleOffset; } case AUTO_ALIGNMENT: default: if (scrollLeft >= minOffset && scrollLeft <= maxOffset) return scrollLeft; else if (minOffset > maxOffset) return minOffset; else if (scrollLeft < minOffset) return minOffset; else return maxOffset; } }, getRowOffset: ({ rowHeight, height, totalRow }, rowIndex, align, scrollTop, _, scrollBarWidth) => { height = Number(height); const lastRowOffset = Math.max(0, totalRow * rowHeight - height); const maxOffset = Math.min(lastRowOffset, rowIndex * rowHeight); const minOffset = Math.max(0, rowIndex * rowHeight - height + scrollBarWidth + rowHeight); if (align === "smart") if (scrollTop >= minOffset - height && scrollTop <= maxOffset + height) align = AUTO_ALIGNMENT; else align = CENTERED_ALIGNMENT; switch (align) { case START_ALIGNMENT: return maxOffset; case "end": return minOffset; case CENTERED_ALIGNMENT: { const middleOffset = Math.round(minOffset + (maxOffset - minOffset) / 2); if (middleOffset < Math.ceil(height / 2)) return 0; else if (middleOffset > lastRowOffset + Math.floor(height / 2)) return lastRowOffset; else return middleOffset; } case AUTO_ALIGNMENT: default: if (scrollTop >= minOffset && scrollTop <= maxOffset) return scrollTop; else if (minOffset > maxOffset) return minOffset; else if (scrollTop < minOffset) return minOffset; else return maxOffset; } }, getColumnStartIndexForOffset: ({ columnWidth, totalColumn }, scrollLeft) => Math.max(0, Math.min(totalColumn - 1, Math.floor(scrollLeft / columnWidth))), getColumnStopIndexForStartIndex: ({ columnWidth, totalColumn, width }, startIndex, scrollLeft) => { const left = startIndex * columnWidth; const visibleColumnsCount = Math.ceil((width + scrollLeft - left) / columnWidth); return Math.max(0, Math.min(totalColumn - 1, startIndex + visibleColumnsCount - 1)); }, getRowStartIndexForOffset: ({ rowHeight, totalRow }, scrollTop) => Math.max(0, Math.min(totalRow - 1, Math.floor(scrollTop / rowHeight))), getRowStopIndexForStartIndex: ({ rowHeight, totalRow, height }, startIndex, scrollTop) => { const top = startIndex * rowHeight; const numVisibleRows = Math.ceil((height + scrollTop - top) / rowHeight); return Math.max(0, Math.min(totalRow - 1, startIndex + numVisibleRows - 1)); }, /** * Fixed size grid does not need this cache * Using any to bypass it, TODO: Using type inference to fix this. */ initCache: () => void 0, clearCache: true, validateProps: ({ columnWidth, rowHeight }) => {} }); //#endregion //#region ../../packages/components/virtual-list/src/components/dynamic-size-grid.ts const { max, min, floor } = Math; const ACCESS_SIZER_KEY_MAP = { column: "columnWidth", row: "rowHeight" }; const ACCESS_LAST_VISITED_KEY_MAP = { column: "lastVisitedColumnIndex", row: "lastVisitedRowIndex" }; const getItemFromCache = (props, index, gridCache, type) => { const [cachedItems, sizer, lastVisited] = [ gridCache[type], props[ACCESS_SIZER_KEY_MAP[type]], gridCache[ACCESS_LAST_VISITED_KEY_MAP[type]] ]; if (index > lastVisited) { let offset = 0; if (lastVisited >= 0) { const item = cachedItems[lastVisited]; offset = item.offset + item.size; } for (let i = lastVisited + 1; i <= index; i++) { const size = sizer(i); cachedItems[i] = { offset, size }; offset += size; } gridCache[ACCESS_LAST_VISITED_KEY_MAP[type]] = index; } return cachedItems[index]; }; const bs = (props, gridCache, low, high, offset, type) => { while (low <= high) { const mid = low + floor((high - low) / 2); const currentOffset = getItemFromCache(props, mid, gridCache, type).offset; if (currentOffset === offset) return mid; else if (currentOffset < offset) low = mid + 1; else high = mid - 1; } return max(0, low - 1); }; const es = (props, gridCache, idx, offset, type) => { const total = type === "column" ? props.totalColumn : props.totalRow; let exponent = 1; while (idx < total && getItemFromCache(props, idx, gridCache, type).offset < offset) { idx += exponent; exponent *= 2; } return bs(props, gridCache, floor(idx / 2), min(idx, total - 1), offset, type); }; const findItem = (props, gridCache, offset, type) => { const [cache, lastVisitedIndex] = [gridCache[type], gridCache[ACCESS_LAST_VISITED_KEY_MAP[type]]]; if ((lastVisitedIndex > 0 ? cache[lastVisitedIndex].offset : 0) >= offset) return bs(props, gridCache, 0, lastVisitedIndex, offset, type); return es(props, gridCache, max(0, lastVisitedIndex), offset, type); }; const getEstimatedTotalHeight = ({ totalRow }, { estimatedRowHeight, lastVisitedRowIndex, row }) => { let sizeOfVisitedRows = 0; if (lastVisitedRowIndex >= totalRow) lastVisitedRowIndex = totalRow - 1; if (lastVisitedRowIndex >= 0) { const item = row[lastVisitedRowIndex]; sizeOfVisitedRows = item.offset + item.size; } const sizeOfUnvisitedItems = (totalRow - lastVisitedRowIndex - 1) * estimatedRowHeight; return sizeOfVisitedRows + sizeOfUnvisitedItems; }; const getEstimatedTotalWidth = ({ totalColumn }, { column, estimatedColumnWidth, lastVisitedColumnIndex }) => { let sizeOfVisitedColumns = 0; if (lastVisitedColumnIndex > totalColumn) lastVisitedColumnIndex = totalColumn - 1; if (lastVisitedColumnIndex >= 0) { const item = column[lastVisitedColumnIndex]; sizeOfVisitedColumns = item.offset + item.size; } const sizeOfUnvisitedItems = (totalColumn - lastVisitedColumnIndex - 1) * estimatedColumnWidth; return sizeOfVisitedColumns + sizeOfUnvisitedItems; }; const ACCESS_ESTIMATED_SIZE_KEY_MAP = { column: getEstimatedTotalWidth, row: getEstimatedTotalHeight }; const getOffset$1 = (props, index, alignment, scrollOffset, cache, type, scrollBarWidth) => { const [size, estimatedSizeAssociates] = [type === "row" ? props.height : props.width, ACCESS_ESTIMATED_SIZE_KEY_MAP[type]]; const item = getItemFromCache(props, index, cache, type); const maxOffset = max(0, min(estimatedSizeAssociates(props, cache) - size, item.offset)); const minOffset = max(0, item.offset - size + scrollBarWidth + item.size); if (alignment === "smart") if (scrollOffset >= minOffset - size && scrollOffset <= maxOffset + size) alignment = AUTO_ALIGNMENT; else alignment = CENTERED_ALIGNMENT; switch (alignment) { case START_ALIGNMENT: return maxOffset; case "end": return minOffset; case CENTERED_ALIGNMENT: return Math.round(minOffset + (maxOffset - minOffset) / 2); case AUTO_ALIGNMENT: default: if (scrollOffset >= minOffset && scrollOffset <= maxOffset) return scrollOffset; else if (minOffset > maxOffset) return minOffset; else if (scrollOffset < minOffset) return minOffset; else return maxOffset; } }; const DynamicSizeGrid = createGrid({ name: "ElDynamicSizeGrid", getColumnPosition: (props, idx, cache) => { const item = getItemFromCache(props, idx, cache, "column"); return [item.size, item.offset]; }, getRowPosition: (props, idx, cache) => { const item = getItemFromCache(props, idx, cache, "row"); return [item.size, item.offset]; }, getColumnOffset: (props, columnIndex, alignment, scrollLeft, cache, scrollBarWidth) => getOffset$1(props, columnIndex, alignment, scrollLeft, cache, "column", scrollBarWidth), getRowOffset: (props, rowIndex, alignment, scrollTop, cache, scrollBarWidth) => getOffset$1(props, rowIndex, alignment, scrollTop, cache, "row", scrollBarWidth), getColumnStartIndexForOffset: (props, scrollLeft, cache) => findItem(props, cache, scrollLeft, "column"), getColumnStopIndexForStartIndex: (props, startIndex, scrollLeft, cache) => { const item = getItemFromCache(props, startIndex, cache, "column"); const maxOffset = scrollLeft + props.width; let offset = item.offset + item.size; let stopIndex = startIndex; while (stopIndex < props.totalColumn - 1 && offset < maxOffset) { stopIndex++; offset += getItemFromCache(props, startIndex, cache, "column").size; } return stopIndex; }, getEstimatedTotalHeight, getEstimatedTotalWidth, getRowStartIndexForOffset: (props, scrollTop, cache) => findItem(props, cache, scrollTop, "row"), getRowStopIndexForStartIndex: (props, startIndex, scrollTop, cache) => { const { totalRow, height } = props; const item = getItemFromCache(props, startIndex, cache, "row"); const maxOffset = scrollTop + height; let offset = item.size + item.offset; let stopIndex = startIndex; while (stopIndex < totalRow - 1 && offset < maxOffset) { stopIndex++; offset += getItemFromCache(props, stopIndex, cache, "row").size; } return stopIndex; }, injectToInstance: (instance, cache) => { const resetAfter = ({ columnIndex, rowIndex }, forceUpdate) => { forceUpdate = isUndefined(forceUpdate) ? true : forceUpdate; if (isNumber(columnIndex)) cache.value.lastVisitedColumnIndex = Math.min(cache.value.lastVisitedColumnIndex, columnIndex - 1); if (isNumber(rowIndex)) cache.value.lastVisitedRowIndex = Math.min(cache.value.lastVisitedRowIndex, rowIndex - 1); instance.exposed?.getItemStyleCache.value(-1, null, null); if (forceUpdate) instance.proxy?.$forceUpdate(); }; const resetAfterColumnIndex = (columnIndex, forceUpdate) => { resetAfter({ columnIndex }, forceUpdate); }; const resetAfterRowIndex = (rowIndex, forceUpdate) => { resetAfter({ rowIndex }, forceUpdate); }; Object.assign(instance.proxy, { resetAfterColumnIndex, resetAfterRowIndex, resetAfter }); }, initCache: ({ estimatedColumnWidth = 50, estimatedRowHeight = 50 }) => { return { column: {}, estimatedColumnWidth, estimatedRowHeight, lastVisitedColumnIndex: -1, lastVisitedRowIndex: -1, row: {} }; }, clearCache: false, validateProps: ({ columnWidth, rowHeight }) => {} }); //#endregion //#region ../../packages/components/checkbox/src/checkbox.ts /** * @deprecated Removed after 3.0.0, Use `CheckboxProps` instead. */ const checkboxProps = { /** * @description binding value */ modelValue: { type: [ Number, String, Boolean ], default: void 0 }, /** * @description label of the Checkbox when used inside a `checkbox-group` */ label: { type: [ String, Boolean, Number, Object ], default: void 0 }, /** * @description value of the Checkbox when used inside a `checkbox-group` */ value: { type: [ String, Boolean, Number, Object ], default: void 0 }, /** * @description Set indeterminate state, only responsible for style control */ indeterminate: Boolean, /** * @description whether the Checkbox is disabled */ disabled: { type: Boolean, default: void 0 }, /** * @description if the Checkbox is checked */ checked: Boolean, /** * @description native 'name' attribute */ name: { type: String, default: void 0 }, /** * @description value of the Checkbox if it's checked */ trueValue: { type: [String, Number], default: void 0 }, /** * @description value of the Checkbox if it's not checked */ falseValue: { type: [String, Number], default: void 0 }, /** * @deprecated use `trueValue` instead * @description value of the Checkbox if it's checked */ trueLabel: { type: [String, Number], default: void 0 }, /** * @deprecated use `falseValue` instead * @description value of the Checkbox if it's not checked */ falseLabel: { type: [String, Number], default: void 0 }, /** * @description input id */ id: { type: String, default: void 0 }, /** * @description whether to add a border around Checkbox */ border: Boolean, /** * @description size of the Checkbox */ size: useSizeProp, /** * @description input tabindex */ tabindex: [String, Number], /** * @description whether to trigger form validation */ validateEvent: { type: Boolean, default: true }, ariaLabel: String, ...useAriaProps(["ariaControls"]) }; const checkboxEmits = { [UPDATE_MODEL_EVENT]: (val) => isString(val) || isNumber(val) || isBoolean(val), change: (val) => isString(val) || isNumber(val) || isBoolean(val) }; const checkboxPropsDefaults = { modelValue: void 0, label: void 0, value: void 0, disabled: void 0, name: void 0, trueValue: void 0, falseValue: void 0, trueLabel: void 0, falseLabel: void 0, id: void 0, validateEvent: true }; //#endregion //#region ../../packages/components/checkbox/src/constants.ts const checkboxGroupContextKey = Symbol("checkboxGroupContextKey"); //#endregion //#region ../../packages/components/checkbox/src/composables/use-checkbox-disabled.ts const useCheckboxDisabled = ({ model, isChecked }) => { const checkboxGroup = inject(checkboxGroupContextKey, void 0); const formContext = inject(formContextKey, void 0); const isLimitDisabled = computed(() => { const max = checkboxGroup?.max?.value; const min = checkboxGroup?.min?.value; return !isUndefined(max) && model.value.length >= max && !isChecked.value || !isUndefined(min) && model.value.length <= min && isChecked.value; }); return { isDisabled: useFormDisabled(computed(() => { if (checkboxGroup === void 0) return formContext?.disabled ?? isLimitDisabled.value; else return checkboxGroup.disabled?.value || isLimitDisabled.value; })), isLimitDisabled }; }; //#endregion //#region ../../packages/components/checkbox/src/composables/use-checkbox-event.ts const useCheckboxEvent = (props, { model, isLimitExceeded, hasOwnLabel, isDisabled, isLabeledByFormItem }) => { const checkboxGroup = inject(checkboxGroupContextKey, void 0); const { formItem } = useFormItem(); const { emit } = getCurrentInstance(); function getLabeledValue(value) { return [ true, props.trueValue, props.trueLabel ].includes(value) ? props.trueValue ?? props.trueLabel ?? true : props.falseValue ?? props.falseLabel ?? false; } function emitChangeEvent(checked, e) { emit(CHANGE_EVENT, getLabeledValue(checked), e); } function handleChange(e) { if (isLimitExceeded.value) return; const target = e.target; emit(CHANGE_EVENT, getLabeledValue(target.checked), e); } async function onClickRoot(e) { if (isLimitExceeded.value) return; if (!hasOwnLabel.value && !isDisabled.value && isLabeledByFormItem.value) { if (!e.composedPath().some((item) => item.tagName === "LABEL")) { model.value = getLabeledValue([ false, props.falseValue, props.falseLabel ].includes(model.value)); await nextTick(); emitChangeEvent(model.value, e); } } } const validateEvent = computed(() => checkboxGroup?.validateEvent || props.validateEvent); watch(() => props.modelValue, () => { if (validateEvent.value) formItem?.validate("change").catch(NOOP); }); return { handleChange, onClickRoot }; }; //#endregion //#region ../../packages/components/checkbox/src/composables/use-checkbox-model.ts const useCheckboxModel = (props) => { const selfModel = ref(false); const { emit, vnode } = getCurrentInstance(); const checkboxGroup = inject(checkboxGroupContextKey, void 0); const isGroup = computed(() => isUndefined(checkboxGroup) === false); const isLimitExceeded = ref(false); const isControlled = computed(() => { const rawProps = vnode.props ?? {}; return "modelValue" in rawProps || "model-value" in rawProps; }); const model = computed({ get() { return isGroup.value ? checkboxGroup?.modelValue?.value : !isControlled.value ? selfModel.value : props.modelValue; }, set(val) { if (isGroup.value && isArray$1(val)) { isLimitExceeded.value = checkboxGroup?.max?.value !== void 0 && val.length > checkboxGroup?.max.value && val.length > model.value.length; isLimitExceeded.value === false && checkboxGroup?.changeEvent?.(val); } else { emit(UPDATE_MODEL_EVENT, val); selfModel.value = val; } } }); return { model, isGroup, isLimitExceeded }; }; //#endregion //#region ../../packages/components/checkbox/src/composables/use-checkbox-status.ts const useCheckboxStatus = (props, slots, { model }) => { const checkboxGroup = inject(checkboxGroupContextKey, void 0); const isFocused = ref(false); const actualValue = computed(() => { if (!isPropAbsent(props.value)) return props.value; return props.label; }); const isChecked = computed(() => { const value = model.value; if (isBoolean(value)) return value; else if (isArray$1(value)) if (isObject$1(actualValue.value)) return value.map(toRaw).some((o) => isEqual$1(o, actualValue.value)); else return value.map(toRaw).includes(actualValue.value); else if (value !== null && value !== void 0) return value === props.trueValue || value === props.trueLabel; else return !!value; }); return { checkboxButtonSize: useFormSize(computed(() => checkboxGroup?.size?.value), { prop: true }), isChecked, isFocused, checkboxSize: useFormSize(computed(() => checkboxGroup?.size?.value)), hasOwnLabel: computed(() => { return !!slots.default || !isPropAbsent(actualValue.value); }), actualValue }; }; //#endregion //#region ../../packages/components/checkbox/src/composables/use-checkbox.ts const useCheckbox = (props, slots) => { const { formItem: elFormItem } = useFormItem(); const { model, isGroup, isLimitExceeded } = useCheckboxModel(props); const { isFocused, isChecked, checkboxButtonSize, checkboxSize, hasOwnLabel, actualValue } = useCheckboxStatus(props, slots, { model }); const { isDisabled } = useCheckboxDisabled({ model, isChecked }); const { inputId, isLabeledByFormItem } = useFormItemInputId(props, { formItemContext: elFormItem, disableIdGeneration: hasOwnLabel, disableIdManagement: isGroup }); const { handleChange, onClickRoot } = useCheckboxEvent(props, { model, isLimitExceeded, hasOwnLabel, isDisabled, isLabeledByFormItem }); const setStoreValue = () => { function addToStore() { if (isArray$1(model.value) && !model.value.includes(actualValue.value)) model.value.push(actualValue.value); else model.value = props.trueValue ?? props.trueLabel ?? true; } props.checked && addToStore(); }; setStoreValue(); useDeprecated({ from: "label act as value", replacement: "value", version: "3.0.0", scope: "el-checkbox", ref: "https://element-plus.org/en-US/component/checkbox.html" }, computed(() => isGroup.value && isPropAbsent(props.value))); useDeprecated({ from: "true-label", replacement: "true-value", version: "3.0.0", scope: "el-checkbox", ref: "https://element-plus.org/en-US/component/checkbox.html" }, computed(() => !!props.trueLabel)); useDeprecated({ from: "false-label", replacement: "false-value", version: "3.0.0", scope: "el-checkbox", ref: "https://element-plus.org/en-US/component/checkbox.html" }, computed(() => !!props.falseLabel)); return { inputId, isLabeledByFormItem, isChecked, isDisabled, isFocused, checkboxButtonSize, checkboxSize, hasOwnLabel, model, actualValue, handleChange, onClickRoot }; }; //#endregion //#region ../../packages/components/checkbox/src/checkbox.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$64 = [ "id", "indeterminate", "name", "tabindex", "disabled" ]; var checkbox_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElCheckbox", __name: "checkbox", props: checkboxProps, emits: checkboxEmits, setup(__props) { const props = __props; const { inputId, isLabeledByFormItem, isChecked, isDisabled, isFocused, checkboxSize, hasOwnLabel, model, actualValue, handleChange, onClickRoot } = useCheckbox(props, useSlots()); const inputBindings = computed(() => { if (props.trueValue || props.falseValue || props.trueLabel || props.falseLabel) return { "true-value": props.trueValue ?? props.trueLabel ?? true, "false-value": props.falseValue ?? props.falseLabel ?? false }; return { value: actualValue.value }; }); const ns = useNamespace("checkbox"); const compKls = computed(() => { return [ ns.b(), ns.m(checkboxSize.value), ns.is("disabled", isDisabled.value), ns.is("bordered", props.border), ns.is("checked", isChecked.value) ]; }); const spanKls = computed(() => { return [ ns.e("input"), ns.is("disabled", isDisabled.value), ns.is("checked", isChecked.value), ns.is("indeterminate", props.indeterminate), ns.is("focus", isFocused.value) ]; }); return (_ctx, _cache) => { return openBlock(), createBlock(resolveDynamicComponent(!unref(hasOwnLabel) && unref(isLabeledByFormItem) ? "span" : "label"), { for: !unref(hasOwnLabel) && unref(isLabeledByFormItem) ? null : unref(inputId), class: normalizeClass(compKls.value), "aria-controls": __props.indeterminate ? __props.ariaControls : null, "aria-checked": __props.indeterminate ? "mixed" : void 0, "aria-label": __props.ariaLabel, onClick: unref(onClickRoot) }, { default: withCtx(() => [createElementVNode("span", { class: normalizeClass(spanKls.value) }, [withDirectives(createElementVNode("input", mergeProps({ id: unref(inputId), "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => isRef(model) ? model.value = $event : null), class: unref(ns).e("original"), type: "checkbox", indeterminate: __props.indeterminate, name: __props.name, tabindex: __props.tabindex, disabled: unref(isDisabled) }, inputBindings.value, { onChange: _cache[1] || (_cache[1] = (...args) => unref(handleChange) && unref(handleChange)(...args)), onFocus: _cache[2] || (_cache[2] = ($event) => isFocused.value = true), onBlur: _cache[3] || (_cache[3] = ($event) => isFocused.value = false), onClick: _cache[4] || (_cache[4] = withModifiers(() => {}, ["stop"])) }), null, 16, _hoisted_1$64), [[vModelCheckbox, unref(model)]]), createElementVNode("span", { class: normalizeClass(unref(ns).e("inner")) }, null, 2)], 2), unref(hasOwnLabel) ? (openBlock(), createElementBlock("span", { key: 0, class: normalizeClass(unref(ns).e("label")) }, [renderSlot(_ctx.$slots, "default"), !_ctx.$slots.default ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createTextVNode(toDisplayString(__props.label), 1)], 64)) : createCommentVNode("v-if", true)], 2)) : createCommentVNode("v-if", true)]), _: 3 }, 8, [ "for", "class", "aria-controls", "aria-checked", "aria-label", "onClick" ]); }; } }); //#endregion //#region ../../packages/components/checkbox/src/checkbox.vue var checkbox_default = checkbox_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/checkbox/src/checkbox-button.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$63 = [ "name", "tabindex", "disabled" ]; var checkbox_button_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElCheckboxButton", __name: "checkbox-button", props: checkboxProps, emits: checkboxEmits, setup(__props) { const props = __props; const { isFocused, isChecked, isDisabled, checkboxButtonSize, model, actualValue, handleChange } = useCheckbox(props, useSlots()); const inputBindings = computed(() => { if (props.trueValue || props.falseValue || props.trueLabel || props.falseLabel) return { "true-value": props.trueValue ?? props.trueLabel ?? true, "false-value": props.falseValue ?? props.falseLabel ?? false }; return { value: actualValue.value }; }); const checkboxGroup = inject(checkboxGroupContextKey, void 0); const ns = useNamespace("checkbox"); const activeStyle = computed(() => { const fillValue = checkboxGroup?.fill?.value ?? ""; return { backgroundColor: fillValue, borderColor: fillValue, color: checkboxGroup?.textColor?.value ?? "", boxShadow: fillValue ? `-1px 0 0 0 ${fillValue}` : void 0 }; }); const labelKls = computed(() => { return [ ns.b("button"), ns.bm("button", checkboxButtonSize.value), ns.is("disabled", isDisabled.value), ns.is("checked", isChecked.value), ns.is("focus", isFocused.value) ]; }); return (_ctx, _cache) => { return openBlock(), createElementBlock("label", { class: normalizeClass(labelKls.value) }, [withDirectives(createElementVNode("input", mergeProps({ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => isRef(model) ? model.value = $event : null), class: unref(ns).be("button", "original"), type: "checkbox", name: __props.name, tabindex: __props.tabindex, disabled: unref(isDisabled) }, inputBindings.value, { onChange: _cache[1] || (_cache[1] = (...args) => unref(handleChange) && unref(handleChange)(...args)), onFocus: _cache[2] || (_cache[2] = ($event) => isFocused.value = true), onBlur: _cache[3] || (_cache[3] = ($event) => isFocused.value = false), onClick: _cache[4] || (_cache[4] = withModifiers(() => {}, ["stop"])) }), null, 16, _hoisted_1$63), [[vModelCheckbox, unref(model)]]), _ctx.$slots.default || __props.label ? (openBlock(), createElementBlock("span", { key: 0, class: normalizeClass(unref(ns).be("button", "inner")), style: normalizeStyle(unref(isChecked) ? activeStyle.value : void 0) }, [renderSlot(_ctx.$slots, "default", {}, () => [createTextVNode(toDisplayString(__props.label), 1)])], 6)) : createCommentVNode("v-if", true)], 2); }; } }); //#endregion //#region ../../packages/components/checkbox/src/checkbox-button.vue var checkbox_button_default = checkbox_button_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/checkbox/src/checkbox-group.ts /** * @deprecated Removed after 3.0.0, Use `CheckboxGroupProps` instead. */ const checkboxGroupProps = buildProps({ /** * @description binding value */ modelValue: { type: definePropType(Array), default: () => [] }, /** * @description whether the nesting checkboxes are disabled */ disabled: { type: Boolean, default: void 0 }, /** * @description minimum number of checkbox checked */ min: Number, /** * @description maximum number of checkbox checked */ max: Number, /** * @description size of checkbox */ size: useSizeProp, /** * @description border and background color when button is active */ fill: String, /** * @description font color when button is active */ textColor: String, /** * @description element tag of the checkbox group */ tag: { type: String, default: "div" }, /** * @description whether to trigger form validation */ validateEvent: { type: Boolean, default: true }, options: { type: definePropType(Array) }, props: { type: definePropType(Object), default: () => checkboxDefaultProps }, type: { type: String, values: ["checkbox", "button"], default: "checkbox" }, ...useAriaProps(["ariaLabel"]) }); const checkboxGroupEmits = { [UPDATE_MODEL_EVENT]: (val) => isArray$1(val), change: (val) => isArray$1(val) }; const checkboxDefaultProps = { label: "label", value: "value", disabled: "disabled" }; //#endregion //#region ../../packages/components/checkbox/src/checkbox-group.vue?vue&type=script&setup=true&lang.ts var checkbox_group_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElCheckboxGroup", __name: "checkbox-group", props: checkboxGroupProps, emits: checkboxGroupEmits, setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const ns = useNamespace("checkbox"); const checkboxDisabled = useFormDisabled(); const { formItem } = useFormItem(); const { inputId: groupId, isLabeledByFormItem } = useFormItemInputId(props, { formItemContext: formItem }); const changeEvent = async (value) => { emit(UPDATE_MODEL_EVENT, value); await nextTick(); emit(CHANGE_EVENT, value); }; const modelValue = computed({ get() { return props.modelValue; }, set(val) { changeEvent(val); } }); const aliasProps = computed(() => ({ ...checkboxDefaultProps, ...props.props })); const getOptionProps = (option) => { const { label, value, disabled } = aliasProps.value; const base = { label: option[label], value: option[value], disabled: option[disabled] }; return { ...omit(option, [ label, value, disabled ]), ...base }; }; const optionComponent = computed(() => props.type === "button" ? checkbox_button_default : checkbox_default); provide(checkboxGroupContextKey, { ...pick(toRefs(props), [ "size", "min", "max", "validateEvent", "fill", "textColor" ]), disabled: checkboxDisabled, modelValue, changeEvent }); watch(() => props.modelValue, (newVal, oldValue) => { if (props.validateEvent && !isEqual$1(newVal, oldValue)) formItem?.validate("change").catch(NOOP); }); return (_ctx, _cache) => { return openBlock(), createBlock(resolveDynamicComponent(__props.tag), { id: unref(groupId), class: normalizeClass(unref(ns).b("group")), role: "group", "aria-label": !unref(isLabeledByFormItem) ? __props.ariaLabel || "checkbox-group" : void 0, "aria-labelledby": unref(isLabeledByFormItem) ? unref(formItem)?.labelId : void 0 }, { default: withCtx(() => [renderSlot(_ctx.$slots, "default", {}, () => [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.options, (item, index) => { return openBlock(), createBlock(resolveDynamicComponent(optionComponent.value), mergeProps({ key: index }, { ref_for: true }, getOptionProps(item)), null, 16); }), 128))])]), _: 3 }, 8, [ "id", "class", "aria-label", "aria-labelledby" ]); }; } }); //#endregion //#region ../../packages/components/checkbox/src/checkbox-group.vue var checkbox_group_default = checkbox_group_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/checkbox/index.ts const ElCheckbox = withInstall(checkbox_default, { CheckboxButton: checkbox_button_default, CheckboxGroup: checkbox_group_default }); const ElCheckboxButton = withNoopInstall(checkbox_button_default); const ElCheckboxGroup = withNoopInstall(checkbox_group_default); //#endregion //#region ../../packages/components/radio/src/radio.ts /** * @deprecated Removed after 3.0.0, Use `RadioPropsBase` instead. */ const radioPropsBase = buildProps({ /** * @description binding value */ modelValue: { type: [ String, Number, Boolean ], default: void 0 }, /** * @description size of the Radio */ size: useSizeProp, /** * @description whether Radio is disabled */ disabled: { type: Boolean, default: void 0 }, /** * @description the label of Radio */ label: { type: [ String, Number, Boolean ], default: void 0 }, /** * @description the value of Radio */ value: { type: [ String, Number, Boolean ], default: void 0 }, /** * @description native `name` attribute */ name: { type: String, default: void 0 } }); /** * @deprecated Removed after 3.0.0, Use `RadioProps` instead. */ const radioProps = buildProps({ ...radioPropsBase, /** * @description whether to add a border around Radio */ border: Boolean }); const radioEmits = { [UPDATE_MODEL_EVENT]: (val) => isString(val) || isNumber(val) || isBoolean(val), [CHANGE_EVENT]: (val) => isString(val) || isNumber(val) || isBoolean(val) }; /** * @description default values for RadioProps */ const radioPropsDefaults = { modelValue: void 0, disabled: void 0, label: void 0, value: void 0, name: void 0, border: false }; //#endregion //#region ../../packages/components/radio/src/constants.ts const radioGroupKey = Symbol("radioGroupKey"); //#endregion //#region ../../packages/components/radio/src/use-radio.ts const useRadio = (props, emit) => { const radioRef = ref(); const radioGroup = inject(radioGroupKey, void 0); const isGroup = computed(() => !!radioGroup); const actualValue = computed(() => { if (!isPropAbsent(props.value)) return props.value; return props.label; }); const modelValue = computed({ get() { return isGroup.value ? radioGroup.modelValue : props.modelValue; }, set(val) { if (isGroup.value) radioGroup.changeEvent(val); else emit && emit("update:modelValue", val); radioRef.value.checked = props.modelValue === actualValue.value; } }); const size = useFormSize(computed(() => radioGroup?.size)); const disabled = useFormDisabled(computed(() => radioGroup?.disabled)); const focus = ref(false); const tabIndex = computed(() => { return disabled.value || isGroup.value && modelValue.value !== actualValue.value ? -1 : 0; }); useDeprecated({ from: "label act as value", replacement: "value", version: "3.0.0", scope: "el-radio", ref: "https://element-plus.org/en-US/component/radio.html" }, computed(() => isGroup.value && isPropAbsent(props.value))); return { radioRef, isGroup, radioGroup, focus, size, disabled, tabIndex, modelValue, actualValue }; }; //#endregion //#region ../../packages/components/radio/src/radio.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$62 = [ "value", "name", "disabled", "checked" ]; var radio_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElRadio", __name: "radio", props: radioProps, emits: radioEmits, setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const ns = useNamespace("radio"); const { radioRef, radioGroup, focus, size, disabled, modelValue, actualValue } = useRadio(props, emit); function handleChange() { nextTick(() => emit(CHANGE_EVENT, modelValue.value)); } return (_ctx, _cache) => { return openBlock(), createElementBlock("label", { class: normalizeClass([ unref(ns).b(), unref(ns).is("disabled", unref(disabled)), unref(ns).is("focus", unref(focus)), unref(ns).is("bordered", __props.border), unref(ns).is("checked", unref(modelValue) === unref(actualValue)), unref(ns).m(unref(size)) ]) }, [createElementVNode("span", { class: normalizeClass([ unref(ns).e("input"), unref(ns).is("disabled", unref(disabled)), unref(ns).is("checked", unref(modelValue) === unref(actualValue)) ]) }, [withDirectives(createElementVNode("input", { ref_key: "radioRef", ref: radioRef, "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => isRef(modelValue) ? modelValue.value = $event : null), class: normalizeClass(unref(ns).e("original")), value: unref(actualValue), name: __props.name || unref(radioGroup)?.name, disabled: unref(disabled), checked: unref(modelValue) === unref(actualValue), type: "radio", onFocus: _cache[1] || (_cache[1] = ($event) => focus.value = true), onBlur: _cache[2] || (_cache[2] = ($event) => focus.value = false), onChange: handleChange, onClick: _cache[3] || (_cache[3] = withModifiers(() => {}, ["stop"])) }, null, 42, _hoisted_1$62), [[vModelRadio, unref(modelValue)]]), createElementVNode("span", { class: normalizeClass(unref(ns).e("inner")) }, null, 2)], 2), createElementVNode("span", { class: normalizeClass(unref(ns).e("label")), onKeydown: _cache[4] || (_cache[4] = withModifiers(() => {}, ["stop"])) }, [renderSlot(_ctx.$slots, "default", {}, () => [createTextVNode(toDisplayString(__props.label), 1)])], 34)], 2); }; } }); //#endregion //#region ../../packages/components/radio/src/radio.vue var radio_default = radio_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/radio/src/radio-button.ts /** * @deprecated Removed after 3.0.0, Use `RadioButtonProps` instead. */ const radioButtonProps = buildProps({ ...radioPropsBase }); /** * @description default values for RadioButtonProps */ const radioButtonPropsDefaults = { modelValue: void 0, disabled: void 0, label: void 0, value: void 0, name: void 0 }; //#endregion //#region ../../packages/components/radio/src/radio-button.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$61 = [ "value", "name", "disabled" ]; var radio_button_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElRadioButton", __name: "radio-button", props: radioButtonProps, setup(__props) { const props = __props; const ns = useNamespace("radio"); const { radioRef, focus, size, disabled, modelValue, radioGroup, actualValue } = useRadio(props); const activeStyle = computed(() => { return { backgroundColor: radioGroup?.fill || "", borderColor: radioGroup?.fill || "", boxShadow: radioGroup?.fill ? `-1px 0 0 0 ${radioGroup.fill}` : "", color: radioGroup?.textColor || "" }; }); return (_ctx, _cache) => { return openBlock(), createElementBlock("label", { class: normalizeClass([ unref(ns).b("button"), unref(ns).is("active", unref(modelValue) === unref(actualValue)), unref(ns).is("disabled", unref(disabled)), unref(ns).is("focus", unref(focus)), unref(ns).bm("button", unref(size)) ]) }, [withDirectives(createElementVNode("input", { ref_key: "radioRef", ref: radioRef, "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => isRef(modelValue) ? modelValue.value = $event : null), class: normalizeClass(unref(ns).be("button", "original-radio")), value: unref(actualValue), type: "radio", name: __props.name || unref(radioGroup)?.name, disabled: unref(disabled), onFocus: _cache[1] || (_cache[1] = ($event) => focus.value = true), onBlur: _cache[2] || (_cache[2] = ($event) => focus.value = false), onClick: _cache[3] || (_cache[3] = withModifiers(() => {}, ["stop"])) }, null, 42, _hoisted_1$61), [[vModelRadio, unref(modelValue)]]), createElementVNode("span", { class: normalizeClass(unref(ns).be("button", "inner")), style: normalizeStyle(unref(modelValue) === unref(actualValue) ? activeStyle.value : {}), onKeydown: _cache[4] || (_cache[4] = withModifiers(() => {}, ["stop"])) }, [renderSlot(_ctx.$slots, "default", {}, () => [createTextVNode(toDisplayString(__props.label), 1)])], 38)], 2); }; } }); //#endregion //#region ../../packages/components/radio/src/radio-button.vue var radio_button_default = radio_button_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/radio/src/radio-group.ts const radioDefaultProps = { label: "label", value: "value", disabled: "disabled" }; /** * @deprecated Removed after 3.0.0, Use `RadioGroupProps` instead. */ const radioGroupProps = buildProps({ /** * @description native `id` attribute */ id: { type: String, default: void 0 }, /** * @description the size of radio buttons or bordered radios */ size: useSizeProp, /** * @description whether the nesting radios are disabled */ disabled: { type: Boolean, default: void 0 }, /** * @description binding value */ modelValue: { type: [ String, Number, Boolean ], default: void 0 }, /** * @description border and background color when button is active */ fill: { type: String, default: "" }, /** * @description font color when button is active */ textColor: { type: String, default: "" }, /** * @description native `name` attribute */ name: { type: String, default: void 0 }, /** * @description whether to trigger form validation */ validateEvent: { type: Boolean, default: true }, options: { type: definePropType(Array) }, props: { type: definePropType(Object), default: () => radioDefaultProps }, type: { type: String, values: ["radio", "button"], default: "radio" }, ...useAriaProps(["ariaLabel"]) }); const radioGroupEmits = radioEmits; /** * @description default values for RadioGroupProps */ const radioGroupPropsDefaults = { id: void 0, disabled: void 0, modelValue: void 0, fill: "", textColor: "", name: void 0, validateEvent: true, props: () => radioDefaultProps, type: "radio" }; //#endregion //#region ../../packages/components/radio/src/radio-group.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$60 = [ "id", "aria-label", "aria-labelledby" ]; var radio_group_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElRadioGroup", __name: "radio-group", props: radioGroupProps, emits: radioGroupEmits, setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const ns = useNamespace("radio"); const radioId = useId(); const radioGroupRef = ref(); const { formItem } = useFormItem(); const { inputId: groupId, isLabeledByFormItem } = useFormItemInputId(props, { formItemContext: formItem }); const changeEvent = (value) => { emit(UPDATE_MODEL_EVENT, value); nextTick(() => emit(CHANGE_EVENT, value)); }; onMounted(() => { const radios = radioGroupRef.value.querySelectorAll("[type=radio]"); const firstLabel = radios[0]; if (!Array.from(radios).some((radio) => radio.checked) && firstLabel) firstLabel.tabIndex = 0; }); const name = computed(() => { return props.name || radioId.value; }); const aliasProps = computed(() => ({ ...radioDefaultProps, ...props.props })); const getOptionProps = (option) => { const { label, value, disabled } = aliasProps.value; const base = { label: option[label], value: option[value], disabled: option[disabled] }; return { ...omit(option, [ label, value, disabled ]), ...base }; }; const optionComponent = computed(() => props.type === "button" ? radio_button_default : radio_default); provide(radioGroupKey, reactive({ ...toRefs(props), changeEvent, name })); watch(() => props.modelValue, (newVal, oldValue) => { if (props.validateEvent && !isEqual$1(newVal, oldValue)) formItem?.validate("change").catch(NOOP); }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { id: unref(groupId), ref_key: "radioGroupRef", ref: radioGroupRef, class: normalizeClass(unref(ns).b("group")), role: "radiogroup", "aria-label": !unref(isLabeledByFormItem) ? __props.ariaLabel || "radio-group" : void 0, "aria-labelledby": unref(isLabeledByFormItem) ? unref(formItem).labelId : void 0 }, [renderSlot(_ctx.$slots, "default", {}, () => [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.options, (item, index) => { return openBlock(), createBlock(resolveDynamicComponent(optionComponent.value), mergeProps({ key: index }, { ref_for: true }, getOptionProps(item)), null, 16); }), 128))])], 10, _hoisted_1$60); }; } }); //#endregion //#region ../../packages/components/radio/src/radio-group.vue var radio_group_default = radio_group_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/radio/index.ts const ElRadio = withInstall(radio_default, { RadioButton: radio_button_default, RadioGroup: radio_group_default }); const ElRadioGroup = withNoopInstall(radio_group_default); const ElRadioButton = withNoopInstall(radio_button_default); //#endregion //#region ../../packages/components/cascader-panel/src/types.ts const CASCADER_PANEL_INJECTION_KEY = Symbol(); //#endregion //#region ../../packages/components/cascader-panel/src/node-content.tsx function isVNodeEmpty(vnodes) { return !!(isArray$1(vnodes) ? vnodes.every(({ type }) => type === Comment) : vnodes?.type === Comment); } var node_content_default = /* @__PURE__ */ defineComponent({ name: "NodeContent", props: { node: { type: Object, required: true } }, setup(props) { const ns = useNamespace("cascader-node"); const { renderLabelFn } = inject(CASCADER_PANEL_INJECTION_KEY); const { node } = props; const { data, label: nodeLabel } = node; const label = () => { const renderLabel = renderLabelFn?.({ node, data }); return isVNodeEmpty(renderLabel) ? nodeLabel : renderLabel ?? nodeLabel; }; return () => createVNode("span", { "class": ns.e("label") }, [label()]); } }); //#endregion //#region ../../packages/components/cascader-panel/src/node.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$59 = [ "id", "aria-haspopup", "aria-owns", "aria-expanded", "tabindex" ]; var node_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElCascaderNode", __name: "node", props: { node: { type: Object, required: true }, menuId: { type: String, required: false } }, emits: ["expand"], setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const panel = inject(CASCADER_PANEL_INJECTION_KEY); const ns = useNamespace("cascader-node"); const isHoverMenu = computed(() => panel.isHoverMenu); const multiple = computed(() => panel.config.multiple); const checkStrictly = computed(() => panel.config.checkStrictly); const showPrefix = computed(() => panel.config.showPrefix); const checkedNodeId = computed(() => panel.checkedNodes[0]?.uid); const isDisabled = computed(() => props.node.isDisabled); const isLeaf = computed(() => props.node.isLeaf); const expandable = computed(() => checkStrictly.value && !isLeaf.value || !isDisabled.value); const inExpandingPath = computed(() => isInPath(panel.expandingNode)); const inCheckedPath = computed(() => checkStrictly.value && panel.checkedNodes.some(isInPath)); const isInPath = (node) => { const { level, uid } = props.node; return node?.pathNodes[level - 1]?.uid === uid; }; const doExpand = () => { if (inExpandingPath.value) return; panel.expandNode(props.node); }; const doCheck = (checked) => { const { node } = props; if (checked === node.checked) return; panel.handleCheckChange(node, checked); }; const doLoad = () => { panel.lazyLoad(props.node, () => { if (!isLeaf.value) doExpand(); }); }; const handleHoverExpand = (e) => { if (!isHoverMenu.value) return; handleExpand(); !isLeaf.value && emit("expand", e); }; const handleExpand = () => { const { node } = props; if (!expandable.value || node.loading) return; node.loaded ? doExpand() : doLoad(); }; const handleClick = () => { if (isLeaf.value && !isDisabled.value && !checkStrictly.value && !multiple.value) handleCheck(true); else if ((panel.config.checkOnClickNode && (multiple.value || checkStrictly.value) || isLeaf.value && panel.config.checkOnClickLeaf) && !isDisabled.value) handleSelectCheck(!props.node.checked); else if (!isHoverMenu.value) handleExpand(); }; const handleSelectCheck = (checked) => { if (checkStrictly.value) { doCheck(checked); if (props.node.loaded) doExpand(); } else handleCheck(checked); }; const handleCheck = (checked) => { if (!props.node.loaded) doLoad(); else { doCheck(checked); !checkStrictly.value && doExpand(); } }; return (_ctx, _cache) => { return openBlock(), createElementBlock("li", { id: `${__props.menuId}-${__props.node.uid}`, role: "menuitem", "aria-haspopup": !isLeaf.value, "aria-owns": isLeaf.value ? void 0 : __props.menuId, "aria-expanded": inExpandingPath.value, tabindex: expandable.value ? -1 : void 0, class: normalizeClass([ unref(ns).b(), unref(ns).is("selectable", checkStrictly.value), unref(ns).is("active", __props.node.checked), unref(ns).is("disabled", !expandable.value), inExpandingPath.value && "in-active-path", inCheckedPath.value && "in-checked-path" ]), onMouseenter: handleHoverExpand, onFocus: handleHoverExpand, onClick: handleClick }, [ createCommentVNode(" prefix "), multiple.value && showPrefix.value ? (openBlock(), createBlock(unref(ElCheckbox), { key: 0, "model-value": __props.node.checked, indeterminate: __props.node.indeterminate, disabled: isDisabled.value, onClick: _cache[0] || (_cache[0] = withModifiers(() => {}, ["stop"])), "onUpdate:modelValue": handleSelectCheck }, null, 8, [ "model-value", "indeterminate", "disabled" ])) : checkStrictly.value && showPrefix.value ? (openBlock(), createBlock(unref(ElRadio), { key: 1, "model-value": checkedNodeId.value, label: __props.node.uid, disabled: isDisabled.value, "onUpdate:modelValue": handleSelectCheck, onClick: _cache[1] || (_cache[1] = withModifiers(() => {}, ["stop"])) }, { default: withCtx(() => [createCommentVNode("\n Add an empty element to avoid render label,\n do not use empty fragment here for https://github.com/vuejs/vue-next/pull/2485\n "), _cache[2] || (_cache[2] = createElementVNode("span", null, null, -1))]), _: 1 }, 8, [ "model-value", "label", "disabled" ])) : isLeaf.value && __props.node.checked ? (openBlock(), createBlock(unref(ElIcon), { key: 2, class: normalizeClass(unref(ns).e("prefix")) }, { default: withCtx(() => [createVNode(unref(check_default))]), _: 1 }, 8, ["class"])) : createCommentVNode("v-if", true), createCommentVNode(" content "), createVNode(unref(node_content_default), { node: __props.node }, null, 8, ["node"]), createCommentVNode(" postfix "), !isLeaf.value ? (openBlock(), createElementBlock(Fragment, { key: 3 }, [__props.node.loading ? (openBlock(), createBlock(unref(ElIcon), { key: 0, class: normalizeClass([unref(ns).is("loading"), unref(ns).e("postfix")]) }, { default: withCtx(() => [createVNode(unref(loading_default))]), _: 1 }, 8, ["class"])) : (openBlock(), createBlock(unref(ElIcon), { key: 1, class: normalizeClass(["arrow-right", unref(ns).e("postfix")]) }, { default: withCtx(() => [createVNode(unref(arrow_right_default))]), _: 1 }, 8, ["class"]))], 64)) : createCommentVNode("v-if", true) ], 42, _hoisted_1$59); }; } }); //#endregion //#region ../../packages/components/cascader-panel/src/node.vue var node_default = node_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/cascader-panel/src/menu.vue?vue&type=script&setup=true&lang.ts var menu_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElCascaderMenu", __name: "menu", props: { nodes: { type: Array, required: true }, index: { type: Number, required: true }, virtualScroll: { type: Boolean, required: false, default: false }, itemSize: { type: Number, required: false, default: 34 }, height: { type: Number, required: false, default: 204 } }, setup(__props, { expose: __expose }) { const props = __props; const instance = getCurrentInstance(); const ns = useNamespace("cascader-menu"); const { t } = useLocale(); const id = useId(); let activeNode; let hoverTimer; const panel = inject(CASCADER_PANEL_INJECTION_KEY); const hoverZone = ref(); const virtualListRef = ref(); const isEmpty = computed(() => !props.nodes.length); const isLoading = computed(() => !panel.initialLoaded); const menuId = computed(() => `${id.value}-${props.index}`); const getActiveNodeIndex = () => { let activeNodeId; if (panel.expandingNode) { const { level, pathNodes } = panel.expandingNode; if (props.index < level) activeNodeId = pathNodes[props.index]?.uid; else if (props.index === level && panel.checkedNodes.length > 0) activeNodeId = panel.checkedNodes[0]?.pathNodes[props.index]?.uid; } else if (panel.checkedNodes.length > 0 && props.index < panel.checkedNodes[0].pathNodes.length) activeNodeId = panel.checkedNodes[0].pathNodes[props.index]?.uid; return activeNodeId !== void 0 ? props.nodes.findIndex((node) => node.uid === activeNodeId) : -1; }; const getNodeIndexById = (nodeId) => { if (!nodeId) return -1; return props.nodes.findIndex((node) => `${menuId.value}-${node.uid}` === nodeId); }; const scrollToItem = (index) => { const targetIndex = clamp$1(index, 0, props.nodes.length - 1); virtualListRef.value?.scrollToItem(targetIndex); }; const focusNodeAt = (index) => { if (!props.nodes.length) return; const targetIndex = clamp$1(index, 0, props.nodes.length - 1); scrollToItem(targetIndex); nextTick(() => { const node = instance.vnode.el?.querySelector(`#${menuId.value}-${props.nodes[targetIndex].uid}`); if (node) focusNode(node); }); }; const handleExpand = (e) => { activeNode = e.target; }; const handleMouseMove = (e) => { if (!panel.isHoverMenu || !activeNode || !hoverZone.value) return; if (activeNode.contains(e.target)) { clearHoverTimer(); const el = instance.vnode.el; const { left } = el.getBoundingClientRect(); const { offsetWidth, offsetHeight } = el; const startX = e.clientX - left; const top = activeNode.offsetTop; const bottom = top + activeNode.offsetHeight; const scrollTop = props.virtualScroll ? virtualListRef.value?.states?.scrollOffset || 0 : el.querySelector(`.${ns.e("wrap")}`)?.scrollTop || 0; hoverZone.value.innerHTML = ` `; } else if (!hoverTimer) hoverTimer = window.setTimeout(clearHoverZone, panel.config.hoverThreshold); }; const clearHoverTimer = () => { if (!hoverTimer) return; clearTimeout(hoverTimer); hoverTimer = void 0; }; const clearHoverZone = () => { if (!hoverZone.value) return; hoverZone.value.innerHTML = ""; clearHoverTimer(); }; __expose({ getActiveNodeIndex, getNodeIndexById, scrollToItem, focusNodeAt, virtualListRef, get $el() { return instance.vnode.el; } }); return (_ctx, _cache) => { return __props.virtualScroll ? (openBlock(), createElementBlock("div", { key: menuId.value, class: normalizeClass(unref(ns).b()), onMousemove: handleMouseMove, onMouseleave: clearHoverZone }, [ createVNode(unref(FixedSizeList), { ref_key: "virtualListRef", ref: virtualListRef, height: __props.height, "item-size": __props.itemSize, data: __props.nodes, total: __props.nodes.length, "class-name": unref(ns).e("list"), "inner-element": "ul", "inner-props": { role: "menu", class: unref(ns).is("empty", isEmpty.value) } }, { default: withCtx(({ data, index: nodeIndex, style }) => [(openBlock(), createBlock(node_default, { key: data[nodeIndex].uid, node: data[nodeIndex], "menu-id": menuId.value, style: normalizeStyle(style), onExpand: handleExpand }, null, 8, [ "node", "menu-id", "style" ]))]), _: 1 }, 8, [ "height", "item-size", "data", "total", "class-name", "inner-props" ]), isLoading.value ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ns).e("empty-text")) }, [createVNode(unref(ElIcon), { size: 14, class: normalizeClass(unref(ns).is("loading")) }, { default: withCtx(() => [createVNode(unref(loading_default))]), _: 1 }, 8, ["class"]), createTextVNode(" " + toDisplayString(unref(t)("el.cascader.loading")), 1)], 2)) : isEmpty.value ? (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass(unref(ns).e("empty-text")) }, [renderSlot(_ctx.$slots, "empty", {}, () => [createTextVNode(toDisplayString(unref(t)("el.cascader.noData")), 1)])], 2)) : unref(panel)?.isHoverMenu ? (openBlock(), createElementBlock(Fragment, { key: 2 }, [createCommentVNode(" eslint-disable vue/html-self-closing "), (openBlock(), createElementBlock("svg", { ref_key: "hoverZone", ref: hoverZone, class: normalizeClass(unref(ns).e("hover-zone")) }, null, 2))], 2112)) : createCommentVNode("v-if", true), createCommentVNode(" eslint-enable vue/html-self-closing ") ], 34)) : (openBlock(), createBlock(unref(ElScrollbar), { key: menuId.value, tag: "ul", role: "menu", class: normalizeClass(unref(ns).b()), "wrap-class": unref(ns).e("wrap"), "view-class": [unref(ns).e("list"), unref(ns).is("empty", isEmpty.value)], onMousemove: handleMouseMove, onMouseleave: clearHoverZone }, { default: withCtx(() => [ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.nodes, (node) => { return openBlock(), createBlock(node_default, { key: node.uid, node, "menu-id": menuId.value, onExpand: handleExpand }, null, 8, ["node", "menu-id"]); }), 128)), isLoading.value ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ns).e("empty-text")) }, [createVNode(unref(ElIcon), { size: 14, class: normalizeClass(unref(ns).is("loading")) }, { default: withCtx(() => [createVNode(unref(loading_default))]), _: 1 }, 8, ["class"]), createTextVNode(" " + toDisplayString(unref(t)("el.cascader.loading")), 1)], 2)) : isEmpty.value ? (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass(unref(ns).e("empty-text")) }, [renderSlot(_ctx.$slots, "empty", {}, () => [createTextVNode(toDisplayString(unref(t)("el.cascader.noData")), 1)])], 2)) : unref(panel)?.isHoverMenu ? (openBlock(), createElementBlock(Fragment, { key: 2 }, [createCommentVNode(" eslint-disable vue/html-self-closing "), (openBlock(), createElementBlock("svg", { ref_key: "hoverZone", ref: hoverZone, class: normalizeClass(unref(ns).e("hover-zone")) }, null, 2))], 2112)) : createCommentVNode("v-if", true), createCommentVNode(" eslint-enable vue/html-self-closing ") ]), _: 3 }, 8, [ "class", "wrap-class", "view-class" ])); }; } }); //#endregion //#region ../../packages/components/cascader-panel/src/menu.vue var menu_default$1 = menu_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/cascader-panel/src/node.ts let uid = 0; const calculatePathNodes = (node) => { const nodes = [node]; let { parent } = node; while (parent) { nodes.unshift(parent); parent = parent.parent; } return nodes; }; var Node$2 = class Node$2 { constructor(data, config, parent, root = false) { this.data = data; this.config = config; this.parent = parent; this.root = root; this.uid = uid++; this.checked = false; this.indeterminate = false; this.loading = false; const { value: valueKey, label: labelKey, children: childrenKey } = config; const childrenData = data[childrenKey]; const pathNodes = calculatePathNodes(this); this.level = root ? 0 : parent ? parent.level + 1 : 1; this.value = data[valueKey]; this.label = data[labelKey]; this.pathNodes = pathNodes; this.pathValues = pathNodes.map((node) => node.value); this.pathLabels = pathNodes.map((node) => node.label); this.childrenData = childrenData; this.children = (childrenData || []).map((child) => new Node$2(child, config, this)); this.loaded = !config.lazy || this.isLeaf || !isEmpty(childrenData); this.text = ""; } get isDisabled() { const { data, parent, config } = this; const { disabled, checkStrictly } = config; return (isFunction$1(disabled) ? disabled(data, this) : !!data[disabled]) || !checkStrictly && !!parent?.isDisabled; } get isLeaf() { const { data, config, childrenData, loaded } = this; const { lazy, leaf } = config; const isLeaf = isFunction$1(leaf) ? leaf(data, this) : data[leaf]; return isUndefined(isLeaf) ? lazy && !loaded ? false : !(isArray$1(childrenData) && childrenData.length) : !!isLeaf; } get valueByOption() { return this.config.emitPath ? this.pathValues : this.value; } appendChild(childData) { const { childrenData, children } = this; const node = new Node$2(childData, this.config, this); if (isArray$1(childrenData)) childrenData.push(childData); else this.childrenData = [childData]; children.push(node); return node; } calcText(allLevels, separator) { const text = allLevels ? this.pathLabels.join(separator) : this.label; this.text = text; return text; } broadcast(checked) { this.children.forEach((child) => { if (child) { child.broadcast(checked); child.onParentCheck?.(checked); } }); } emit() { const { parent } = this; if (parent) { parent.onChildCheck?.(); parent.emit(); } } onParentCheck(checked) { if (!this.isDisabled) this.setCheckState(checked); } onChildCheck() { const { children } = this; const validChildren = children.filter((child) => !child.isDisabled); const checked = validChildren.length ? validChildren.every((child) => child.checked) : false; this.setCheckState(checked); } setCheckState(checked) { const totalNum = this.children.length; const checkedNum = this.children.reduce((c, p) => { return c + (p.checked ? 1 : p.indeterminate ? .5 : 0); }, 0); this.checked = this.loaded && this.children.filter((child) => !child.isDisabled).every((child) => child.loaded && child.checked) && checked; this.indeterminate = this.loaded && checkedNum !== totalNum && checkedNum > 0; } doCheck(checked) { if (this.checked === checked) return; const { checkStrictly, multiple } = this.config; if (checkStrictly || !multiple) this.checked = checked; else { this.broadcast(checked); this.setCheckState(checked); this.emit(); } } }; //#endregion //#region ../../packages/components/cascader-panel/src/store.ts const flatNodes = (nodes, leafOnly) => { return nodes.reduce((res, node) => { if (node.isLeaf) res.push(node); else { !leafOnly && res.push(node); res = res.concat(flatNodes(node.children, leafOnly)); } return res; }, []); }; var Store = class { constructor(data, config) { this.config = config; const nodes = (data || []).map((nodeData) => new Node$2(nodeData, this.config)); this.nodes = nodes; this.allNodes = flatNodes(nodes, false); this.leafNodes = flatNodes(nodes, true); } getNodes() { return this.nodes; } getFlattedNodes(leafOnly) { return leafOnly ? this.leafNodes : this.allNodes; } appendNode(nodeData, parentNode) { const node = parentNode ? parentNode.appendChild(nodeData) : new Node$2(nodeData, this.config); if (!parentNode) this.nodes.push(node); this.appendAllNodesAndLeafNodes(node); } appendNodes(nodeDataList, parentNode) { if (nodeDataList.length > 0) nodeDataList.forEach((nodeData) => this.appendNode(nodeData, parentNode)); else parentNode && parentNode.isLeaf && this.leafNodes.push(parentNode); } appendAllNodesAndLeafNodes(node) { this.allNodes.push(node); node.isLeaf && this.leafNodes.push(node); if (node.children) node.children.forEach((subNode) => { this.appendAllNodesAndLeafNodes(subNode); }); } getNodeByValue(value, leafOnly = false) { if (isPropAbsent(value)) return null; return this.getFlattedNodes(leafOnly).find((node) => isEqual$1(node.value, value) || isEqual$1(node.pathValues, value)) || null; } getSameNode(node) { if (!node) return null; return this.getFlattedNodes(false).find(({ value, level }) => isEqual$1(node.value, value) && node.level === level) || null; } }; //#endregion //#region ../../packages/components/cascader-panel/src/utils.ts const getMenuIndex = (el) => { if (!el) return 0; const pieces = el.id.split("-"); return Number(pieces[pieces.length - 2]); }; const checkNode = (el) => { if (!el) return; const input = el.querySelector("input"); if (input) input.click(); else if (isLeaf(el)) el.click(); }; const sortByOriginalOrder = (oldNodes, newNodes) => { const newNodesCopy = newNodes.slice(0); const newIds = newNodesCopy.map((node) => node.uid); const res = oldNodes.reduce((acc, item) => { const index = newIds.indexOf(item.uid); if (index > -1) { acc.push(item); newNodesCopy.splice(index, 1); newIds.splice(index, 1); } return acc; }, []); res.push(...newNodesCopy); return res; }; //#endregion //#region ../../packages/components/cascader-panel/src/index.vue?vue&type=script&setup=true&lang.ts var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElCascaderPanel", __name: "index", props: cascaderPanelProps, emits: cascaderPanelEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; let manualChecked = false; const ns = useNamespace("cascader"); const config = useCascaderConfig(props); const slots = useSlots(); let store; const initialLoaded = ref(true); const initialLoadedOnce = ref(false); const menuList = ref([]); const checkedValue = ref(); const menus = ref([]); const expandingNode = ref(); const checkedNodes = ref([]); const isHoverMenu = computed(() => config.value.expandTrigger === "hover"); const renderLabelFn = computed(() => props.renderLabel || slots.default); const virtualScroll = computed(() => props.virtualScroll); const itemSize = computed(() => props.itemSize); const height = computed(() => props.height); const initStore = () => { const { options } = props; const cfg = config.value; manualChecked = false; store = new Store(options, cfg); menus.value = [store.getNodes()]; if (cfg.lazy && isEmpty(props.options)) { initialLoaded.value = false; lazyLoad(void 0, (list) => { if (list) { store = new Store(list, cfg); menus.value = [store.getNodes()]; } initialLoaded.value = true; syncCheckedValue(false, true); }); } else syncCheckedValue(false, true); }; const lazyLoad = (node, cb) => { const cfg = config.value; node = node || new Node$2({}, cfg, void 0, true); node.loading = true; const resolve = (dataList) => { const _node = node; const parent = _node.root ? null : _node; _node.loading = false; _node.loaded = true; _node.childrenData = _node.childrenData || []; dataList && store?.appendNodes(dataList, parent); dataList && cb?.(dataList); if (node.level === 0) initialLoadedOnce.value = true; }; const reject = () => { node.loading = false; node.loaded = false; if (node.level === 0) initialLoaded.value = true; }; cfg.lazyLoad(node, resolve, reject); }; const expandNode = (node, silent) => { const { level } = node; const newMenus = menus.value.slice(0, level); let newExpandingNode; if (node.isLeaf) newExpandingNode = node.pathNodes[level - 2]; else { newExpandingNode = node; newMenus.push(node.children); } if (expandingNode.value?.uid !== newExpandingNode?.uid) { expandingNode.value = node; menus.value = newMenus; !silent && emit("expand-change", node?.pathValues || []); } }; const handleCheckChange = (node, checked, emitClose = true) => { const { checkStrictly, multiple } = config.value; const oldNode = checkedNodes.value[0]; manualChecked = true; !multiple && oldNode?.doCheck(false); node.doCheck(checked); calculateCheckedValue(); emitClose && !multiple && !checkStrictly && emit("close"); !emitClose && !multiple && expandParentNode(node); }; const expandParentNode = (node) => { if (!node) return; node = node.parent; expandParentNode(node); node && expandNode(node); }; const getFlattedNodes = (leafOnly) => store?.getFlattedNodes(leafOnly); const getCheckedNodes = (leafOnly) => { return getFlattedNodes(leafOnly)?.filter(({ checked }) => checked !== false); }; const clearCheckedNodes = () => { checkedNodes.value.forEach((node) => node.doCheck(false)); calculateCheckedValue(); menus.value = menus.value.slice(0, 1); expandingNode.value = void 0; emit("expand-change", []); }; const calculateCheckedValue = () => { const { checkStrictly, multiple } = config.value; const oldNodes = checkedNodes.value; const nodes = sortByOriginalOrder(oldNodes, getCheckedNodes(!checkStrictly)); const values = nodes.map((node) => node.valueByOption); checkedNodes.value = nodes; checkedValue.value = multiple ? values : values[0] ?? null; }; const syncCheckedValue = (loaded = false, forced = false) => { const { modelValue } = props; const { lazy, multiple, checkStrictly } = config.value; const leafOnly = !checkStrictly; if (!initialLoaded.value || manualChecked || !forced && isEqual$1(modelValue, checkedValue.value)) return; if (lazy && !loaded) { const nodes = unique(flattenDeep(castArray(modelValue))).map((val) => store?.getNodeByValue(val)).filter((node) => !!node && !node.loaded && !node.loading); if (nodes.length) nodes.forEach((node) => { lazyLoad(node, () => syncCheckedValue(false, forced)); }); else syncCheckedValue(true, forced); } else { syncMenuState(unique((multiple ? castArray(modelValue) : [modelValue]).map((val) => store?.getNodeByValue(val, leafOnly))), forced); checkedValue.value = cloneDeep(modelValue ?? void 0); } }; const syncMenuState = (newCheckedNodes, reserveExpandingState = true) => { const { checkStrictly } = config.value; const oldNodes = checkedNodes.value; const newNodes = newCheckedNodes.filter((node) => !!node && (checkStrictly || node.isLeaf)); const oldExpandingNode = store?.getSameNode(expandingNode.value); const newExpandingNode = reserveExpandingState && oldExpandingNode || newNodes[0]; if (newExpandingNode) newExpandingNode.pathNodes.forEach((node) => expandNode(node, true)); else expandingNode.value = void 0; oldNodes.forEach((node) => node.doCheck(false)); reactive(newNodes).forEach((node) => node.doCheck(true)); checkedNodes.value = newNodes; nextTick(scrollToExpandingNode); }; const scrollToExpandingNode = () => { if (!isClient) return; menuList.value.forEach((menu) => { const menuElement = menu?.$el; if (menuElement) if (virtualScroll.value) { const activeIndex = menu?.getActiveNodeIndex?.(); if (activeIndex !== void 0 && activeIndex >= 0) menu?.scrollToItem?.(activeIndex); } else { const container = menuElement.querySelector(`.${ns.namespace.value}-scrollbar__wrap`); let activeNode = menuElement.querySelector(`.${ns.b("node")}.in-active-path`); if (!activeNode) { const activeElements = menuElement.querySelectorAll(`.${ns.b("node")}.${ns.is("active")}`); activeNode = activeElements[activeElements.length - 1]; } scrollIntoView(container, activeNode); } }); }; const handleKeyDown = (e) => { const target = e.target; const code = getEventCode(e); switch (code) { case EVENT_CODE.up: case EVENT_CODE.down: { e.preventDefault(); const distance = code === EVENT_CODE.up ? -1 : 1; if (virtualScroll.value) { const menuIndex = getMenuIndex(target); const menu = menuList.value[menuIndex]; if (menu) { const currentIndex = menu.getNodeIndexById(target.id); if (currentIndex >= 0) { const nodesInMenu = menus.value[menuIndex] ?? []; const nodesCount = nodesInMenu.length; let targetIndex = currentIndex + distance; while (targetIndex >= 0 && targetIndex < nodesCount) { if (!nodesInMenu[targetIndex].isDisabled) { menu.focusNodeAt(targetIndex); return; } targetIndex += distance; } } } } focusNode(getSibling(target, distance, `.${ns.b("node")}[tabindex="-1"]`)); break; } case EVENT_CODE.left: { e.preventDefault(); const expandedNode = menuList.value[getMenuIndex(target) - 1]?.$el.querySelector(`.${ns.b("node")}[aria-expanded="true"]`); focusNode(expandedNode); break; } case EVENT_CODE.right: { e.preventDefault(); const firstNode = menuList.value[getMenuIndex(target) + 1]?.$el.querySelector(`.${ns.b("node")}[tabindex="-1"]`); focusNode(firstNode); break; } case EVENT_CODE.enter: case EVENT_CODE.numpadEnter: checkNode(target); break; } }; provide(CASCADER_PANEL_INJECTION_KEY, reactive({ config, expandingNode, checkedNodes, isHoverMenu, initialLoaded, renderLabelFn, virtualScroll, itemSize, height, lazyLoad, expandNode, handleCheckChange })); watch(config, (newVal, oldVal) => { if (isEqual$1(newVal, oldVal)) return; initStore(); }, { immediate: true }); watch(() => props.options, initStore, { deep: true }); watch(() => props.modelValue, () => { manualChecked = false; syncCheckedValue(); }, { deep: true }); watch(() => checkedValue.value, (val) => { if (!isEqual$1(val, props.modelValue)) { emit(UPDATE_MODEL_EVENT, val); emit(CHANGE_EVENT, val); } }); const loadLazyRootNodes = () => { if (initialLoadedOnce.value) return; initStore(); }; onBeforeUpdate(() => menuList.value = []); onMounted(() => !isEmpty(props.modelValue) && syncCheckedValue()); __expose({ menuList, menus, checkedNodes, handleKeyDown, handleCheckChange, getFlattedNodes, /** * @description get an array of currently selected node,(leafOnly) whether only return the leaf checked nodes, default is `false` */ getCheckedNodes, /** * @description clear checked nodes */ clearCheckedNodes, calculateCheckedValue, scrollToExpandingNode, loadLazyRootNodes }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass([unref(ns).b("panel"), unref(ns).is("bordered", __props.border)]), onKeydown: handleKeyDown }, [(openBlock(true), createElementBlock(Fragment, null, renderList(menus.value, (menu, index) => { return openBlock(), createBlock(menu_default$1, { key: index, ref_for: true, ref: (item) => menuList.value[index] = item, index, nodes: [...menu], "virtual-scroll": virtualScroll.value, "item-size": itemSize.value, height: height.value }, { empty: withCtx(() => [renderSlot(_ctx.$slots, "empty")]), _: 3 }, 8, [ "index", "nodes", "virtual-scroll", "item-size", "height" ]); }), 128))], 34); }; } }); //#endregion //#region ../../packages/components/cascader-panel/src/index.vue var src_default$1 = index_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/cascader-panel/index.ts const ElCascaderPanel = withInstall(src_default$1); //#endregion //#region ../../packages/components/cascader/src/cascader.ts /** * @deprecated Removed after 3.0.0, Use `CascaderComponentProps` instead. */ const cascaderProps = buildProps({ ...CommonProps, /** * @description size of input */ size: useSizeProp, /** * @description placeholder of input */ placeholder: String, /** * @description whether Cascader is disabled */ disabled: { type: Boolean, default: void 0 }, /** * @description whether selected value can be cleared */ clearable: Boolean, /** * @description custom clear icon component */ clearIcon: { type: iconPropType, default: circle_close_default }, /** * @description whether the options can be searched */ filterable: Boolean, /** * @description customize search logic, the first parameter is `node`, the second is `keyword`, and need return a boolean value indicating whether it hits. */ filterMethod: { type: definePropType(Function), default: (node, keyword) => node.text.includes(keyword) }, /** * @description option label separator */ separator: { type: String, default: " / " }, /** * @description whether to display all levels of the selected value in the input */ showAllLevels: { type: Boolean, default: true }, /** * @description whether to collapse tags in multiple selection mode */ collapseTags: Boolean, /** * @description The max tags number to be shown. To use this, collapse-tags must be true */ maxCollapseTags: { type: Number, default: 1 }, /** * @description whether show all selected tags when mouse hover text of collapse-tags. To use this, collapse-tags must be true */ collapseTagsTooltip: Boolean, /** * @description The max height of collapse tags tooltip, in pixels. To use this, collapse-tags-tooltip must be true */ maxCollapseTagsTooltipHeight: { type: [String, Number] }, /** * @description debounce delay when typing filter keyword, in milliseconds */ debounce: { type: Number, default: 300 }, /** * @description hook function before filtering with the value to be filtered as its parameter. If `false` is returned or a `Promise` is returned and then is rejected, filtering will be aborted */ beforeFilter: { type: definePropType(Function), default: () => true }, /** * @description position of dropdown */ placement: { type: definePropType(String), values: Ee, default: "bottom-start" }, /** * @description list of possible positions for dropdown */ fallbackPlacements: { type: definePropType(Array), default: [ "bottom-start", "bottom", "top-start", "top", "right", "left" ] }, /** * @description custom class name for Cascader's dropdown */ popperClass: useTooltipContentProps.popperClass, /** * @description custom style for Cascader's dropdown */ popperStyle: useTooltipContentProps.popperStyle, /** * @description whether cascader popup is teleported */ teleported: useTooltipContentProps.teleported, /** * @description tooltip theme, built-in theme: `dark` / `light` */ effect: { type: definePropType(String), default: "light" }, /** * @description tag type */ tagType: { ...tagProps.type, default: "info" }, /** * @description tag effect */ tagEffect: { ...tagProps.effect, default: "light" }, /** * @description whether to trigger form validation */ validateEvent: { type: Boolean, default: true }, /** * @description when dropdown is inactive and `persistent` is `false`, dropdown will be destroyed */ persistent: { type: Boolean, default: true }, /** * @description Use `parent` when you want things tidy (like "Entire Collection" instead of listing 100 items) * Use `child` when every single item matters (like important settings) */ showCheckedStrategy: { type: String, values: ["parent", "child"], default: "child" }, /** * @description whether to check or uncheck node when clicking on the node */ checkOnClickNode: Boolean, /** * @description whether to show the radio or checkbox prefix */ showPrefix: { type: Boolean, default: true }, /** * @description whether the width of the suggestion panel is the same as the input, if the value is `number`, then the width is fixed */ fitInputWidth: { type: [Boolean, Number], default: false }, ...useEmptyValuesProps }); const emitChangeFn$1 = (value) => true; const cascaderEmits = { [UPDATE_MODEL_EVENT]: emitChangeFn$1, [CHANGE_EVENT]: emitChangeFn$1, focus: (evt) => evt instanceof FocusEvent, blur: (evt) => evt instanceof FocusEvent, clear: () => true, visibleChange: (val) => isBoolean(val), expandChange: (val) => !!val, removeTag: (val) => !!val }; //#endregion //#region ../../packages/components/cascader/src/cascader.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$58 = ["placeholder"]; const _hoisted_2$35 = ["onClick"]; const _hoisted_3$16 = [ "id", "data-suggestion-index", "onClick" ]; const SUGGESTION_ITEM_EXTRA_WIDTH = 34; var cascader_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElCascader", __name: "cascader", props: cascaderProps, emits: cascaderEmits, setup(__props, { expose: __expose, emit: __emit }) { const popperOptions = { modifiers: [{ name: "arrowPosition", enabled: true, phase: "main", fn: ({ state }) => { const { modifiersData, placement } = state; if ([ "right", "left", "bottom", "top" ].includes(placement)) return; if (modifiersData.arrow) modifiersData.arrow.x = 35; }, requires: ["arrow"] }] }; const props = __props; const emit = __emit; const attrs = useAttrs$1(); const slots = useSlots(); let inputInitialHeight = 0; let pressDeleteCount = 0; const nsCascader = useNamespace("cascader"); const nsInput = useNamespace("input"); const sizeMapPadding = { small: 7, default: 11, large: 15 }; const { t } = useLocale(); const { formItem } = useFormItem(); const isDisabled = useFormDisabled(); const { valueOnClear } = useEmptyValues(props); const { isComposing, handleComposition } = useComposition({ afterComposition(event) { const text = event.target?.value; handleInput(text); } }); const tooltipRef = ref(); const tagTooltipRef = ref(); const inputRef = ref(); const tagWrapper = ref(); const cascaderPanelRef = ref(); const suggestionPanel = ref(); const suggestionVirtualListRef = ref(); const popperVisible = ref(false); const inputHover = ref(false); const filtering = ref(false); const inputValue = ref(""); const searchInputValue = ref(""); const tags = ref([]); const suggestions = ref([]); const suggestionListWidth = ref("100%"); const hasCustomSuggestionItemSlot = computed(() => !!slots["suggestion-item"]); const clampedSuggestionListHeight = computed(() => clamp$1(suggestions.value.length * props.itemSize, props.itemSize, props.height)); const showTagList = computed(() => { if (!props.props.multiple) return []; return props.collapseTags ? tags.value.slice(0, props.maxCollapseTags) : tags.value; }); const collapseTagList = computed(() => { if (!props.props.multiple) return []; return props.collapseTags ? tags.value.slice(props.maxCollapseTags) : []; }); const cascaderStyle = computed(() => { return attrs.style; }); const inputPlaceholder = computed(() => props.placeholder ?? t("el.cascader.placeholder")); const currentPlaceholder = computed(() => searchInputValue.value || tags.value.length > 0 || isComposing.value ? "" : inputPlaceholder.value); const realSize = useFormSize(); const tagSize = computed(() => realSize.value === "small" ? "small" : "default"); const multiple = computed(() => !!props.props.multiple); const readonly = computed(() => !props.filterable || multiple.value); const searchKeyword = computed(() => multiple.value ? searchInputValue.value : inputValue.value); const checkedNodes = computed(() => cascaderPanelRef.value?.checkedNodes || []); const { wrapperRef, isFocused, handleBlur } = useFocusController(inputRef, { disabled: isDisabled, beforeBlur(event) { return tooltipRef.value?.isFocusInsideContent(event) || tagTooltipRef.value?.isFocusInsideContent(event); }, afterBlur() { if (props.validateEvent) formItem?.validate?.("blur").catch(NOOP); } }); const clearBtnVisible = computed(() => { if (!props.clearable || isDisabled.value || filtering.value || !inputHover.value && !isFocused.value) return false; return !!checkedNodes.value.length; }); const presentText = computed(() => { const { showAllLevels, separator } = props; const nodes = checkedNodes.value; return nodes.length ? multiple.value ? "" : nodes[0].calcText(showAllLevels, separator) : ""; }); const validateState = computed(() => formItem?.validateState || ""); const checkedValue = computed({ get() { return cloneDeep(props.modelValue); }, set(val) { const value = val ?? valueOnClear.value; emit(UPDATE_MODEL_EVENT, value); emit(CHANGE_EVENT, value); if (props.validateEvent) formItem?.validate("change").catch(NOOP); } }); const cascaderKls = computed(() => { return [ nsCascader.b(), nsCascader.m(realSize.value), nsCascader.is("disabled", isDisabled.value), attrs.class ]; }); const cascaderIconKls = computed(() => { return [ nsInput.e("icon"), "icon-arrow-down", nsCascader.is("reverse", popperVisible.value) ]; }); const inputClass = computed(() => nsCascader.is("focus", isFocused.value)); const contentRef = computed(() => { return tooltipRef.value?.popperRef?.contentRef; }); const handleClickOutside = (event) => { if (isFocused.value) handleBlur(new FocusEvent("blur", event)); togglePopperVisible(false); }; const togglePopperVisible = (visible) => { if (isDisabled.value) return; visible = visible ?? !popperVisible.value; if (visible !== popperVisible.value) { popperVisible.value = visible; inputRef.value?.input?.setAttribute("aria-expanded", `${visible}`); if (visible) { updatePopperPosition(); cascaderPanelRef.value && nextTick(cascaderPanelRef.value.scrollToExpandingNode); } else if (props.filterable) syncPresentTextValue(); emit("visibleChange", visible); } }; const updatePopperPosition = () => { nextTick(() => { tooltipRef.value?.updatePopper(); }); }; const hideSuggestionPanel = () => { filtering.value = false; }; const genTag = (node) => { const { showAllLevels, separator } = props; return { node, key: node.uid, text: node.calcText(showAllLevels, separator), hitState: false, closable: !isDisabled.value && !node.isDisabled }; }; const deleteTag = (tag) => { const node = tag.node; node.doCheck(false); cascaderPanelRef.value?.calculateCheckedValue(); emit("removeTag", node.valueByOption); }; const getStrategyCheckedNodes = () => { switch (props.showCheckedStrategy) { case "child": return checkedNodes.value; case "parent": { const clickedNodes = getCheckedNodes(false); const clickedNodesValue = clickedNodes.map((o) => o.value); return clickedNodes.filter((o) => !o.parent || !clickedNodesValue.includes(o.parent.value)); } default: return []; } }; const calculatePresentTags = () => { if (!multiple.value) return; const nodes = getStrategyCheckedNodes(); const allTags = []; nodes.forEach((node) => allTags.push(genTag(node))); tags.value = allTags; }; const calculateSuggestions = () => { const { filterMethod, showAllLevels, separator } = props; const res = cascaderPanelRef.value?.getFlattedNodes(!props.props.checkStrictly)?.filter((node) => { if (node.isDisabled) return false; node.calcText(showAllLevels, separator); return filterMethod(node, searchKeyword.value); }); if (multiple.value) tags.value.forEach((tag) => { tag.hitState = false; }); filtering.value = true; suggestions.value = res; nextTick(() => { if (props.virtualScroll && suggestions.value.length > 0) suggestionVirtualListRef.value?.scrollToItem(0); updateStyle(); }); updatePopperPosition(); }; const getSuggestionPanelEl = (selector) => { const el = suggestionPanel.value; return selector ? el?.querySelector(selector) ?? void 0 : el; }; const focusFirstNode = () => { let firstNode; if (filtering.value && suggestionPanel.value) firstNode = getSuggestionPanelEl(`.${nsCascader.e("suggestion-item")}`); else firstNode = cascaderPanelRef.value?.$el.querySelector(`.${nsCascader.b("node")}[tabindex="-1"]`); if (firstNode) { firstNode.focus(); if (!filtering.value && firstNode.getAttribute("aria-haspopup") === "true") firstNode.click(); } }; const updateSuggestionPanelWidth = (inputWidth) => { const suggestionPanelEl = getSuggestionPanelEl(); if (!suggestionPanelEl) return; const panelWidth = isNumber(props.fitInputWidth) ? `${props.fitInputWidth}px` : `${inputWidth}px`; const setPanelStyle = (el) => { if (props.fitInputWidth !== false) { el.style.width = panelWidth; el.style.minWidth = ""; } else { el.style.width = ""; el.style.minWidth = panelWidth; } }; setPanelStyle(suggestionPanelEl); if (props.virtualScroll) { suggestionListWidth.value = props.fitInputWidth !== false ? panelWidth : hasCustomSuggestionItemSlot.value ? `${inputWidth}px` : `${Math.max(inputWidth, calculateSuggestionMaxWidth())}px`; return; } const suggestionList = getSuggestionPanelEl(`.${nsCascader.e("suggestion-list")}`); if (suggestionList) setPanelStyle(suggestionList); }; const getTagWrapperLeft = () => { if (!slots.prefix) return 0; const prefix = inputRef.value?.$el.querySelector(`.${nsInput.e("prefix")}`); if (!prefix) return 0; const prefixWidth = prefix.getBoundingClientRect().width; if (prefixWidth <= 0) return 0; return prefixWidth + sizeMapPadding[realSize.value || "default"]; }; const updateStyle = () => { const inputInner = inputRef.value?.input; const inputWrapper = inputRef.value?.$el; if (!isClient || !inputInner || !inputWrapper) return; if (suggestionPanel.value) updateSuggestionPanelWidth(inputWrapper.getBoundingClientRect().width); const tagWrapperEl = tagWrapper.value; if (tagWrapperEl) { const height = tags.value.length > 0 ? `${Math.max(tagWrapperEl.offsetHeight, inputInitialHeight) - 2}px` : `${inputInitialHeight}px`; inputInner.style.height = height; tagWrapperEl.style.left = `${getTagWrapperLeft()}px`; updatePopperPosition(); } }; const calculateSuggestionMaxWidth = () => { if (hasCustomSuggestionItemSlot.value) return 0; if (!suggestions.value.length) return 0; const ctx = document.createElement("canvas").getContext("2d"); if (!ctx) return 0; const renderedSuggestion = getSuggestionPanelEl(`.${nsCascader.e("suggestion-item")}`); if (!renderedSuggestion || !isClient) return 0; const style = getComputedStyle(renderedSuggestion); const padding = Number.parseFloat(style.paddingLeft) + Number.parseFloat(style.paddingRight); ctx.font = `bold ${style.fontSize} ${style.fontFamily}`; let maxWidth = 0; let hasChecked = false; for (const suggestion of suggestions.value) { const text = suggestion.text || ""; const metrics = ctx.measureText(text); maxWidth = Math.max(maxWidth, metrics.width); if (suggestion.checked && !hasChecked) hasChecked = true; } return maxWidth + padding + (hasChecked ? SUGGESTION_ITEM_EXTRA_WIDTH : 0); }; const getCheckedNodes = (leafOnly) => { return cascaderPanelRef.value?.getCheckedNodes(leafOnly); }; const handleExpandChange = (value) => { updatePopperPosition(); emit("expandChange", value); }; const handleKeyDown = (e) => { if (isComposing.value) return; switch (getEventCode(e)) { case EVENT_CODE.enter: case EVENT_CODE.numpadEnter: togglePopperVisible(); break; case EVENT_CODE.down: togglePopperVisible(true); nextTick(focusFirstNode); e.preventDefault(); break; case EVENT_CODE.esc: if (popperVisible.value === true) { e.preventDefault(); e.stopPropagation(); togglePopperVisible(false); } break; case EVENT_CODE.tab: togglePopperVisible(false); break; } }; const handleClear = () => { cascaderPanelRef.value?.clearCheckedNodes(); if (!popperVisible.value && props.filterable) syncPresentTextValue(); togglePopperVisible(false); emit("clear"); }; const syncPresentTextValue = () => { const { value } = presentText; inputValue.value = value; searchInputValue.value = value; }; const handleSuggestionClick = (node) => { const { checked } = node; if (multiple.value) cascaderPanelRef.value?.handleCheckChange(node, !checked, false); else { !checked && cascaderPanelRef.value?.handleCheckChange(node, true, false); togglePopperVisible(false); } }; const getSuggestionIndexFromTarget = (target) => { const indexStr = target.closest("[data-suggestion-index]")?.dataset.suggestionIndex; if (!indexStr) return -1; const index = Number.parseInt(indexStr, 10); if (Number.isNaN(index) || index < 0 || index >= suggestions.value.length) return -1; return index; }; const handleSuggestionKeyDown = (e) => { const target = e.target; const code = getEventCode(e); switch (code) { case EVENT_CODE.up: case EVENT_CODE.down: { e.preventDefault(); const distance = code === EVENT_CODE.up ? -1 : 1; if (props.virtualScroll && suggestionVirtualListRef.value) { const currentIndex = getSuggestionIndexFromTarget(target); if (currentIndex >= 0) { const length = suggestions.value.length; const targetIndex = (currentIndex + distance + length) % length; suggestionVirtualListRef.value.scrollToItem(targetIndex); nextTick(() => { const targetItem = getSuggestionPanelEl(`#suggestion-${suggestions.value[targetIndex].uid}`); targetItem && focusNode(targetItem); }); return; } } focusNode(getSibling(target, distance, `.${nsCascader.e("suggestion-item")}[tabindex="-1"]`)); break; } case EVENT_CODE.enter: case EVENT_CODE.numpadEnter: target.click(); break; } }; const handleDelete = () => { const lastTag = tags.value[tags.value.length - 1]; pressDeleteCount = searchInputValue.value ? 0 : pressDeleteCount + 1; if (!lastTag || !pressDeleteCount || props.collapseTags && tags.value.length > 1) return; if (lastTag.hitState) deleteTag(lastTag); else lastTag.hitState = true; }; const handleFilter = useDebounceFn(() => { const { value } = searchKeyword; if (!value) return; const passed = props.beforeFilter(value); if (isPromise(passed)) passed.then(calculateSuggestions).catch(() => {}); else if (passed !== false) calculateSuggestions(); else hideSuggestionPanel(); }, computed(() => props.debounce)); const handleInput = (val, e) => { !popperVisible.value && togglePopperVisible(true); if (e?.isComposing) return; if (val) handleFilter(); else { const passed = props.beforeFilter(""); if (isPromise(passed)) passed.catch(() => {}); hideSuggestionPanel(); } }; const getInputInnerHeight = (inputInner) => Number.parseFloat(useCssVar(nsInput.cssVarName("input-height"), inputInner).value) - 2; const focus = () => { inputRef.value?.focus(); }; const blur = () => { inputRef.value?.blur(); }; watch(filtering, updatePopperPosition); watch([ checkedNodes, isDisabled, () => props.collapseTags, () => props.maxCollapseTags ], calculatePresentTags); watch(tags, () => { nextTick(() => updateStyle()); }); watch(realSize, async () => { await nextTick(); const inputInner = inputRef.value.input; inputInitialHeight = getInputInnerHeight(inputInner) || inputInitialHeight; updateStyle(); }); watch(presentText, syncPresentTextValue, { immediate: true }); watch(() => popperVisible.value, (val) => { if (val && props.props.lazy && props.props.lazyLoad) cascaderPanelRef.value?.loadLazyRootNodes(); }); onMounted(() => { const inputInner = inputRef.value.input; const inputWrapper = inputRef.value.$el; const inputInnerHeight = getInputInnerHeight(inputInner); inputInitialHeight = inputInner.offsetHeight || inputInnerHeight; useResizeObserver(inputWrapper, updateStyle); }); __expose({ /** * @description get an array of currently selected node,(leafOnly) whether only return the leaf checked nodes, default is `false` */ getCheckedNodes, /** * @description cascader panel ref */ cascaderPanelRef, /** * @description toggle the visible of popper */ togglePopperVisible, /** * @description cascader content ref */ contentRef, /** * @description selected content text */ presentText, /** @description focus the input element */ focus, /** @description blur the input element */ blur }); return (_ctx, _cache) => { return openBlock(), createBlock(unref(ElTooltip), { ref_key: "tooltipRef", ref: tooltipRef, visible: popperVisible.value, teleported: __props.teleported, "popper-class": [unref(nsCascader).e("dropdown"), __props.popperClass], "popper-style": __props.popperStyle, "popper-options": popperOptions, "fallback-placements": __props.fallbackPlacements, "stop-popper-mouse-event": false, "gpu-acceleration": false, placement: __props.placement, transition: `${unref(nsCascader).namespace.value}-zoom-in-top`, effect: __props.effect, pure: "", persistent: __props.persistent, onHide: hideSuggestionPanel }, { default: withCtx(() => [withDirectives((openBlock(), createElementBlock("div", { ref_key: "wrapperRef", ref: wrapperRef, class: normalizeClass(cascaderKls.value), style: normalizeStyle(cascaderStyle.value), onClick: _cache[8] || (_cache[8] = () => togglePopperVisible(readonly.value ? void 0 : true)), onKeydown: handleKeyDown, onMouseenter: _cache[9] || (_cache[9] = ($event) => inputHover.value = true), onMouseleave: _cache[10] || (_cache[10] = ($event) => inputHover.value = false) }, [createVNode(unref(ElInput), { ref_key: "inputRef", ref: inputRef, modelValue: inputValue.value, "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => inputValue.value = $event), placeholder: currentPlaceholder.value, readonly: readonly.value, disabled: unref(isDisabled), "validate-event": false, size: unref(realSize), class: normalizeClass(inputClass.value), tabindex: multiple.value && __props.filterable && !unref(isDisabled) ? -1 : void 0, onCompositionstart: unref(handleComposition), onCompositionupdate: unref(handleComposition), onCompositionend: unref(handleComposition), onInput: handleInput }, createSlots({ suffix: withCtx(() => [clearBtnVisible.value ? (openBlock(), createBlock(unref(ElIcon), { key: "clear", class: normalizeClass([unref(nsInput).e("icon"), "icon-circle-close"]), onClick: withModifiers(handleClear, ["stop"]) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(__props.clearIcon)))]), _: 1 }, 8, ["class"])) : (openBlock(), createBlock(unref(ElIcon), { key: "arrow-down", class: normalizeClass(cascaderIconKls.value), onClick: _cache[0] || (_cache[0] = withModifiers(($event) => togglePopperVisible(), ["stop"])) }, { default: withCtx(() => [createVNode(unref(arrow_down_default))]), _: 1 }, 8, ["class"]))]), _: 2 }, [_ctx.$slots.prefix ? { name: "prefix", fn: withCtx(() => [renderSlot(_ctx.$slots, "prefix")]), key: "0" } : void 0]), 1032, [ "modelValue", "placeholder", "readonly", "disabled", "size", "class", "tabindex", "onCompositionstart", "onCompositionupdate", "onCompositionend" ]), multiple.value ? (openBlock(), createElementBlock("div", { key: 0, ref_key: "tagWrapper", ref: tagWrapper, class: normalizeClass([unref(nsCascader).e("tags"), unref(nsCascader).is("validate", Boolean(validateState.value))]) }, [ renderSlot(_ctx.$slots, "tag", { data: tags.value, deleteTag }, () => [(openBlock(true), createElementBlock(Fragment, null, renderList(showTagList.value, (tag) => { return openBlock(), createBlock(unref(ElTag), { key: tag.key, type: __props.tagType, size: tagSize.value, effect: __props.tagEffect, hit: tag.hitState, closable: tag.closable, "disable-transitions": "", onClose: ($event) => deleteTag(tag) }, { default: withCtx(() => [createElementVNode("span", null, toDisplayString(tag.text), 1)]), _: 2 }, 1032, [ "type", "size", "effect", "hit", "closable", "onClose" ]); }), 128))]), __props.collapseTags && tags.value.length > __props.maxCollapseTags ? (openBlock(), createBlock(unref(ElTooltip), { key: 0, ref_key: "tagTooltipRef", ref: tagTooltipRef, disabled: popperVisible.value || !__props.collapseTagsTooltip, "fallback-placements": [ "bottom", "top", "right", "left" ], placement: "bottom", "popper-class": __props.popperClass, "popper-style": __props.popperStyle, effect: __props.effect, persistent: __props.persistent }, { default: withCtx(() => [createVNode(unref(ElTag), { closable: false, size: tagSize.value, type: __props.tagType, effect: __props.tagEffect, "disable-transitions": "" }, { default: withCtx(() => [createElementVNode("span", { class: normalizeClass(unref(nsCascader).e("tags-text")) }, " + " + toDisplayString(tags.value.length - __props.maxCollapseTags), 3)]), _: 1 }, 8, [ "size", "type", "effect" ])]), content: withCtx(() => [createVNode(unref(ElScrollbar), { "max-height": __props.maxCollapseTagsTooltipHeight }, { default: withCtx(() => [createElementVNode("div", { class: normalizeClass(unref(nsCascader).e("collapse-tags")) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(collapseTagList.value, (tag, idx) => { return openBlock(), createElementBlock("div", { key: idx, class: normalizeClass(unref(nsCascader).e("collapse-tag")) }, [(openBlock(), createBlock(unref(ElTag), { key: tag.key, class: "in-tooltip", type: __props.tagType, size: tagSize.value, effect: __props.tagEffect, hit: tag.hitState, closable: tag.closable, "disable-transitions": "", onClose: ($event) => deleteTag(tag) }, { default: withCtx(() => [createElementVNode("span", null, toDisplayString(tag.text), 1)]), _: 2 }, 1032, [ "type", "size", "effect", "hit", "closable", "onClose" ]))], 2); }), 128))], 2)]), _: 1 }, 8, ["max-height"])]), _: 1 }, 8, [ "disabled", "popper-class", "popper-style", "effect", "persistent" ])) : createCommentVNode("v-if", true), __props.filterable && !unref(isDisabled) ? withDirectives((openBlock(), createElementBlock("input", { key: 1, "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => searchInputValue.value = $event), type: "text", class: normalizeClass(unref(nsCascader).e("search-input")), placeholder: presentText.value ? "" : inputPlaceholder.value, onInput: _cache[3] || (_cache[3] = (e) => handleInput(searchInputValue.value, e)), onClick: _cache[4] || (_cache[4] = withModifiers(($event) => togglePopperVisible(true), ["stop"])), onKeydown: withKeys(handleDelete, ["delete"]), onCompositionstart: _cache[5] || (_cache[5] = (...args) => unref(handleComposition) && unref(handleComposition)(...args)), onCompositionupdate: _cache[6] || (_cache[6] = (...args) => unref(handleComposition) && unref(handleComposition)(...args)), onCompositionend: _cache[7] || (_cache[7] = (...args) => unref(handleComposition) && unref(handleComposition)(...args)) }, null, 42, _hoisted_1$58)), [[vModelText, searchInputValue.value]]) : createCommentVNode("v-if", true) ], 2)) : createCommentVNode("v-if", true)], 38)), [[ unref(ClickOutside), handleClickOutside, contentRef.value ]])]), content: withCtx(() => [ _ctx.$slots.header ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(nsCascader).e("header")), onClick: _cache[11] || (_cache[11] = withModifiers(() => {}, ["stop"])) }, [renderSlot(_ctx.$slots, "header")], 2)) : createCommentVNode("v-if", true), withDirectives(createVNode(unref(ElCascaderPanel), { ref_key: "cascaderPanelRef", ref: cascaderPanelRef, modelValue: checkedValue.value, "onUpdate:modelValue": _cache[12] || (_cache[12] = ($event) => checkedValue.value = $event), options: __props.options, props: props.props, border: false, "render-label": _ctx.$slots.default, "virtual-scroll": __props.virtualScroll, "item-size": __props.itemSize, height: __props.height, onExpandChange: handleExpandChange, onClose: _cache[13] || (_cache[13] = ($event) => _ctx.$nextTick(() => togglePopperVisible(false))) }, { empty: withCtx(() => [renderSlot(_ctx.$slots, "empty")]), _: 3 }, 8, [ "modelValue", "options", "props", "render-label", "virtual-scroll", "item-size", "height" ]), [[vShow, !filtering.value]]), __props.filterable ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [!__props.virtualScroll ? withDirectives((openBlock(), createBlock(unref(ElScrollbar), { key: 0, ref: (ref) => suggestionPanel.value = ref?.$el, tag: "ul", class: normalizeClass(unref(nsCascader).e("suggestion-panel")), "wrap-class": unref(nsCascader).e("suggestion-wrap"), "view-class": unref(nsCascader).e("suggestion-list"), onKeydown: handleSuggestionKeyDown }, { default: withCtx(() => [suggestions.value.length ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(suggestions.value, (item) => { return openBlock(), createElementBlock("li", { key: item.uid, class: normalizeClass([unref(nsCascader).e("suggestion-item"), unref(nsCascader).is("checked", item.checked)]), tabindex: -1, onClick: ($event) => handleSuggestionClick(item) }, [renderSlot(_ctx.$slots, "suggestion-item", { item }, () => [createElementVNode("span", null, toDisplayString(item.text), 1), item.checked ? (openBlock(), createBlock(unref(ElIcon), { key: 0 }, { default: withCtx(() => [createVNode(unref(check_default))]), _: 1 })) : createCommentVNode("v-if", true)])], 10, _hoisted_2$35); }), 128)) : renderSlot(_ctx.$slots, "empty", { key: 1 }, () => [createElementVNode("li", { class: normalizeClass(unref(nsCascader).e("empty-text")) }, toDisplayString(unref(t)("el.cascader.noMatch")), 3)])]), _: 3 }, 8, [ "class", "wrap-class", "view-class" ])), [[vShow, filtering.value]]) : withDirectives((openBlock(), createElementBlock("div", { key: 1, ref_key: "suggestionPanel", ref: suggestionPanel, class: normalizeClass(unref(nsCascader).e("suggestion-panel")), onKeydown: handleSuggestionKeyDown }, [withDirectives(createVNode(unref(FixedSizeList), { ref_key: "suggestionVirtualListRef", ref: suggestionVirtualListRef, height: clampedSuggestionListHeight.value, "item-size": __props.itemSize, data: suggestions.value, total: suggestions.value.length, "class-name": unref(nsCascader).e("suggestion-list"), "inner-element": "ul", "inner-width": suggestionListWidth.value }, { default: withCtx(({ data, index, style }) => [(openBlock(), createElementBlock("li", { id: `suggestion-${data[index].uid}`, key: data[index].uid, "data-suggestion-index": index, class: normalizeClass([unref(nsCascader).e("suggestion-item"), unref(nsCascader).is("checked", data[index].checked)]), tabindex: -1, style: normalizeStyle(style), onClick: ($event) => handleSuggestionClick(data[index]) }, [renderSlot(_ctx.$slots, "suggestion-item", { item: data[index] }, () => [createElementVNode("span", null, toDisplayString(data[index].text), 1), data[index].checked ? (openBlock(), createBlock(unref(ElIcon), { key: 0 }, { default: withCtx(() => [createVNode(unref(check_default))]), _: 1 })) : createCommentVNode("v-if", true)])], 14, _hoisted_3$16))]), _: 3 }, 8, [ "height", "item-size", "data", "total", "class-name", "inner-width" ]), [[vShow, suggestions.value.length]]), !suggestions.value.length ? renderSlot(_ctx.$slots, "empty", { key: 0 }, () => [createElementVNode("ul", { class: normalizeClass(unref(nsCascader).e("suggestion-list")) }, [createElementVNode("li", { class: normalizeClass(unref(nsCascader).e("empty-text")) }, toDisplayString(unref(t)("el.cascader.noMatch")), 3)], 2)]) : createCommentVNode("v-if", true)], 34)), [[vShow, filtering.value]])], 64)) : createCommentVNode("v-if", true), _ctx.$slots.footer ? (openBlock(), createElementBlock("div", { key: 2, class: normalizeClass(unref(nsCascader).e("footer")), onClick: _cache[14] || (_cache[14] = withModifiers(() => {}, ["stop"])) }, [renderSlot(_ctx.$slots, "footer")], 2)) : createCommentVNode("v-if", true) ]), _: 3 }, 8, [ "visible", "teleported", "popper-class", "popper-style", "fallback-placements", "placement", "transition", "effect", "persistent" ]); }; } }); //#endregion //#region ../../packages/components/cascader/src/cascader.vue var cascader_default = cascader_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/cascader/index.ts const ElCascader = withInstall(cascader_default); //#endregion //#region ../../packages/components/check-tag/src/check-tag.ts /** * @deprecated Removed after 3.0.0, Use `CheckTagProps` instead. */ const checkTagProps = buildProps({ /** * @description is checked */ checked: Boolean, /** * @description whether the check-tag is disabled */ disabled: Boolean, /** * @description type of Tag */ type: { type: String, values: [ "primary", "success", "info", "warning", "danger" ], default: "primary" } }); const checkTagEmits = { "update:checked": (value) => isBoolean(value), [CHANGE_EVENT]: (value) => isBoolean(value) }; //#endregion //#region ../../packages/components/check-tag/src/check-tag.vue?vue&type=script&setup=true&lang.ts var check_tag_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElCheckTag", __name: "check-tag", props: checkTagProps, emits: checkTagEmits, setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const ns = useNamespace("check-tag"); const containerKls = computed(() => [ ns.b(), ns.is("checked", props.checked), ns.is("disabled", props.disabled), ns.m(props.type || "primary") ]); const handleChange = () => { if (props.disabled) return; const checked = !props.checked; emit(CHANGE_EVENT, checked); emit("update:checked", checked); }; return (_ctx, _cache) => { return openBlock(), createElementBlock("span", { class: normalizeClass(containerKls.value), onClick: handleChange }, [renderSlot(_ctx.$slots, "default")], 2); }; } }); //#endregion //#region ../../packages/components/check-tag/src/check-tag.vue var check_tag_default = check_tag_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/check-tag/index.ts const ElCheckTag = withInstall(check_tag_default); //#endregion //#region ../../packages/components/col/src/col.ts /** * @deprecated Removed after 3.0.0, Use `ColProps` instead. */ const colProps = buildProps({ /** * @description custom element tag */ tag: { type: String, default: "div" }, /** * @description number of column the grid spans */ span: { type: Number, default: 24 }, /** * @description number of spacing on the left side of the grid */ offset: { type: Number, default: 0 }, /** * @description number of columns that grid moves to the left */ pull: { type: Number, default: 0 }, /** * @description number of columns that grid moves to the right */ push: { type: Number, default: 0 }, /** * @description `<768px` Responsive columns or column props object */ xs: { type: definePropType([Number, Object]), default: () => mutable({}) }, /** * @description `≥768px` Responsive columns or column props object */ sm: { type: definePropType([Number, Object]), default: () => mutable({}) }, /** * @description `≥992px` Responsive columns or column props object */ md: { type: definePropType([Number, Object]), default: () => mutable({}) }, /** * @description `≥1200px` Responsive columns or column props object */ lg: { type: definePropType([Number, Object]), default: () => mutable({}) }, /** * @description `≥1920px` Responsive columns or column props object */ xl: { type: definePropType([Number, Object]), default: () => mutable({}) } }); //#endregion //#region ../../packages/components/row/src/row.ts const RowJustify = [ "start", "center", "end", "space-around", "space-between", "space-evenly" ]; const RowAlign = [ "top", "middle", "bottom" ]; /** * @deprecated Removed after 3.0.0, Use `RowProps` instead. */ const rowProps = buildProps({ /** * @description custom element tag */ tag: { type: String, default: "div" }, /** * @description grid spacing */ gutter: { type: Number, default: 0 }, /** * @description horizontal alignment of flex layout */ justify: { type: String, values: RowJustify, default: "start" }, /** * @description vertical alignment of flex layout */ align: { type: String, values: RowAlign } }); //#endregion //#region ../../packages/components/row/src/constants.ts const rowContextKey = Symbol("rowContextKey"); //#endregion //#region ../../packages/components/row/src/row.vue?vue&type=script&setup=true&lang.ts var row_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElRow", __name: "row", props: rowProps, setup(__props) { const props = __props; const ns = useNamespace("row"); provide(rowContextKey, { gutter: computed(() => props.gutter) }); const style = computed(() => { const styles = {}; if (!props.gutter) return styles; styles.marginRight = styles.marginLeft = `-${props.gutter / 2}px`; return styles; }); const rowKls = computed(() => [ ns.b(), ns.is(`justify-${props.justify}`, props.justify !== "start"), ns.is(`align-${props.align}`, !!props.align) ]); return (_ctx, _cache) => { return openBlock(), createBlock(resolveDynamicComponent(__props.tag), { class: normalizeClass(rowKls.value), style: normalizeStyle(style.value) }, { default: withCtx(() => [renderSlot(_ctx.$slots, "default")]), _: 3 }, 8, ["class", "style"]); }; } }); //#endregion //#region ../../packages/components/row/src/row.vue var row_default = row_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/row/index.ts const ElRow = withInstall(row_default); //#endregion //#region ../../packages/components/col/src/col.vue?vue&type=script&setup=true&lang.ts var col_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElCol", __name: "col", props: colProps, setup(__props) { const props = __props; const { gutter } = inject(rowContextKey, { gutter: computed(() => 0) }); const ns = useNamespace("col"); const style = computed(() => { const styles = {}; if (gutter.value) styles.paddingLeft = styles.paddingRight = `${gutter.value / 2}px`; return styles; }); const colKls = computed(() => { const classes = []; [ "span", "offset", "pull", "push" ].forEach((prop) => { const size = props[prop]; if (isNumber(size)) { if (prop === "span") classes.push(ns.b(`${props[prop]}`)); else if (size > 0) classes.push(ns.b(`${prop}-${props[prop]}`)); } }); [ "xs", "sm", "md", "lg", "xl" ].forEach((size) => { if (isNumber(props[size])) classes.push(ns.b(`${size}-${props[size]}`)); else if (isObject$1(props[size])) Object.entries(props[size]).forEach(([prop, sizeProp]) => { classes.push(prop !== "span" ? ns.b(`${size}-${prop}-${sizeProp}`) : ns.b(`${size}-${sizeProp}`)); }); }); if (gutter.value) classes.push(ns.is("guttered")); return [ns.b(), classes]; }); return (_ctx, _cache) => { return openBlock(), createBlock(resolveDynamicComponent(__props.tag), { class: normalizeClass(colKls.value), style: normalizeStyle(style.value) }, { default: withCtx(() => [renderSlot(_ctx.$slots, "default")]), _: 3 }, 8, ["class", "style"]); }; } }); //#endregion //#region ../../packages/components/col/src/col.vue var col_default = col_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/col/index.ts const ElCol = withInstall(col_default); //#endregion //#region ../../packages/components/collapse/src/collapse.ts const emitChangeFn = (value) => isNumber(value) || isString(value) || isArray$1(value); /** * @deprecated Removed after 3.0.0, Use `CollapseProps` instead. */ const collapseProps = buildProps({ /** * @description whether to activate accordion mode */ accordion: Boolean, /** * @description currently active panel, the type is `string` in accordion mode, otherwise it is `array` */ modelValue: { type: definePropType([ Array, String, Number ]), default: () => mutable([]) }, /** * @description set expand icon position */ expandIconPosition: { type: definePropType([String]), default: "right" }, /** * @description before-collapse hook before the collapse state changes. If `false` is returned or a `Promise` is returned and then is rejected, will stop collapsing */ beforeCollapse: { type: definePropType(Function) } }); const collapseEmits = { [UPDATE_MODEL_EVENT]: emitChangeFn, [CHANGE_EVENT]: emitChangeFn }; //#endregion //#region ../../packages/components/collapse/src/constants.ts const collapseContextKey = Symbol("collapseContextKey"); //#endregion //#region ../../packages/components/collapse/src/use-collapse.ts const SCOPE$4 = "ElCollapse"; const useCollapse = (props, emit) => { const activeNames = ref(castArray$1(props.modelValue)); const setActiveNames = (_activeNames) => { activeNames.value = _activeNames; const value = props.accordion ? activeNames.value[0] : activeNames.value; emit(UPDATE_MODEL_EVENT, value); emit(CHANGE_EVENT, value); }; const handleChange = (name) => { if (props.accordion) setActiveNames([activeNames.value[0] === name ? "" : name]); else { const _activeNames = [...activeNames.value]; const index = _activeNames.indexOf(name); if (index > -1) _activeNames.splice(index, 1); else _activeNames.push(name); setActiveNames(_activeNames); } }; const handleItemClick = async (name) => { const { beforeCollapse } = props; if (!beforeCollapse) { handleChange(name); return; } const shouldChange = beforeCollapse(name); if (![isPromise(shouldChange), isBoolean(shouldChange)].includes(true)) throwError(SCOPE$4, "beforeCollapse must return type `Promise` or `boolean`"); if (isPromise(shouldChange)) shouldChange.then((result) => { if (result !== false) handleChange(name); }).catch((e) => { /* @__PURE__ */ debugWarn(SCOPE$4, `some error occurred: ${e}`); }); else if (shouldChange) handleChange(name); }; watch(() => props.modelValue, () => activeNames.value = castArray$1(props.modelValue), { deep: true }); provide(collapseContextKey, { activeNames, handleItemClick }); return { activeNames, setActiveNames }; }; const useCollapseDOM = (props) => { const ns = useNamespace("collapse"); return { rootKls: computed(() => [ns.b(), ns.b(`icon-position-${props.expandIconPosition}`)]) }; }; //#endregion //#region ../../packages/components/collapse/src/collapse.vue?vue&type=script&setup=true&lang.ts var collapse_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElCollapse", __name: "collapse", props: collapseProps, emits: collapseEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const { activeNames, setActiveNames } = useCollapse(props, __emit); const { rootKls } = useCollapseDOM(props); __expose({ /** @description active names */ activeNames, /** @description set active names */ setActiveNames }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass(unref(rootKls)) }, [renderSlot(_ctx.$slots, "default")], 2); }; } }); //#endregion //#region ../../packages/components/collapse/src/collapse.vue var collapse_default = collapse_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/collapse/src/collapse-item.ts /** * @deprecated Removed after 3.0.0, Use `CollapseItemProps` instead. */ const collapseItemProps = buildProps({ /** * @description title of the panel */ title: { type: String, default: "" }, /** * @description unique identification of the panel */ name: { type: definePropType([String, Number]), default: void 0 }, /** * @description icon of the collapse item */ icon: { type: iconPropType, default: arrow_right_default }, /** * @description disable the collapse item */ disabled: Boolean }); //#endregion //#region ../../packages/components/collapse-transition/src/collapse-transition.vue?vue&type=script&setup=true&lang.ts var collapse_transition_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElCollapseTransition", __name: "collapse-transition", setup(__props) { const ns = useNamespace("collapse-transition"); const reset = (el) => { el.style.maxHeight = ""; el.style.overflow = el.dataset.oldOverflow; el.style.paddingTop = el.dataset.oldPaddingTop; el.style.paddingBottom = el.dataset.oldPaddingBottom; }; const on = { beforeEnter(el) { if (!el.dataset) el.dataset = {}; el.dataset.oldPaddingTop = el.style.paddingTop; el.dataset.oldPaddingBottom = el.style.paddingBottom; if (el.style.height) el.dataset.elExistsHeight = el.style.height; el.style.maxHeight = 0; el.style.paddingTop = 0; el.style.paddingBottom = 0; }, enter(el) { requestAnimationFrame(() => { el.dataset.oldOverflow = el.style.overflow; if (el.dataset.elExistsHeight) el.style.maxHeight = el.dataset.elExistsHeight; else if (el.scrollHeight !== 0) el.style.maxHeight = `${el.scrollHeight}px`; else el.style.maxHeight = 0; el.style.paddingTop = el.dataset.oldPaddingTop; el.style.paddingBottom = el.dataset.oldPaddingBottom; el.style.overflow = "hidden"; }); }, afterEnter(el) { el.style.maxHeight = ""; el.style.overflow = el.dataset.oldOverflow; }, enterCancelled(el) { reset(el); }, beforeLeave(el) { if (!el.dataset) el.dataset = {}; el.dataset.oldPaddingTop = el.style.paddingTop; el.dataset.oldPaddingBottom = el.style.paddingBottom; el.dataset.oldOverflow = el.style.overflow; el.style.maxHeight = `${el.scrollHeight}px`; el.style.overflow = "hidden"; }, leave(el) { if (el.scrollHeight !== 0) { el.style.maxHeight = 0; el.style.paddingTop = 0; el.style.paddingBottom = 0; } }, afterLeave(el) { reset(el); }, leaveCancelled(el) { reset(el); } }; return (_ctx, _cache) => { return openBlock(), createBlock(Transition, mergeProps({ name: unref(ns).b() }, toHandlers(on)), { default: withCtx(() => [renderSlot(_ctx.$slots, "default")]), _: 3 }, 16, ["name"]); }; } }); //#endregion //#region ../../packages/components/collapse-transition/src/collapse-transition.vue var collapse_transition_default = collapse_transition_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/collapse-transition/index.ts const ElCollapseTransition = withInstall(collapse_transition_default); //#endregion //#region ../../packages/components/collapse/src/use-collapse-item.ts const useCollapseItem = (props) => { const collapse = inject(collapseContextKey); const { namespace } = useNamespace("collapse"); const focusing = ref(false); const isClick = ref(false); const idInjection = useIdInjection(); const id = computed(() => idInjection.current++); const name = computed(() => { return props.name ?? `${namespace.value}-id-${idInjection.prefix}-${unref(id)}`; }); const isActive = computed(() => collapse?.activeNames.value.includes(unref(name))); const handleFocus = () => { setTimeout(() => { if (!isClick.value) focusing.value = true; else isClick.value = false; }, 50); }; const handleHeaderClick = (e) => { if (props.disabled) return; if (e.target?.closest("input, textarea, select")) return; collapse?.handleItemClick(unref(name)); focusing.value = false; isClick.value = true; }; const handleEnterClick = (e) => { if (e.target?.closest("input, textarea, select")) return; e.preventDefault(); collapse?.handleItemClick(unref(name)); }; return { focusing, id, isActive, handleFocus, handleHeaderClick, handleEnterClick }; }; const useCollapseItemDOM = (props, { focusing, isActive, id }) => { const ns = useNamespace("collapse"); const rootKls = computed(() => [ ns.b("item"), ns.is("active", unref(isActive)), ns.is("disabled", props.disabled) ]); const headKls = computed(() => [ ns.be("item", "header"), ns.is("active", unref(isActive)), { focusing: unref(focusing) && !props.disabled } ]); const arrowKls = computed(() => [ns.be("item", "arrow"), ns.is("active", unref(isActive))]); return { itemTitleKls: computed(() => [ns.be("item", "title")]), arrowKls, headKls, rootKls, itemWrapperKls: computed(() => ns.be("item", "wrap")), itemContentKls: computed(() => ns.be("item", "content")), scopedContentId: computed(() => ns.b(`content-${unref(id)}`)), scopedHeadId: computed(() => ns.b(`head-${unref(id)}`)) }; }; //#endregion //#region ../../packages/components/collapse/src/collapse-item.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$57 = [ "id", "aria-expanded", "aria-controls", "aria-describedby", "tabindex", "aria-disabled" ]; const _hoisted_2$34 = [ "id", "aria-hidden", "aria-labelledby" ]; var collapse_item_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElCollapseItem", __name: "collapse-item", props: collapseItemProps, setup(__props, { expose: __expose }) { const props = __props; const { focusing, id, isActive, handleFocus, handleHeaderClick, handleEnterClick } = useCollapseItem(props); const { arrowKls, headKls, rootKls, itemTitleKls, itemWrapperKls, itemContentKls, scopedContentId, scopedHeadId } = useCollapseItemDOM(props, { focusing, isActive, id }); __expose({ /** @description current collapse-item whether active */ isActive }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass(unref(rootKls)) }, [createElementVNode("div", { id: unref(scopedHeadId), class: normalizeClass(unref(headKls)), "aria-expanded": unref(isActive), "aria-controls": unref(scopedContentId), "aria-describedby": unref(scopedContentId), tabindex: __props.disabled ? void 0 : 0, "aria-disabled": __props.disabled, role: "button", onClick: _cache[0] || (_cache[0] = (...args) => unref(handleHeaderClick) && unref(handleHeaderClick)(...args)), onKeydown: _cache[1] || (_cache[1] = withKeys(withModifiers((...args) => unref(handleEnterClick) && unref(handleEnterClick)(...args), ["stop"]), ["space", "enter"])), onFocus: _cache[2] || (_cache[2] = (...args) => unref(handleFocus) && unref(handleFocus)(...args)), onBlur: _cache[3] || (_cache[3] = ($event) => focusing.value = false) }, [createElementVNode("span", { class: normalizeClass(unref(itemTitleKls)) }, [renderSlot(_ctx.$slots, "title", { isActive: unref(isActive) }, () => [createTextVNode(toDisplayString(__props.title), 1)])], 2), renderSlot(_ctx.$slots, "icon", { isActive: unref(isActive) }, () => [createVNode(unref(ElIcon), { class: normalizeClass(unref(arrowKls)) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(__props.icon)))]), _: 1 }, 8, ["class"])])], 42, _hoisted_1$57), createVNode(unref(ElCollapseTransition), null, { default: withCtx(() => [withDirectives(createElementVNode("div", { id: unref(scopedContentId), role: "region", class: normalizeClass(unref(itemWrapperKls)), "aria-hidden": !unref(isActive), "aria-labelledby": unref(scopedHeadId) }, [createElementVNode("div", { class: normalizeClass(unref(itemContentKls)) }, [renderSlot(_ctx.$slots, "default")], 2)], 10, _hoisted_2$34), [[vShow, unref(isActive)]])]), _: 3 })], 2); }; } }); //#endregion //#region ../../packages/components/collapse/src/collapse-item.vue var collapse_item_default = collapse_item_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/collapse/index.ts const ElCollapse = withInstall(collapse_default, { CollapseItem: collapse_item_default }); const ElCollapseItem = withNoopInstall(collapse_item_default); //#endregion //#region ../../packages/components/color-picker-panel/src/color-picker-panel.ts /** * @deprecated Removed after 3.0.0, Use `ColorPickerPanelProps` instead. */ const colorPickerPanelProps = buildProps({ /** * @description binding value */ modelValue: { type: definePropType(String), default: void 0 }, /** * @description whether the color picker is bordered */ border: { type: Boolean, default: true }, /** * @description whether to display the alpha slider */ showAlpha: Boolean, /** * @description color format of v-model */ colorFormat: { type: definePropType(String) }, /** * @description whether to disable the color picker */ disabled: Boolean, /** * @description predefined color options */ predefine: { type: definePropType(Array) }, /** * @description whether to trigger form validation */ validateEvent: { type: Boolean, default: true }, /** * @description class names will be passed to */ hueSliderClass: { type: definePropType([ String, Array, Object ]) }, /** * @description styles will be passed to */ hueSliderStyle: { type: definePropType([ String, Array, Object, Boolean ]), default: void 0 } }); const colorPickerPanelEmits = { [UPDATE_MODEL_EVENT]: (val) => isString(val) || isNil(val) }; const ROOT_COMMON_COLOR_INJECTION_KEY = Symbol("colorCommonPickerKey"); const colorPickerPanelContextKey = Symbol("colorPickerPanelContextKey"); //#endregion //#region ../../packages/components/color-picker-panel/src/props/slider.ts /** * @deprecated Removed after 3.0.0, Use `AlphaSliderProps` instead. */ const alphaSliderProps = buildProps({ color: { type: definePropType(Object), required: true }, vertical: Boolean, disabled: Boolean }); /** * @deprecated Removed after 3.0.0, Use `HueSliderProps` instead. */ const hueSliderProps = alphaSliderProps; //#endregion //#region ../../packages/components/color-picker-panel/src/utils/draggable.ts let isDragging = false; function draggable(element, options) { if (!isClient) return; const moveFn = function(event) { options.drag?.(event); }; const upFn = function(event) { document.removeEventListener("mousemove", moveFn); document.removeEventListener("mouseup", upFn); document.removeEventListener("touchmove", moveFn); document.removeEventListener("touchend", upFn); document.onselectstart = null; document.ondragstart = null; isDragging = false; options.end?.(event); }; const downFn = function(event) { if (isDragging) return; document.onselectstart = () => false; document.ondragstart = () => false; document.addEventListener("mousemove", moveFn); document.addEventListener("mouseup", upFn); document.addEventListener("touchmove", moveFn); document.addEventListener("touchend", upFn); isDragging = true; options.start?.(event); }; element.addEventListener("mousedown", downFn); element.addEventListener("touchstart", downFn, { passive: false }); } //#endregion //#region ../../packages/components/color-picker-panel/src/composables/use-slider.ts const useSlider = (props, { key, minValue, maxValue }) => { const instance = getCurrentInstance(); const thumb = shallowRef(); const bar = shallowRef(); const currentValue = computed(() => props.color.get(key)); function handleClick(event) { if (props.disabled) return; if (event.target !== thumb.value) handleDrag(event); thumb.value?.focus(); } function handleDrag(event) { if (!bar.value || !thumb.value || props.disabled) return; const rect = instance.vnode.el.getBoundingClientRect(); const { clientX, clientY } = getClientXY(event); let value; if (!props.vertical) { let left = clientX - rect.left; left = Math.max(thumb.value.offsetWidth / 2, left); left = Math.min(left, rect.width - thumb.value.offsetWidth / 2); value = Math.round((left - thumb.value.offsetWidth / 2) / (rect.width - thumb.value.offsetWidth) * maxValue); } else { let top = clientY - rect.top; top = Math.max(thumb.value.offsetHeight / 2, top); top = Math.min(top, rect.height - thumb.value.offsetHeight / 2); value = Math.round((top - thumb.value.offsetHeight / 2) / (rect.height - thumb.value.offsetHeight) * maxValue); } props.color.set(key, value); } function handleKeydown(event) { if (props.disabled) return; const { shiftKey } = event; const code = getEventCode(event); const step = shiftKey ? 10 : 1; const reverse = key === "hue" ? -1 : 1; let isPreventDefault = true; switch (code) { case EVENT_CODE.left: case EVENT_CODE.down: incrementPosition(-step * reverse); break; case EVENT_CODE.right: case EVENT_CODE.up: incrementPosition(step * reverse); break; case EVENT_CODE.home: props.color.set(key, key === "hue" ? maxValue : minValue); break; case EVENT_CODE.end: props.color.set(key, key === "hue" ? minValue : maxValue); break; case EVENT_CODE.pageDown: incrementPosition(-4 * reverse); break; case EVENT_CODE.pageUp: incrementPosition(4 * reverse); break; default: isPreventDefault = false; break; } isPreventDefault && event.preventDefault(); } function incrementPosition(step) { let next = currentValue.value + step; next = next < minValue ? minValue : next > maxValue ? maxValue : next; props.color.set(key, next); } return { thumb, bar, currentValue, handleDrag, handleClick, handleKeydown }; }; const useSliderDOM = (props, { namespace, maxValue, bar, thumb, currentValue, handleDrag, getBackground }) => { const instance = getCurrentInstance(); const ns = useNamespace(namespace); const thumbLeft = ref(0); const thumbTop = ref(0); const background = ref(); function getThumbLeft() { if (!thumb.value) return 0; if (props.vertical) return 0; const el = instance.vnode.el; const value = currentValue.value; if (!el) return 0; return Math.round(value * (el.offsetWidth - thumb.value.offsetWidth / 2) / maxValue); } function getThumbTop() { if (!thumb.value) return 0; const el = instance.vnode.el; if (!props.vertical) return 0; const value = currentValue.value; if (!el) return 0; return Math.round(value * (el.offsetHeight - thumb.value.offsetHeight / 2) / maxValue); } function update() { thumbLeft.value = getThumbLeft(); thumbTop.value = getThumbTop(); background.value = getBackground?.(); } onMounted(() => { if (!bar.value || !thumb.value) return; const dragConfig = { drag: (event) => { handleDrag(event); }, end: (event) => { handleDrag(event); } }; draggable(bar.value, dragConfig); draggable(thumb.value, dragConfig); update(); }); watch(currentValue, () => update()); watch(() => props.color.value, () => update()); const rootKls = computed(() => [ ns.b(), ns.is("vertical", props.vertical), ns.is("disabled", props.disabled) ]); const barKls = computed(() => ns.e("bar")); const thumbKls = computed(() => ns.e("thumb")); return { rootKls, barKls, barStyle: computed(() => ({ background: background.value })), thumbKls, thumbStyle: computed(() => ({ left: addUnit(thumbLeft.value), top: addUnit(thumbTop.value) })), thumbLeft, thumbTop, update }; }; //#endregion //#region ../../packages/components/color-picker-panel/src/components/alpha-slider.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$56 = [ "aria-label", "aria-valuenow", "aria-valuetext", "aria-orientation", "tabindex", "aria-disabled" ]; const minValue$1 = 0; const maxValue$1 = 100; var alpha_slider_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElColorAlphaSlider", __name: "alpha-slider", props: alphaSliderProps, setup(__props, { expose: __expose }) { const props = __props; const { currentValue, bar, thumb, handleDrag, handleClick, handleKeydown } = useSlider(props, { key: "alpha", minValue: minValue$1, maxValue: maxValue$1 }); const { rootKls, barKls, barStyle, thumbKls, thumbStyle, update } = useSliderDOM(props, { namespace: "color-alpha-slider", maxValue: maxValue$1, currentValue, bar, thumb, handleDrag, getBackground }); const { t } = useLocale(); const ariaLabel = computed(() => t("el.colorpicker.alphaLabel")); const ariaValuetext = computed(() => { return t("el.colorpicker.alphaDescription", { alpha: currentValue.value, color: props.color.value }); }); function getBackground() { if (props.color && props.color.value) { const { r, g, b } = props.color.toRgb(); return `linear-gradient(to right, rgba(${r}, ${g}, ${b}, 0) 0%, rgba(${r}, ${g}, ${b}, 1) 100%)`; } return ""; } __expose({ /** * @description update alpha slider manually * @type {Function} */ update, /** * @description bar element ref * @type {HTMLElement} */ bar, /** * @description thumb element ref * @type {HTMLElement} */ thumb }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass(unref(rootKls)) }, [createElementVNode("div", { ref_key: "bar", ref: bar, class: normalizeClass(unref(barKls)), style: normalizeStyle(unref(barStyle)), onClick: _cache[0] || (_cache[0] = (...args) => unref(handleClick) && unref(handleClick)(...args)) }, null, 6), createElementVNode("div", { ref_key: "thumb", ref: thumb, class: normalizeClass(unref(thumbKls)), style: normalizeStyle(unref(thumbStyle)), "aria-label": ariaLabel.value, "aria-valuenow": unref(currentValue), "aria-valuetext": ariaValuetext.value, "aria-orientation": __props.vertical ? "vertical" : "horizontal", "aria-valuemin": minValue$1, "aria-valuemax": maxValue$1, role: "slider", tabindex: __props.disabled ? void 0 : 0, "aria-disabled": __props.disabled, onKeydown: _cache[1] || (_cache[1] = (...args) => unref(handleKeydown) && unref(handleKeydown)(...args)) }, null, 46, _hoisted_1$56)], 2); }; } }); //#endregion //#region ../../packages/components/color-picker-panel/src/components/alpha-slider.vue var alpha_slider_default = alpha_slider_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/color-picker-panel/src/components/hue-slider.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$55 = [ "aria-label", "aria-valuenow", "aria-valuetext", "aria-orientation", "tabindex", "aria-disabled" ]; const minValue = 0; const maxValue = 360; var hue_slider_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElColorHueSlider", __name: "hue-slider", props: hueSliderProps, setup(__props, { expose: __expose }) { const props = __props; const { currentValue, bar, thumb, handleDrag, handleClick, handleKeydown } = useSlider(props, { key: "hue", minValue, maxValue }); const { rootKls, barKls, thumbKls, thumbStyle, thumbTop, update } = useSliderDOM(props, { namespace: "color-hue-slider", maxValue, currentValue, bar, thumb, handleDrag }); const { t } = useLocale(); const ariaLabel = computed(() => t("el.colorpicker.hueLabel")); const ariaValuetext = computed(() => { return t("el.colorpicker.hueDescription", { hue: currentValue.value, color: props.color.value }); }); __expose({ /** * @description bar element ref */ bar, /** * @description thumb element ref */ thumb, /** * @description thumb top position, only for vertical slider */ thumbTop, /** * @description update hue slider manually */ update }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass(unref(rootKls)) }, [createElementVNode("div", { ref_key: "bar", ref: bar, class: normalizeClass(unref(barKls)), onClick: _cache[0] || (_cache[0] = (...args) => unref(handleClick) && unref(handleClick)(...args)) }, null, 2), createElementVNode("div", { ref_key: "thumb", ref: thumb, class: normalizeClass(unref(thumbKls)), style: normalizeStyle(unref(thumbStyle)), "aria-label": ariaLabel.value, "aria-valuenow": unref(currentValue), "aria-valuetext": ariaValuetext.value, "aria-orientation": __props.vertical ? "vertical" : "horizontal", "aria-valuemin": minValue, "aria-valuemax": maxValue, role: "slider", tabindex: __props.disabled ? void 0 : 0, "aria-disabled": __props.disabled, onKeydown: _cache[1] || (_cache[1] = (...args) => unref(handleKeydown) && unref(handleKeydown)(...args)) }, null, 46, _hoisted_1$55)], 2); }; } }); //#endregion //#region ../../packages/components/color-picker-panel/src/components/hue-slider.vue var hue_slider_default = hue_slider_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/color-picker-panel/src/props/predefine.ts /** * @deprecated Removed after 3.0.0, Use `PredefineProps` instead. */ const predefineProps = buildProps({ colors: { type: definePropType(Array), required: true }, color: { type: definePropType(Object), required: true }, enableAlpha: { type: Boolean, required: true }, disabled: Boolean }); //#endregion //#region ../../packages/components/color-picker-panel/src/utils/color.ts var Color = class { constructor(options = {}) { this._hue = 0; this._saturation = 100; this._value = 100; this._alpha = 100; this._tiny = new TinyColor(); this._isValid = false; this.enableAlpha = false; this.format = ""; this.value = ""; for (const option in options) if (hasOwn(options, option)) this[option] = options[option]; if (options.value) this.fromString(options.value); else this.doOnChange(); } set(prop, value) { if (arguments.length === 1 && typeof prop === "object") { for (const p in prop) if (hasOwn(prop, p)) this.set(p, prop[p]); return; } this[`_${prop}`] = value; this._isValid = true; this.doOnChange(); } get(prop) { if ([ "hue", "saturation", "value", "alpha" ].includes(prop)) return Math.round(this[`_${prop}`]); return this[`_${prop}`]; } toRgb() { return this._isValid ? this._tiny.toRgb() : { r: 255, g: 255, b: 255, a: 0 }; } fromString(value) { const color = new TinyColor(value); this._isValid = color.isValid; if (color.isValid) { const { h, s, v, a } = color.toHsv(); this._hue = h; this._saturation = s * 100; this._value = v * 100; this._alpha = a * 100; } else { this._hue = 0; this._saturation = 100; this._value = 100; this._alpha = 100; } this.doOnChange(); } clear() { this._isValid = false; this.value = ""; this._hue = 0; this._saturation = 100; this._value = 100; this._alpha = 100; } compare(color) { const compareColor = new TinyColor({ h: color._hue, s: color._saturation / 100, v: color._value / 100, a: color._alpha / 100 }); return this._tiny.equals(compareColor); } doOnChange() { const { _hue, _saturation, _value, _alpha, format, enableAlpha } = this; let _format = format || (enableAlpha ? "rgb" : "hex"); if (format === "hex" && enableAlpha) _format = "hex8"; this._tiny = new TinyColor({ h: _hue, s: _saturation / 100, v: _value / 100, a: _alpha / 100 }); this.value = this._isValid ? this._tiny.toString(_format) : ""; } }; //#endregion //#region ../../packages/components/color-picker-panel/src/composables/use-predefine.ts const usePredefine = (props) => { const { currentColor } = inject(colorPickerPanelContextKey); const rgbaColors = ref(parseColors(props.colors, props.color)); watch(() => currentColor.value, (val) => { const color = new Color({ value: val, enableAlpha: props.enableAlpha }); rgbaColors.value.forEach((item) => { item.selected = color.compare(item); }); }); watchEffect(() => { rgbaColors.value = parseColors(props.colors, props.color); }); function handleSelect(index) { props.color.fromString(props.colors[index]); } function parseColors(colors, color) { return colors.map((value) => { const c = new Color({ value, enableAlpha: props.enableAlpha }); c.selected = c.compare(color); return c; }); } return { rgbaColors, handleSelect }; }; const usePredefineDOM = (props) => { const ns = useNamespace("color-predefine"); const rootKls = computed(() => [ns.b(), ns.is("disabled", props.disabled)]); const colorsKls = computed(() => ns.e("colors")); function colorSelectorKls(item) { return [ ns.e("color-selector"), ns.is("alpha", item.get("alpha") < 100), { selected: item.selected } ]; } return { rootKls, colorsKls, colorSelectorKls }; }; //#endregion //#region ../../packages/components/color-picker-panel/src/components/predefine.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$54 = [ "disabled", "aria-label", "onClick" ]; var predefine_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElColorPredefine", __name: "predefine", props: predefineProps, setup(__props) { const props = __props; const { rgbaColors, handleSelect } = usePredefine(props); const { rootKls, colorsKls, colorSelectorKls } = usePredefineDOM(props); const { t } = useLocale(); const ariaLabel = (value) => { return t("el.colorpicker.predefineDescription", { value }); }; return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass(unref(rootKls)) }, [createElementVNode("div", { class: normalizeClass(unref(colorsKls)) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(rgbaColors), (item, index) => { return openBlock(), createElementBlock("button", { key: __props.colors[index], type: "button", disabled: __props.disabled, "aria-label": ariaLabel(item.value), class: normalizeClass(unref(colorSelectorKls)(item)), onClick: ($event) => unref(handleSelect)(index) }, [createElementVNode("div", { style: normalizeStyle({ backgroundColor: item.value }) }, null, 4)], 10, _hoisted_1$54); }), 128))], 2)], 2); }; } }); //#endregion //#region ../../packages/components/color-picker-panel/src/components/predefine.vue var predefine_default = predefine_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/color-picker-panel/src/props/sv-panel.ts /** * @deprecated Removed after 3.0.0, Use `SvPanelProps` instead. */ const svPanelProps = buildProps({ color: { type: definePropType(Object), required: true }, disabled: Boolean }); //#endregion //#region ../../packages/components/color-picker-panel/src/composables/use-sv-panel.ts const useSvPanel = (props) => { const instance = getCurrentInstance(); const cursorRef = ref(); const cursorTop = ref(0); const cursorLeft = ref(0); const background = ref("hsl(0, 100%, 50%)"); const saturation = computed(() => props.color.get("saturation")); const brightness = computed(() => props.color.get("value")); const hue = computed(() => props.color.get("hue")); function handleClick(event) { if (props.disabled) return; if (event.target !== cursorRef.value) handleDrag(event); cursorRef.value?.focus({ preventScroll: true }); } function handleDrag(event) { if (props.disabled) return; const rect = instance.vnode.el.getBoundingClientRect(); const { clientX, clientY } = getClientXY(event); let left = clientX - rect.left; let top = clientY - rect.top; left = Math.max(0, left); left = Math.min(left, rect.width); top = Math.max(0, top); top = Math.min(top, rect.height); cursorLeft.value = left; cursorTop.value = top; props.color.set({ saturation: left / rect.width * 100, value: 100 - top / rect.height * 100 }); } function handleKeydown(event) { if (props.disabled) return; const { shiftKey } = event; const code = getEventCode(event); const step = shiftKey ? 10 : 1; let isPreventDefault = true; switch (code) { case EVENT_CODE.left: incrementSaturation(-step); break; case EVENT_CODE.right: incrementSaturation(step); break; case EVENT_CODE.up: incrementBrightness(step); break; case EVENT_CODE.down: incrementBrightness(-step); break; default: isPreventDefault = false; break; } isPreventDefault && event.preventDefault(); } function incrementSaturation(step) { let next = saturation.value + step; next = next < 0 ? 0 : next > 100 ? 100 : next; props.color.set("saturation", next); } function incrementBrightness(step) { let next = brightness.value + step; next = next < 0 ? 0 : next > 100 ? 100 : next; props.color.set("value", next); } return { cursorRef, cursorTop, cursorLeft, background, saturation, brightness, hue, handleClick, handleDrag, handleKeydown }; }; const useSvPanelDOM = (props, { cursorTop, cursorLeft, background, handleDrag }) => { const instance = getCurrentInstance(); const ns = useNamespace("color-svpanel"); function update() { const saturation = props.color.get("saturation"); const brightness = props.color.get("value"); const { clientWidth: width, clientHeight: height } = instance.vnode.el; cursorLeft.value = saturation * width / 100; cursorTop.value = (100 - brightness) * height / 100; background.value = `hsl(${props.color.get("hue")}, 100%, 50%)`; } onMounted(() => { draggable(instance.vnode.el, { drag: (event) => { handleDrag(event); }, end: (event) => { handleDrag(event); } }); update(); }); watch([ () => props.color.get("hue"), () => props.color.get("value"), () => props.color.value ], () => update()); return { rootKls: computed(() => ns.b()), cursorKls: computed(() => ns.e("cursor")), rootStyle: computed(() => ({ backgroundColor: background.value })), cursorStyle: computed(() => ({ top: addUnit(cursorTop.value), left: addUnit(cursorLeft.value) })), update }; }; //#endregion //#region ../../packages/components/color-picker-panel/src/components/sv-panel.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$53 = [ "tabindex", "aria-disabled", "aria-label", "aria-valuenow", "aria-valuetext" ]; var sv_panel_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElSvPanel", __name: "sv-panel", props: svPanelProps, setup(__props, { expose: __expose }) { const props = __props; const { cursorRef, cursorTop, cursorLeft, background, saturation, brightness, handleClick, handleDrag, handleKeydown } = useSvPanel(props); const { rootKls, cursorKls, rootStyle, cursorStyle, update } = useSvPanelDOM(props, { cursorTop, cursorLeft, background, handleDrag }); const { t } = useLocale(); const ariaLabel = computed(() => t("el.colorpicker.svLabel")); const ariaValuetext = computed(() => { return t("el.colorpicker.svDescription", { saturation: saturation.value, brightness: brightness.value, color: props.color.value }); }); __expose({ /** * @description update sv panel manually */ update }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass(unref(rootKls)), style: normalizeStyle(unref(rootStyle)), onClick: _cache[1] || (_cache[1] = (...args) => unref(handleClick) && unref(handleClick)(...args)) }, [createElementVNode("div", { ref_key: "cursorRef", ref: cursorRef, class: normalizeClass(unref(cursorKls)), style: normalizeStyle(unref(cursorStyle)), tabindex: __props.disabled ? void 0 : 0, "aria-disabled": __props.disabled, role: "slider", "aria-valuemin": "0,0", "aria-valuemax": "100,100", "aria-label": ariaLabel.value, "aria-valuenow": `${unref(saturation)},${unref(brightness)}`, "aria-valuetext": ariaValuetext.value, onKeydown: _cache[0] || (_cache[0] = (...args) => unref(handleKeydown) && unref(handleKeydown)(...args)) }, null, 46, _hoisted_1$53)], 6); }; } }); //#endregion //#region ../../packages/components/color-picker-panel/src/components/sv-panel.vue var sv_panel_default = sv_panel_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/color-picker-panel/src/composables/use-common-color.ts const useCommonColor = (props, emit) => { const color = reactive(new Color({ enableAlpha: props.showAlpha, format: props.colorFormat || "", value: props.modelValue })); watch(() => [props.colorFormat, props.showAlpha], () => { color.enableAlpha = props.showAlpha; color.format = props.colorFormat || color.format; color.doOnChange(); emit(UPDATE_MODEL_EVENT, color.value); }); return { color }; }; //#endregion //#region ../../packages/components/color-picker-panel/src/color-picker-panel.vue?vue&type=script&setup=true&lang.ts var color_picker_panel_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElColorPickerPanel", __name: "color-picker-panel", props: colorPickerPanelProps, emits: colorPickerPanelEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const ns = useNamespace("color-picker-panel"); const { formItem } = useFormItem(); const disabled = useFormDisabled(); const hueRef = ref(); const svRef = ref(); const alphaRef = ref(); const inputRef = ref(); const customInput = ref(""); const { color } = inject(ROOT_COMMON_COLOR_INJECTION_KEY, () => useCommonColor(props, emit), true); function handleConfirm() { color.fromString(customInput.value); if (color.value !== customInput.value) customInput.value = color.value; } function handleFocusout() { if (props.validateEvent) formItem?.validate?.("blur").catch(NOOP); } function update() { hueRef.value?.update(); svRef.value?.update(); alphaRef.value?.update(); } onMounted(() => { if (props.modelValue) customInput.value = color.value; nextTick(update); }); watch(() => props.modelValue, (newVal) => { if (newVal !== color.value) newVal ? color.fromString(newVal) : color.clear(); }); watch(() => color.value, (val) => { emit(UPDATE_MODEL_EVENT, val); customInput.value = val; if (props.validateEvent) formItem?.validate("change").catch(NOOP); }); provide(colorPickerPanelContextKey, { currentColor: computed(() => color.value) }); __expose({ /** * @description current color object */ color, /** * @description custom input ref */ inputRef, /** * @description update sub components */ update }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass([ unref(ns).b(), unref(ns).is("disabled", unref(disabled)), unref(ns).is("border", __props.border) ]), onFocusout: handleFocusout }, [ createElementVNode("div", { class: normalizeClass(unref(ns).e("wrapper")) }, [createVNode(hue_slider_default, { ref_key: "hueRef", ref: hueRef, color: unref(color), vertical: "", disabled: unref(disabled), class: normalizeClass(["hue-slider", __props.hueSliderClass]), style: normalizeStyle(__props.hueSliderStyle) }, null, 8, [ "color", "disabled", "class", "style" ]), createVNode(sv_panel_default, { ref_key: "svRef", ref: svRef, color: unref(color), disabled: unref(disabled) }, null, 8, ["color", "disabled"])], 2), __props.showAlpha ? (openBlock(), createBlock(alpha_slider_default, { key: 0, ref_key: "alphaRef", ref: alphaRef, color: unref(color), disabled: unref(disabled) }, null, 8, ["color", "disabled"])) : createCommentVNode("v-if", true), __props.predefine ? (openBlock(), createBlock(predefine_default, { key: 1, ref: "predefine", "enable-alpha": __props.showAlpha, color: unref(color), colors: __props.predefine, disabled: unref(disabled) }, null, 8, [ "enable-alpha", "color", "colors", "disabled" ])) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass(unref(ns).e("footer")) }, [createVNode(unref(ElInput), { ref_key: "inputRef", ref: inputRef, modelValue: customInput.value, "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => customInput.value = $event), "validate-event": false, size: "small", disabled: unref(disabled), onChange: handleConfirm }, null, 8, ["modelValue", "disabled"]), renderSlot(_ctx.$slots, "footer")], 2) ], 34); }; } }); //#endregion //#region ../../packages/components/color-picker-panel/src/color-picker-panel.vue var color_picker_panel_default = color_picker_panel_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/color-picker-panel/index.ts const ElColorPickerPanel = withInstall(color_picker_panel_default); //#endregion //#region ../../packages/components/color-picker/src/color-picker.ts /** * @deprecated Removed after 3.0.0, Use `ColorPickerProps` instead. */ const colorPickerProps = buildProps({ /** * @description when color-picker inactive and persistent is false, the color panel will be destroyed */ persistent: { type: Boolean, default: true }, /** * @description binding value */ modelValue: { type: definePropType(String), default: void 0 }, /** * @description ColorPicker id */ id: String, /** * @description whether to display the alpha slider */ showAlpha: Boolean, /** * @description color format of v-model */ colorFormat: { type: definePropType(String) }, /** * @description whether to disable the ColorPicker */ disabled: { type: Boolean, default: void 0 }, /** * @description whether to show clear button */ clearable: { type: Boolean, default: true }, /** * @description size of ColorPicker */ size: useSizeProp, /** * @description custom class name for ColorPicker's dropdown */ popperClass: useTooltipContentProps.popperClass, /** * @description custom style for ColorPicker's dropdown */ popperStyle: useTooltipContentProps.popperStyle, /** * @description ColorPicker tabindex */ tabindex: { type: [String, Number], default: 0 }, /** * @description whether color-picker popper is teleported to the body */ teleported: useTooltipContentProps.teleported, /** * @description which color-picker panel appends to */ appendTo: useTooltipContentProps.appendTo, /** * @description predefined color options */ predefine: { type: definePropType(Array) }, /** * @description whether to trigger form validation */ validateEvent: { type: Boolean, default: true }, ...useEmptyValuesProps, ...useAriaProps(["ariaLabel"]) }); const colorPickerEmits = { [UPDATE_MODEL_EVENT]: (val) => isString(val) || isNil(val), [CHANGE_EVENT]: (val) => isString(val) || isNil(val), activeChange: (val) => isString(val) || isNil(val), focus: (evt) => evt instanceof FocusEvent, blur: (evt) => evt instanceof FocusEvent, clear: () => true }; /** * @description default values for ColorPickerProps, used in components that extend ColorPickerProps */ const colorPickerPropsDefaults = { persistent: true, modelValue: void 0, disabled: void 0, clearable: true, popperStyle: void 0, tabindex: 0, teleported: true, validateEvent: true, valueOnClear: void 0 }; //#endregion //#region ../../packages/components/color-picker/src/color-picker.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$52 = [ "id", "aria-label", "aria-labelledby", "aria-description", "aria-disabled", "tabindex" ]; var color_picker_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElColorPicker", __name: "color-picker", props: colorPickerProps, emits: colorPickerEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const { t } = useLocale(); const ns = useNamespace("color"); const { formItem } = useFormItem(); const colorSize = useFormSize(); const colorDisabled = useFormDisabled(); const { valueOnClear, isEmptyValue } = useEmptyValues(props, null); const commonColor = useCommonColor(props, emit); const { inputId: buttonId, isLabeledByFormItem } = useFormItemInputId(props, { formItemContext: formItem }); const popper = ref(); const triggerRef = ref(); const pickerPanelRef = ref(); const showPicker = ref(false); const showPanelColor = ref(false); let shouldActiveChange = true; const { isFocused, handleFocus, handleBlur } = useFocusController(triggerRef, { disabled: colorDisabled, beforeBlur(event) { return popper.value?.isFocusInsideContent(event); }, afterBlur() { setShowPicker(false); resetColor(); if (props.validateEvent) formItem?.validate?.("blur").catch(NOOP); } }); const color = reactiveComputed(() => pickerPanelRef.value?.color ?? commonColor.color); const panelProps = computed(() => pick(props, Object.keys(colorPickerPanelProps))); const displayedColor = computed(() => { if (!props.modelValue && !showPanelColor.value) return "transparent"; return displayedRgb(color, props.showAlpha); }); const currentColor = computed(() => { return !props.modelValue && !showPanelColor.value ? "" : color.value; }); const buttonAriaLabel = computed(() => { return !isLabeledByFormItem.value ? props.ariaLabel || t("el.colorpicker.defaultLabel") : void 0; }); const buttonAriaLabelledby = computed(() => { return isLabeledByFormItem.value ? formItem?.labelId : void 0; }); const btnKls = computed(() => { return [ ns.b("picker"), ns.is("disabled", colorDisabled.value), ns.bm("picker", colorSize.value), ns.is("focused", isFocused.value) ]; }); function displayedRgb(color, showAlpha) { const { r, g, b, a } = color.toRgb(); return showAlpha ? `rgba(${r}, ${g}, ${b}, ${a})` : `rgb(${r}, ${g}, ${b})`; } function setShowPicker(value) { showPicker.value = value; } const debounceSetShowPicker = debounce(setShowPicker, 100, { leading: true }); function show() { if (colorDisabled.value) return; setShowPicker(true); } function hide() { debounceSetShowPicker(false); resetColor(); } function resetColor() { nextTick(() => { if (props.modelValue) color.fromString(props.modelValue); else { color.value = ""; nextTick(() => { showPanelColor.value = false; }); } }); } function handleTrigger() { if (colorDisabled.value) return; if (showPicker.value) resetColor(); debounceSetShowPicker(!showPicker.value); } function confirmValue() { const value = isEmptyValue(color.value) ? valueOnClear.value : color.value; emit(UPDATE_MODEL_EVENT, value); emit(CHANGE_EVENT, value); if (props.validateEvent) formItem?.validate("change").catch(NOOP); debounceSetShowPicker(false); nextTick(() => { const newColor = new Color({ enableAlpha: props.showAlpha, format: props.colorFormat || "", value: props.modelValue }); if (!color.compare(newColor)) resetColor(); }); } function clear() { debounceSetShowPicker(false); emit(UPDATE_MODEL_EVENT, valueOnClear.value); emit(CHANGE_EVENT, valueOnClear.value); if (props.modelValue !== valueOnClear.value && props.validateEvent) formItem?.validate("change").catch(NOOP); resetColor(); emit("clear"); } function handleShowTooltip() { pickerPanelRef?.value?.inputRef?.focus(); } function handleClickOutside() { if (!showPicker.value) return; hide(); isFocused.value && focus(); } function handleEsc(event) { event.preventDefault(); event.stopPropagation(); setShowPicker(false); resetColor(); } function handleKeyDown(event) { switch (getEventCode(event)) { case EVENT_CODE.enter: case EVENT_CODE.numpadEnter: case EVENT_CODE.space: event.preventDefault(); event.stopPropagation(); show(); break; case EVENT_CODE.esc: handleEsc(event); break; } } function focus() { triggerRef.value.focus(); } function blur() { triggerRef.value.blur(); } watch(() => currentColor.value, (val) => { shouldActiveChange && emit("activeChange", val); shouldActiveChange = true; }); watch(() => color.value, () => { if (!props.modelValue && !showPanelColor.value) showPanelColor.value = true; }); watch(() => props.modelValue, (newVal) => { if (!newVal) showPanelColor.value = false; else if (newVal && newVal !== color.value) { shouldActiveChange = false; color.fromString(newVal); } }); watch(() => showPicker.value, () => { pickerPanelRef.value && nextTick(pickerPanelRef.value.update); }); provide(ROOT_COMMON_COLOR_INJECTION_KEY, commonColor); __expose({ /** * @description current color object */ color, /** * @description manually show ColorPicker */ show, /** * @description manually hide ColorPicker */ hide, /** * @description focus the input element */ focus, /** * @description blur the input element */ blur }); return (_ctx, _cache) => { return openBlock(), createBlock(unref(ElTooltip), { ref_key: "popper", ref: popper, visible: showPicker.value, "show-arrow": false, "fallback-placements": [ "bottom", "top", "right", "left" ], offset: 0, "gpu-acceleration": false, "popper-class": [unref(ns).be("picker", "panel"), __props.popperClass], "popper-style": __props.popperStyle, "stop-popper-mouse-event": false, pure: "", loop: "", role: "dialog", effect: "light", trigger: "click", teleported: __props.teleported, transition: `${unref(ns).namespace.value}-zoom-in-top`, persistent: __props.persistent, "append-to": __props.appendTo, onShow: handleShowTooltip, onHide: _cache[2] || (_cache[2] = ($event) => setShowPicker(false)) }, { content: withCtx(() => [withDirectives((openBlock(), createBlock(unref(ElColorPickerPanel), mergeProps({ ref_key: "pickerPanelRef", ref: pickerPanelRef }, panelProps.value, { border: false, "validate-event": false, onKeydown: withKeys(handleEsc, ["esc"]) }), { footer: withCtx(() => [createElementVNode("div", null, [__props.clearable ? (openBlock(), createBlock(unref(ElButton), { key: 0, class: normalizeClass(unref(ns).be("footer", "link-btn")), text: "", size: "small", onClick: clear }, { default: withCtx(() => [createTextVNode(toDisplayString(unref(t)("el.colorpicker.clear")), 1)]), _: 1 }, 8, ["class"])) : createCommentVNode("v-if", true), createVNode(unref(ElButton), { plain: "", size: "small", class: normalizeClass(unref(ns).be("footer", "btn")), onClick: confirmValue }, { default: withCtx(() => [createTextVNode(toDisplayString(unref(t)("el.colorpicker.confirm")), 1)]), _: 1 }, 8, ["class"])])]), _: 1 }, 16)), [[ unref(ClickOutside), handleClickOutside, triggerRef.value ]])]), default: withCtx(() => [createElementVNode("div", mergeProps({ id: unref(buttonId), ref_key: "triggerRef", ref: triggerRef }, _ctx.$attrs, { class: btnKls.value, role: "button", "aria-label": buttonAriaLabel.value, "aria-labelledby": buttonAriaLabelledby.value, "aria-description": unref(t)("el.colorpicker.description", { color: __props.modelValue || "" }), "aria-disabled": unref(colorDisabled), tabindex: unref(colorDisabled) ? void 0 : __props.tabindex, onKeydown: handleKeyDown, onFocus: _cache[0] || (_cache[0] = (...args) => unref(handleFocus) && unref(handleFocus)(...args)), onBlur: _cache[1] || (_cache[1] = (...args) => unref(handleBlur) && unref(handleBlur)(...args)) }), [createElementVNode("div", { class: normalizeClass(unref(ns).be("picker", "trigger")), onClick: handleTrigger }, [createElementVNode("span", { class: normalizeClass([unref(ns).be("picker", "color"), unref(ns).is("alpha", __props.showAlpha)]) }, [createElementVNode("span", { class: normalizeClass(unref(ns).be("picker", "color-inner")), style: normalizeStyle({ backgroundColor: displayedColor.value }) }, [withDirectives(createVNode(unref(ElIcon), { class: normalizeClass([unref(ns).be("picker", "icon"), unref(ns).is("icon-arrow-down")]) }, { default: withCtx(() => [createVNode(unref(arrow_down_default))]), _: 1 }, 8, ["class"]), [[vShow, __props.modelValue || showPanelColor.value]]), withDirectives(createVNode(unref(ElIcon), { class: normalizeClass([unref(ns).be("picker", "empty"), unref(ns).is("icon-close")]) }, { default: withCtx(() => [createVNode(unref(close_default))]), _: 1 }, 8, ["class"]), [[vShow, !__props.modelValue && !showPanelColor.value]])], 6)], 2)], 2)], 16, _hoisted_1$52)]), _: 1 }, 8, [ "visible", "popper-class", "popper-style", "teleported", "transition", "persistent", "append-to" ]); }; } }); //#endregion //#region ../../packages/components/color-picker/src/color-picker.vue var color_picker_default = color_picker_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/color-picker/index.ts const ElColorPicker = withInstall(color_picker_default); //#endregion //#region ../../packages/components/container/src/container.vue?vue&type=script&setup=true&lang.ts var container_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElContainer", __name: "container", props: { direction: { type: String, required: false } }, setup(__props) { const props = __props; const slots = useSlots(); const ns = useNamespace("container"); const isVertical = computed(() => { if (props.direction === "vertical") return true; else if (props.direction === "horizontal") return false; if (slots && slots.default) return slots.default().some((vNode) => { const tag = vNode.type.name; return tag === "ElHeader" || tag === "ElFooter"; }); else return false; }); return (_ctx, _cache) => { return openBlock(), createElementBlock("section", { class: normalizeClass([unref(ns).b(), unref(ns).is("vertical", isVertical.value)]) }, [renderSlot(_ctx.$slots, "default")], 2); }; } }); //#endregion //#region ../../packages/components/container/src/container.vue var container_default = container_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/container/src/aside.vue?vue&type=script&setup=true&lang.ts var aside_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElAside", __name: "aside", props: { width: { type: [String, null], required: false, default: null } }, setup(__props) { const props = __props; const ns = useNamespace("aside"); const style = computed(() => props.width ? ns.cssVarBlock({ width: props.width }) : {}); return (_ctx, _cache) => { return openBlock(), createElementBlock("aside", { class: normalizeClass(unref(ns).b()), style: normalizeStyle(style.value) }, [renderSlot(_ctx.$slots, "default")], 6); }; } }); //#endregion //#region ../../packages/components/container/src/aside.vue var aside_default = aside_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/container/src/footer.vue?vue&type=script&setup=true&lang.ts var footer_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElFooter", __name: "footer", props: { height: { type: [String, null], required: false, default: null } }, setup(__props) { const props = __props; const ns = useNamespace("footer"); const style = computed(() => props.height ? ns.cssVarBlock({ height: props.height }) : {}); return (_ctx, _cache) => { return openBlock(), createElementBlock("footer", { class: normalizeClass(unref(ns).b()), style: normalizeStyle(style.value) }, [renderSlot(_ctx.$slots, "default")], 6); }; } }); //#endregion //#region ../../packages/components/container/src/footer.vue var footer_default = footer_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/container/src/header.vue?vue&type=script&setup=true&lang.ts var header_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElHeader", __name: "header", props: { height: { type: [String, null], required: false, default: null } }, setup(__props) { const props = __props; const ns = useNamespace("header"); const style = computed(() => { return props.height ? ns.cssVarBlock({ height: props.height }) : {}; }); return (_ctx, _cache) => { return openBlock(), createElementBlock("header", { class: normalizeClass(unref(ns).b()), style: normalizeStyle(style.value) }, [renderSlot(_ctx.$slots, "default")], 6); }; } }); //#endregion //#region ../../packages/components/container/src/header.vue var header_default = header_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/container/src/main.vue?vue&type=script&setup=true&lang.ts var main_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElMain", __name: "main", setup(__props) { const ns = useNamespace("main"); return (_ctx, _cache) => { return openBlock(), createElementBlock("main", { class: normalizeClass(unref(ns).b()) }, [renderSlot(_ctx.$slots, "default")], 2); }; } }); //#endregion //#region ../../packages/components/container/src/main.vue var main_default = main_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/container/index.ts const ElContainer = withInstall(container_default, { Aside: aside_default, Footer: footer_default, Header: header_default, Main: main_default }); const ElAside = withNoopInstall(aside_default); const ElFooter = withNoopInstall(footer_default); const ElHeader = withNoopInstall(header_default); const ElMain = withNoopInstall(main_default); //#endregion //#region ../../node_modules/.pnpm/dayjs@1.11.20/node_modules/dayjs/plugin/advancedFormat.js var require_advancedFormat = /* @__PURE__ */ __commonJSMin(((exports, module) => { (function(e, t) { "object" == typeof exports && "undefined" != typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define(t) : (e = "undefined" != typeof globalThis ? globalThis : e || self).dayjs_plugin_advancedFormat = t(); })(exports, (function() { "use strict"; return function(e, t) { var r = t.prototype, n = r.format; r.format = function(e) { var t = this, r = this.$locale(); if (!this.isValid()) return n.bind(this)(e); var s = this.$utils(), a = (e || "YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g, (function(e) { switch (e) { case "Q": return Math.ceil((t.$M + 1) / 3); case "Do": return r.ordinal(t.$D); case "gggg": return t.weekYear(); case "GGGG": return t.isoWeekYear(); case "wo": return r.ordinal(t.week(), "W"); case "w": case "ww": return s.s(t.week(), "w" === e ? 1 : 2, "0"); case "W": case "WW": return s.s(t.isoWeek(), "W" === e ? 1 : 2, "0"); case "k": case "kk": return s.s(String(0 === t.$H ? 24 : t.$H), "k" === e ? 1 : 2, "0"); case "X": return Math.floor(t.$d.getTime() / 1e3); case "x": return t.$d.getTime(); case "z": return "[" + t.offsetName() + "]"; case "zzz": return "[" + t.offsetName("long") + "]"; default: return e; } })); return n.bind(this)(a); }; }; })); })); //#endregion //#region ../../node_modules/.pnpm/dayjs@1.11.20/node_modules/dayjs/plugin/weekOfYear.js var require_weekOfYear = /* @__PURE__ */ __commonJSMin(((exports, module) => { (function(e, t) { "object" == typeof exports && "undefined" != typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define(t) : (e = "undefined" != typeof globalThis ? globalThis : e || self).dayjs_plugin_weekOfYear = t(); })(exports, (function() { "use strict"; var e = "week", t = "year"; return function(i, n, r) { var f = n.prototype; f.week = function(i) { if (void 0 === i && (i = null), null !== i) return this.add(7 * (i - this.week()), "day"); var n = this.$locale().yearStart || 1; if (11 === this.month() && this.date() > 25) { var f = r(this).startOf(t).add(1, t).date(n), s = r(this).endOf(e); if (f.isBefore(s)) return 1; } var a = r(this).startOf(t).date(n).startOf(e).subtract(1, "millisecond"), o = this.diff(a, e, !0); return o < 0 ? r(this).startOf("week").week() : Math.ceil(o); }, f.weeks = function(e) { return void 0 === e && (e = null), this.week(e); }; }; })); })); //#endregion //#region ../../node_modules/.pnpm/dayjs@1.11.20/node_modules/dayjs/plugin/weekYear.js var require_weekYear = /* @__PURE__ */ __commonJSMin(((exports, module) => { (function(e, t) { "object" == typeof exports && "undefined" != typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define(t) : (e = "undefined" != typeof globalThis ? globalThis : e || self).dayjs_plugin_weekYear = t(); })(exports, (function() { "use strict"; return function(e, t) { t.prototype.weekYear = function() { var e = this.month(), t = this.week(), n = this.year(); return 1 === t && 11 === e ? n + 1 : 0 === e && t >= 52 ? n - 1 : n; }; }; })); })); //#endregion //#region ../../node_modules/.pnpm/dayjs@1.11.20/node_modules/dayjs/plugin/dayOfYear.js var require_dayOfYear = /* @__PURE__ */ __commonJSMin(((exports, module) => { (function(e, t) { "object" == typeof exports && "undefined" != typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define(t) : (e = "undefined" != typeof globalThis ? globalThis : e || self).dayjs_plugin_dayOfYear = t(); })(exports, (function() { "use strict"; return function(e, t, n) { t.prototype.dayOfYear = function(e) { var t = Math.round((n(this).startOf("day") - n(this).startOf("year")) / 864e5) + 1; return null == e ? t : this.add(e - t, "day"); }; }; })); })); //#endregion //#region ../../node_modules/.pnpm/dayjs@1.11.20/node_modules/dayjs/plugin/isSameOrAfter.js var require_isSameOrAfter = /* @__PURE__ */ __commonJSMin(((exports, module) => { (function(e, t) { "object" == typeof exports && "undefined" != typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define(t) : (e = "undefined" != typeof globalThis ? globalThis : e || self).dayjs_plugin_isSameOrAfter = t(); })(exports, (function() { "use strict"; return function(e, t) { t.prototype.isSameOrAfter = function(e, t) { return this.isSame(e, t) || this.isAfter(e, t); }; }; })); })); //#endregion //#region ../../node_modules/.pnpm/dayjs@1.11.20/node_modules/dayjs/plugin/isSameOrBefore.js var require_isSameOrBefore = /* @__PURE__ */ __commonJSMin(((exports, module) => { (function(e, i) { "object" == typeof exports && "undefined" != typeof module ? module.exports = i() : "function" == typeof define && define.amd ? define(i) : (e = "undefined" != typeof globalThis ? globalThis : e || self).dayjs_plugin_isSameOrBefore = i(); })(exports, (function() { "use strict"; return function(e, i) { i.prototype.isSameOrBefore = function(e, i) { return this.isSame(e, i) || this.isBefore(e, i); }; }; })); })); //#endregion //#region ../../packages/components/date-picker-panel/src/props/date-picker-panel.ts var import_advancedFormat = /* @__PURE__ */ __toESM(require_advancedFormat()); var import_weekOfYear = /* @__PURE__ */ __toESM(require_weekOfYear()); var import_weekYear = /* @__PURE__ */ __toESM(require_weekYear()); var import_dayOfYear = /* @__PURE__ */ __toESM(require_dayOfYear()); var import_isSameOrAfter = /* @__PURE__ */ __toESM(require_isSameOrAfter()); var import_isSameOrBefore = /* @__PURE__ */ __toESM(require_isSameOrBefore()); const datePickerPanelProps = buildProps({ /** * @description optional, format of binding value. If not specified, the binding value will be a Date object */ valueFormat: String, /** * @description optional, format of the date displayed in input's inner panel */ dateFormat: String, /** * @description optional, format of the time displayed in input's inner panel */ timeFormat: String, /** * @description whether picker is disabled */ disabled: { type: Boolean, default: void 0 }, /** * @description binding value, if it is an array, the length should be 2 */ modelValue: { type: definePropType([ Date, Array, String, Number ]), default: "" }, /** * @description optional, default date of the calendar */ defaultValue: { type: definePropType([Date, Array]) }, /** * @description optional, the time value to use when selecting date range */ defaultTime: { type: definePropType([Date, Array]) }, /** * @description whether to pick a time range */ isRange: Boolean, ...disabledTimeListsProps, /** * @description a function determining if a date is disabled with that date as its parameter. Should return a Boolean */ disabledDate: { type: Function }, /** * @description set custom className */ cellClassName: { type: Function }, /** * @description an object array to set shortcut options */ shortcuts: { type: Array, default: () => [] }, /** * @description whether to pick time using arrow buttons */ arrowControl: Boolean, /** * @description unlink two date-panels in range-picker */ unlinkPanels: Boolean, /** * @description whether to show the now button */ showNow: { type: Boolean, default: true }, /** * @description whether to show the confirm button */ showConfirm: Boolean, /** * @description whether to show footer */ showFooter: Boolean, /** * @description whether to show the number of the calendar week */ showWeekNumber: Boolean, /** * @description type of the picker */ type: { type: definePropType(String), default: "date" }, /** * @description whether to show clear button in range mode */ clearable: { type: Boolean, default: true }, /** * @description whether the date picker is bordered */ border: { type: Boolean, default: true }, /** * @description whether the input is editable */ editable: { type: Boolean, default: true } }); //#endregion //#region ../../packages/components/date-picker-panel/src/constants.ts const ROOT_PICKER_INJECTION_KEY = Symbol("rootPickerContextKey"); const ROOT_PICKER_IS_DEFAULT_FORMAT_INJECTION_KEY = "ElIsDefaultFormat"; //#endregion //#region ../../packages/components/date-picker-panel/src/props/shared.ts const selectionModes = [ "date", "dates", "year", "years", "month", "months", "week", "range" ]; const datePickerSharedProps = buildProps({ cellClassName: { type: definePropType(Function) }, disabledDate: { type: definePropType(Function) }, date: { type: definePropType(Object), required: true }, minDate: { type: definePropType(Object) }, maxDate: { type: definePropType(Object) }, parsedValue: { type: definePropType([Object, Array]) }, rangeState: { type: definePropType(Object), default: () => ({ endDate: null, selecting: false }) }, disabled: Boolean }); const panelSharedProps = buildProps({ type: { type: definePropType(String), required: true, values: datePickTypes }, dateFormat: String, timeFormat: String, showNow: { type: Boolean, default: true }, showConfirm: Boolean, showFooter: { type: Boolean, default: true }, showWeekNumber: Boolean, border: Boolean, disabled: Boolean, editable: { type: Boolean, default: true } }); const panelRangeSharedProps = buildProps({ unlinkPanels: Boolean, visible: { type: Boolean, default: true }, showConfirm: Boolean, showFooter: { type: Boolean, default: true }, border: Boolean, disabled: Boolean, parsedValue: { type: definePropType(Array) }, singlePanel: Boolean }); const selectionModeWithDefault = (mode) => { return { type: String, values: selectionModes, default: mode }; }; //#endregion //#region ../../packages/components/date-picker-panel/src/props/panel-date-pick.ts const panelDatePickProps = buildProps({ ...panelSharedProps, parsedValue: { type: definePropType([Object, Array]) }, visible: { type: Boolean, default: true }, format: { type: String, default: "" } }); //#endregion //#region ../../packages/components/date-picker-panel/src/utils.ts const isValidRange = (range) => { if (!isArray$1(range)) return false; const [left, right] = range; return import_dayjs_min.default.isDayjs(left) && import_dayjs_min.default.isDayjs(right) && (0, import_dayjs_min.default)(left).isValid() && (0, import_dayjs_min.default)(right).isValid() && left.isSameOrBefore(right); }; const getDefaultValue = (defaultValue, { lang, step = 1, unit, unlinkPanels }) => { let start; if (isArray$1(defaultValue)) { let [left, right] = defaultValue.map((d) => (0, import_dayjs_min.default)(d).locale(lang)); if (!unlinkPanels) right = left.add(step, unit); return [left, right]; } else if (defaultValue) start = (0, import_dayjs_min.default)(defaultValue); else start = (0, import_dayjs_min.default)(); start = start.locale(lang); return [start, start.add(step, unit)]; }; const buildPickerTable = (dimension, rows, { columnIndexOffset, startDate, nextEndDate, now, unit, relativeDateGetter, setCellMetadata, setRowMetadata }) => { for (let rowIndex = 0; rowIndex < dimension.row; rowIndex++) { const row = rows[rowIndex]; for (let columnIndex = 0; columnIndex < dimension.column; columnIndex++) { let cell = row[columnIndex + columnIndexOffset]; if (!cell) cell = { row: rowIndex, column: columnIndex, type: "normal", inRange: false, start: false, end: false }; const nextStartDate = relativeDateGetter(rowIndex * dimension.column + columnIndex); cell.dayjs = nextStartDate; cell.date = nextStartDate.toDate(); cell.timestamp = nextStartDate.valueOf(); cell.type = "normal"; cell.inRange = !!(startDate && nextStartDate.isSameOrAfter(startDate, unit) && nextEndDate && nextStartDate.isSameOrBefore(nextEndDate, unit)) || !!(startDate && nextStartDate.isSameOrBefore(startDate, unit) && nextEndDate && nextStartDate.isSameOrAfter(nextEndDate, unit)); if (startDate?.isSameOrAfter(nextEndDate)) { cell.start = !!nextEndDate && nextStartDate.isSame(nextEndDate, unit); cell.end = startDate && nextStartDate.isSame(startDate, unit); } else { cell.start = !!startDate && nextStartDate.isSame(startDate, unit); cell.end = !!nextEndDate && nextStartDate.isSame(nextEndDate, unit); } if (nextStartDate.isSame(now, unit)) cell.type = "today"; setCellMetadata?.(cell, { rowIndex, columnIndex }); row[columnIndex + columnIndexOffset] = cell; } setRowMetadata?.(row); } }; const datesInMonth = (date, year, month, lang) => { const firstDay = (0, import_dayjs_min.default)().locale(lang).startOf("month").month(month).year(year).hour(date.hour()).minute(date.minute()).second(date.second()); return rangeArr(firstDay.daysInMonth()).map((n) => firstDay.add(n, "day").toDate()); }; const getValidDateOfMonth = (date, year, month, lang, disabledDate) => { const _value = (0, import_dayjs_min.default)().year(year).month(month).startOf("month").hour(date.hour()).minute(date.minute()).second(date.second()); const _date = datesInMonth(date, year, month, lang).find((date) => { return !disabledDate?.(date); }); if (_date) return (0, import_dayjs_min.default)(_date).locale(lang); return _value.locale(lang); }; const getValidDateOfYear = (value, lang, disabledDate) => { const year = value.year(); if (!disabledDate?.(value.toDate())) return value.locale(lang); const month = value.month(); if (!datesInMonth(value, year, month, lang).every(disabledDate)) return getValidDateOfMonth(value, year, month, lang, disabledDate); for (let i = 0; i < 12; i++) if (!datesInMonth(value, year, i, lang).every(disabledDate)) return getValidDateOfMonth(value, year, i, lang, disabledDate); return value; }; const correctlyParseUserInput = (value, format, lang, defaultFormat) => { if (isArray$1(value)) return value.map((v) => correctlyParseUserInput(v, format, lang, defaultFormat)); if (isString(value)) { const dayjsValue = defaultFormat?.value ? (0, import_dayjs_min.default)(value) : (0, import_dayjs_min.default)(value, format); if (!dayjsValue.isValid()) return dayjsValue; } return (0, import_dayjs_min.default)(value, format).locale(lang); }; //#endregion //#region ../../packages/components/date-picker-panel/src/props/basic-date-table.ts const basicDateTableProps = buildProps({ ...datePickerSharedProps, showWeekNumber: Boolean, selectionMode: selectionModeWithDefault("date") }); const basicDateTableEmits = [ "changerange", "pick", "select" ]; //#endregion //#region ../../packages/components/date-picker-panel/src/composables/use-basic-date-table.ts const isNormalDay = (type = "") => { return ["normal", "today"].includes(type); }; const useBasicDateTable = (props, emit) => { const { lang } = useLocale(); const tbodyRef = ref(); const currentCellRef = ref(); const lastRow = ref(); const lastColumn = ref(); const tableRows = ref([ [], [], [], [], [], [] ]); let focusWithClick = false; const firstDayOfWeek = props.date.$locale().weekStart || 7; const WEEKS_CONSTANT = props.date.locale("en").localeData().weekdaysShort().map((_) => _.toLowerCase()); const offsetDay = computed(() => { return firstDayOfWeek > 3 ? 7 - firstDayOfWeek : -firstDayOfWeek; }); const startDate = computed(() => { const startDayOfMonth = props.date.startOf("month"); return startDayOfMonth.subtract(startDayOfMonth.day() || 7, "day"); }); const WEEKS = computed(() => { return WEEKS_CONSTANT.concat(WEEKS_CONSTANT).slice(firstDayOfWeek, firstDayOfWeek + 7); }); const hasCurrent = computed(() => { return flatten(unref(rows)).some((row) => { return row.isCurrent; }); }); const days = computed(() => { const startOfMonth = props.date.startOf("month"); return { startOfMonthDay: startOfMonth.day() || 7, dateCountOfMonth: startOfMonth.daysInMonth(), dateCountOfLastMonth: startOfMonth.subtract(1, "month").daysInMonth() }; }); const selectedDate = computed(() => { return props.selectionMode === "dates" ? castArray(props.parsedValue) : []; }); const setDateText = (cell, { count, rowIndex, columnIndex }) => { const { startOfMonthDay, dateCountOfMonth, dateCountOfLastMonth } = unref(days); const offset = unref(offsetDay); if (rowIndex >= 0 && rowIndex <= 1) { const numberOfDaysFromPreviousMonth = startOfMonthDay + offset < 0 ? 7 + startOfMonthDay + offset : startOfMonthDay + offset; if (columnIndex + rowIndex * 7 >= numberOfDaysFromPreviousMonth) { cell.text = count; return true; } else { cell.text = dateCountOfLastMonth - (numberOfDaysFromPreviousMonth - columnIndex % 7) + 1 + rowIndex * 7; cell.type = "prev-month"; } } else { if (count <= dateCountOfMonth) cell.text = count; else { cell.text = count - dateCountOfMonth; cell.type = "next-month"; } return true; } return false; }; const setCellMetadata = (cell, { columnIndex, rowIndex }, count) => { const { disabledDate, cellClassName } = props; const _selectedDate = unref(selectedDate); const shouldIncrement = setDateText(cell, { count, rowIndex, columnIndex }); const cellDate = cell.dayjs.toDate(); cell.selected = _selectedDate.find((d) => d.isSame(cell.dayjs, "day")); cell.isSelected = !!cell.selected; cell.isCurrent = isCurrent(cell); cell.disabled = disabledDate?.(cellDate); cell.customClass = cellClassName?.(cellDate); return shouldIncrement; }; const setRowMetadata = (row) => { if (props.selectionMode === "week") { const [start, end] = props.showWeekNumber ? [1, 7] : [0, 6]; const isActive = isWeekActive(row[start + 1]); row[start].inRange = isActive; row[start].start = isActive; row[end].inRange = isActive; row[end].end = isActive; } }; const rows = computed(() => { const { minDate, maxDate, rangeState, showWeekNumber } = props; const offset = unref(offsetDay); const rows_ = unref(tableRows); const dateUnit = "day"; let count = 1; buildPickerTable({ row: 6, column: 7 }, rows_, { startDate: minDate, columnIndexOffset: showWeekNumber ? 1 : 0, nextEndDate: rangeState.endDate || maxDate || rangeState.selecting && minDate || null, now: (0, import_dayjs_min.default)().locale(unref(lang)).startOf(dateUnit), unit: dateUnit, relativeDateGetter: (idx) => unref(startDate).add(idx - offset, dateUnit), setCellMetadata: (...args) => { if (setCellMetadata(...args, count)) count += 1; }, setRowMetadata }); if (showWeekNumber) { for (let rowIndex = 0; rowIndex < 6; rowIndex++) if (rows_[rowIndex][1].dayjs) rows_[rowIndex][0] = { type: "week", text: rows_[rowIndex][1].dayjs.week() }; } return rows_; }); watch(() => props.date, async () => { if (unref(tbodyRef)?.contains(document.activeElement)) { await nextTick(); await focus(); } }); const focus = async () => unref(currentCellRef)?.focus(); const isCurrent = (cell) => { return props.selectionMode === "date" && isNormalDay(cell.type) && cellMatchesDate(cell, props.parsedValue); }; const cellMatchesDate = (cell, date) => { if (!date) return false; return (0, import_dayjs_min.default)(date).locale(unref(lang)).isSame(props.date.date(Number(cell.text)), "day"); }; const getDateOfCell = (row, column) => { const startOfMonthDay = unref(days).startOfMonthDay; const offset = unref(offsetDay); const numberOfDaysFromPreviousMonth = startOfMonthDay + offset < 0 ? 7 + startOfMonthDay + offset : startOfMonthDay + offset; const offsetFromStart = row * 7 + (column - (props.showWeekNumber ? 1 : 0)); return props.date.startOf("month").subtract(numberOfDaysFromPreviousMonth, "day").add(offsetFromStart, "day"); }; const handleMouseMove = (event) => { if (!props.rangeState.selecting) return; let target = event.target; if (target.tagName === "SPAN") target = target.parentNode?.parentNode; if (target.tagName === "DIV") target = target.parentNode; if (target.tagName !== "TD") return; const row = target.parentNode.rowIndex - 1; const column = target.cellIndex; if (unref(rows)[row][column].disabled) return; if (row !== unref(lastRow) || column !== unref(lastColumn)) { lastRow.value = row; lastColumn.value = column; emit("changerange", { selecting: true, endDate: getDateOfCell(row, column) }); } }; const isSelectedCell = (cell) => { return !unref(hasCurrent) && cell?.text === 1 && isNormalDay(cell.type) || cell.isCurrent; }; const handleFocus = (event) => { if (focusWithClick || unref(hasCurrent) || props.selectionMode !== "date") return; handlePickDate(event, true); }; const handleMouseDown = (event) => { if (!event.target.closest("td")) return; focusWithClick = true; }; const handleMouseUp = (event) => { if (!event.target.closest("td")) return; focusWithClick = false; }; const handleRangePick = (newDate) => { if (!props.rangeState.selecting || !props.minDate) { emit("pick", { minDate: newDate, maxDate: null }); emit("select", true); } else { if (newDate >= props.minDate) emit("pick", { minDate: props.minDate, maxDate: newDate }); else emit("pick", { minDate: newDate, maxDate: props.minDate }); emit("select", false); } }; const handleWeekPick = (newDate) => { const weekNumber = newDate.week(); const value = `${newDate.year()}w${weekNumber}`; emit("pick", { year: newDate.year(), week: weekNumber, value, date: newDate.startOf("week") }); }; const handleDatesPick = (newDate, selected) => { emit("pick", selected ? castArray(props.parsedValue).filter((d) => d?.valueOf() !== newDate.valueOf()) : castArray(props.parsedValue).concat([newDate])); }; const handlePickDate = (event, isKeyboardMovement = false) => { if (props.disabled) return; const target = event.target.closest("td"); if (!target) return; const row = target.parentNode.rowIndex - 1; const column = target.cellIndex; const cell = unref(rows)[row][column]; if (cell.disabled || cell.type === "week") return; const newDate = getDateOfCell(row, column); switch (props.selectionMode) { case "range": handleRangePick(newDate); break; case "date": emit("pick", newDate, isKeyboardMovement); break; case "week": handleWeekPick(newDate); break; case "dates": handleDatesPick(newDate, !!cell.selected); break; default: break; } }; const isWeekActive = (cell) => { if (props.selectionMode !== "week") return false; let newDate = props.date.startOf("day"); if (cell.type === "prev-month") newDate = newDate.subtract(1, "month"); if (cell.type === "next-month") newDate = newDate.add(1, "month"); newDate = newDate.date(Number.parseInt(cell.text, 10)); if (props.parsedValue && !isArray$1(props.parsedValue)) { const dayOffset = (props.parsedValue.day() - firstDayOfWeek + 7) % 7 - 1; return props.parsedValue.subtract(dayOffset, "day").isSame(newDate, "day"); } return false; }; return { WEEKS, rows, tbodyRef, currentCellRef, focus, isCurrent, isWeekActive, isSelectedCell, handlePickDate, handleMouseUp, handleMouseDown, handleMouseMove, handleFocus }; }; const useBasicDateTableDOM = (props, { isCurrent, isWeekActive }) => { const ns = useNamespace("date-table"); const { t } = useLocale(); const tableKls = computed(() => [ns.b(), ns.is("week-mode", props.selectionMode === "week" && !props.disabled)]); const tableLabel = computed(() => t("el.datepicker.dateTablePrompt")); const getCellClasses = (cell) => { const classes = []; if (isNormalDay(cell.type) && !cell.disabled) { classes.push("available"); if (cell.type === "today") classes.push("today"); } else classes.push(cell.type); if (isCurrent(cell)) classes.push("current"); if (cell.inRange && (isNormalDay(cell.type) || props.selectionMode === "week")) { classes.push("in-range"); if (cell.start) classes.push("start-date"); if (cell.end) classes.push("end-date"); } if (cell.disabled || props.disabled) classes.push("disabled"); if (cell.selected) classes.push("selected"); if (cell.customClass) classes.push(cell.customClass); return classes.join(" "); }; const getRowKls = (cell) => [ns.e("row"), { current: isWeekActive(cell) }]; return { tableKls, tableLabel, weekHeaderClass: ns.e("week-header"), getCellClasses, getRowKls, t }; }; //#endregion //#region ../../packages/components/date-picker-panel/src/props/basic-cell.ts const basicCellProps = buildProps({ cell: { type: definePropType(Object) } }); //#endregion //#region ../../packages/components/date-picker-panel/src/date-picker-com/basic-cell-render.tsx var basic_cell_render_default = /* @__PURE__ */ defineComponent({ name: "ElDatePickerCell", props: basicCellProps, setup(props) { const ns = useNamespace("date-table-cell"); const { slots } = inject(ROOT_PICKER_INJECTION_KEY); return () => { const { cell } = props; return renderSlot(slots, "default", { ...cell }, () => [createVNode("div", { "class": ns.b() }, [createVNode("span", { "class": ns.e("text") }, [cell?.renderText ?? cell?.text])])]); }; } }); //#endregion //#region ../../packages/components/date-picker-panel/src/date-picker-com/basic-date-table.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$51 = ["aria-label"]; const _hoisted_2$33 = ["aria-label"]; const _hoisted_3$15 = [ "aria-current", "aria-selected", "tabindex", "aria-disabled" ]; var basic_date_table_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ __name: "basic-date-table", props: basicDateTableProps, emits: basicDateTableEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const { WEEKS, rows, tbodyRef, currentCellRef, focus, isCurrent, isWeekActive, isSelectedCell, handlePickDate, handleMouseUp, handleMouseDown, handleMouseMove, handleFocus } = useBasicDateTable(props, __emit); const { tableLabel, tableKls, getCellClasses, getRowKls, weekHeaderClass, t } = useBasicDateTableDOM(props, { isCurrent, isWeekActive }); let isUnmounting = false; onBeforeUnmount(() => { isUnmounting = true; }); __expose({ /** * @description focus on current cell */ focus }); return (_ctx, _cache) => { return openBlock(), createElementBlock("table", { "aria-label": unref(tableLabel), class: normalizeClass(unref(tableKls)), cellspacing: "0", cellpadding: "0", role: "grid", onClick: _cache[1] || (_cache[1] = (...args) => unref(handlePickDate) && unref(handlePickDate)(...args)), onMousemove: _cache[2] || (_cache[2] = (...args) => unref(handleMouseMove) && unref(handleMouseMove)(...args)), onMousedown: _cache[3] || (_cache[3] = (...args) => unref(handleMouseDown) && unref(handleMouseDown)(...args)), onMouseup: _cache[4] || (_cache[4] = (...args) => unref(handleMouseUp) && unref(handleMouseUp)(...args)) }, [createElementVNode("tbody", { ref_key: "tbodyRef", ref: tbodyRef }, [createElementVNode("tr", null, [_ctx.showWeekNumber ? (openBlock(), createElementBlock("th", { key: 0, scope: "col", class: normalizeClass(unref(weekHeaderClass)) }, null, 2)) : createCommentVNode("v-if", true), (openBlock(true), createElementBlock(Fragment, null, renderList(unref(WEEKS), (week, key) => { return openBlock(), createElementBlock("th", { key, "aria-label": unref(t)("el.datepicker.weeksFull." + week), scope: "col" }, toDisplayString(unref(t)("el.datepicker.weeks." + week)), 9, _hoisted_2$33); }), 128))]), (openBlock(true), createElementBlock(Fragment, null, renderList(unref(rows), (row, rowKey) => { return openBlock(), createElementBlock("tr", { key: rowKey, class: normalizeClass(unref(getRowKls)(_ctx.showWeekNumber ? row[2] : row[1])) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(row, (cell, columnKey) => { return openBlock(), createElementBlock("td", { key: `${rowKey}.${columnKey}`, ref_for: true, ref: (el) => !unref(isUnmounting) && unref(isSelectedCell)(cell) && (currentCellRef.value = el), class: normalizeClass(unref(getCellClasses)(cell)), "aria-current": cell.isCurrent ? "date" : void 0, "aria-selected": cell.isCurrent, tabindex: _ctx.disabled ? void 0 : unref(isSelectedCell)(cell) ? 0 : -1, "aria-disabled": _ctx.disabled, onFocus: _cache[0] || (_cache[0] = (...args) => unref(handleFocus) && unref(handleFocus)(...args)) }, [createVNode(unref(basic_cell_render_default), { cell }, null, 8, ["cell"])], 42, _hoisted_3$15); }), 128))], 2); }), 128))], 512)], 42, _hoisted_1$51); }; } }); //#endregion //#region ../../packages/components/date-picker-panel/src/date-picker-com/basic-date-table.vue var basic_date_table_default = basic_date_table_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/date-picker-panel/src/props/basic-month-table.ts const basicMonthTableProps = buildProps({ ...datePickerSharedProps, selectionMode: selectionModeWithDefault("month") }); //#endregion //#region ../../packages/components/date-picker-panel/src/date-picker-com/basic-month-table.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$50 = ["aria-label"]; const _hoisted_2$32 = [ "aria-selected", "aria-label", "tabindex", "onKeydown" ]; var basic_month_table_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ __name: "basic-month-table", props: basicMonthTableProps, emits: [ "changerange", "pick", "select" ], setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const ns = useNamespace("month-table"); const { t, lang } = useLocale(); const tbodyRef = ref(); const currentCellRef = ref(); const months = ref(props.date.locale("en").localeData().monthsShort().map((_) => _.toLowerCase())); const tableRows = ref([ [], [], [] ]); const lastRow = ref(); const lastColumn = ref(); const rows = computed(() => { const rows = tableRows.value; const now = (0, import_dayjs_min.default)().locale(lang.value).startOf("month"); for (let i = 0; i < 3; i++) { const row = rows[i]; for (let j = 0; j < 4; j++) { const cell = row[j] ||= { row: i, column: j, type: "normal", inRange: false, start: false, end: false, text: -1, disabled: false, isSelected: false, customClass: void 0, date: void 0, dayjs: void 0, isCurrent: void 0, selected: void 0, renderText: void 0, timestamp: void 0 }; cell.type = "normal"; const index = i * 4 + j; const calTime = props.date.startOf("year").month(index); const calEndDate = props.rangeState.endDate || props.maxDate || props.rangeState.selecting && props.minDate || null; cell.inRange = !!(props.minDate && calTime.isSameOrAfter(props.minDate, "month") && calEndDate && calTime.isSameOrBefore(calEndDate, "month")) || !!(props.minDate && calTime.isSameOrBefore(props.minDate, "month") && calEndDate && calTime.isSameOrAfter(calEndDate, "month")); if (props.minDate?.isSameOrAfter(calEndDate)) { cell.start = !!(calEndDate && calTime.isSame(calEndDate, "month")); cell.end = props.minDate && calTime.isSame(props.minDate, "month"); } else { cell.start = !!(props.minDate && calTime.isSame(props.minDate, "month")); cell.end = !!(calEndDate && calTime.isSame(calEndDate, "month")); } if (now.isSame(calTime)) cell.type = "today"; const cellDate = calTime.toDate(); cell.text = index; cell.disabled = props.disabledDate?.(cellDate) || false; cell.date = cellDate; cell.customClass = props.cellClassName?.(cellDate); cell.dayjs = calTime; cell.timestamp = calTime.valueOf(); cell.isSelected = isSelectedCell(cell); } } return rows; }); const focus = () => { currentCellRef.value?.focus(); }; const getCellStyle = (cell) => { const style = {}; const year = props.date.year(); const today = /* @__PURE__ */ new Date(); const month = cell.text; style.disabled = props.disabled || (props.disabledDate ? datesInMonth(props.date, year, month, lang.value).every(props.disabledDate) : false); style.current = castArray(props.parsedValue).some((date) => import_dayjs_min.default.isDayjs(date) && date.year() === year && date.month() === month); style.today = today.getFullYear() === year && today.getMonth() === month; if (cell.customClass) style[cell.customClass] = true; if (cell.inRange) { style["in-range"] = true; if (cell.start) style["start-date"] = true; if (cell.end) style["end-date"] = true; } return style; }; const isSelectedCell = (cell) => { const year = props.date.year(); const month = cell.text; return castArray(props.date).some((date) => date.year() === year && date.month() === month); }; const handleMouseMove = (event) => { if (!props.rangeState.selecting) return; let target = event.target; if (target.tagName === "SPAN") target = target.parentNode?.parentNode; if (target.tagName === "DIV") target = target.parentNode; if (target.tagName !== "TD") return; const row = target.parentNode.rowIndex; const column = target.cellIndex; if (rows.value[row][column].disabled) return; if (row !== lastRow.value || column !== lastColumn.value) { lastRow.value = row; lastColumn.value = column; emit("changerange", { selecting: true, endDate: props.date.startOf("year").month(row * 4 + column) }); } }; const handleMonthTableClick = (event) => { if (props.disabled) return; const target = event.target?.closest("td"); if (target?.tagName !== "TD") return; if (hasClass(target, "disabled")) return; const column = target.cellIndex; const month = target.parentNode.rowIndex * 4 + column; const newDate = props.date.startOf("year").month(month); if (props.selectionMode === "months") { if (event.type === "keydown") { emit("pick", castArray(props.parsedValue), false); return; } const newMonth = getValidDateOfMonth(props.date, props.date.year(), month, lang.value, props.disabledDate); emit("pick", hasClass(target, "current") ? castArray(props.parsedValue).filter((d) => d?.year() !== newMonth.year() || d?.month() !== newMonth.month()) : castArray(props.parsedValue).concat([(0, import_dayjs_min.default)(newMonth)])); } else if (props.selectionMode === "range") if (!props.rangeState.selecting) { emit("pick", { minDate: newDate, maxDate: null }); emit("select", true); } else { if (props.minDate && newDate >= props.minDate) emit("pick", { minDate: props.minDate, maxDate: newDate }); else emit("pick", { minDate: newDate, maxDate: props.minDate }); emit("select", false); } else emit("pick", month); }; watch(() => props.date, async () => { if (tbodyRef.value?.contains(document.activeElement)) { await nextTick(); currentCellRef.value?.focus(); } }); __expose({ /** * @description focus current cell */ focus }); return (_ctx, _cache) => { return openBlock(), createElementBlock("table", { role: "grid", "aria-label": unref(t)("el.datepicker.monthTablePrompt"), class: normalizeClass(unref(ns).b()), onClick: handleMonthTableClick, onMousemove: handleMouseMove }, [createElementVNode("tbody", { ref_key: "tbodyRef", ref: tbodyRef }, [(openBlock(true), createElementBlock(Fragment, null, renderList(rows.value, (row, key) => { return openBlock(), createElementBlock("tr", { key }, [(openBlock(true), createElementBlock(Fragment, null, renderList(row, (cell, key_) => { return openBlock(), createElementBlock("td", { key: key_, ref_for: true, ref: (el) => cell.isSelected && (currentCellRef.value = el), class: normalizeClass(getCellStyle(cell)), "aria-selected": !!cell.isSelected, "aria-label": unref(t)(`el.datepicker.month${+cell.text + 1}`), tabindex: cell.isSelected ? 0 : -1, onKeydown: [withKeys(withModifiers(handleMonthTableClick, ["prevent", "stop"]), ["space"]), withKeys(withModifiers(handleMonthTableClick, ["prevent", "stop"]), ["enter"])] }, [createVNode(unref(basic_cell_render_default), { cell: { ...cell, renderText: unref(t)("el.datepicker.months." + months.value[cell.text]) } }, null, 8, ["cell"])], 42, _hoisted_2$32); }), 128))]); }), 128))], 512)], 42, _hoisted_1$50); }; } }); //#endregion //#region ../../packages/components/date-picker-panel/src/date-picker-com/basic-month-table.vue var basic_month_table_default = basic_month_table_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/date-picker-panel/src/props/basic-year-table.ts const basicYearTableProps = buildProps({ ...datePickerSharedProps, selectionMode: selectionModeWithDefault("year") }); //#endregion //#region ../../packages/components/date-picker-panel/src/date-picker-com/basic-year-table.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$49 = ["aria-label"]; const _hoisted_2$31 = [ "aria-selected", "aria-label", "tabindex", "onKeydown" ]; var basic_year_table_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ __name: "basic-year-table", props: basicYearTableProps, emits: [ "changerange", "pick", "select" ], setup(__props, { expose: __expose, emit: __emit }) { const datesInYear = (year, lang) => { const firstDay = (0, import_dayjs_min.default)(String(year)).locale(lang).startOf("year"); return rangeArr(firstDay.endOf("year").dayOfYear()).map((n) => firstDay.add(n, "day").toDate()); }; const props = __props; const emit = __emit; const ns = useNamespace("year-table"); const { t, lang } = useLocale(); const tbodyRef = ref(); const currentCellRef = ref(); const startYear = computed(() => { return Math.floor(props.date.year() / 10) * 10; }); const tableRows = ref([ [], [], [] ]); const lastRow = ref(); const lastColumn = ref(); const rows = computed(() => { const rows = tableRows.value; const now = (0, import_dayjs_min.default)().locale(lang.value).startOf("year"); for (let i = 0; i < 3; i++) { const row = rows[i]; for (let j = 0; j < 4; j++) { if (i * 4 + j >= 10) break; let cell = row[j]; if (!cell) cell = { row: i, column: j, type: "normal", inRange: false, start: false, end: false, text: -1, disabled: false, isSelected: false, customClass: void 0, date: void 0, dayjs: void 0, isCurrent: void 0, selected: void 0, renderText: void 0, timestamp: void 0 }; cell.type = "normal"; const index = i * 4 + j + startYear.value; const calTime = (0, import_dayjs_min.default)().year(index); const calEndDate = props.rangeState.endDate || props.maxDate || props.rangeState.selecting && props.minDate || null; cell.inRange = !!(props.minDate && calTime.isSameOrAfter(props.minDate, "year") && calEndDate && calTime.isSameOrBefore(calEndDate, "year")) || !!(props.minDate && calTime.isSameOrBefore(props.minDate, "year") && calEndDate && calTime.isSameOrAfter(calEndDate, "year")); if (props.minDate?.isSameOrAfter(calEndDate)) { cell.start = !!(calEndDate && calTime.isSame(calEndDate, "year")); cell.end = !!(props.minDate && calTime.isSame(props.minDate, "year")); } else { cell.start = !!(props.minDate && calTime.isSame(props.minDate, "year")); cell.end = !!(calEndDate && calTime.isSame(calEndDate, "year")); } if (now.isSame(calTime)) cell.type = "today"; cell.text = index; const cellDate = calTime.toDate(); cell.disabled = props.disabledDate?.(cellDate) || false; cell.date = cellDate; cell.customClass = props.cellClassName?.(cellDate); cell.dayjs = calTime; cell.timestamp = calTime.valueOf(); cell.isSelected = isSelectedCell(cell); row[j] = cell; } } return rows; }); const focus = () => { currentCellRef.value?.focus(); }; const getCellKls = (cell) => { const kls = {}; const today = (0, import_dayjs_min.default)().locale(lang.value); const year = cell.text; kls.disabled = props.disabled || (props.disabledDate ? datesInYear(year, lang.value).every(props.disabledDate) : false); kls.today = today.year() === year; kls.current = castArray(props.parsedValue).some((d) => d.year() === year); if (cell.customClass) kls[cell.customClass] = true; if (cell.inRange) { kls["in-range"] = true; if (cell.start) kls["start-date"] = true; if (cell.end) kls["end-date"] = true; } return kls; }; const isSelectedCell = (cell) => { const year = cell.text; return castArray(props.date).some((date) => date.year() === year); }; const handleYearTableClick = (event) => { if (props.disabled) return; const target = event.target?.closest("td"); if (!target || !target.textContent || hasClass(target, "disabled")) return; const column = target.cellIndex; const selectedYear = target.parentNode.rowIndex * 4 + column + startYear.value; const newDate = (0, import_dayjs_min.default)().year(selectedYear); if (props.selectionMode === "range") if (!props.rangeState.selecting) { emit("pick", { minDate: newDate, maxDate: null }); emit("select", true); } else { if (props.minDate && newDate >= props.minDate) emit("pick", { minDate: props.minDate, maxDate: newDate }); else emit("pick", { minDate: newDate, maxDate: props.minDate }); emit("select", false); } else if (props.selectionMode === "years") { if (event.type === "keydown") { emit("pick", castArray(props.parsedValue), false); return; } const vaildYear = getValidDateOfYear(newDate.startOf("year"), lang.value, props.disabledDate); emit("pick", hasClass(target, "current") ? castArray(props.parsedValue).filter((d) => d?.year() !== selectedYear) : castArray(props.parsedValue).concat([vaildYear])); } else emit("pick", selectedYear); }; const handleMouseMove = (event) => { if (!props.rangeState.selecting) return; const target = event.target?.closest("td"); if (!target) return; const row = target.parentNode.rowIndex; const column = target.cellIndex; if (rows.value[row][column].disabled) return; if (row !== lastRow.value || column !== lastColumn.value) { lastRow.value = row; lastColumn.value = column; emit("changerange", { selecting: true, endDate: (0, import_dayjs_min.default)().year(startYear.value).add(row * 4 + column, "year") }); } }; watch(() => props.date, async () => { if (tbodyRef.value?.contains(document.activeElement)) { await nextTick(); currentCellRef.value?.focus(); } }); __expose({ /** * @description focus on the current cell */ focus }); return (_ctx, _cache) => { return openBlock(), createElementBlock("table", { role: "grid", "aria-label": unref(t)("el.datepicker.yearTablePrompt"), class: normalizeClass(unref(ns).b()), onClick: handleYearTableClick, onMousemove: handleMouseMove }, [createElementVNode("tbody", { ref_key: "tbodyRef", ref: tbodyRef }, [(openBlock(true), createElementBlock(Fragment, null, renderList(rows.value, (row, rowKey) => { return openBlock(), createElementBlock("tr", { key: rowKey }, [(openBlock(true), createElementBlock(Fragment, null, renderList(row, (cell, cellKey) => { return openBlock(), createElementBlock("td", { key: `${rowKey}_${cellKey}`, ref_for: true, ref: (el) => cell.isSelected && (currentCellRef.value = el), class: normalizeClass(["available", getCellKls(cell)]), "aria-selected": cell.isSelected, "aria-label": String(cell.text), tabindex: cell.isSelected ? 0 : -1, onKeydown: [withKeys(withModifiers(handleYearTableClick, ["prevent", "stop"]), ["space"]), withKeys(withModifiers(handleYearTableClick, ["prevent", "stop"]), ["enter"])] }, [createVNode(unref(basic_cell_render_default), { cell }, null, 8, ["cell"])], 42, _hoisted_2$31); }), 128))]); }), 128))], 512)], 42, _hoisted_1$49); }; } }); //#endregion //#region ../../packages/components/date-picker-panel/src/date-picker-com/basic-year-table.vue var basic_year_table_default = basic_year_table_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/date-picker-panel/src/date-picker-com/panel-date-pick.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$48 = ["disabled", "onClick"]; const _hoisted_2$30 = ["aria-label", "disabled"]; const _hoisted_3$14 = ["aria-label", "disabled"]; const _hoisted_4$11 = ["tabindex", "aria-disabled"]; const _hoisted_5$8 = ["tabindex", "aria-disabled"]; const _hoisted_6$3 = ["aria-label", "disabled"]; const _hoisted_7$2 = ["aria-label", "disabled"]; var panel_date_pick_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ __name: "panel-date-pick", props: panelDatePickProps, emits: [ "pick", "set-picker-option", "panel-change" ], setup(__props, { emit: __emit }) { const timeWithinRange = (_, __, ___) => true; const props = __props; const contextEmit = __emit; const ppNs = useNamespace("picker-panel"); const dpNs = useNamespace("date-picker"); const attrs = useAttrs$1(); const slots = useSlots(); const { t, lang } = useLocale(); const pickerBase = inject(PICKER_BASE_INJECTION_KEY); const isDefaultFormat = inject(ROOT_PICKER_IS_DEFAULT_FORMAT_INJECTION_KEY, void 0); const { shortcuts, disabledDate, cellClassName, defaultTime } = pickerBase.props; const defaultValue = toRef(pickerBase.props, "defaultValue"); const currentViewRef = ref(); const innerDate = ref((0, import_dayjs_min.default)().locale(lang.value)); const isChangeToNow = ref(false); let isShortcut = false; const defaultTimeD = computed(() => { return (0, import_dayjs_min.default)(defaultTime).locale(lang.value); }); const month = computed(() => { return innerDate.value.month(); }); const year = computed(() => { return innerDate.value.year(); }); const selectableRange = ref([]); const userInputDate = ref(null); const userInputTime = ref(null); const checkDateWithinRange = (date) => { return selectableRange.value.length > 0 ? timeWithinRange(date, selectableRange.value, props.format || "HH:mm:ss") : true; }; const formatEmit = (emitDayjs) => { if (defaultTime && !visibleTime.value && !isChangeToNow.value && !isShortcut) return defaultTimeD.value.year(emitDayjs.year()).month(emitDayjs.month()).date(emitDayjs.date()); if (showTime.value) return emitDayjs.millisecond(0); return emitDayjs.startOf("day"); }; const emit = (value, ...args) => { if (!value) contextEmit("pick", value, ...args); else if (isArray$1(value)) contextEmit("pick", value.map(formatEmit), ...args); else contextEmit("pick", formatEmit(value), ...args); userInputDate.value = null; userInputTime.value = null; isChangeToNow.value = false; isShortcut = false; }; const handleDatePick = async (value, keepOpen) => { if (selectionMode.value === "date" && import_dayjs_min.default.isDayjs(value)) { const parsedDateValue = extractFirst(props.parsedValue); let newDate = parsedDateValue ? parsedDateValue.year(value.year()).month(value.month()).date(value.date()) : value; if (!checkDateWithinRange(newDate)) newDate = selectableRange.value[0][0].year(value.year()).month(value.month()).date(value.date()); innerDate.value = newDate; emit(newDate, showTime.value || keepOpen); } else if (selectionMode.value === "week") emit(value.date); else if (selectionMode.value === "dates") emit(value, true); }; const moveByMonth = (forward) => { const action = forward ? "add" : "subtract"; innerDate.value = innerDate.value[action](1, "month"); handlePanelChange("month"); }; const moveByYear = (forward) => { const currentDate = innerDate.value; const action = forward ? "add" : "subtract"; innerDate.value = currentView.value === "year" ? currentDate[action](10, "year") : currentDate[action](1, "year"); handlePanelChange("year"); }; const currentView = ref("date"); const yearLabel = computed(() => { const yearTranslation = t("el.datepicker.year"); if (currentView.value === "year") { const startYear = Math.floor(year.value / 10) * 10; if (yearTranslation) return `${startYear} ${yearTranslation} - ${startYear + 9} ${yearTranslation}`; return `${startYear} - ${startYear + 9}`; } return `${year.value} ${yearTranslation}`; }); const handleShortcutClick = (shortcut) => { const shortcutValue = isFunction$1(shortcut.value) ? shortcut.value() : shortcut.value; if (shortcutValue) { isShortcut = true; emit((0, import_dayjs_min.default)(shortcutValue).locale(lang.value)); return; } if (shortcut.onClick) shortcut.onClick({ attrs, slots, emit: contextEmit }); }; const selectionMode = computed(() => { const { type } = props; if ([ "week", "month", "months", "year", "years", "dates" ].includes(type)) return type; return "date"; }); const isMultipleType = computed(() => { return selectionMode.value === "dates" || selectionMode.value === "months" || selectionMode.value === "years"; }); const keyboardMode = computed(() => { return selectionMode.value === "date" ? currentView.value : selectionMode.value; }); const hasShortcuts = computed(() => !!shortcuts.length); const handleMonthPick = async (month, keepOpen) => { if (selectionMode.value === "month") { innerDate.value = getValidDateOfMonth(innerDate.value, innerDate.value.year(), month, lang.value, disabledDate); emit(innerDate.value, false); } else if (selectionMode.value === "months") emit(month, keepOpen ?? true); else { innerDate.value = getValidDateOfMonth(innerDate.value, innerDate.value.year(), month, lang.value, disabledDate); currentView.value = "date"; if ([ "month", "year", "date", "week" ].includes(selectionMode.value)) { emit(innerDate.value, true); await nextTick(); handleFocusPicker(); } } handlePanelChange("month"); }; const handleYearPick = async (year, keepOpen) => { if (selectionMode.value === "year") { innerDate.value = getValidDateOfYear(innerDate.value.startOf("year").year(year), lang.value, disabledDate); emit(innerDate.value, false); } else if (selectionMode.value === "years") emit(year, keepOpen ?? true); else { innerDate.value = getValidDateOfYear(innerDate.value.year(year), lang.value, disabledDate); currentView.value = "month"; if ([ "month", "year", "date", "week" ].includes(selectionMode.value)) { emit(innerDate.value, true); await nextTick(); handleFocusPicker(); } } handlePanelChange("year"); }; const dateDisabled = useFormDisabled(); const showPicker = async (view) => { if (dateDisabled.value) return; currentView.value = view; await nextTick(); handleFocusPicker(); }; const showTime = computed(() => props.type === "datetime" || props.type === "datetimerange"); const footerVisible = computed(() => { const showDateFooter = showTime.value || selectionMode.value === "dates"; const showYearFooter = selectionMode.value === "years"; const showMonthFooter = selectionMode.value === "months"; const isDateView = currentView.value === "date"; const isYearView = currentView.value === "year"; const isMonthView = currentView.value === "month"; return showDateFooter && isDateView || showYearFooter && isYearView || showMonthFooter && isMonthView; }); const footerFilled = computed(() => !isMultipleType.value && props.showNow || props.showConfirm); const disabledConfirm = computed(() => { if (!disabledDate) return false; if (!props.parsedValue) return true; if (isArray$1(props.parsedValue)) return disabledDate(props.parsedValue[0].toDate()); return disabledDate(props.parsedValue.toDate()); }); const onConfirm = () => { if (isMultipleType.value) emit(props.parsedValue); else { let result = extractFirst(props.parsedValue); if (!result) { const defaultTimeD = (0, import_dayjs_min.default)(defaultTime).locale(lang.value); const defaultValueD = getDefaultValue(); result = defaultTimeD.year(defaultValueD.year()).month(defaultValueD.month()).date(defaultValueD.date()); } innerDate.value = result; emit(result); } }; const disabledNow = computed(() => { if (!disabledDate) return false; return disabledDate((0, import_dayjs_min.default)().locale(lang.value).toDate()); }); const changeToNow = () => { const nowDate = (0, import_dayjs_min.default)().locale(lang.value).toDate(); isChangeToNow.value = true; if ((!disabledDate || !disabledDate(nowDate)) && checkDateWithinRange(nowDate)) { innerDate.value = (0, import_dayjs_min.default)().locale(lang.value); emit(innerDate.value); } }; const timeFormat = computed(() => { return props.timeFormat || extractTimeFormat(props.format) || "HH:mm:ss"; }); const dateFormat = computed(() => { return props.dateFormat || extractDateFormat(props.format) || "YYYY-MM-DD"; }); const visibleTime = computed(() => { if (userInputTime.value) return userInputTime.value; if (!props.parsedValue && !defaultValue.value) return; return (extractFirst(props.parsedValue) || innerDate.value).format(timeFormat.value); }); const visibleDate = computed(() => { if (userInputDate.value) return userInputDate.value; if (!props.parsedValue && !defaultValue.value) return; return (extractFirst(props.parsedValue) || innerDate.value).format(dateFormat.value); }); const timePickerVisible = ref(false); const onTimePickerInputFocus = () => { timePickerVisible.value = true; }; const handleTimePickClose = () => { timePickerVisible.value = false; }; const getUnits = (date) => { return { hour: date.hour(), minute: date.minute(), second: date.second(), year: date.year(), month: date.month(), date: date.date() }; }; const handleTimePick = (value, visible, first) => { const { hour, minute, second } = getUnits(value); const parsedDateValue = extractFirst(props.parsedValue); innerDate.value = parsedDateValue ? parsedDateValue.hour(hour).minute(minute).second(second) : value; emit(innerDate.value, true); if (!first) timePickerVisible.value = visible; }; const handleVisibleTimeChange = (value) => { const newDate = (0, import_dayjs_min.default)(value, timeFormat.value).locale(lang.value); if (newDate.isValid() && checkDateWithinRange(newDate)) { const { year, month, date } = getUnits(innerDate.value); innerDate.value = newDate.year(year).month(month).date(date); userInputTime.value = null; timePickerVisible.value = false; emit(innerDate.value, true); } }; const handleVisibleDateChange = (value) => { const newDate = correctlyParseUserInput(value, dateFormat.value, lang.value, isDefaultFormat); if (newDate.isValid()) { if (disabledDate && disabledDate(newDate.toDate())) return; const { hour, minute, second } = getUnits(innerDate.value); innerDate.value = newDate.hour(hour).minute(minute).second(second); userInputDate.value = null; emit(innerDate.value, true); } }; const isValidValue = (date) => { return import_dayjs_min.default.isDayjs(date) && date.isValid() && (disabledDate ? !disabledDate(date.toDate()) : true); }; const parseUserInput = (value) => { return correctlyParseUserInput(value, props.format, lang.value, isDefaultFormat); }; const getDefaultValue = () => { const parseDate = (0, import_dayjs_min.default)(defaultValue.value).locale(lang.value); if (!defaultValue.value) { const defaultTimeDValue = defaultTimeD.value; return (0, import_dayjs_min.default)().hour(defaultTimeDValue.hour()).minute(defaultTimeDValue.minute()).second(defaultTimeDValue.second()).locale(lang.value); } return parseDate; }; const handleFocusPicker = () => { if ([ "week", "month", "year", "date" ].includes(selectionMode.value)) currentViewRef.value?.focus(); }; const _handleFocusPicker = () => { handleFocusPicker(); if (selectionMode.value === "week") handleKeyControl(EVENT_CODE.down); }; const handleKeydownTable = (event) => { const code = getEventCode(event); if ([ EVENT_CODE.up, EVENT_CODE.down, EVENT_CODE.left, EVENT_CODE.right, EVENT_CODE.home, EVENT_CODE.end, EVENT_CODE.pageUp, EVENT_CODE.pageDown ].includes(code)) { handleKeyControl(code); event.stopPropagation(); event.preventDefault(); } if ([ EVENT_CODE.enter, EVENT_CODE.space, EVENT_CODE.numpadEnter ].includes(code) && userInputDate.value === null && userInputTime.value === null) { event.preventDefault(); emit(innerDate.value, false); } }; const handleKeyControl = (code) => { const { up, down, left, right, home, end, pageUp, pageDown } = EVENT_CODE; const mapping = { year: { [up]: -4, [down]: 4, [left]: -1, [right]: 1, offset: (date, step) => date.setFullYear(date.getFullYear() + step) }, month: { [up]: -4, [down]: 4, [left]: -1, [right]: 1, offset: (date, step) => date.setMonth(date.getMonth() + step) }, week: { [up]: -1, [down]: 1, [left]: -1, [right]: 1, offset: (date, step) => date.setDate(date.getDate() + step * 7) }, date: { [up]: -7, [down]: 7, [left]: -1, [right]: 1, [home]: (date) => -date.getDay(), [end]: (date) => -date.getDay() + 6, [pageUp]: (date) => -new Date(date.getFullYear(), date.getMonth(), 0).getDate(), [pageDown]: (date) => new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate(), offset: (date, step) => date.setDate(date.getDate() + step) } }; const newDate = innerDate.value.toDate(); while (Math.abs(innerDate.value.diff(newDate, "year", true)) < 1) { const map = mapping[keyboardMode.value]; if (!map) return; map.offset(newDate, isFunction$1(map[code]) ? map[code](newDate) : map[code] ?? 0); if (disabledDate && disabledDate(newDate)) break; const result = (0, import_dayjs_min.default)(newDate).locale(lang.value); innerDate.value = result; contextEmit("pick", result, true); break; } }; const handlePanelChange = (mode) => { contextEmit("panel-change", innerDate.value.toDate(), mode, currentView.value); }; watch(() => selectionMode.value, (val) => { if (["month", "year"].includes(val)) { currentView.value = val; return; } else if (val === "years") { currentView.value = "year"; return; } else if (val === "months") { currentView.value = "month"; return; } currentView.value = "date"; }, { immediate: true }); watch(() => defaultValue.value, (val) => { if (val) innerDate.value = getDefaultValue(); }, { immediate: true }); watch(() => props.parsedValue, (val) => { if (val) { if (isMultipleType.value) return; if (isArray$1(val)) return; innerDate.value = val; } else innerDate.value = getDefaultValue(); }, { immediate: true }); contextEmit("set-picker-option", ["isValidValue", isValidValue]); contextEmit("set-picker-option", ["parseUserInput", parseUserInput]); contextEmit("set-picker-option", ["handleFocusPicker", _handleFocusPicker]); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass([ unref(ppNs).b(), unref(dpNs).b(), unref(ppNs).is("border", _ctx.border), unref(ppNs).is("disabled", unref(dateDisabled)), { "has-sidebar": _ctx.$slots.sidebar || hasShortcuts.value, "has-time": showTime.value } ]) }, [createElementVNode("div", { class: normalizeClass(unref(ppNs).e("body-wrapper")) }, [ renderSlot(_ctx.$slots, "sidebar", { class: normalizeClass(unref(ppNs).e("sidebar")) }), hasShortcuts.value ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ppNs).e("sidebar")) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(shortcuts), (shortcut, key) => { return openBlock(), createElementBlock("button", { key, type: "button", disabled: unref(dateDisabled), class: normalizeClass(unref(ppNs).e("shortcut")), onClick: ($event) => handleShortcutClick(shortcut) }, toDisplayString(shortcut.text), 11, _hoisted_1$48); }), 128))], 2)) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass(unref(ppNs).e("body")) }, [ showTime.value ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(dpNs).e("time-header")) }, [createElementVNode("span", { class: normalizeClass(unref(dpNs).e("editor-wrap")) }, [createVNode(unref(ElInput), { placeholder: unref(t)("el.datepicker.selectDate"), "model-value": visibleDate.value, size: "small", "validate-event": false, disabled: unref(dateDisabled), readonly: !_ctx.editable, onInput: _cache[0] || (_cache[0] = (val) => userInputDate.value = val), onChange: handleVisibleDateChange }, null, 8, [ "placeholder", "model-value", "disabled", "readonly" ])], 2), withDirectives((openBlock(), createElementBlock("span", { class: normalizeClass(unref(dpNs).e("editor-wrap")) }, [createVNode(unref(ElInput), { placeholder: unref(t)("el.datepicker.selectTime"), "model-value": visibleTime.value, size: "small", "validate-event": false, disabled: unref(dateDisabled), readonly: !_ctx.editable, onFocus: onTimePickerInputFocus, onInput: _cache[1] || (_cache[1] = (val) => userInputTime.value = val), onChange: handleVisibleTimeChange }, null, 8, [ "placeholder", "model-value", "disabled", "readonly" ]), createVNode(unref(panel_time_pick_default), { visible: timePickerVisible.value, format: timeFormat.value, "parsed-value": innerDate.value, onPick: handleTimePick }, null, 8, [ "visible", "format", "parsed-value" ])], 2)), [[unref(ClickOutside), handleTimePickClose]])], 2)) : createCommentVNode("v-if", true), withDirectives(createElementVNode("div", { class: normalizeClass([unref(dpNs).e("header"), (currentView.value === "year" || currentView.value === "month") && unref(dpNs).em("header", "bordered")]) }, [ createElementVNode("span", { class: normalizeClass(unref(dpNs).e("prev-btn")) }, [createElementVNode("button", { type: "button", "aria-label": unref(t)(`el.datepicker.prevYear`), class: normalizeClass(["d-arrow-left", unref(ppNs).e("icon-btn")]), disabled: unref(dateDisabled), onClick: _cache[2] || (_cache[2] = ($event) => moveByYear(false)) }, [renderSlot(_ctx.$slots, "prev-year", {}, () => [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(d_arrow_left_default))]), _: 1 })])], 10, _hoisted_2$30), withDirectives(createElementVNode("button", { type: "button", "aria-label": unref(t)(`el.datepicker.prevMonth`), class: normalizeClass([unref(ppNs).e("icon-btn"), "arrow-left"]), disabled: unref(dateDisabled), onClick: _cache[3] || (_cache[3] = ($event) => moveByMonth(false)) }, [renderSlot(_ctx.$slots, "prev-month", {}, () => [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(arrow_left_default))]), _: 1 })])], 10, _hoisted_3$14), [[vShow, currentView.value === "date"]])], 2), createElementVNode("span", { role: "button", class: normalizeClass(unref(dpNs).e("header-label")), "aria-live": "polite", tabindex: _ctx.disabled ? void 0 : 0, "aria-disabled": _ctx.disabled, onKeydown: _cache[4] || (_cache[4] = withKeys(($event) => showPicker("year"), ["enter"])), onClick: _cache[5] || (_cache[5] = ($event) => showPicker("year")) }, toDisplayString(yearLabel.value), 43, _hoisted_4$11), withDirectives(createElementVNode("span", { role: "button", "aria-live": "polite", tabindex: _ctx.disabled ? void 0 : 0, "aria-disabled": _ctx.disabled, class: normalizeClass([unref(dpNs).e("header-label"), { active: currentView.value === "month" }]), onKeydown: _cache[6] || (_cache[6] = withKeys(($event) => showPicker("month"), ["enter"])), onClick: _cache[7] || (_cache[7] = ($event) => showPicker("month")) }, toDisplayString(unref(t)(`el.datepicker.month${month.value + 1}`)), 43, _hoisted_5$8), [[vShow, currentView.value === "date"]]), createElementVNode("span", { class: normalizeClass(unref(dpNs).e("next-btn")) }, [withDirectives(createElementVNode("button", { type: "button", "aria-label": unref(t)(`el.datepicker.nextMonth`), class: normalizeClass([unref(ppNs).e("icon-btn"), "arrow-right"]), disabled: unref(dateDisabled), onClick: _cache[8] || (_cache[8] = ($event) => moveByMonth(true)) }, [renderSlot(_ctx.$slots, "next-month", {}, () => [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(arrow_right_default))]), _: 1 })])], 10, _hoisted_6$3), [[vShow, currentView.value === "date"]]), createElementVNode("button", { type: "button", "aria-label": unref(t)(`el.datepicker.nextYear`), class: normalizeClass([unref(ppNs).e("icon-btn"), "d-arrow-right"]), disabled: unref(dateDisabled), onClick: _cache[9] || (_cache[9] = ($event) => moveByYear(true)) }, [renderSlot(_ctx.$slots, "next-year", {}, () => [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(d_arrow_right_default))]), _: 1 })])], 10, _hoisted_7$2)], 2) ], 2), [[vShow, currentView.value !== "time"]]), createElementVNode("div", { class: normalizeClass(unref(ppNs).e("content")), onKeydown: handleKeydownTable }, [ currentView.value === "date" ? (openBlock(), createBlock(basic_date_table_default, { key: 0, ref_key: "currentViewRef", ref: currentViewRef, "selection-mode": selectionMode.value, date: innerDate.value, "parsed-value": _ctx.parsedValue, "disabled-date": unref(disabledDate), disabled: unref(dateDisabled), "cell-class-name": unref(cellClassName), "show-week-number": _ctx.showWeekNumber, onPick: handleDatePick }, null, 8, [ "selection-mode", "date", "parsed-value", "disabled-date", "disabled", "cell-class-name", "show-week-number" ])) : createCommentVNode("v-if", true), currentView.value === "year" ? (openBlock(), createBlock(basic_year_table_default, { key: 1, ref_key: "currentViewRef", ref: currentViewRef, "selection-mode": selectionMode.value, date: innerDate.value, "disabled-date": unref(disabledDate), disabled: unref(dateDisabled), "parsed-value": _ctx.parsedValue, "cell-class-name": unref(cellClassName), onPick: handleYearPick }, null, 8, [ "selection-mode", "date", "disabled-date", "disabled", "parsed-value", "cell-class-name" ])) : createCommentVNode("v-if", true), currentView.value === "month" ? (openBlock(), createBlock(basic_month_table_default, { key: 2, ref_key: "currentViewRef", ref: currentViewRef, "selection-mode": selectionMode.value, date: innerDate.value, "parsed-value": _ctx.parsedValue, "disabled-date": unref(disabledDate), disabled: unref(dateDisabled), "cell-class-name": unref(cellClassName), onPick: handleMonthPick }, null, 8, [ "selection-mode", "date", "parsed-value", "disabled-date", "disabled", "cell-class-name" ])) : createCommentVNode("v-if", true) ], 34) ], 2) ], 2), _ctx.showFooter && footerVisible.value && footerFilled.value ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ppNs).e("footer")) }, [withDirectives(createVNode(unref(ElButton), { text: "", size: "small", class: normalizeClass(unref(ppNs).e("link-btn")), disabled: disabledNow.value, onClick: changeToNow }, { default: withCtx(() => [createTextVNode(toDisplayString(unref(t)("el.datepicker.now")), 1)]), _: 1 }, 8, ["class", "disabled"]), [[vShow, !isMultipleType.value && _ctx.showNow]]), _ctx.showConfirm ? (openBlock(), createBlock(unref(ElButton), { key: 0, plain: "", size: "small", class: normalizeClass(unref(ppNs).e("link-btn")), disabled: disabledConfirm.value, onClick: onConfirm }, { default: withCtx(() => [createTextVNode(toDisplayString(unref(t)("el.datepicker.confirm")), 1)]), _: 1 }, 8, ["class", "disabled"])) : createCommentVNode("v-if", true)], 2)) : createCommentVNode("v-if", true)], 2); }; } }); //#endregion //#region ../../packages/components/date-picker-panel/src/date-picker-com/panel-date-pick.vue var panel_date_pick_default = panel_date_pick_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/date-picker-panel/src/props/panel-date-range.ts const panelDateRangeProps = buildProps({ ...panelSharedProps, ...panelRangeSharedProps }); //#endregion //#region ../../packages/components/date-picker-panel/src/composables/use-shortcut.ts const useShortcut = (lang) => { const { emit } = getCurrentInstance(); const attrs = useAttrs$1(); const slots = useSlots(); const handleShortcutClick = (shortcut) => { const shortcutValues = isFunction$1(shortcut.value) ? shortcut.value() : shortcut.value; if (shortcutValues) { emit("pick", [(0, import_dayjs_min.default)(shortcutValues[0]).locale(lang.value), (0, import_dayjs_min.default)(shortcutValues[1]).locale(lang.value)]); return; } if (shortcut.onClick) shortcut.onClick({ attrs, slots, emit }); }; return handleShortcutClick; }; //#endregion //#region ../../packages/components/date-picker-panel/src/composables/use-range-picker.ts const useRangePicker = (props, { defaultValue, defaultTime, leftDate, rightDate, step, unit, sortDates }) => { const { emit } = getCurrentInstance(); const { pickerNs } = inject(ROOT_PICKER_INJECTION_KEY); const drpNs = useNamespace("date-range-picker"); const { t, lang } = useLocale(); const handleShortcutClick = useShortcut(lang); const minDate = ref(); const maxDate = ref(); const rangeState = ref({ endDate: null, selecting: false }); const handleChangeRange = (val) => { rangeState.value = val; }; const handleRangeConfirm = (visible = false) => { const _minDate = unref(minDate); const _maxDate = unref(maxDate); if (isValidRange([_minDate, _maxDate])) emit("pick", [_minDate, _maxDate], visible); }; const onSelect = (selecting) => { rangeState.value.selecting = selecting; if (!selecting) rangeState.value.endDate = null; }; const parseValue = (parsedValue) => { if (isArray$1(parsedValue) && parsedValue.length === 2) { const [start, end] = parsedValue; minDate.value = start; leftDate.value = start; maxDate.value = end; sortDates(unref(minDate), unref(maxDate)); } else restoreDefault(); }; const restoreDefault = () => { let [start, end] = getDefaultValue(unref(defaultValue), { lang: unref(lang), step, unit, unlinkPanels: props.unlinkPanels }); const getShift = (day) => { return day.diff(day.startOf("d"), "ms"); }; const maybeTimes = unref(defaultTime); if (maybeTimes) { let leftShift = 0; let rightShift = 0; if (isArray$1(maybeTimes)) { const [timeStart, timeEnd] = maybeTimes.map(import_dayjs_min.default); leftShift = getShift(timeStart); rightShift = getShift(timeEnd); } else { const shift = getShift((0, import_dayjs_min.default)(maybeTimes)); leftShift = shift; rightShift = shift; } start = start.startOf("d").add(leftShift, "ms"); end = end.startOf("d").add(rightShift, "ms"); } minDate.value = void 0; maxDate.value = void 0; leftDate.value = start; rightDate.value = end; }; watch(defaultValue, (val) => { if (val) restoreDefault(); }, { immediate: true }); watch(() => props.parsedValue, (parsedValue) => { if (!parsedValue?.length || !isEqual$1(parsedValue, [minDate.value, maxDate.value])) parseValue(parsedValue); }, { immediate: true }); watch(() => props.visible, () => { if (props.visible) parseValue(props.parsedValue); }, { immediate: true }); return { minDate, maxDate, rangeState, lang, ppNs: pickerNs, drpNs, handleChangeRange, handleRangeConfirm, handleShortcutClick, onSelect, parseValue, t }; }; //#endregion //#region ../../packages/components/date-picker-panel/src/composables/use-panel-date-range.ts const usePanelDateRange = (props, emit, leftDate, rightDate) => { const leftCurrentView = ref("date"); const leftCurrentViewRef = ref(); const rightCurrentView = ref("date"); const rightCurrentViewRef = ref(); const { disabledDate } = inject(PICKER_BASE_INJECTION_KEY).props; const { t, lang } = useLocale(); const leftYear = computed(() => { return leftDate.value.year(); }); const leftMonth = computed(() => { return leftDate.value.month(); }); const rightYear = computed(() => { return rightDate.value.year(); }); const rightMonth = computed(() => { return rightDate.value.month(); }); function computedYearLabel(currentView, yearValue) { const yearTranslation = t("el.datepicker.year"); if (currentView.value === "year") { const startYear = Math.floor(yearValue.value / 10) * 10; return yearTranslation ? `${startYear} ${yearTranslation} - ${startYear + 9} ${yearTranslation}` : `${startYear} - ${startYear + 9}`; } return `${yearValue.value} ${yearTranslation}`; } function focusPicker(currentViewRef) { currentViewRef?.focus(); } async function showPicker(pickerType, view) { if (props.disabled) return; const currentView = pickerType === "left" ? leftCurrentView : rightCurrentView; const currentViewRef = pickerType === "left" ? leftCurrentViewRef : rightCurrentViewRef; currentView.value = view; await nextTick(); focusPicker(currentViewRef.value); } async function handlePick(mode, pickerType, value) { if (props.disabled) return; const isLeftPicker = pickerType === "left"; const startDate = isLeftPicker ? leftDate : rightDate; const endDate = isLeftPicker ? rightDate : leftDate; const currentView = isLeftPicker ? leftCurrentView : rightCurrentView; const currentViewRef = isLeftPicker ? leftCurrentViewRef : rightCurrentViewRef; if (mode === "year") startDate.value = getValidDateOfYear(startDate.value.year(value), lang.value, disabledDate); if (mode === "month") startDate.value = getValidDateOfMonth(startDate.value, startDate.value.year(), value, lang.value, disabledDate); if (!props.unlinkPanels) endDate.value = pickerType === "left" ? startDate.value.add(1, "month") : startDate.value.subtract(1, "month"); currentView.value = mode === "year" ? "month" : "date"; await nextTick(); focusPicker(currentViewRef.value); handlePanelChange(mode); } function handlePanelChange(mode) { emit("panel-change", [leftDate.value.toDate(), rightDate.value.toDate()], mode); } function adjustDateByView(currentView, date, forward) { const action = forward ? "add" : "subtract"; return currentView === "year" ? date[action](10, "year") : date[action](1, "year"); } return { leftCurrentView, rightCurrentView, leftCurrentViewRef, rightCurrentViewRef, leftYear, rightYear, leftMonth, rightMonth, leftYearLabel: computed(() => computedYearLabel(leftCurrentView, leftYear)), rightYearLabel: computed(() => computedYearLabel(rightCurrentView, rightYear)), showLeftPicker: (view) => showPicker("left", view), showRightPicker: (view) => showPicker("right", view), handleLeftYearPick: (year) => handlePick("year", "left", year), handleRightYearPick: (year) => handlePick("year", "right", year), handleLeftMonthPick: (month) => handlePick("month", "left", month), handleRightMonthPick: (month) => handlePick("month", "right", month), handlePanelChange, adjustDateByView }; }; //#endregion //#region ../../packages/components/date-picker-panel/src/date-picker-com/panel-date-range.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$47 = ["disabled", "onClick"]; const _hoisted_2$29 = ["aria-label", "disabled"]; const _hoisted_3$13 = ["aria-label", "disabled"]; const _hoisted_4$10 = ["disabled", "aria-label"]; const _hoisted_5$7 = ["disabled", "aria-label"]; const _hoisted_6$2 = ["tabindex", "aria-disabled"]; const _hoisted_7$1 = ["tabindex", "aria-disabled"]; const _hoisted_8$1 = ["disabled", "aria-label"]; const _hoisted_9$1 = ["disabled", "aria-label"]; const _hoisted_10$1 = ["aria-label", "disabled"]; const _hoisted_11$1 = ["disabled", "aria-label"]; const _hoisted_12$1 = ["tabindex", "aria-disabled"]; const _hoisted_13$1 = ["tabindex", "aria-disabled"]; const unit$2 = "month"; var panel_date_range_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ __name: "panel-date-range", props: panelDateRangeProps, emits: [ "pick", "set-picker-option", "calendar-change", "panel-change", "clear" ], setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const pickerBase = inject(PICKER_BASE_INJECTION_KEY); const isDefaultFormat = inject(ROOT_PICKER_IS_DEFAULT_FORMAT_INJECTION_KEY, void 0); const { disabledDate, cellClassName, defaultTime, clearable } = pickerBase.props; const format = toRef(pickerBase.props, "format"); const shortcuts = toRef(pickerBase.props, "shortcuts"); const defaultValue = toRef(pickerBase.props, "defaultValue"); const { lang } = useLocale(); const leftDate = ref((0, import_dayjs_min.default)().locale(lang.value)); const rightDate = ref((0, import_dayjs_min.default)().locale(lang.value).add(1, unit$2)); const { minDate, maxDate, rangeState, ppNs, drpNs, handleChangeRange, handleRangeConfirm, handleShortcutClick, onSelect, parseValue, t } = useRangePicker(props, { defaultValue, defaultTime, leftDate, rightDate, unit: unit$2, sortDates }); watch(() => props.visible, (visible) => { if (!visible && rangeState.value.selecting) { parseValue(props.parsedValue); onSelect(false); } }); const dateUserInput = ref({ min: null, max: null }); const timeUserInput = ref({ min: null, max: null }); const { leftCurrentView, rightCurrentView, leftCurrentViewRef, rightCurrentViewRef, leftYear, rightYear, leftMonth, rightMonth, leftYearLabel, rightYearLabel, showLeftPicker, showRightPicker, handleLeftYearPick, handleRightYearPick, handleLeftMonthPick, handleRightMonthPick, handlePanelChange, adjustDateByView } = usePanelDateRange(props, emit, leftDate, rightDate); const hasShortcuts = computed(() => !!shortcuts.value.length); const minVisibleDate = computed(() => { if (dateUserInput.value.min !== null) return dateUserInput.value.min; if (minDate.value) return minDate.value.format(dateFormat.value); return ""; }); const maxVisibleDate = computed(() => { if (dateUserInput.value.max !== null) return dateUserInput.value.max; if (maxDate.value || minDate.value) return (maxDate.value || minDate.value).format(dateFormat.value); return ""; }); const minVisibleTime = computed(() => { if (timeUserInput.value.min !== null) return timeUserInput.value.min; if (minDate.value) return minDate.value.format(timeFormat.value); return ""; }); const maxVisibleTime = computed(() => { if (timeUserInput.value.max !== null) return timeUserInput.value.max; if (maxDate.value || minDate.value) return (maxDate.value || minDate.value).format(timeFormat.value); return ""; }); const timeFormat = computed(() => { return props.timeFormat || extractTimeFormat(format.value || "") || "HH:mm:ss"; }); const dateFormat = computed(() => { return props.dateFormat || extractDateFormat(format.value || "") || "YYYY-MM-DD"; }); const isValidValue = (date) => { return isValidRange(date) && (disabledDate ? !disabledDate(date[0].toDate()) && !disabledDate(date[1].toDate()) : true); }; const leftPrevYear = () => { leftDate.value = adjustDateByView(leftCurrentView.value, leftDate.value, false); if (!props.unlinkPanels) rightDate.value = leftDate.value.add(1, "month"); handlePanelChange("year"); }; const leftPrevMonth = () => { leftDate.value = leftDate.value.subtract(1, "month"); if (!props.unlinkPanels) rightDate.value = leftDate.value.add(1, "month"); handlePanelChange("month"); }; const rightNextYear = () => { if (!props.unlinkPanels) { leftDate.value = adjustDateByView(rightCurrentView.value, leftDate.value, true); rightDate.value = leftDate.value.add(1, "month"); } else rightDate.value = adjustDateByView(rightCurrentView.value, rightDate.value, true); handlePanelChange("year"); }; const rightNextMonth = () => { if (!props.unlinkPanels) { leftDate.value = leftDate.value.add(1, "month"); rightDate.value = leftDate.value.add(1, "month"); } else rightDate.value = rightDate.value.add(1, "month"); handlePanelChange("month"); }; const leftNextYear = () => { leftDate.value = adjustDateByView(leftCurrentView.value, leftDate.value, true); handlePanelChange("year"); }; const leftNextMonth = () => { leftDate.value = leftDate.value.add(1, "month"); handlePanelChange("month"); }; const rightPrevYear = () => { rightDate.value = adjustDateByView(rightCurrentView.value, rightDate.value, false); handlePanelChange("year"); }; const rightPrevMonth = () => { rightDate.value = rightDate.value.subtract(1, "month"); handlePanelChange("month"); }; const enableMonthArrow = computed(() => { const nextMonth = (leftMonth.value + 1) % 12; const yearOffset = leftMonth.value + 1 >= 12 ? 1 : 0; return props.singlePanel || props.unlinkPanels && new Date(leftYear.value + yearOffset, nextMonth) < new Date(rightYear.value, rightMonth.value); }); const enableYearArrow = computed(() => { return props.singlePanel || props.unlinkPanels && rightYear.value * 12 + rightMonth.value - (leftYear.value * 12 + leftMonth.value + 1) >= 12; }); const dateRangeDisabled = useFormDisabled(); const btnDisabled = computed(() => { return !(minDate.value && maxDate.value && !rangeState.value.selecting && isValidRange([minDate.value, maxDate.value]) && !dateRangeDisabled.value); }); const showTime = computed(() => props.type === "datetime" || props.type === "datetimerange"); const formatEmit = (emitDayjs, index) => { if (!emitDayjs) return; if (defaultTime) return (0, import_dayjs_min.default)(defaultTime[index] || defaultTime).locale(lang.value).year(emitDayjs.year()).month(emitDayjs.month()).date(emitDayjs.date()); return emitDayjs; }; const handleRangePick = (val, close = true) => { const min_ = val.minDate; const max_ = val.maxDate; const minDate_ = formatEmit(min_, 0); const maxDate_ = formatEmit(max_, 1); if (maxDate.value === maxDate_ && minDate.value === minDate_) return; emit("calendar-change", [min_.toDate(), max_ && max_.toDate()]); maxDate.value = maxDate_; minDate.value = minDate_; if (!showTime.value && close) close = !minDate_ || !maxDate_; handleRangeConfirm(close); }; const minTimePickerVisible = ref(false); const maxTimePickerVisible = ref(false); const handleMinTimeClose = () => { minTimePickerVisible.value = false; }; const handleMaxTimeClose = () => { maxTimePickerVisible.value = false; }; const handleDateInput = (value, type) => { dateUserInput.value[type] = value; const parsedValueD = (0, import_dayjs_min.default)(value, dateFormat.value).locale(lang.value); if (parsedValueD.isValid()) { if (disabledDate && disabledDate(parsedValueD.toDate())) return; if (type === "min") { leftDate.value = parsedValueD; minDate.value = (minDate.value || leftDate.value).year(parsedValueD.year()).month(parsedValueD.month()).date(parsedValueD.date()); if (!props.unlinkPanels && (!maxDate.value || maxDate.value.isBefore(minDate.value))) { rightDate.value = parsedValueD.add(1, "month"); maxDate.value = minDate.value.add(1, "month"); } } else { rightDate.value = parsedValueD; maxDate.value = (maxDate.value || rightDate.value).year(parsedValueD.year()).month(parsedValueD.month()).date(parsedValueD.date()); if (!props.unlinkPanels && (!minDate.value || minDate.value.isAfter(maxDate.value))) { leftDate.value = parsedValueD.subtract(1, "month"); minDate.value = maxDate.value.subtract(1, "month"); } } sortDates(minDate.value, maxDate.value); handleRangeConfirm(true); } }; const handleDateChange = (_, type) => { dateUserInput.value[type] = null; }; const handleTimeInput = (value, type) => { timeUserInput.value[type] = value; const parsedValueD = (0, import_dayjs_min.default)(value, timeFormat.value).locale(lang.value); if (parsedValueD.isValid()) if (type === "min") { minTimePickerVisible.value = true; minDate.value = (minDate.value || leftDate.value).hour(parsedValueD.hour()).minute(parsedValueD.minute()).second(parsedValueD.second()); leftDate.value = minDate.value; } else { maxTimePickerVisible.value = true; maxDate.value = (maxDate.value || rightDate.value).hour(parsedValueD.hour()).minute(parsedValueD.minute()).second(parsedValueD.second()); rightDate.value = maxDate.value; } }; const handleTimeChange = (_value, type) => { timeUserInput.value[type] = null; if (type === "min") { leftDate.value = minDate.value; minTimePickerVisible.value = false; if (!maxDate.value || maxDate.value.isBefore(minDate.value)) maxDate.value = minDate.value; } else { rightDate.value = maxDate.value; maxTimePickerVisible.value = false; if (maxDate.value && maxDate.value.isBefore(minDate.value)) minDate.value = maxDate.value; } handleRangeConfirm(true); }; const handleMinTimePick = (value, visible, first) => { if (timeUserInput.value.min) return; if (value) minDate.value = (minDate.value || leftDate.value).hour(value.hour()).minute(value.minute()).second(value.second()); if (!first) minTimePickerVisible.value = visible; if (!maxDate.value || maxDate.value.isBefore(minDate.value)) { maxDate.value = minDate.value; rightDate.value = value; nextTick(() => { parseValue(props.parsedValue); }); } handleRangeConfirm(true); }; const handleMaxTimePick = (value, visible, first) => { if (timeUserInput.value.max) return; if (value) maxDate.value = (maxDate.value || rightDate.value).hour(value.hour()).minute(value.minute()).second(value.second()); if (!first) maxTimePickerVisible.value = visible; if (maxDate.value && maxDate.value.isBefore(minDate.value)) minDate.value = maxDate.value; handleRangeConfirm(true); }; const onClear = () => { handleClear(); emit("clear"); }; const handleClear = () => { let valueOnClear = null; if (pickerBase?.emptyValues) valueOnClear = pickerBase.emptyValues.valueOnClear.value; leftDate.value = getDefaultValue(unref(defaultValue), { lang: unref(lang), unit: "month", unlinkPanels: props.unlinkPanels })[0]; rightDate.value = leftDate.value.add(1, "month"); maxDate.value = void 0; minDate.value = void 0; handleRangeConfirm(true); emit("pick", valueOnClear); }; const parseUserInput = (value) => { return correctlyParseUserInput(value, format.value || "", lang.value, isDefaultFormat); }; function sortDates(minDate, maxDate) { if (props.unlinkPanels && maxDate) { const minDateYear = minDate?.year() || 0; const minDateMonth = minDate?.month() || 0; const maxDateYear = maxDate.year(); const maxDateMonth = maxDate.month(); rightDate.value = minDateYear === maxDateYear && minDateMonth === maxDateMonth ? maxDate.add(1, unit$2) : maxDate; } else { rightDate.value = leftDate.value.add(1, unit$2); if (maxDate) rightDate.value = rightDate.value.hour(maxDate.hour()).minute(maxDate.minute()).second(maxDate.second()); } } emit("set-picker-option", ["isValidValue", isValidValue]); emit("set-picker-option", ["parseUserInput", parseUserInput]); emit("set-picker-option", ["handleClear", handleClear]); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass([ unref(ppNs).b(), unref(drpNs).b(), unref(ppNs).is("border", _ctx.border), unref(ppNs).is("disabled", unref(dateRangeDisabled)), { "has-sidebar": _ctx.$slots.sidebar || hasShortcuts.value, "has-time": showTime.value, "single-panel": _ctx.singlePanel } ]) }, [createElementVNode("div", { class: normalizeClass(unref(ppNs).e("body-wrapper")) }, [ renderSlot(_ctx.$slots, "sidebar", { class: normalizeClass(unref(ppNs).e("sidebar")) }), hasShortcuts.value ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ppNs).e("sidebar")) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(shortcuts.value, (shortcut, key) => { return openBlock(), createElementBlock("button", { key, type: "button", disabled: unref(dateRangeDisabled), class: normalizeClass(unref(ppNs).e("shortcut")), onClick: ($event) => unref(handleShortcutClick)(shortcut) }, toDisplayString(shortcut.text), 11, _hoisted_1$47); }), 128))], 2)) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass(unref(ppNs).e("body")) }, [ showTime.value ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(drpNs).e("time-header")) }, [ createElementVNode("span", { class: normalizeClass(unref(drpNs).e("editors-wrap")) }, [createElementVNode("span", { class: normalizeClass(unref(drpNs).e("time-picker-wrap")) }, [createVNode(unref(ElInput), { size: "small", disabled: unref(rangeState).selecting || unref(dateRangeDisabled), placeholder: unref(t)("el.datepicker.startDate"), class: normalizeClass(unref(drpNs).e("editor")), "model-value": minVisibleDate.value, "validate-event": false, readonly: !_ctx.editable, onInput: _cache[0] || (_cache[0] = (val) => handleDateInput(val, "min")), onChange: _cache[1] || (_cache[1] = (val) => handleDateChange(val, "min")) }, null, 8, [ "disabled", "placeholder", "class", "model-value", "readonly" ])], 2), withDirectives((openBlock(), createElementBlock("span", { class: normalizeClass(unref(drpNs).e("time-picker-wrap")) }, [createVNode(unref(ElInput), { size: "small", class: normalizeClass(unref(drpNs).e("editor")), disabled: unref(rangeState).selecting || unref(dateRangeDisabled), placeholder: unref(t)("el.datepicker.startTime"), "model-value": minVisibleTime.value, "validate-event": false, readonly: !_ctx.editable, onFocus: _cache[2] || (_cache[2] = ($event) => minTimePickerVisible.value = true), onInput: _cache[3] || (_cache[3] = (val) => handleTimeInput(val, "min")), onChange: _cache[4] || (_cache[4] = (val) => handleTimeChange(val, "min")) }, null, 8, [ "class", "disabled", "placeholder", "model-value", "readonly" ]), createVNode(unref(panel_time_pick_default), { visible: minTimePickerVisible.value, format: timeFormat.value, "datetime-role": "start", "parsed-value": unref(minDate) || leftDate.value, onPick: handleMinTimePick }, null, 8, [ "visible", "format", "parsed-value" ])], 2)), [[unref(ClickOutside), handleMinTimeClose]])], 2), createElementVNode("span", null, [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(arrow_right_default))]), _: 1 })]), createElementVNode("span", { class: normalizeClass([unref(drpNs).e("editors-wrap"), "is-right"]) }, [createElementVNode("span", { class: normalizeClass(unref(drpNs).e("time-picker-wrap")) }, [createVNode(unref(ElInput), { size: "small", class: normalizeClass(unref(drpNs).e("editor")), disabled: unref(rangeState).selecting || unref(dateRangeDisabled), placeholder: unref(t)("el.datepicker.endDate"), "model-value": maxVisibleDate.value, readonly: !unref(minDate) || !_ctx.editable, "validate-event": false, onInput: _cache[5] || (_cache[5] = (val) => handleDateInput(val, "max")), onChange: _cache[6] || (_cache[6] = (val) => handleDateChange(val, "max")) }, null, 8, [ "class", "disabled", "placeholder", "model-value", "readonly" ])], 2), withDirectives((openBlock(), createElementBlock("span", { class: normalizeClass(unref(drpNs).e("time-picker-wrap")) }, [createVNode(unref(ElInput), { size: "small", class: normalizeClass(unref(drpNs).e("editor")), disabled: unref(rangeState).selecting || unref(dateRangeDisabled), placeholder: unref(t)("el.datepicker.endTime"), "model-value": maxVisibleTime.value, readonly: !unref(minDate) || !_ctx.editable, "validate-event": false, onFocus: _cache[7] || (_cache[7] = ($event) => unref(minDate) && (maxTimePickerVisible.value = true)), onInput: _cache[8] || (_cache[8] = (val) => handleTimeInput(val, "max")), onChange: _cache[9] || (_cache[9] = (val) => handleTimeChange(val, "max")) }, null, 8, [ "class", "disabled", "placeholder", "model-value", "readonly" ]), createVNode(unref(panel_time_pick_default), { "datetime-role": "end", visible: maxTimePickerVisible.value, format: timeFormat.value, "parsed-value": unref(maxDate) || rightDate.value, onPick: handleMaxTimePick }, null, 8, [ "visible", "format", "parsed-value" ])], 2)), [[unref(ClickOutside), handleMaxTimeClose]])], 2) ], 2)) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass([ unref(ppNs).e("content"), unref(drpNs).e("content"), unref(drpNs).is("left", !_ctx.singlePanel) ]) }, [ createElementVNode("div", { class: normalizeClass(unref(drpNs).e("header")) }, [ createElementVNode("button", { type: "button", class: normalizeClass([unref(ppNs).e("icon-btn"), "d-arrow-left"]), "aria-label": unref(t)(`el.datepicker.prevYear`), disabled: unref(dateRangeDisabled), onClick: leftPrevYear }, [renderSlot(_ctx.$slots, "prev-year", {}, () => [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(d_arrow_left_default))]), _: 1 })])], 10, _hoisted_2$29), withDirectives(createElementVNode("button", { type: "button", class: normalizeClass([unref(ppNs).e("icon-btn"), "arrow-left"]), "aria-label": unref(t)(`el.datepicker.prevMonth`), disabled: unref(dateRangeDisabled), onClick: leftPrevMonth }, [renderSlot(_ctx.$slots, "prev-month", {}, () => [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(arrow_left_default))]), _: 1 })])], 10, _hoisted_3$13), [[vShow, unref(leftCurrentView) === "date"]]), _ctx.unlinkPanels || _ctx.singlePanel ? (openBlock(), createElementBlock("button", { key: 0, type: "button", disabled: !enableYearArrow.value || unref(dateRangeDisabled), class: normalizeClass([[unref(ppNs).e("icon-btn"), unref(ppNs).is("disabled", !enableYearArrow.value || unref(dateRangeDisabled))], "d-arrow-right"]), "aria-label": unref(t)(`el.datepicker.nextYear`), onClick: leftNextYear }, [renderSlot(_ctx.$slots, "next-year", {}, () => [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(d_arrow_right_default))]), _: 1 })])], 10, _hoisted_4$10)) : createCommentVNode("v-if", true), _ctx.unlinkPanels && unref(leftCurrentView) === "date" || _ctx.singlePanel ? (openBlock(), createElementBlock("button", { key: 1, type: "button", disabled: !enableMonthArrow.value || unref(dateRangeDisabled), class: normalizeClass([[unref(ppNs).e("icon-btn"), unref(ppNs).is("disabled", !enableMonthArrow.value || unref(dateRangeDisabled))], "arrow-right"]), "aria-label": unref(t)(`el.datepicker.nextMonth`), onClick: leftNextMonth }, [renderSlot(_ctx.$slots, "next-month", {}, () => [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(arrow_right_default))]), _: 1 })])], 10, _hoisted_5$7)) : createCommentVNode("v-if", true), createElementVNode("div", null, [createElementVNode("span", { role: "button", class: normalizeClass(unref(drpNs).e("header-label")), "aria-live": "polite", tabindex: _ctx.disabled ? void 0 : 0, "aria-disabled": _ctx.disabled, onKeydown: _cache[10] || (_cache[10] = withKeys(($event) => unref(showLeftPicker)("year"), ["enter"])), onClick: _cache[11] || (_cache[11] = ($event) => unref(showLeftPicker)("year")) }, toDisplayString(unref(leftYearLabel)), 43, _hoisted_6$2), withDirectives(createElementVNode("span", { role: "button", "aria-live": "polite", tabindex: _ctx.disabled ? void 0 : 0, "aria-disabled": _ctx.disabled, class: normalizeClass([unref(drpNs).e("header-label"), { active: unref(leftCurrentView) === "month" }]), onKeydown: _cache[12] || (_cache[12] = withKeys(($event) => unref(showLeftPicker)("month"), ["enter"])), onClick: _cache[13] || (_cache[13] = ($event) => unref(showLeftPicker)("month")) }, toDisplayString(unref(t)(`el.datepicker.month${leftDate.value.month() + 1}`)), 43, _hoisted_7$1), [[vShow, unref(leftCurrentView) === "date"]])]) ], 2), unref(leftCurrentView) === "date" ? (openBlock(), createBlock(basic_date_table_default, { key: 0, ref_key: "leftCurrentViewRef", ref: leftCurrentViewRef, "selection-mode": "range", date: leftDate.value, "min-date": unref(minDate), "max-date": unref(maxDate), "range-state": unref(rangeState), "disabled-date": unref(disabledDate), "cell-class-name": unref(cellClassName), "show-week-number": _ctx.showWeekNumber, disabled: unref(dateRangeDisabled), onChangerange: unref(handleChangeRange), onPick: handleRangePick, onSelect: unref(onSelect) }, null, 8, [ "date", "min-date", "max-date", "range-state", "disabled-date", "cell-class-name", "show-week-number", "disabled", "onChangerange", "onSelect" ])) : createCommentVNode("v-if", true), unref(leftCurrentView) === "year" ? (openBlock(), createBlock(basic_year_table_default, { key: 1, ref_key: "leftCurrentViewRef", ref: leftCurrentViewRef, "selection-mode": "year", date: leftDate.value, "disabled-date": unref(disabledDate), "parsed-value": _ctx.parsedValue, disabled: unref(dateRangeDisabled), onPick: unref(handleLeftYearPick) }, null, 8, [ "date", "disabled-date", "parsed-value", "disabled", "onPick" ])) : createCommentVNode("v-if", true), unref(leftCurrentView) === "month" ? (openBlock(), createBlock(basic_month_table_default, { key: 2, ref_key: "leftCurrentViewRef", ref: leftCurrentViewRef, "selection-mode": "month", date: leftDate.value, "parsed-value": _ctx.parsedValue, "disabled-date": unref(disabledDate), disabled: unref(dateRangeDisabled), onPick: unref(handleLeftMonthPick) }, null, 8, [ "date", "parsed-value", "disabled-date", "disabled", "onPick" ])) : createCommentVNode("v-if", true) ], 2), !_ctx.singlePanel ? (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass([[unref(ppNs).e("content"), unref(drpNs).e("content")], "is-right"]) }, [ createElementVNode("div", { class: normalizeClass(unref(drpNs).e("header")) }, [ _ctx.unlinkPanels ? (openBlock(), createElementBlock("button", { key: 0, type: "button", disabled: !enableYearArrow.value || unref(dateRangeDisabled), class: normalizeClass([[unref(ppNs).e("icon-btn"), unref(ppNs).is("disabled", !enableYearArrow.value || unref(dateRangeDisabled))], "d-arrow-left"]), "aria-label": unref(t)(`el.datepicker.prevYear`), onClick: rightPrevYear }, [renderSlot(_ctx.$slots, "prev-year", {}, () => [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(d_arrow_left_default))]), _: 1 })])], 10, _hoisted_8$1)) : createCommentVNode("v-if", true), _ctx.unlinkPanels && unref(rightCurrentView) === "date" ? (openBlock(), createElementBlock("button", { key: 1, type: "button", disabled: !enableMonthArrow.value || unref(dateRangeDisabled), class: normalizeClass([[unref(ppNs).e("icon-btn"), unref(ppNs).is("disabled", !enableMonthArrow.value || unref(dateRangeDisabled))], "arrow-left"]), "aria-label": unref(t)(`el.datepicker.prevMonth`), onClick: rightPrevMonth }, [renderSlot(_ctx.$slots, "prev-month", {}, () => [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(arrow_left_default))]), _: 1 })])], 10, _hoisted_9$1)) : createCommentVNode("v-if", true), createElementVNode("button", { type: "button", "aria-label": unref(t)(`el.datepicker.nextYear`), class: normalizeClass([unref(ppNs).e("icon-btn"), "d-arrow-right"]), disabled: unref(dateRangeDisabled), onClick: rightNextYear }, [renderSlot(_ctx.$slots, "next-year", {}, () => [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(d_arrow_right_default))]), _: 1 })])], 10, _hoisted_10$1), withDirectives(createElementVNode("button", { type: "button", class: normalizeClass([unref(ppNs).e("icon-btn"), "arrow-right"]), disabled: unref(dateRangeDisabled), "aria-label": unref(t)(`el.datepicker.nextMonth`), onClick: rightNextMonth }, [renderSlot(_ctx.$slots, "next-month", {}, () => [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(arrow_right_default))]), _: 1 })])], 10, _hoisted_11$1), [[vShow, unref(rightCurrentView) === "date"]]), createElementVNode("div", null, [createElementVNode("span", { role: "button", class: normalizeClass(unref(drpNs).e("header-label")), "aria-live": "polite", tabindex: _ctx.disabled ? void 0 : 0, "aria-disabled": _ctx.disabled, onKeydown: _cache[14] || (_cache[14] = withKeys(($event) => unref(showRightPicker)("year"), ["enter"])), onClick: _cache[15] || (_cache[15] = ($event) => unref(showRightPicker)("year")) }, toDisplayString(unref(rightYearLabel)), 43, _hoisted_12$1), withDirectives(createElementVNode("span", { role: "button", "aria-live": "polite", tabindex: _ctx.disabled ? void 0 : 0, "aria-disabled": _ctx.disabled, class: normalizeClass([unref(drpNs).e("header-label"), { active: unref(rightCurrentView) === "month" }]), onKeydown: _cache[16] || (_cache[16] = withKeys(($event) => unref(showRightPicker)("month"), ["enter"])), onClick: _cache[17] || (_cache[17] = ($event) => unref(showRightPicker)("month")) }, toDisplayString(unref(t)(`el.datepicker.month${rightDate.value.month() + 1}`)), 43, _hoisted_13$1), [[vShow, unref(rightCurrentView) === "date"]])]) ], 2), unref(rightCurrentView) === "date" ? (openBlock(), createBlock(basic_date_table_default, { key: 0, ref_key: "rightCurrentViewRef", ref: rightCurrentViewRef, "selection-mode": "range", date: rightDate.value, "min-date": unref(minDate), "max-date": unref(maxDate), "range-state": unref(rangeState), "disabled-date": unref(disabledDate), "cell-class-name": unref(cellClassName), "show-week-number": _ctx.showWeekNumber, disabled: unref(dateRangeDisabled), onChangerange: unref(handleChangeRange), onPick: handleRangePick, onSelect: unref(onSelect) }, null, 8, [ "date", "min-date", "max-date", "range-state", "disabled-date", "cell-class-name", "show-week-number", "disabled", "onChangerange", "onSelect" ])) : createCommentVNode("v-if", true), unref(rightCurrentView) === "year" ? (openBlock(), createBlock(basic_year_table_default, { key: 1, ref_key: "rightCurrentViewRef", ref: rightCurrentViewRef, "selection-mode": "year", date: rightDate.value, "disabled-date": unref(disabledDate), "parsed-value": _ctx.parsedValue, disabled: unref(dateRangeDisabled), onPick: unref(handleRightYearPick) }, null, 8, [ "date", "disabled-date", "parsed-value", "disabled", "onPick" ])) : createCommentVNode("v-if", true), unref(rightCurrentView) === "month" ? (openBlock(), createBlock(basic_month_table_default, { key: 2, ref_key: "rightCurrentViewRef", ref: rightCurrentViewRef, "selection-mode": "month", date: rightDate.value, "parsed-value": _ctx.parsedValue, "disabled-date": unref(disabledDate), disabled: unref(dateRangeDisabled), onPick: unref(handleRightMonthPick) }, null, 8, [ "date", "parsed-value", "disabled-date", "disabled", "onPick" ])) : createCommentVNode("v-if", true) ], 2)) : createCommentVNode("v-if", true) ], 2) ], 2), _ctx.showFooter && showTime.value && (_ctx.showConfirm || unref(clearable)) ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ppNs).e("footer")) }, [unref(clearable) ? (openBlock(), createBlock(unref(ElButton), { key: 0, text: "", size: "small", class: normalizeClass(unref(ppNs).e("link-btn")), onClick: onClear }, { default: withCtx(() => [createTextVNode(toDisplayString(unref(t)("el.datepicker.clear")), 1)]), _: 1 }, 8, ["class"])) : createCommentVNode("v-if", true), _ctx.showConfirm ? (openBlock(), createBlock(unref(ElButton), { key: 1, plain: "", size: "small", class: normalizeClass(unref(ppNs).e("link-btn")), disabled: btnDisabled.value, onClick: _cache[18] || (_cache[18] = ($event) => unref(handleRangeConfirm)(false)) }, { default: withCtx(() => [createTextVNode(toDisplayString(unref(t)("el.datepicker.confirm")), 1)]), _: 1 }, 8, ["class", "disabled"])) : createCommentVNode("v-if", true)], 2)) : createCommentVNode("v-if", true)], 2); }; } }); //#endregion //#region ../../packages/components/date-picker-panel/src/date-picker-com/panel-date-range.vue var panel_date_range_default = panel_date_range_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/date-picker-panel/src/props/panel-month-range.ts const panelMonthRangeProps = buildProps({ ...panelRangeSharedProps }); const panelMonthRangeEmits = [ "pick", "set-picker-option", "calendar-change" ]; //#endregion //#region ../../packages/components/date-picker-panel/src/composables/use-month-range-header.ts const useMonthRangeHeader = ({ unlinkPanels, leftDate, rightDate }) => { const { t } = useLocale(); const leftPrevYear = () => { leftDate.value = leftDate.value.subtract(1, "year"); if (!unlinkPanels.value) rightDate.value = rightDate.value.subtract(1, "year"); }; const rightNextYear = () => { if (!unlinkPanels.value) leftDate.value = leftDate.value.add(1, "year"); rightDate.value = rightDate.value.add(1, "year"); }; const leftNextYear = () => { leftDate.value = leftDate.value.add(1, "year"); }; const rightPrevYear = () => { rightDate.value = rightDate.value.subtract(1, "year"); }; return { leftPrevYear, rightNextYear, leftNextYear, rightPrevYear, leftLabel: computed(() => { return `${leftDate.value.year()} ${t("el.datepicker.year")}`; }), rightLabel: computed(() => { return `${rightDate.value.year()} ${t("el.datepicker.year")}`; }), leftYear: computed(() => { return leftDate.value.year(); }), rightYear: computed(() => { return rightDate.value.year() === leftDate.value.year() ? leftDate.value.year() + 1 : rightDate.value.year(); }) }; }; //#endregion //#region ../../packages/components/date-picker-panel/src/date-picker-com/panel-month-range.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$46 = ["disabled", "onClick"]; const _hoisted_2$28 = ["disabled"]; const _hoisted_3$12 = ["disabled"]; const _hoisted_4$9 = ["disabled"]; const _hoisted_5$6 = ["disabled"]; const unit$1 = "year"; var panel_month_range_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "DatePickerMonthRange", __name: "panel-month-range", props: panelMonthRangeProps, emits: panelMonthRangeEmits, setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const { lang } = useLocale(); const pickerBase = inject(PICKER_BASE_INJECTION_KEY); const isDefaultFormat = inject(ROOT_PICKER_IS_DEFAULT_FORMAT_INJECTION_KEY, void 0); const { shortcuts, disabledDate, cellClassName } = pickerBase.props; const format = toRef(pickerBase.props, "format"); const defaultValue = toRef(pickerBase.props, "defaultValue"); const leftDate = ref((0, import_dayjs_min.default)().locale(lang.value)); const rightDate = ref((0, import_dayjs_min.default)().locale(lang.value).add(1, unit$1)); const { minDate, maxDate, rangeState, ppNs, drpNs, handleChangeRange, handleRangeConfirm, handleShortcutClick, onSelect, parseValue } = useRangePicker(props, { defaultValue, leftDate, rightDate, unit: unit$1, sortDates }); const hasShortcuts = computed(() => !!shortcuts.length); const { leftPrevYear, rightNextYear, leftNextYear, rightPrevYear, leftLabel, rightLabel, leftYear, rightYear } = useMonthRangeHeader({ unlinkPanels: toRef(props, "unlinkPanels"), leftDate, rightDate }); const enableYearArrow = computed(() => { return props.singlePanel || props.unlinkPanels && rightYear.value > leftYear.value + 1; }); const handleRangePick = (val, close = true) => { const minDate_ = val.minDate; const maxDate_ = val.maxDate; if (maxDate.value === maxDate_ && minDate.value === minDate_) return; emit("calendar-change", [minDate_.toDate(), maxDate_ && maxDate_.toDate()]); maxDate.value = maxDate_; minDate.value = minDate_; if (!close) return; handleRangeConfirm(); }; const handleClear = () => { let valueOnClear = null; if (pickerBase?.emptyValues) valueOnClear = pickerBase.emptyValues.valueOnClear.value; leftDate.value = getDefaultValue(unref(defaultValue), { lang: unref(lang), unit: "year", unlinkPanels: props.unlinkPanels })[0]; rightDate.value = leftDate.value.add(1, "year"); emit("pick", valueOnClear); }; const parseUserInput = (value) => { return correctlyParseUserInput(value, format.value, lang.value, isDefaultFormat); }; function sortDates(minDate, maxDate) { if (props.unlinkPanels && maxDate) rightDate.value = (minDate?.year() || 0) === maxDate.year() ? maxDate.add(1, unit$1) : maxDate; else rightDate.value = leftDate.value.add(1, unit$1); } const monthRangeDisabled = useFormDisabled(); watch(() => props.visible, (visible) => { if (!visible && rangeState.value.selecting) { parseValue(props.parsedValue); onSelect(false); } }); emit("set-picker-option", ["isValidValue", isValidRange]); emit("set-picker-option", ["parseUserInput", parseUserInput]); emit("set-picker-option", ["handleClear", handleClear]); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass([ unref(ppNs).b(), unref(drpNs).b(), unref(ppNs).is("border", _ctx.border), unref(ppNs).is("disabled", unref(monthRangeDisabled)), { "has-sidebar": Boolean(_ctx.$slots.sidebar) || hasShortcuts.value, "single-panel": _ctx.singlePanel } ]) }, [createElementVNode("div", { class: normalizeClass(unref(ppNs).e("body-wrapper")) }, [ renderSlot(_ctx.$slots, "sidebar", { class: normalizeClass(unref(ppNs).e("sidebar")) }), hasShortcuts.value ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ppNs).e("sidebar")) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(shortcuts), (shortcut, key) => { return openBlock(), createElementBlock("button", { key, type: "button", class: normalizeClass(unref(ppNs).e("shortcut")), disabled: unref(monthRangeDisabled), onClick: ($event) => unref(handleShortcutClick)(shortcut) }, toDisplayString(shortcut.text), 11, _hoisted_1$46); }), 128))], 2)) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass(unref(ppNs).e("body")) }, [createElementVNode("div", { class: normalizeClass([ unref(ppNs).e("content"), unref(drpNs).e("content"), unref(drpNs).is("left", !_ctx.singlePanel) ]) }, [createElementVNode("div", { class: normalizeClass(unref(drpNs).e("header")) }, [ createElementVNode("button", { type: "button", class: normalizeClass([unref(ppNs).e("icon-btn"), "d-arrow-left"]), disabled: unref(monthRangeDisabled), onClick: _cache[0] || (_cache[0] = (...args) => unref(leftPrevYear) && unref(leftPrevYear)(...args)) }, [renderSlot(_ctx.$slots, "prev-year", {}, () => [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(d_arrow_left_default))]), _: 1 })])], 10, _hoisted_2$28), _ctx.unlinkPanels || _ctx.singlePanel ? (openBlock(), createElementBlock("button", { key: 0, type: "button", disabled: !enableYearArrow.value || unref(monthRangeDisabled), class: normalizeClass([[unref(ppNs).e("icon-btn"), unref(ppNs).is("disabled", !enableYearArrow.value || unref(monthRangeDisabled))], "d-arrow-right"]), onClick: _cache[1] || (_cache[1] = (...args) => unref(leftNextYear) && unref(leftNextYear)(...args)) }, [renderSlot(_ctx.$slots, "next-year", {}, () => [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(d_arrow_right_default))]), _: 1 })])], 10, _hoisted_3$12)) : createCommentVNode("v-if", true), createElementVNode("div", null, toDisplayString(unref(leftLabel)), 1) ], 2), createVNode(basic_month_table_default, { "selection-mode": "range", date: leftDate.value, "min-date": unref(minDate), "max-date": unref(maxDate), "range-state": unref(rangeState), "disabled-date": unref(disabledDate), disabled: unref(monthRangeDisabled), "cell-class-name": unref(cellClassName), onChangerange: unref(handleChangeRange), onPick: handleRangePick, onSelect: unref(onSelect) }, null, 8, [ "date", "min-date", "max-date", "range-state", "disabled-date", "disabled", "cell-class-name", "onChangerange", "onSelect" ])], 2), !_ctx.singlePanel ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass([[unref(ppNs).e("content"), unref(drpNs).e("content")], "is-right"]) }, [createElementVNode("div", { class: normalizeClass(unref(drpNs).e("header")) }, [ _ctx.unlinkPanels ? (openBlock(), createElementBlock("button", { key: 0, type: "button", disabled: !enableYearArrow.value || unref(monthRangeDisabled), class: normalizeClass([[unref(ppNs).e("icon-btn"), unref(ppNs).is("disabled", !enableYearArrow.value || unref(monthRangeDisabled))], "d-arrow-left"]), onClick: _cache[2] || (_cache[2] = (...args) => unref(rightPrevYear) && unref(rightPrevYear)(...args)) }, [renderSlot(_ctx.$slots, "prev-year", {}, () => [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(d_arrow_left_default))]), _: 1 })])], 10, _hoisted_4$9)) : createCommentVNode("v-if", true), createElementVNode("button", { type: "button", class: normalizeClass([unref(ppNs).e("icon-btn"), "d-arrow-right"]), disabled: unref(monthRangeDisabled), onClick: _cache[3] || (_cache[3] = (...args) => unref(rightNextYear) && unref(rightNextYear)(...args)) }, [renderSlot(_ctx.$slots, "next-year", {}, () => [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(d_arrow_right_default))]), _: 1 })])], 10, _hoisted_5$6), createElementVNode("div", null, toDisplayString(unref(rightLabel)), 1) ], 2), createVNode(basic_month_table_default, { "selection-mode": "range", date: rightDate.value, "min-date": unref(minDate), "max-date": unref(maxDate), "range-state": unref(rangeState), "disabled-date": unref(disabledDate), disabled: unref(monthRangeDisabled), "cell-class-name": unref(cellClassName), onChangerange: unref(handleChangeRange), onPick: handleRangePick, onSelect: unref(onSelect) }, null, 8, [ "date", "min-date", "max-date", "range-state", "disabled-date", "disabled", "cell-class-name", "onChangerange", "onSelect" ])], 2)) : createCommentVNode("v-if", true)], 2) ], 2)], 2); }; } }); //#endregion //#region ../../packages/components/date-picker-panel/src/date-picker-com/panel-month-range.vue var panel_month_range_default = panel_month_range_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/date-picker-panel/src/props/panel-year-range.ts const panelYearRangeProps = buildProps({ ...panelRangeSharedProps }); const panelYearRangeEmits = [ "pick", "set-picker-option", "calendar-change" ]; //#endregion //#region ../../packages/components/date-picker-panel/src/composables/use-year-range-header.ts const useYearRangeHeader = ({ unlinkPanels, leftDate, rightDate }) => { const leftPrevYear = () => { leftDate.value = leftDate.value.subtract(10, "year"); if (!unlinkPanels.value) rightDate.value = rightDate.value.subtract(10, "year"); }; const rightNextYear = () => { if (!unlinkPanels.value) leftDate.value = leftDate.value.add(10, "year"); rightDate.value = rightDate.value.add(10, "year"); }; const leftNextYear = () => { leftDate.value = leftDate.value.add(10, "year"); }; const rightPrevYear = () => { rightDate.value = rightDate.value.subtract(10, "year"); }; return { leftPrevYear, rightNextYear, leftNextYear, rightPrevYear, leftLabel: computed(() => { const leftStartDate = Math.floor(leftDate.value.year() / 10) * 10; return `${leftStartDate}-${leftStartDate + 9}`; }), rightLabel: computed(() => { const rightStartDate = Math.floor(rightDate.value.year() / 10) * 10; return `${rightStartDate}-${rightStartDate + 9}`; }), leftYear: computed(() => { return Math.floor(leftDate.value.year() / 10) * 10 + 9; }), rightYear: computed(() => { return Math.floor(rightDate.value.year() / 10) * 10; }) }; }; //#endregion //#region ../../packages/components/date-picker-panel/src/date-picker-com/panel-year-range.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$45 = ["disabled", "onClick"]; const _hoisted_2$27 = ["disabled"]; const _hoisted_3$11 = ["disabled"]; const _hoisted_4$8 = ["disabled"]; const _hoisted_5$5 = ["disabled"]; const step = 10; const unit = "year"; var panel_year_range_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "DatePickerYearRange", __name: "panel-year-range", props: panelYearRangeProps, emits: panelYearRangeEmits, setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const { lang } = useLocale(); const leftDate = ref((0, import_dayjs_min.default)().locale(lang.value)); const rightDate = ref((0, import_dayjs_min.default)().locale(lang.value).add(step, unit)); const isDefaultFormat = inject(ROOT_PICKER_IS_DEFAULT_FORMAT_INJECTION_KEY, void 0); const pickerBase = inject(PICKER_BASE_INJECTION_KEY); const { shortcuts, disabledDate, cellClassName } = pickerBase.props; const format = toRef(pickerBase.props, "format"); const defaultValue = toRef(pickerBase.props, "defaultValue"); const { minDate, maxDate, rangeState, ppNs, drpNs, handleChangeRange, handleRangeConfirm, handleShortcutClick, onSelect, parseValue } = useRangePicker(props, { defaultValue, leftDate, rightDate, step, unit, sortDates }); const { leftPrevYear, rightNextYear, leftNextYear, rightPrevYear, leftLabel, rightLabel, leftYear, rightYear } = useYearRangeHeader({ unlinkPanels: toRef(props, "unlinkPanels"), leftDate, rightDate }); const yearRangeDisabled = useFormDisabled(); const hasShortcuts = computed(() => !!shortcuts.length); const panelKls = computed(() => [ ppNs.b(), drpNs.b(), ppNs.is("border", props.border), ppNs.is("disabled", yearRangeDisabled.value), { "has-sidebar": Boolean(useSlots().sidebar) || hasShortcuts.value, "single-panel": props.singlePanel } ]); const leftPanelKls = computed(() => { return { content: [ ppNs.e("content"), drpNs.e("content"), drpNs.is("left", !props.singlePanel) ], arrowLeftBtn: [ppNs.e("icon-btn"), "d-arrow-left"], arrowRightBtn: [ ppNs.e("icon-btn"), ppNs.is("disabled", !enableYearArrow.value || yearRangeDisabled.value), "d-arrow-right" ] }; }); const rightPanelKls = computed(() => { return { content: [ ppNs.e("content"), drpNs.e("content"), "is-right" ], arrowLeftBtn: [ ppNs.e("icon-btn"), ppNs.is("disabled", !enableYearArrow.value || yearRangeDisabled.value), "d-arrow-left" ], arrowRightBtn: [ppNs.e("icon-btn"), "d-arrow-right"] }; }); const enableYearArrow = computed(() => { return props.singlePanel || props.unlinkPanels && rightYear.value > leftYear.value + 1; }); const handleRangePick = (val, close = true) => { const minDate_ = val.minDate; const maxDate_ = val.maxDate; if (maxDate.value === maxDate_ && minDate.value === minDate_) return; emit("calendar-change", [minDate_.toDate(), maxDate_ && maxDate_.toDate()]); maxDate.value = maxDate_; minDate.value = minDate_; if (!close) return; handleRangeConfirm(); }; const parseUserInput = (value) => { return correctlyParseUserInput(value, format.value, lang.value, isDefaultFormat); }; const isValidValue = (date) => { return isValidRange(date) && (disabledDate ? !disabledDate(date[0].toDate()) && !disabledDate(date[1].toDate()) : true); }; const handleClear = () => { let valueOnClear = null; if (pickerBase?.emptyValues) valueOnClear = pickerBase.emptyValues.valueOnClear.value; const defaultArr = getDefaultValue(unref(defaultValue), { lang: unref(lang), step, unit, unlinkPanels: props.unlinkPanels }); leftDate.value = defaultArr[0]; rightDate.value = defaultArr[1]; emit("pick", valueOnClear); }; function sortDates(minDate, maxDate) { if (props.unlinkPanels && maxDate) { const minDateYear = minDate?.year() || 0; const maxDateYear = maxDate.year(); rightDate.value = minDateYear + step > maxDateYear ? maxDate.add(step, unit) : maxDate; } else rightDate.value = leftDate.value.add(step, unit); } watch(() => props.visible, (visible) => { if (!visible && rangeState.value.selecting) { parseValue(props.parsedValue); onSelect(false); } }); emit("set-picker-option", ["isValidValue", isValidValue]); emit("set-picker-option", ["parseUserInput", parseUserInput]); emit("set-picker-option", ["handleClear", handleClear]); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass(panelKls.value) }, [createElementVNode("div", { class: normalizeClass(unref(ppNs).e("body-wrapper")) }, [ renderSlot(_ctx.$slots, "sidebar", { class: normalizeClass(unref(ppNs).e("sidebar")) }), hasShortcuts.value ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ppNs).e("sidebar")) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(shortcuts), (shortcut, key) => { return openBlock(), createElementBlock("button", { key, type: "button", class: normalizeClass(unref(ppNs).e("shortcut")), disabled: unref(yearRangeDisabled), onClick: ($event) => unref(handleShortcutClick)(shortcut) }, toDisplayString(shortcut.text), 11, _hoisted_1$45); }), 128))], 2)) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass(unref(ppNs).e("body")) }, [createElementVNode("div", { class: normalizeClass(leftPanelKls.value.content) }, [createElementVNode("div", { class: normalizeClass(unref(drpNs).e("header")) }, [ createElementVNode("button", { type: "button", class: normalizeClass(leftPanelKls.value.arrowLeftBtn), disabled: unref(yearRangeDisabled), onClick: _cache[0] || (_cache[0] = (...args) => unref(leftPrevYear) && unref(leftPrevYear)(...args)) }, [renderSlot(_ctx.$slots, "prev-year", {}, () => [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(d_arrow_left_default))]), _: 1 })])], 10, _hoisted_2$27), _ctx.unlinkPanels || _ctx.singlePanel ? (openBlock(), createElementBlock("button", { key: 0, type: "button", disabled: !enableYearArrow.value || unref(yearRangeDisabled), class: normalizeClass(leftPanelKls.value.arrowRightBtn), onClick: _cache[1] || (_cache[1] = (...args) => unref(leftNextYear) && unref(leftNextYear)(...args)) }, [renderSlot(_ctx.$slots, "next-year", {}, () => [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(d_arrow_right_default))]), _: 1 })])], 10, _hoisted_3$11)) : createCommentVNode("v-if", true), createElementVNode("div", null, toDisplayString(unref(leftLabel)), 1) ], 2), createVNode(basic_year_table_default, { "selection-mode": "range", date: leftDate.value, "min-date": unref(minDate), "max-date": unref(maxDate), "range-state": unref(rangeState), "disabled-date": unref(disabledDate), disabled: unref(yearRangeDisabled), "cell-class-name": unref(cellClassName), onChangerange: unref(handleChangeRange), onPick: handleRangePick, onSelect: unref(onSelect) }, null, 8, [ "date", "min-date", "max-date", "range-state", "disabled-date", "disabled", "cell-class-name", "onChangerange", "onSelect" ])], 2), !_ctx.singlePanel ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(rightPanelKls.value.content) }, [createElementVNode("div", { class: normalizeClass(unref(drpNs).e("header")) }, [ _ctx.unlinkPanels ? (openBlock(), createElementBlock("button", { key: 0, type: "button", disabled: !enableYearArrow.value || unref(yearRangeDisabled), class: normalizeClass(rightPanelKls.value.arrowLeftBtn), onClick: _cache[2] || (_cache[2] = (...args) => unref(rightPrevYear) && unref(rightPrevYear)(...args)) }, [renderSlot(_ctx.$slots, "prev-year", {}, () => [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(d_arrow_left_default))]), _: 1 })])], 10, _hoisted_4$8)) : createCommentVNode("v-if", true), createElementVNode("button", { type: "button", class: normalizeClass(rightPanelKls.value.arrowRightBtn), disabled: unref(yearRangeDisabled), onClick: _cache[3] || (_cache[3] = (...args) => unref(rightNextYear) && unref(rightNextYear)(...args)) }, [renderSlot(_ctx.$slots, "next-year", {}, () => [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(d_arrow_right_default))]), _: 1 })])], 10, _hoisted_5$5), createElementVNode("div", null, toDisplayString(unref(rightLabel)), 1) ], 2), createVNode(basic_year_table_default, { "selection-mode": "range", date: rightDate.value, "min-date": unref(minDate), "max-date": unref(maxDate), "range-state": unref(rangeState), "disabled-date": unref(disabledDate), disabled: unref(yearRangeDisabled), "cell-class-name": unref(cellClassName), onChangerange: unref(handleChangeRange), onPick: handleRangePick, onSelect: unref(onSelect) }, null, 8, [ "date", "min-date", "max-date", "range-state", "disabled-date", "disabled", "cell-class-name", "onChangerange", "onSelect" ])], 2)) : createCommentVNode("v-if", true)], 2) ], 2)], 2); }; } }); //#endregion //#region ../../packages/components/date-picker-panel/src/date-picker-com/panel-year-range.vue var panel_year_range_default = panel_year_range_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/date-picker-panel/src/panel-utils.ts const getPanel = function(type) { switch (type) { case "daterange": case "datetimerange": return panel_date_range_default; case "monthrange": return panel_month_range_default; case "yearrange": return panel_year_range_default; default: return panel_date_pick_default; } }; //#endregion //#region ../../packages/components/date-picker-panel/src/date-picker-panel.tsx function _isSlot$7(s) { return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !isVNode(s); } import_dayjs_min.default.extend(import_localeData.default); import_dayjs_min.default.extend(import_advancedFormat.default); import_dayjs_min.default.extend(import_customParseFormat.default); import_dayjs_min.default.extend(import_weekOfYear.default); import_dayjs_min.default.extend(import_weekYear.default); import_dayjs_min.default.extend(import_dayOfYear.default); import_dayjs_min.default.extend(import_isSameOrAfter.default); import_dayjs_min.default.extend(import_isSameOrBefore.default); var date_picker_panel_default = /* @__PURE__ */ defineComponent({ name: "ElDatePickerPanel", install: null, inheritAttrs: false, props: datePickerPanelProps, emits: [ UPDATE_MODEL_EVENT, "calendar-change", "panel-change", "visible-change", "clear" ], setup(props, { slots, emit, attrs }) { const ns = useNamespace("picker-panel"); if (isUndefined(inject("EP_PICKER_BASE", void 0))) provide(PICKER_BASE_INJECTION_KEY, { props: reactive({ ...toRefs(props) }) }); provide(ROOT_PICKER_INJECTION_KEY, { slots, pickerNs: ns }); const { parsedValue, onCalendarChange, onPanelChange, onSetPickerOption, onPick } = inject(ROOT_COMMON_PICKER_INJECTION_KEY, () => useCommonPicker(props, emit), true); return () => { return createVNode(getPanel(props.type), mergeProps(omit(attrs, "onPick"), props, { "parsedValue": parsedValue.value, "onSet-picker-option": onSetPickerOption, "onCalendar-change": onCalendarChange, "onPanel-change": onPanelChange, "onClear": () => emit("clear"), "onPick": onPick }), _isSlot$7(slots) ? slots : { default: () => [slots] }); }; } }); //#endregion //#region ../../packages/components/date-picker-panel/index.ts const ElDatePickerPanel = withInstall(date_picker_panel_default); //#endregion //#region ../../packages/components/date-picker/src/props.ts const datePickerProps = buildProps({ ...timePickerDefaultProps, /** * @description type of the picker */ type: { type: definePropType(String), default: "date" } }); //#endregion //#region ../../packages/components/date-picker/src/date-picker.tsx function _isSlot$6(s) { return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !isVNode(s); } var date_picker_default = /* @__PURE__ */ defineComponent({ name: "ElDatePicker", install: null, props: datePickerProps, emits: [UPDATE_MODEL_EVENT], setup(props, { expose, emit, slots }) { provide(ROOT_PICKER_IS_DEFAULT_FORMAT_INJECTION_KEY, computed(() => { return !props.format; })); provide(PICKER_POPPER_OPTIONS_INJECTION_KEY, reactive(toRef(props, "popperOptions"))); const commonPicker = ref(); expose({ focus: () => { commonPicker.value?.focus(); }, blur: () => { commonPicker.value?.blur(); }, handleOpen: () => { commonPicker.value?.handleOpen(); }, handleClose: () => { commonPicker.value?.handleClose(); } }); const onModelValueUpdated = (val) => { emit(UPDATE_MODEL_EVENT, val); }; return () => { return createVNode(picker_default, mergeProps(props, { "format": props.format ?? (DEFAULT_FORMATS_DATEPICKER[props.type] || "YYYY-MM-DD"), "type": props.type, "ref": commonPicker, "onUpdate:modelValue": onModelValueUpdated }), { default: (scopedProps) => createVNode(ElDatePickerPanel, mergeProps({ "disabled": props.disabled, "editable": props.editable, "border": false }, scopedProps), _isSlot$6(slots) ? slots : { default: () => [slots] }), "range-separator": slots["range-separator"] }); }; } }); //#endregion //#region ../../packages/components/date-picker/index.ts const ElDatePicker = withInstall(date_picker_default); //#endregion //#region ../../packages/components/descriptions/src/description.ts /** * @deprecated Removed after 3.0.0, Use `DescriptionProps` instead. */ const descriptionProps = buildProps({ /** * @description with or without border */ border: Boolean, /** * @description numbers of `Descriptions Item` in one line */ column: { type: Number, default: 3 }, /** * @description direction of list */ direction: { type: String, values: ["horizontal", "vertical"], default: "horizontal" }, /** * @description size of list */ size: useSizeProp, /** * @description title text, display on the top left */ title: { type: String, default: "" }, /** * @description extra text, display on the top right */ extra: { type: String, default: "" }, /** * @description width of every label column */ labelWidth: { type: [String, Number] } }); //#endregion //#region ../../packages/components/descriptions/src/descriptions-row.ts /** * @deprecated Removed after 3.0.0, Use `DescriptionsRowProps` instead. */ const descriptionsRowProps = buildProps({ row: { type: definePropType(Array), default: () => [] } }); //#endregion //#region ../../packages/components/descriptions/src/token.ts const descriptionsKey = Symbol("elDescriptions"); //#endregion //#region ../../packages/components/descriptions/src/descriptions-cell.ts var descriptions_cell_default = defineComponent({ name: "ElDescriptionsCell", props: { cell: { type: Object }, tag: { type: String, default: "td" }, type: { type: String } }, setup() { return { descriptions: inject(descriptionsKey, {}) }; }, render() { const item = getNormalizedProps(this.cell); const directives = (this.cell?.dirs || []).map((dire) => { const { dir, arg, modifiers, value } = dire; return [ dir, value, arg, modifiers ]; }); const { border, direction } = this.descriptions; const isVertical = direction === "vertical"; const renderLabel = () => this.cell?.children?.label?.() || item.label; const renderContent = () => this.cell?.children?.default?.(); const span = item.span; const rowspan = item.rowspan; const align = item.align ? `is-${item.align}` : ""; const labelAlign = item.labelAlign ? `is-${item.labelAlign}` : align; const className = item.className; const labelClassName = item.labelClassName; const style = { width: addUnit(this.type === "label" ? item.labelWidth ?? this.descriptions.labelWidth ?? item.width : item.width), minWidth: addUnit(item.minWidth) }; const ns = useNamespace("descriptions"); switch (this.type) { case "label": return withDirectives(h(this.tag, { style, class: [ ns.e("cell"), ns.e("label"), ns.is("bordered-label", border), ns.is("vertical-label", isVertical), labelAlign, labelClassName ], colSpan: isVertical ? span : 1, rowspan: isVertical ? 1 : rowspan }, renderLabel()), directives); case "content": return withDirectives(h(this.tag, { style, class: [ ns.e("cell"), ns.e("content"), ns.is("bordered-content", border), ns.is("vertical-content", isVertical), align, className ], colSpan: isVertical ? span : span * 2 - 1, rowspan: isVertical ? rowspan * 2 - 1 : rowspan }, renderContent()), directives); default: { const label = renderLabel(); const labelStyle = {}; const width = addUnit(item.labelWidth ?? this.descriptions.labelWidth); if (width) { labelStyle.width = width; labelStyle.display = "inline-block"; } return withDirectives(h("td", { style, class: [ns.e("cell"), align], colSpan: span, rowspan }, [!isNil(label) ? h("span", { style: labelStyle, class: [ns.e("label"), labelClassName] }, label) : void 0, h("span", { class: [ns.e("content"), className] }, renderContent())]), directives); } } } }); //#endregion //#region ../../packages/components/descriptions/src/descriptions-row.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$44 = { key: 1 }; var descriptions_row_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElDescriptionsRow", __name: "descriptions-row", props: descriptionsRowProps, setup(__props) { const descriptions = inject(descriptionsKey, {}); return (_ctx, _cache) => { return unref(descriptions).direction === "vertical" ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createElementVNode("tr", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.row, (cell, _index) => { return openBlock(), createBlock(unref(descriptions_cell_default), { key: `tr1-${_index}`, cell, tag: "th", type: "label" }, null, 8, ["cell"]); }), 128))]), createElementVNode("tr", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.row, (cell, _index) => { return openBlock(), createBlock(unref(descriptions_cell_default), { key: `tr2-${_index}`, cell, tag: "td", type: "content" }, null, 8, ["cell"]); }), 128))])], 64)) : (openBlock(), createElementBlock("tr", _hoisted_1$44, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.row, (cell, _index) => { return openBlock(), createElementBlock(Fragment, { key: `tr3-${_index}` }, [unref(descriptions).border ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createVNode(unref(descriptions_cell_default), { cell, tag: "td", type: "label" }, null, 8, ["cell"]), createVNode(unref(descriptions_cell_default), { cell, tag: "td", type: "content" }, null, 8, ["cell"])], 64)) : (openBlock(), createBlock(unref(descriptions_cell_default), { key: 1, cell, tag: "td", type: "both" }, null, 8, ["cell"]))], 64); }), 128))])); }; } }); //#endregion //#region ../../packages/components/descriptions/src/descriptions-row.vue var descriptions_row_default = descriptions_row_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/descriptions/src/constants.ts const COMPONENT_NAME$10 = "ElDescriptionsItem"; //#endregion //#region ../../packages/components/descriptions/src/description.vue?vue&type=script&setup=true&lang.ts var description_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElDescriptions", __name: "description", props: descriptionProps, setup(__props) { const props = __props; const ns = useNamespace("descriptions"); const descriptionsSize = useFormSize(); const slots = useSlots(); provide(descriptionsKey, props); const descriptionKls = computed(() => [ns.b(), ns.m(descriptionsSize.value)]); const filledNode = (node, span, count, isLast = false) => { if (!node.props) node.props = {}; if (span > count) node.props.span = count; if (isLast) node.props.span = span; return node; }; const getRows = () => { if (!slots.default) return []; const children = flattedChildren(slots.default()).filter((node) => node?.type?.name === COMPONENT_NAME$10); const rows = []; let temp = []; let count = props.column; let totalSpan = 0; const rowspanTemp = []; children.forEach((node, index) => { const span = node.props?.span || 1; const rowspan = node.props?.rowspan || 1; const rowNo = rows.length; rowspanTemp[rowNo] ||= 0; if (rowspan > 1) for (let i = 1; i < rowspan; i++) { rowspanTemp[rowNo + i] ||= 0; rowspanTemp[rowNo + i]++; totalSpan++; } if (rowspanTemp[rowNo] > 0) { count -= rowspanTemp[rowNo]; rowspanTemp[rowNo] = 0; } if (index < children.length - 1) totalSpan += span > count ? count : span; if (index === children.length - 1) { const lastSpan = props.column - totalSpan % props.column; temp.push(filledNode(node, lastSpan, count, true)); rows.push(temp); return; } if (span < count) { count -= span; temp.push(node); } else { temp.push(filledNode(node, span, count)); rows.push(temp); count = props.column; temp = []; } }); return rows; }; return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass(descriptionKls.value) }, [__props.title || __props.extra || _ctx.$slots.title || _ctx.$slots.extra ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ns).e("header")) }, [createElementVNode("div", { class: normalizeClass(unref(ns).e("title")) }, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])], 2), createElementVNode("div", { class: normalizeClass(unref(ns).e("extra")) }, [renderSlot(_ctx.$slots, "extra", {}, () => [createTextVNode(toDisplayString(__props.extra), 1)])], 2)], 2)) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass(unref(ns).e("body")) }, [createElementVNode("table", { class: normalizeClass([unref(ns).e("table"), unref(ns).is("bordered", __props.border)]) }, [createElementVNode("tbody", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(getRows(), (row, _index) => { return openBlock(), createBlock(descriptions_row_default, { key: _index, row }, null, 8, ["row"]); }), 128))])], 2)], 2)], 2); }; } }); //#endregion //#region ../../packages/components/descriptions/src/description.vue var description_default = description_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/descriptions/src/description-item.ts const descriptionItemProps = buildProps({ /** * @description label text */ label: { type: String, default: "" }, /** * @description colspan of column */ span: { type: Number, default: 1 }, /** * @description the number of rows a cell should span */ rowspan: { type: Number, default: 1 }, /** * @description column width, the width of the same column in different rows is set by the max value (If no `border`, width contains label and content) */ width: { type: [String, Number], default: "" }, /** * @description column minimum width, columns with `width` has a fixed width, while columns with `min-width` has a width that is distributed in proportion (If no`border`, width contains label and content) */ minWidth: { type: [String, Number], default: "" }, /** * @description column label width, if not set, it will be the same as the width of the column. Higher priority than the `label-width` of `Descriptions` */ labelWidth: { type: [String, Number] }, /** * @description column content alignment (If no `border`, effective for both label and content) */ align: { type: String, values: columnAlignment, default: "left" }, /** * @description column label alignment, if omitted, the value of the above `align` attribute will be applied (If no `border`, please use `align` attribute) */ labelAlign: { type: String, values: columnAlignment }, /** * @description column content custom class name */ className: { type: String, default: "" }, /** * @description column label custom class name */ labelClassName: { type: String, default: "" } }); const DescriptionItem = defineComponent({ name: COMPONENT_NAME$10, props: descriptionItemProps }); //#endregion //#region ../../packages/components/descriptions/index.ts const ElDescriptions = withInstall(description_default, { DescriptionsItem: DescriptionItem }); const ElDescriptionsItem = withNoopInstall(DescriptionItem); //#endregion //#region ../../packages/components/dialog/src/dialog-content.ts /** * @deprecated Removed after 3.0.0, Use `DialogContentProps` instead. */ const dialogContentProps = buildProps({ /** * @description whether to align the header and footer in center */ center: Boolean, /** * @description whether to align the dialog both horizontally and vertically */ alignCenter: { type: Boolean, default: void 0 }, /** * @description custom close icon, default is Close */ closeIcon: { type: iconPropType }, /** * @description enable dragging feature for Dialog */ draggable: { type: Boolean, default: void 0 }, /** * @description draggable Dialog can overflow the viewport */ overflow: { type: Boolean, default: void 0 }, /** * @description whether the Dialog takes up full screen */ fullscreen: Boolean, /** * @description custom class names for header wrapper */ headerClass: String, /** * @description custom class names for body wrapper */ bodyClass: String, /** * @description custom class names for footer wrapper */ footerClass: String, /** * @description whether to show a close button */ showClose: { type: Boolean, default: true }, /** * @description title of Dialog. Can also be passed with a named slot (see the following table) */ title: { type: String, default: "" }, /** * @description header's aria-level attribute */ ariaLevel: { type: String, default: "2" } }); const dialogContentEmits = { close: () => true }; const dialogContentPropsDefaults = { alignCenter: void 0, draggable: void 0, overflow: void 0, showClose: true, title: "", ariaLevel: "2" }; //#endregion //#region ../../packages/components/dialog/src/dialog.ts /** * @deprecated Removed after 3.0.0, Use `DialogProps` instead. */ const dialogProps = buildProps({ ...dialogContentProps, /** * @description whether to append Dialog itself to body. A nested Dialog should have this attribute set to `true` */ appendToBody: Boolean, /** * @description which element the Dialog appends to */ appendTo: { type: definePropType([String, Object]), default: "body" }, /** * @description callback before Dialog closes, and it will prevent Dialog from closing, use done to close the dialog */ beforeClose: { type: definePropType(Function) }, /** * @description destroy elements in Dialog when closed */ destroyOnClose: Boolean, /** * @description whether the Dialog can be closed by clicking the mask */ closeOnClickModal: { type: Boolean, default: true }, /** * @description whether the Dialog can be closed by pressing ESC */ closeOnPressEscape: { type: Boolean, default: true }, /** * @description whether scroll of body is disabled while Dialog is displayed */ lockScroll: { type: Boolean, default: true }, /** * @description whether a mask is displayed */ modal: { type: Boolean, default: true }, /** * @description whether the mask is penetrable */ modalPenetrable: Boolean, /** * @description the Time(milliseconds) before open */ openDelay: { type: Number, default: 0 }, /** * @description the Time(milliseconds) before close */ closeDelay: { type: Number, default: 0 }, /** * @description value for `margin-top` of Dialog CSS, default is 15vh */ top: { type: String }, /** * @description visibility of Dialog */ modelValue: Boolean, /** * @description custom class names for mask */ modalClass: String, /** * @description custom class names for header wrapper */ headerClass: String, /** * @description custom class names for body wrapper */ bodyClass: String, /** * @description custom class names for footer wrapper */ footerClass: String, /** * @description width of Dialog, default is 50% */ width: { type: [String, Number] }, /** * @description same as z-index in native CSS, z-order of dialog */ zIndex: { type: Number }, trapFocus: Boolean, /** * @description header's aria-level attribute */ headerAriaLevel: { type: String, default: "2" }, /** * @description custom transition configuration for dialog animation, it can be a string (transition name) or an object with Vue transition props */ transition: { type: definePropType([String, Object]), default: void 0 } }); const dialogEmits = { open: () => true, opened: () => true, close: () => true, closed: () => true, [UPDATE_MODEL_EVENT]: (value) => isBoolean(value), openAutoFocus: () => true, closeAutoFocus: () => true }; const dialogContextKey = Symbol("dialogContextKey"); const dialogPropsDefaults = { ...dialogContentPropsDefaults, appendTo: "body", closeOnClickModal: true, closeOnPressEscape: true, lockScroll: true, modal: true, openDelay: 0, closeDelay: 0, headerAriaLevel: "2", transition: void 0 }; //#endregion //#region ../../packages/components/overlay/src/overlay.ts const overlayProps = buildProps({ mask: { type: Boolean, default: true }, customMaskEvent: Boolean, overlayClass: { type: definePropType([ String, Array, Object ]) }, zIndex: { type: definePropType([String, Number]) } }); const overlayEmits = { click: (evt) => evt instanceof MouseEvent }; const BLOCK = "overlay"; var overlay_default = defineComponent({ name: "ElOverlay", props: overlayProps, emits: overlayEmits, setup(props, { slots, emit }) { const ns = useNamespace(BLOCK); const onMaskClick = (e) => { emit("click", e); }; const { onClick, onMousedown, onMouseup } = useSameTarget(props.customMaskEvent ? void 0 : onMaskClick); return () => { return props.mask ? createVNode("div", { class: [ns.b(), props.overlayClass], style: { zIndex: props.zIndex }, onClick, onMousedown, onMouseup }, [renderSlot(slots, "default")], 4 | 2 | 8, [ "onClick", "onMouseup", "onMousedown" ]) : h("div", { class: props.overlayClass, style: { zIndex: props.zIndex, position: "fixed", top: "0px", right: "0px", bottom: "0px", left: "0px" } }, [renderSlot(slots, "default")]); }; } }); //#endregion //#region ../../packages/components/overlay/index.ts const ElOverlay = overlay_default; //#endregion //#region ../../packages/components/dialog/src/constants.ts const dialogInjectionKey = Symbol("dialogInjectionKey"); const DEFAULT_DIALOG_TRANSITION = "dialog-fade"; //#endregion //#region ../../packages/components/dialog/src/dialog-content.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$43 = ["aria-level"]; const _hoisted_2$26 = ["aria-label"]; const _hoisted_3$10 = ["id"]; var dialog_content_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElDialogContent", __name: "dialog-content", props: dialogContentProps, emits: dialogContentEmits, setup(__props, { expose: __expose }) { const { t } = useLocale(); const { Close } = CloseComponents; const props = __props; const { dialogRef, headerRef, bodyId, ns, style } = inject(dialogInjectionKey); const { focusTrapRef } = inject(FOCUS_TRAP_INJECTION_KEY); const composedDialogRef = composeRefs(focusTrapRef, dialogRef); const draggable = computed(() => !!props.draggable); const { resetPosition, updatePosition, isDragging } = useDraggable(dialogRef, headerRef, draggable, computed(() => !!props.overflow)); const dialogKls = computed(() => [ ns.b(), ns.is("fullscreen", props.fullscreen), ns.is("draggable", draggable.value), ns.is("dragging", isDragging.value), ns.is("align-center", !!props.alignCenter), { [ns.m("center")]: props.center } ]); __expose({ resetPosition, updatePosition }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { ref: unref(composedDialogRef), class: normalizeClass(dialogKls.value), style: normalizeStyle(unref(style)), tabindex: "-1" }, [ createElementVNode("header", { ref_key: "headerRef", ref: headerRef, class: normalizeClass([ unref(ns).e("header"), __props.headerClass, { "show-close": __props.showClose } ]) }, [renderSlot(_ctx.$slots, "header", {}, () => [createElementVNode("span", { role: "heading", "aria-level": __props.ariaLevel, class: normalizeClass(unref(ns).e("title")) }, toDisplayString(__props.title), 11, _hoisted_1$43)]), __props.showClose ? (openBlock(), createElementBlock("button", { key: 0, "aria-label": unref(t)("el.dialog.close"), class: normalizeClass(unref(ns).e("headerbtn")), type: "button", onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("close")) }, [createVNode(unref(ElIcon), { class: normalizeClass(unref(ns).e("close")) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(__props.closeIcon || unref(Close))))]), _: 1 }, 8, ["class"])], 10, _hoisted_2$26)) : createCommentVNode("v-if", true)], 2), createElementVNode("div", { id: unref(bodyId), class: normalizeClass([unref(ns).e("body"), __props.bodyClass]) }, [renderSlot(_ctx.$slots, "default")], 10, _hoisted_3$10), _ctx.$slots.footer ? (openBlock(), createElementBlock("footer", { key: 0, class: normalizeClass([unref(ns).e("footer"), __props.footerClass]) }, [renderSlot(_ctx.$slots, "footer")], 2)) : createCommentVNode("v-if", true) ], 6); }; } }); //#endregion //#region ../../packages/components/dialog/src/dialog-content.vue var dialog_content_default = dialog_content_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/dialog/src/use-dialog.ts const COMPONENT_NAME$9 = "ElDialog"; const useDialog = (props, targetRef) => { const emit = getCurrentInstance().emit; const { nextZIndex } = useZIndex(); let lastPosition = ""; const titleId = useId(); const bodyId = useId(); const visible = ref(false); const closed = ref(false); const rendered = ref(false); const zIndex = ref(props.zIndex ?? nextZIndex()); const closing = ref(false); let openTimer = void 0; let closeTimer = void 0; const config = useGlobalConfig(); const namespace = computed(() => config.value?.namespace ?? "el"); const globalConfig = computed(() => config.value?.dialog); const style = computed(() => { const style = {}; const varPrefix = `--${namespace.value}-dialog`; if (!props.fullscreen) { if (props.top) style[`${varPrefix}-margin-top`] = props.top; const width = addUnit(props.width); if (width) style[`${varPrefix}-width`] = width; } return style; }); const _draggable = computed(() => (props.draggable ?? globalConfig.value?.draggable ?? false) && !props.fullscreen); const _alignCenter = computed(() => props.alignCenter ?? globalConfig.value?.alignCenter ?? false); const _overflow = computed(() => props.overflow ?? globalConfig.value?.overflow ?? false); const penetrable = computed(() => props.modalPenetrable && !props.modal && !props.fullscreen); const overlayDialogStyle = computed(() => { if (_alignCenter.value) return { display: "flex" }; return {}; }); const transitionConfig = computed(() => { const transition = props.transition ?? globalConfig.value?.transition ?? "dialog-fade"; const baseConfig = { name: transition, onAfterEnter: afterEnter, onBeforeLeave: beforeLeave, onAfterLeave: afterLeave }; if (isObject$1(transition)) { const config = { ...transition }; const _mergeHook = (userHook, defaultHook) => { return (el) => { if (isArray$1(userHook)) userHook.forEach((fn) => { if (isFunction$1(fn)) fn(el); }); else if (isFunction$1(userHook)) userHook(el); defaultHook(); }; }; config.onAfterEnter = _mergeHook(config.onAfterEnter, afterEnter); config.onBeforeLeave = _mergeHook(config.onBeforeLeave, beforeLeave); config.onAfterLeave = _mergeHook(config.onAfterLeave, afterLeave); if (!config.name) { config.name = DEFAULT_DIALOG_TRANSITION; /* @__PURE__ */ debugWarn(COMPONENT_NAME$9, `transition.name is missing when using object syntax, fallback to '${DEFAULT_DIALOG_TRANSITION}'`); } return config; } return baseConfig; }); function afterEnter() { emit("opened"); } function afterLeave() { emit("closed"); emit(UPDATE_MODEL_EVENT, false); if (props.destroyOnClose) rendered.value = false; closing.value = false; } function beforeLeave() { closing.value = true; emit("close"); } function open() { closeTimer?.(); openTimer?.(); if (props.openDelay && props.openDelay > 0) ({stop: openTimer} = useTimeoutFn(() => doOpen(), props.openDelay)); else doOpen(); } function close() { openTimer?.(); closeTimer?.(); if (props.closeDelay && props.closeDelay > 0) ({stop: closeTimer} = useTimeoutFn(() => doClose(), props.closeDelay)); else doClose(); } function handleClose() { function hide(shouldCancel) { if (shouldCancel) return; closed.value = true; visible.value = false; } if (props.beforeClose) props.beforeClose(hide); else close(); } function onModalClick() { if (props.closeOnClickModal) handleClose(); } function doOpen() { if (!isClient) return; visible.value = true; } function doClose() { visible.value = false; } function onOpenAutoFocus() { emit("openAutoFocus"); } function onCloseAutoFocus() { emit("closeAutoFocus"); } function onFocusoutPrevented(event) { if (event.detail?.focusReason === "pointer") event.preventDefault(); } if (props.lockScroll) useLockscreen(visible); function onCloseRequested() { if (props.closeOnPressEscape) handleClose(); } function bringToFront() { if (!visible.value || !penetrable.value || props.zIndex !== void 0) return; zIndex.value = nextZIndex(); } watch(() => props.zIndex, () => { zIndex.value = props.zIndex ?? nextZIndex(); }); watch(() => props.modelValue, (val) => { if (val) { closed.value = false; closing.value = false; open(); rendered.value = true; zIndex.value = props.zIndex ?? nextZIndex(); nextTick(() => { emit("open"); if (targetRef.value) { targetRef.value.parentElement.scrollTop = 0; targetRef.value.parentElement.scrollLeft = 0; targetRef.value.scrollTop = 0; } }); } else if (visible.value) close(); }); watch(() => props.fullscreen, (val) => { if (!targetRef.value) return; if (val) { lastPosition = targetRef.value.style.transform; targetRef.value.style.transform = ""; } else targetRef.value.style.transform = lastPosition; }); onMounted(() => { if (props.modelValue) { visible.value = true; rendered.value = true; open(); } }); return { afterEnter, afterLeave, beforeLeave, handleClose, onModalClick, close, doClose, onOpenAutoFocus, onCloseAutoFocus, onCloseRequested, onFocusoutPrevented, bringToFront, titleId, bodyId, closed, style, overlayDialogStyle, rendered, visible, zIndex, transitionConfig, _draggable, _alignCenter, _overflow, closing, penetrable }; }; //#endregion //#region ../../packages/components/dialog/src/dialog.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$42 = [ "aria-label", "aria-labelledby", "aria-describedby" ]; var dialog_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElDialog", inheritAttrs: false, __name: "dialog", props: dialogProps, emits: dialogEmits, setup(__props, { expose: __expose }) { const props = __props; const slots = useSlots(); useDeprecated({ scope: "el-dialog", from: "the title slot", replacement: "the header slot", version: "3.0.0", ref: "https://element-plus.org/en-US/component/dialog.html#slots" }, computed(() => !!slots.title)); const ns = useNamespace("dialog"); const dialogRef = ref(); const headerRef = ref(); const dialogContentRef = ref(); const { visible, titleId, bodyId, style, overlayDialogStyle, rendered, transitionConfig, zIndex, _draggable, _alignCenter, _overflow, penetrable, handleClose, onModalClick, onOpenAutoFocus, onCloseAutoFocus, onCloseRequested, onFocusoutPrevented, bringToFront, closing } = useDialog(props, dialogRef); provide(dialogInjectionKey, { dialogRef, headerRef, bodyId, ns, rendered, style }); const overlayEvent = useSameTarget(onModalClick); const resetPosition = () => { dialogContentRef.value?.resetPosition(); }; __expose({ /** @description whether the dialog is visible */ visible, dialogContentRef, resetPosition, handleClose }); return (_ctx, _cache) => { return openBlock(), createBlock(Teleport, { to: __props.appendTo, disabled: __props.appendTo !== "body" ? false : !__props.appendToBody }, [createVNode(Transition, mergeProps(unref(transitionConfig), { persisted: "" }), { default: withCtx(() => [withDirectives(createVNode(unref(ElOverlay), { "custom-mask-event": "", mask: __props.modal, "overlay-class": [ __props.modalClass ?? "", `${unref(ns).namespace.value}-modal-dialog`, unref(ns).is("penetrable", unref(penetrable)) ], "z-index": unref(zIndex) }, { default: withCtx(() => [createElementVNode("div", { role: "dialog", "aria-modal": "true", "aria-label": __props.title || void 0, "aria-labelledby": !__props.title ? unref(titleId) : void 0, "aria-describedby": unref(bodyId), class: normalizeClass([`${unref(ns).namespace.value}-overlay-dialog`, unref(ns).is("closing", unref(closing))]), style: normalizeStyle(unref(overlayDialogStyle)), onClick: _cache[0] || (_cache[0] = (...args) => unref(overlayEvent).onClick && unref(overlayEvent).onClick(...args)), onMousedown: _cache[1] || (_cache[1] = (...args) => unref(overlayEvent).onMousedown && unref(overlayEvent).onMousedown(...args)), onMouseup: _cache[2] || (_cache[2] = (...args) => unref(overlayEvent).onMouseup && unref(overlayEvent).onMouseup(...args)) }, [createVNode(unref(focus_trap_default), { loop: "", trapped: unref(visible), "focus-start-el": "container", onFocusAfterTrapped: unref(onOpenAutoFocus), onFocusAfterReleased: unref(onCloseAutoFocus), onFocusoutPrevented: unref(onFocusoutPrevented), onReleaseRequested: unref(onCloseRequested) }, { default: withCtx(() => [unref(rendered) ? (openBlock(), createBlock(dialog_content_default, mergeProps({ key: 0, ref_key: "dialogContentRef", ref: dialogContentRef }, _ctx.$attrs, { center: __props.center, "align-center": unref(_alignCenter), "close-icon": __props.closeIcon, draggable: unref(_draggable), overflow: unref(_overflow), fullscreen: __props.fullscreen, "header-class": __props.headerClass, "body-class": __props.bodyClass, "footer-class": __props.footerClass, "show-close": __props.showClose, title: __props.title, "aria-level": __props.headerAriaLevel, onClose: unref(handleClose), onMousedown: unref(bringToFront) }), createSlots({ header: withCtx(() => [!_ctx.$slots.title ? renderSlot(_ctx.$slots, "header", { key: 0, close: unref(handleClose), titleId: unref(titleId), titleClass: unref(ns).e("title") }) : renderSlot(_ctx.$slots, "title", { key: 1 })]), default: withCtx(() => [renderSlot(_ctx.$slots, "default")]), _: 2 }, [_ctx.$slots.footer ? { name: "footer", fn: withCtx(() => [renderSlot(_ctx.$slots, "footer")]), key: "0" } : void 0]), 1040, [ "center", "align-center", "close-icon", "draggable", "overflow", "fullscreen", "header-class", "body-class", "footer-class", "show-close", "title", "aria-level", "onClose", "onMousedown" ])) : createCommentVNode("v-if", true)]), _: 3 }, 8, [ "trapped", "onFocusAfterTrapped", "onFocusAfterReleased", "onFocusoutPrevented", "onReleaseRequested" ])], 46, _hoisted_1$42)]), _: 3 }, 8, [ "mask", "overlay-class", "z-index" ]), [[vShow, unref(visible)]])]), _: 3 }, 16)], 8, ["to", "disabled"]); }; } }); //#endregion //#region ../../packages/components/dialog/src/dialog.vue var dialog_default = dialog_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/dialog/index.ts const ElDialog = withInstall(dialog_default); //#endregion //#region ../../packages/components/divider/src/divider.ts /** * @deprecated Removed after 3.0.0, Use `DividerProps` instead. */ const dividerProps = buildProps({ /** * @description Set divider's direction */ direction: { type: String, values: ["horizontal", "vertical"], default: "horizontal" }, /** * @description Set the style of divider */ contentPosition: { type: String, values: [ "left", "center", "right" ], default: "center" }, /** * @description the position of the customized content on the divider line */ borderStyle: { type: definePropType(String), default: "solid" } }); //#endregion //#region ../../packages/components/divider/src/divider.vue?vue&type=script&setup=true&lang.ts var divider_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElDivider", __name: "divider", props: dividerProps, setup(__props) { const props = __props; const ns = useNamespace("divider"); const dividerStyle = computed(() => { return ns.cssVar({ "border-style": props.borderStyle }); }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass([unref(ns).b(), unref(ns).m(__props.direction)]), style: normalizeStyle(dividerStyle.value), role: "separator" }, [_ctx.$slots.default && __props.direction !== "vertical" ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass([unref(ns).e("text"), unref(ns).is(__props.contentPosition)]) }, [renderSlot(_ctx.$slots, "default")], 2)) : createCommentVNode("v-if", true)], 6); }; } }); //#endregion //#region ../../packages/components/divider/src/divider.vue var divider_default = divider_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/divider/index.ts const ElDivider = withInstall(divider_default); //#endregion //#region ../../packages/components/drawer/src/drawer.ts /** * @deprecated Removed after 3.0.0, Use `DrawerProps` instead. */ const drawerProps = buildProps({ ...dialogProps, direction: { type: String, default: "rtl", values: [ "ltr", "rtl", "ttb", "btt" ] }, resizable: Boolean, size: { type: [String, Number], default: "30%" }, withHeader: { type: Boolean, default: true }, modalFade: { type: Boolean, default: true }, headerAriaLevel: { type: String, default: "2" } }); const drawerEmits = { ...dialogEmits, "resize-start": (evt, size) => evt instanceof MouseEvent && typeof size === "number", resize: (evt, size) => evt instanceof MouseEvent && typeof size === "number", "resize-end": (evt, size) => evt instanceof MouseEvent && typeof size === "number" }; //#endregion //#region ../../packages/components/drawer/src/composables/useResizable.ts function useResizable(props, target, emit) { const { width, height } = useWindowSize(); const isHorizontal = computed(() => ["ltr", "rtl"].includes(props.direction)); const sign = computed(() => ["ltr", "ttb"].includes(props.direction) ? 1 : -1); const windowSize = computed(() => isHorizontal.value ? width.value : height.value); const getSize = computed(() => { return clamp$2(startSize.value + sign.value * offset.value, 4, windowSize.value); }); const startSize = ref(0); const offset = ref(0); const isResizing = ref(false); const hasStartedDragging = ref(false); let startPos = []; let cleanups = []; const getActualSize = () => { const drawerEl = target.value?.closest("[aria-modal=\"true\"]"); if (drawerEl) return isHorizontal.value ? drawerEl.offsetWidth : drawerEl.offsetHeight; return 100; }; watch(() => [props.size, props.resizable], () => { hasStartedDragging.value = false; startSize.value = 0; offset.value = 0; onMouseUp(); }); const onMousedown = (e) => { if (!props.resizable) return; if (!hasStartedDragging.value) { startSize.value = getActualSize(); hasStartedDragging.value = true; } startPos = [e.pageX, e.pageY]; isResizing.value = true; emit("resize-start", e, startSize.value); cleanups.push(useEventListener(window, "mouseup", onMouseUp), useEventListener(window, "mousemove", onMouseMove)); }; const onMouseMove = (e) => { const { pageX, pageY } = e; const offsetX = pageX - startPos[0]; const offsetY = pageY - startPos[1]; offset.value = isHorizontal.value ? offsetX : offsetY; emit("resize", e, getSize.value); }; const onMouseUp = (e) => { if (!isResizing.value) return; startPos = []; startSize.value = getSize.value; offset.value = 0; isResizing.value = false; cleanups.forEach((cleanup) => cleanup?.()); cleanups = []; if (e) emit("resize-end", e, startSize.value); }; const cleanup = useEventListener(target, "mousedown", onMousedown); onBeforeUnmount(() => { cleanup(); onMouseUp(); }); return { size: computed(() => { return hasStartedDragging.value ? `${getSize.value}px` : addUnit(props.size); }), isResizing, isHorizontal }; } //#endregion //#region ../../packages/components/drawer/src/drawer.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$41 = [ "aria-label", "aria-labelledby", "aria-describedby" ]; const _hoisted_2$25 = ["id", "aria-level"]; const _hoisted_3$9 = ["aria-label"]; const _hoisted_4$7 = ["id"]; var drawer_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElDrawer", inheritAttrs: false, __name: "drawer", props: drawerProps, emits: drawerEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const slots = useSlots(); useDeprecated({ scope: "el-drawer", from: "the title slot", replacement: "the header slot", version: "3.0.0", ref: "https://element-plus.org/en-US/component/drawer.html#slots" }, computed(() => !!slots.title)); const drawerRef = ref(); const focusStartRef = ref(); const draggerRef = ref(); const ns = useNamespace("drawer"); const { t } = useLocale(); const { afterEnter, afterLeave, beforeLeave, visible, rendered, titleId, bodyId, zIndex, onModalClick, onOpenAutoFocus, onCloseAutoFocus, onFocusoutPrevented, onCloseRequested, handleClose } = useDialog(props, drawerRef); const { isHorizontal, size, isResizing } = useResizable(props, draggerRef, emit); const penetrable = computed(() => props.modalPenetrable && !props.modal); __expose({ handleClose, /** @deprecated Will be removed after 2.14.0. */ afterEnter, /** @deprecated Will be removed after 2.14.0. */ afterLeave }); return (_ctx, _cache) => { return openBlock(), createBlock(Teleport, { to: __props.appendTo, disabled: __props.appendTo !== "body" ? false : !__props.appendToBody }, [createVNode(Transition, { name: unref(ns).b("fade"), onAfterEnter: unref(afterEnter), onAfterLeave: unref(afterLeave), onBeforeLeave: unref(beforeLeave), persisted: "" }, { default: withCtx(() => [withDirectives(createVNode(unref(ElOverlay), { mask: __props.modal, "overlay-class": [ unref(ns).is("drawer"), __props.modalClass ?? "", `${unref(ns).namespace.value}-modal-drawer`, unref(ns).is("penetrable", penetrable.value) ], "z-index": unref(zIndex), onClick: unref(onModalClick) }, { default: withCtx(() => [createVNode(unref(focus_trap_default), { loop: "", trapped: unref(visible), "focus-trap-el": drawerRef.value, "focus-start-el": focusStartRef.value, onFocusAfterTrapped: unref(onOpenAutoFocus), onFocusAfterReleased: unref(onCloseAutoFocus), onFocusoutPrevented: unref(onFocusoutPrevented), onReleaseRequested: unref(onCloseRequested) }, { default: withCtx(() => [createElementVNode("div", mergeProps({ ref_key: "drawerRef", ref: drawerRef, "aria-modal": "true", "aria-label": __props.title || void 0, "aria-labelledby": !__props.title ? unref(titleId) : void 0, "aria-describedby": unref(bodyId) }, _ctx.$attrs, { class: [ unref(ns).b(), __props.direction, unref(visible) && "open", unref(ns).is("dragging", unref(isResizing)) ], style: { [unref(isHorizontal) ? "width" : "height"]: unref(size) }, role: "dialog", onClick: _cache[1] || (_cache[1] = withModifiers(() => {}, ["stop"])) }), [ createElementVNode("span", { ref_key: "focusStartRef", ref: focusStartRef, class: normalizeClass(unref(ns).e("sr-focus")), tabindex: "-1" }, null, 2), __props.withHeader ? (openBlock(), createElementBlock("header", { key: 0, class: normalizeClass([unref(ns).e("header"), __props.headerClass]) }, [!_ctx.$slots.title ? renderSlot(_ctx.$slots, "header", { key: 0, close: unref(handleClose), titleId: unref(titleId), titleClass: unref(ns).e("title") }, () => [createElementVNode("span", { id: unref(titleId), role: "heading", "aria-level": __props.headerAriaLevel, class: normalizeClass(unref(ns).e("title")) }, toDisplayString(__props.title), 11, _hoisted_2$25)]) : renderSlot(_ctx.$slots, "title", { key: 1 }, () => [createCommentVNode(" DEPRECATED SLOT ")]), __props.showClose ? (openBlock(), createElementBlock("button", { key: 2, "aria-label": unref(t)("el.drawer.close"), class: normalizeClass(unref(ns).e("close-btn")), type: "button", onClick: _cache[0] || (_cache[0] = (...args) => unref(handleClose) && unref(handleClose)(...args)) }, [createVNode(unref(ElIcon), { class: normalizeClass(unref(ns).e("close")) }, { default: withCtx(() => [createVNode(unref(close_default))]), _: 1 }, 8, ["class"])], 10, _hoisted_3$9)) : createCommentVNode("v-if", true)], 2)) : createCommentVNode("v-if", true), unref(rendered) ? (openBlock(), createElementBlock("div", { key: 1, id: unref(bodyId), class: normalizeClass([unref(ns).e("body"), __props.bodyClass]) }, [renderSlot(_ctx.$slots, "default")], 10, _hoisted_4$7)) : createCommentVNode("v-if", true), _ctx.$slots.footer ? (openBlock(), createElementBlock("div", { key: 2, class: normalizeClass([unref(ns).e("footer"), __props.footerClass]) }, [renderSlot(_ctx.$slots, "footer")], 2)) : createCommentVNode("v-if", true), __props.resizable ? (openBlock(), createElementBlock("div", { key: 3, ref_key: "draggerRef", ref: draggerRef, style: normalizeStyle({ zIndex: unref(zIndex) }), class: normalizeClass(unref(ns).e("dragger")) }, null, 6)) : createCommentVNode("v-if", true) ], 16, _hoisted_1$41)]), _: 3 }, 8, [ "trapped", "focus-trap-el", "focus-start-el", "onFocusAfterTrapped", "onFocusAfterReleased", "onFocusoutPrevented", "onReleaseRequested" ])]), _: 3 }, 8, [ "mask", "overlay-class", "z-index", "onClick" ]), [[vShow, unref(visible)]])]), _: 3 }, 8, [ "name", "onAfterEnter", "onAfterLeave", "onBeforeLeave" ])], 8, ["to", "disabled"]); }; } }); //#endregion //#region ../../packages/components/drawer/src/drawer.vue var drawer_default = drawer_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/drawer/index.ts const ElDrawer = withInstall(drawer_default); //#endregion //#region ../../packages/components/collection/src/collection.vue?vue&type=script&lang.ts var collection_vue_vue_type_script_lang_default = defineComponent({ inheritAttrs: false }); //#endregion //#region ../../packages/components/collection/src/collection.vue function _sfc_render$16(_ctx, _cache, $props, $setup, $data, $options) { return renderSlot(_ctx.$slots, "default"); } var collection_default = /* @__PURE__ */ _plugin_vue_export_helper_default(collection_vue_vue_type_script_lang_default, [["render", _sfc_render$16]]); //#endregion //#region ../../packages/components/collection/src/collection-item.vue?vue&type=script&lang.ts var collection_item_vue_vue_type_script_lang_default = defineComponent({ name: "ElCollectionItem", inheritAttrs: false }); //#endregion //#region ../../packages/components/collection/src/collection-item.vue function _sfc_render$15(_ctx, _cache, $props, $setup, $data, $options) { return renderSlot(_ctx.$slots, "default"); } var collection_item_default = /* @__PURE__ */ _plugin_vue_export_helper_default(collection_item_vue_vue_type_script_lang_default, [["render", _sfc_render$15]]); //#endregion //#region ../../packages/components/collection/src/collection.ts const COLLECTION_ITEM_SIGN = `data-el-collection-item`; const createCollectionWithScope = (name) => { const COLLECTION_NAME = `El${name}Collection`; const COLLECTION_ITEM_NAME = `${COLLECTION_NAME}Item`; const COLLECTION_INJECTION_KEY = Symbol(COLLECTION_NAME); const COLLECTION_ITEM_INJECTION_KEY = Symbol(COLLECTION_ITEM_NAME); return { COLLECTION_INJECTION_KEY, COLLECTION_ITEM_INJECTION_KEY, ElCollection: Object.assign({}, collection_default, { name: COLLECTION_NAME, setup() { const collectionRef = ref(); const itemMap = /* @__PURE__ */ new Map(); const getItems = (() => { const collectionEl = unref(collectionRef); if (!collectionEl) return []; const orderedNodes = Array.from(collectionEl.querySelectorAll(`[${COLLECTION_ITEM_SIGN}]`)); return [...itemMap.values()].sort((a, b) => orderedNodes.indexOf(a.ref) - orderedNodes.indexOf(b.ref)); }); provide(COLLECTION_INJECTION_KEY, { itemMap, getItems, collectionRef }); } }), ElCollectionItem: Object.assign({}, collection_item_default, { name: COLLECTION_ITEM_NAME, setup(_, { attrs }) { const collectionItemRef = ref(); const collectionInjection = inject(COLLECTION_INJECTION_KEY, void 0); provide(COLLECTION_ITEM_INJECTION_KEY, { collectionItemRef }); onMounted(() => { const collectionItemEl = unref(collectionItemRef); if (collectionItemEl) collectionInjection.itemMap.set(collectionItemEl, { ref: collectionItemEl, ...attrs }); }); onBeforeUnmount(() => { const collectionItemEl = unref(collectionItemRef); collectionInjection.itemMap.delete(collectionItemEl); }); } }) }; }; //#endregion //#region ../../packages/components/roving-focus-group/src/roving-focus-group.ts const rovingFocusGroupProps = buildProps({ style: { type: definePropType([ String, Array, Object, Boolean ]), default: void 0 }, currentTabId: { type: definePropType(String) }, defaultCurrentTabId: String, loop: Boolean, dir: { type: String, values: ["ltr", "rtl"], default: "ltr" }, orientation: { type: definePropType(String) }, onBlur: Function, onFocus: Function, onMousedown: Function }); const { ElCollection, ElCollectionItem, COLLECTION_INJECTION_KEY, COLLECTION_ITEM_INJECTION_KEY } = createCollectionWithScope("RovingFocusGroup"); //#endregion //#region ../../packages/components/roving-focus-group/src/tokens.ts const ROVING_FOCUS_GROUP_INJECTION_KEY = Symbol("elRovingFocusGroup"); const ROVING_FOCUS_GROUP_ITEM_INJECTION_KEY = Symbol("elRovingFocusGroupItem"); //#endregion //#region ../../packages/components/roving-focus-group/src/utils.ts const MAP_KEY_TO_FOCUS_INTENT = { ArrowLeft: "prev", ArrowUp: "prev", ArrowRight: "next", ArrowDown: "next", PageUp: "first", Home: "first", PageDown: "last", End: "last" }; const getDirectionAwareKey = (key, dir) => { if (dir !== "rtl") return key; switch (key) { case EVENT_CODE.right: return EVENT_CODE.left; case EVENT_CODE.left: return EVENT_CODE.right; default: return key; } }; const getFocusIntent = (event, orientation, dir) => { const key = getDirectionAwareKey(getEventCode(event), dir); if (orientation === "vertical" && [EVENT_CODE.left, EVENT_CODE.right].includes(key)) return void 0; if (orientation === "horizontal" && [EVENT_CODE.up, EVENT_CODE.down].includes(key)) return void 0; return MAP_KEY_TO_FOCUS_INTENT[key]; }; const reorderArray = (array, atIdx) => { return array.map((_, idx) => array[(idx + atIdx) % array.length]); }; const focusFirst = (elements) => { const { activeElement: prevActive } = document; for (const element of elements) { if (element === prevActive) return; element.focus(); if (prevActive !== document.activeElement) return; } }; //#endregion //#region ../../packages/components/roving-focus-group/src/roving-focus-group-impl.vue?vue&type=script&lang.ts const CURRENT_TAB_ID_CHANGE_EVT = "currentTabIdChange"; const ENTRY_FOCUS_EVT = "rovingFocusGroup.entryFocus"; const EVT_OPTS = { bubbles: false, cancelable: true }; var roving_focus_group_impl_vue_vue_type_script_lang_default = defineComponent({ name: "ElRovingFocusGroupImpl", inheritAttrs: false, props: rovingFocusGroupProps, emits: [CURRENT_TAB_ID_CHANGE_EVT, "entryFocus"], setup(props, { emit }) { const currentTabbedId = ref((props.currentTabId || props.defaultCurrentTabId) ?? null); const isBackingOut = ref(false); const isClickFocus = ref(false); const rovingFocusGroupRef = ref(); const { getItems } = inject(COLLECTION_INJECTION_KEY, void 0); const rovingFocusGroupRootStyle = computed(() => { return [{ outline: "none" }, props.style]; }); const onItemFocus = (tabbedId) => { emit(CURRENT_TAB_ID_CHANGE_EVT, tabbedId); }; const onItemShiftTab = () => { isBackingOut.value = true; }; const onMousedown = composeEventHandlers((e) => { props.onMousedown?.(e); }, () => { isClickFocus.value = true; }); const onFocus = composeEventHandlers((e) => { props.onFocus?.(e); }, (e) => { const isKeyboardFocus = !unref(isClickFocus); const { target, currentTarget } = e; if (target === currentTarget && isKeyboardFocus && !unref(isBackingOut)) { const entryFocusEvt = new Event(ENTRY_FOCUS_EVT, EVT_OPTS); currentTarget?.dispatchEvent(entryFocusEvt); if (!entryFocusEvt.defaultPrevented) { const items = getItems().filter((item) => item.focusable); focusFirst([ items.find((item) => item.active), items.find((item) => item.id === unref(currentTabbedId)), ...items ].filter(Boolean).map((item) => item.ref)); } } isClickFocus.value = false; }); const onBlur = composeEventHandlers((e) => { props.onBlur?.(e); }, () => { isBackingOut.value = false; }); const handleEntryFocus = (...args) => { emit("entryFocus", ...args); }; const onKeydown = (e) => { const focusIntent = getFocusIntent(e); if (focusIntent) { e.preventDefault(); let elements = getItems().filter((item) => item.focusable).map((item) => item.ref); switch (focusIntent) { case "last": elements.reverse(); break; case "prev": case "next": { if (focusIntent === "prev") elements.reverse(); const currentIdx = elements.indexOf(e.currentTarget); elements = props.loop ? reorderArray(elements, currentIdx + 1) : elements.slice(currentIdx + 1); break; } default: break; } nextTick(() => { focusFirst(elements); }); } }; provide(ROVING_FOCUS_GROUP_INJECTION_KEY, { currentTabbedId: readonly(currentTabbedId), loop: toRef(props, "loop"), tabIndex: computed(() => { return unref(isBackingOut) ? -1 : 0; }), rovingFocusGroupRef, rovingFocusGroupRootStyle, orientation: toRef(props, "orientation"), dir: toRef(props, "dir"), onItemFocus, onItemShiftTab, onBlur, onFocus, onMousedown, onKeydown }); watch(() => props.currentTabId, (val) => { currentTabbedId.value = val ?? null; }); useEventListener(rovingFocusGroupRef, ENTRY_FOCUS_EVT, handleEntryFocus); } }); //#endregion //#region ../../packages/components/roving-focus-group/src/roving-focus-group-impl.vue function _sfc_render$14(_ctx, _cache, $props, $setup, $data, $options) { return renderSlot(_ctx.$slots, "default"); } var roving_focus_group_impl_default = /* @__PURE__ */ _plugin_vue_export_helper_default(roving_focus_group_impl_vue_vue_type_script_lang_default, [["render", _sfc_render$14]]); //#endregion //#region ../../packages/components/roving-focus-group/src/roving-focus-group.vue?vue&type=script&lang.ts var roving_focus_group_vue_vue_type_script_lang_default = defineComponent({ name: "ElRovingFocusGroup", components: { ElFocusGroupCollection: ElCollection, ElRovingFocusGroupImpl: roving_focus_group_impl_default } }); //#endregion //#region ../../packages/components/roving-focus-group/src/roving-focus-group.vue function _sfc_render$13(_ctx, _cache, $props, $setup, $data, $options) { const _component_el_roving_focus_group_impl = resolveComponent("el-roving-focus-group-impl"); const _component_el_focus_group_collection = resolveComponent("el-focus-group-collection"); return openBlock(), createBlock(_component_el_focus_group_collection, null, { default: withCtx(() => [createVNode(_component_el_roving_focus_group_impl, normalizeProps(guardReactiveProps(_ctx.$attrs)), { default: withCtx(() => [renderSlot(_ctx.$slots, "default")]), _: 3 }, 16)]), _: 3 }); } var roving_focus_group_default$1 = /* @__PURE__ */ _plugin_vue_export_helper_default(roving_focus_group_vue_vue_type_script_lang_default, [["render", _sfc_render$13]]); //#endregion //#region ../../packages/components/roving-focus-group/src/roving-focus-item.vue?vue&type=script&lang.ts var roving_focus_item_vue_vue_type_script_lang_default = defineComponent({ components: { ElRovingFocusCollectionItem: ElCollectionItem }, props: { focusable: { type: Boolean, default: true }, active: Boolean }, emits: [ "mousedown", "focus", "keydown" ], setup(props, { emit }) { const { currentTabbedId, onItemFocus, onItemShiftTab, onKeydown } = inject(ROVING_FOCUS_GROUP_INJECTION_KEY, void 0); const id = useId(); const rovingFocusGroupItemRef = ref(); const handleMousedown = composeEventHandlers((e) => { emit("mousedown", e); }, (e) => { if (!props.focusable) e.preventDefault(); else onItemFocus(unref(id)); }); const handleFocus = composeEventHandlers((e) => { emit("focus", e); }, () => { onItemFocus(unref(id)); }); const handleKeydown = composeEventHandlers((e) => { emit("keydown", e); }, (e) => { const { shiftKey, target, currentTarget } = e; if (getEventCode(e) === EVENT_CODE.tab && shiftKey) { onItemShiftTab(); return; } if (target !== currentTarget) return; onKeydown(e); }); const isCurrentTab = computed(() => currentTabbedId.value === unref(id)); provide(ROVING_FOCUS_GROUP_ITEM_INJECTION_KEY, { rovingFocusGroupItemRef, tabIndex: computed(() => unref(isCurrentTab) ? 0 : -1), handleMousedown, handleFocus, handleKeydown }); return { id, handleKeydown, handleFocus, handleMousedown }; } }); //#endregion //#region ../../packages/components/roving-focus-group/src/roving-focus-item.vue function _sfc_render$12(_ctx, _cache, $props, $setup, $data, $options) { const _component_el_roving_focus_collection_item = resolveComponent("el-roving-focus-collection-item"); return openBlock(), createBlock(_component_el_roving_focus_collection_item, { id: _ctx.id, focusable: _ctx.focusable, active: _ctx.active }, { default: withCtx(() => [renderSlot(_ctx.$slots, "default")]), _: 3 }, 8, [ "id", "focusable", "active" ]); } var roving_focus_item_default = /* @__PURE__ */ _plugin_vue_export_helper_default(roving_focus_item_vue_vue_type_script_lang_default, [["render", _sfc_render$12]]); //#endregion //#region ../../packages/components/roving-focus-group/index.ts var roving_focus_group_default = roving_focus_group_default$1; //#endregion //#region ../../packages/components/dropdown/src/dropdown.ts const dropdownProps = buildProps({ /** * @description how to trigger */ trigger: { ...useTooltipTriggerProps.trigger, type: definePropType([String, Array]) }, triggerKeys: { type: definePropType(Array), default: () => [ EVENT_CODE.enter, EVENT_CODE.numpadEnter, EVENT_CODE.space, EVENT_CODE.down ] }, /** * @description Indicates whether virtual triggering is enabled */ virtualTriggering: useTooltipTriggerProps.virtualTriggering, /** * @description Indicates the reference element to which the dropdown is attached */ virtualRef: useTooltipTriggerProps.virtualRef, /** * @description Tooltip theme, built-in theme: `dark` / `light` */ effect: { ...useTooltipContentProps.effect, default: "light" }, /** * @description menu button type, refer to `Button` Component, only works when `split-button` is true */ type: { type: definePropType(String) }, /** * @description placement of pop menu */ placement: { type: definePropType(String), default: "bottom" }, /** * @description [popper.js](https://popper.js.org/docs/v2/) parameters */ popperOptions: { type: definePropType(Object), default: () => ({}) }, id: String, /** * @description menu size, also works on the split button */ size: { type: String, default: "" }, /** * @description whether a button group is displayed */ splitButton: Boolean, /** * @description whether to hide menu after clicking menu-item */ hideOnClick: { type: Boolean, default: true }, loop: { type: Boolean, default: true }, /** * @description whether the tooltip content has an arrow */ showArrow: { type: Boolean, default: true }, /** * @description delay time before show a dropdown (only works when trigger is `hover`) */ showTimeout: { type: Number, default: 150 }, /** * @description delay time before hide a dropdown (only works when trigger is `hover`) */ hideTimeout: { type: Number, default: 150 }, /** * @description [tabindex](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex) of Dropdown */ tabindex: { type: definePropType([Number, String]), default: 0 }, /** * @description the max height of menu */ maxHeight: { type: definePropType([Number, String]), default: "" }, /** * @description custom class name for Dropdown's dropdown */ popperClass: useTooltipContentProps.popperClass, /** * @description custom style for Dropdown's dropdown */ popperStyle: useTooltipContentProps.popperStyle, /** * @description whether to disable */ disabled: Boolean, /** * @description the ARIA role attribute for the dropdown menu. Depending on the use case, you may want to change this to 'navigation' */ role: { type: String, values: roleTypes, default: "menu" }, buttonProps: { type: definePropType(Object) }, /** * @description whether the dropdown popup is teleported to the body */ teleported: useTooltipContentProps.teleported, /** * @description which element the dropdown CONTENT appends to */ appendTo: useTooltipContentProps.appendTo, /** * @description when dropdown inactive and `persistent` is `false` , dropdown menu will be destroyed */ persistent: { type: Boolean, default: true } }); const dropdownItemProps = buildProps({ /** * @description a command to be dispatched to Dropdown's `command` callback */ command: { type: [ Object, String, Number ], default: () => ({}) }, /** * @description whether the item is disabled */ disabled: Boolean, /** * @description whether a divider is displayed */ divided: Boolean, textValue: String, /** * @description custom icon */ icon: { type: iconPropType } }); const dropdownMenuProps = buildProps({ onKeydown: { type: definePropType(Function) } }); const FIRST_KEYS = [ EVENT_CODE.down, EVENT_CODE.pageDown, EVENT_CODE.home ]; const LAST_KEYS = [ EVENT_CODE.up, EVENT_CODE.pageUp, EVENT_CODE.end ]; const FIRST_LAST_KEYS = [...FIRST_KEYS, ...LAST_KEYS]; //#endregion //#region ../../packages/components/dropdown/src/tokens.ts const DROPDOWN_INJECTION_KEY = Symbol("elDropdown"); const DROPDOWN_INSTANCE_INJECTION_KEY = "elDropdown"; //#endregion //#region ../../packages/components/dropdown/src/dropdown.vue?vue&type=script&lang.ts const { ButtonGroup: ElButtonGroup$1 } = ElButton; var dropdown_vue_vue_type_script_lang_default = defineComponent({ name: "ElDropdown", components: { ElButton, ElButtonGroup: ElButtonGroup$1, ElScrollbar, ElTooltip, ElRovingFocusGroup: roving_focus_group_default, ElOnlyChild: OnlyChild, ElIcon, ArrowDown: arrow_down_default }, props: dropdownProps, emits: [ "visible-change", "click", "command" ], setup(props, { emit }) { const _instance = getCurrentInstance(); const ns = useNamespace("dropdown"); const { t } = useLocale(); const triggeringElementRef = ref(); const referenceElementRef = ref(); const popperRef = ref(); const contentRef = ref(); const scrollbar = ref(null); const currentTabId = ref(null); const isUsingKeyboard = ref(false); const wrapStyle = computed(() => ({ maxHeight: addUnit(props.maxHeight) })); const dropdownTriggerKls = computed(() => [ns.m(dropdownSize.value)]); const trigger = computed(() => castArray$1(props.trigger)); const defaultTriggerId = useId().value; const triggerId = computed(() => props.id || defaultTriggerId); function handleClick() { popperRef.value?.onClose(void 0, 0); } function handleClose() { popperRef.value?.onClose(); } function handleOpen() { popperRef.value?.onOpen(); } const dropdownSize = useFormSize(); function commandHandler(...args) { emit("command", ...args); } function onItemEnter() {} function onItemLeave() { const contentEl = unref(contentRef); trigger.value.includes("hover") && contentEl?.focus({ preventScroll: true }); currentTabId.value = null; } function handleCurrentTabIdChange(id) { currentTabId.value = id; } function handleBeforeShowTooltip() { emit("visible-change", true); } function handleShowTooltip(event) { isUsingKeyboard.value = event?.type === "keydown"; contentRef.value?.focus(); } function handleBeforeHideTooltip() { emit("visible-change", false); } provide(DROPDOWN_INJECTION_KEY, { contentRef, role: computed(() => props.role), triggerId, isUsingKeyboard, onItemEnter, onItemLeave, handleClose }); provide(DROPDOWN_INSTANCE_INJECTION_KEY, { instance: _instance, dropdownSize, handleClick, commandHandler, trigger: toRef(props, "trigger"), hideOnClick: toRef(props, "hideOnClick") }); const handlerMainButtonClick = (event) => { emit("click", event); }; return { t, ns, scrollbar, wrapStyle, dropdownTriggerKls, dropdownSize, triggerId, currentTabId, handleCurrentTabIdChange, handlerMainButtonClick, handleClose, handleOpen, handleBeforeShowTooltip, handleShowTooltip, handleBeforeHideTooltip, popperRef, contentRef, triggeringElementRef, referenceElementRef }; } }); //#endregion //#region ../../packages/components/dropdown/src/dropdown.vue function _sfc_render$11(_ctx, _cache, $props, $setup, $data, $options) { const _component_el_roving_focus_group = resolveComponent("el-roving-focus-group"); const _component_el_scrollbar = resolveComponent("el-scrollbar"); const _component_el_only_child = resolveComponent("el-only-child"); const _component_el_tooltip = resolveComponent("el-tooltip"); const _component_el_button = resolveComponent("el-button"); const _component_arrow_down = resolveComponent("arrow-down"); const _component_el_icon = resolveComponent("el-icon"); const _component_el_button_group = resolveComponent("el-button-group"); return openBlock(), createElementBlock("div", { class: normalizeClass([_ctx.ns.b(), _ctx.ns.is("disabled", _ctx.disabled)]) }, [createVNode(_component_el_tooltip, { ref: "popperRef", role: _ctx.role, effect: _ctx.effect, "fallback-placements": ["bottom", "top"], "popper-options": _ctx.popperOptions, "gpu-acceleration": false, placement: _ctx.placement, "popper-class": [_ctx.ns.e("popper"), _ctx.popperClass], "popper-style": _ctx.popperStyle, trigger: _ctx.trigger, "trigger-keys": _ctx.triggerKeys, "trigger-target-el": _ctx.contentRef, "show-arrow": _ctx.showArrow, "show-after": _ctx.trigger === "hover" ? _ctx.showTimeout : 0, "hide-after": _ctx.trigger === "hover" ? _ctx.hideTimeout : 0, "virtual-ref": _ctx.virtualRef ?? _ctx.triggeringElementRef, "virtual-triggering": _ctx.virtualTriggering || _ctx.splitButton, disabled: _ctx.disabled, transition: `${_ctx.ns.namespace.value}-zoom-in-top`, teleported: _ctx.teleported, "append-to": _ctx.appendTo, pure: "", "focus-on-target": "", persistent: _ctx.persistent, onBeforeShow: _ctx.handleBeforeShowTooltip, onShow: _ctx.handleShowTooltip, onBeforeHide: _ctx.handleBeforeHideTooltip }, createSlots({ content: withCtx(() => [createVNode(_component_el_scrollbar, { ref: "scrollbar", "wrap-style": _ctx.wrapStyle, tag: "div", "view-class": _ctx.ns.e("list") }, { default: withCtx(() => [createVNode(_component_el_roving_focus_group, { loop: _ctx.loop, "current-tab-id": _ctx.currentTabId, orientation: "horizontal", onCurrentTabIdChange: _ctx.handleCurrentTabIdChange }, { default: withCtx(() => [renderSlot(_ctx.$slots, "dropdown")]), _: 3 }, 8, [ "loop", "current-tab-id", "onCurrentTabIdChange" ])]), _: 3 }, 8, ["wrap-style", "view-class"])]), _: 2 }, [!_ctx.splitButton ? { name: "default", fn: withCtx(() => [createVNode(_component_el_only_child, { id: _ctx.triggerId, ref: "triggeringElementRef", role: "button", tabindex: _ctx.tabindex }, { default: withCtx(() => [renderSlot(_ctx.$slots, "default")]), _: 3 }, 8, ["id", "tabindex"])]), key: "0" } : void 0]), 1032, [ "role", "effect", "popper-options", "placement", "popper-class", "popper-style", "trigger", "trigger-keys", "trigger-target-el", "show-arrow", "show-after", "hide-after", "virtual-ref", "virtual-triggering", "disabled", "transition", "teleported", "append-to", "persistent", "onBeforeShow", "onShow", "onBeforeHide" ]), _ctx.splitButton ? (openBlock(), createBlock(_component_el_button_group, { key: 0 }, { default: withCtx(() => [createVNode(_component_el_button, mergeProps({ ref: "referenceElementRef" }, _ctx.buttonProps, { size: _ctx.dropdownSize, type: _ctx.type, disabled: _ctx.disabled, tabindex: _ctx.tabindex, onClick: _ctx.handlerMainButtonClick }), { default: withCtx(() => [renderSlot(_ctx.$slots, "default")]), _: 3 }, 16, [ "size", "type", "disabled", "tabindex", "onClick" ]), createVNode(_component_el_button, mergeProps({ id: _ctx.triggerId, ref: "triggeringElementRef" }, _ctx.buttonProps, { role: "button", size: _ctx.dropdownSize, type: _ctx.type, class: _ctx.ns.e("caret-button"), disabled: _ctx.disabled, tabindex: _ctx.tabindex, "aria-label": _ctx.t("el.dropdown.toggleDropdown") }), { default: withCtx(() => [createVNode(_component_el_icon, { class: normalizeClass(_ctx.ns.e("icon")) }, { default: withCtx(() => [createVNode(_component_arrow_down)]), _: 1 }, 8, ["class"])]), _: 1 }, 16, [ "id", "size", "type", "class", "disabled", "tabindex", "aria-label" ])]), _: 3 })) : createCommentVNode("v-if", true)], 2); } var dropdown_default = /* @__PURE__ */ _plugin_vue_export_helper_default(dropdown_vue_vue_type_script_lang_default, [["render", _sfc_render$11]]); //#endregion //#region ../../packages/components/dropdown/src/dropdown-item-impl.vue?vue&type=script&lang.ts var dropdown_item_impl_vue_vue_type_script_lang_default = defineComponent({ name: "DropdownItemImpl", components: { ElIcon }, props: dropdownItemProps, emits: [ "pointermove", "pointerleave", "click", "clickimpl" ], setup(_, { emit }) { const ns = useNamespace("dropdown"); const { role: menuRole } = inject(DROPDOWN_INJECTION_KEY, void 0); const { collectionItemRef: rovingFocusCollectionItemRef } = inject(COLLECTION_ITEM_INJECTION_KEY, void 0); const { rovingFocusGroupItemRef, tabIndex, handleFocus, handleKeydown: handleItemKeydown, handleMousedown } = inject(ROVING_FOCUS_GROUP_ITEM_INJECTION_KEY, void 0); const itemRef = composeRefs(rovingFocusCollectionItemRef, rovingFocusGroupItemRef); const role = computed(() => { if (menuRole.value === "menu") return "menuitem"; else if (menuRole.value === "navigation") return "link"; return "button"; }); const handleKeydown = composeEventHandlers((e) => { const code = getEventCode(e); if ([ EVENT_CODE.enter, EVENT_CODE.numpadEnter, EVENT_CODE.space ].includes(code)) { e.preventDefault(); e.stopImmediatePropagation(); emit("clickimpl", e); return true; } }, handleItemKeydown); return { ns, itemRef, dataset: { [COLLECTION_ITEM_SIGN]: "" }, role, tabIndex, handleFocus, handleKeydown, handleMousedown }; } }); //#endregion //#region ../../packages/components/dropdown/src/dropdown-item-impl.vue const _hoisted_1$40 = [ "aria-disabled", "tabindex", "role" ]; function _sfc_render$10(_ctx, _cache, $props, $setup, $data, $options) { const _component_el_icon = resolveComponent("el-icon"); return openBlock(), createElementBlock(Fragment, null, [_ctx.divided ? (openBlock(), createElementBlock("li", { key: 0, role: "separator", class: normalizeClass(_ctx.ns.bem("menu", "item", "divided")) }, null, 2)) : createCommentVNode("v-if", true), createElementVNode("li", mergeProps({ ref: _ctx.itemRef }, { ..._ctx.dataset, ..._ctx.$attrs }, { "aria-disabled": _ctx.disabled, class: [_ctx.ns.be("menu", "item"), _ctx.ns.is("disabled", _ctx.disabled)], tabindex: _ctx.tabIndex, role: _ctx.role, onClick: _cache[0] || (_cache[0] = (e) => _ctx.$emit("clickimpl", e)), onFocus: _cache[1] || (_cache[1] = (...args) => _ctx.handleFocus && _ctx.handleFocus(...args)), onKeydown: _cache[2] || (_cache[2] = withModifiers((...args) => _ctx.handleKeydown && _ctx.handleKeydown(...args), ["self"])), onMousedown: _cache[3] || (_cache[3] = (...args) => _ctx.handleMousedown && _ctx.handleMousedown(...args)), onPointermove: _cache[4] || (_cache[4] = (e) => _ctx.$emit("pointermove", e)), onPointerleave: _cache[5] || (_cache[5] = (e) => _ctx.$emit("pointerleave", e)) }), [_ctx.icon || _ctx.$slots.icon ? (openBlock(), createBlock(_component_el_icon, { key: 0 }, { default: withCtx(() => [renderSlot(_ctx.$slots, "icon", {}, () => [(openBlock(), createBlock(resolveDynamicComponent(_ctx.icon)))])]), _: 3 })) : createCommentVNode("v-if", true), renderSlot(_ctx.$slots, "default")], 16, _hoisted_1$40)], 64); } var dropdown_item_impl_default = /* @__PURE__ */ _plugin_vue_export_helper_default(dropdown_item_impl_vue_vue_type_script_lang_default, [["render", _sfc_render$10]]); //#endregion //#region ../../packages/components/dropdown/src/useDropdown.ts const useDropdown = () => { const elDropdown = inject(DROPDOWN_INSTANCE_INJECTION_KEY, {}); return { elDropdown, _elDropdownSize: computed(() => elDropdown?.dropdownSize) }; }; //#endregion //#region ../../packages/components/dropdown/src/dropdown-item.vue?vue&type=script&lang.ts var dropdown_item_vue_vue_type_script_lang_default = defineComponent({ name: "ElDropdownItem", components: { ElRovingFocusItem: roving_focus_item_default, ElDropdownItemImpl: dropdown_item_impl_default }, inheritAttrs: false, props: dropdownItemProps, emits: [ "pointermove", "pointerleave", "click" ], setup(props, { emit, attrs }) { const { elDropdown } = useDropdown(); const _instance = getCurrentInstance(); const { onItemEnter, onItemLeave } = inject(DROPDOWN_INJECTION_KEY, void 0); const handlePointerMove = composeEventHandlers((e) => { emit("pointermove", e); return e.defaultPrevented; }, whenMouse((e) => { if (props.disabled) { onItemLeave(e); return; } const target = e.currentTarget; /** * This handles the following scenario: * when the item contains a form element such as input element * when the mouse is moving over the element itself which is contained by * the item, the default focusing logic should be prevented so that * it won't cause weird action. */ if (target === document.activeElement || target.contains(document.activeElement)) return; onItemEnter(e); if (!e.defaultPrevented) target?.focus({ preventScroll: true }); })); const handlePointerLeave = composeEventHandlers((e) => { emit("pointerleave", e); return e.defaultPrevented; }, whenMouse(onItemLeave)); return { handleClick: composeEventHandlers((e) => { if (props.disabled) return; emit("click", e); return e.type !== "keydown" && e.defaultPrevented; }, (e) => { if (props.disabled) { e.stopImmediatePropagation(); return; } if (elDropdown?.hideOnClick?.value) elDropdown.handleClick?.(); elDropdown.commandHandler?.(props.command, _instance, e); }), handlePointerMove, handlePointerLeave, propsAndAttrs: computed(() => ({ ...props, ...attrs })) }; } }); //#endregion //#region ../../packages/components/dropdown/src/dropdown-item.vue function _sfc_render$9(_ctx, _cache, $props, $setup, $data, $options) { const _component_el_dropdown_item_impl = resolveComponent("el-dropdown-item-impl"); const _component_el_roving_focus_item = resolveComponent("el-roving-focus-item"); return openBlock(), createBlock(_component_el_roving_focus_item, { focusable: !_ctx.disabled }, { default: withCtx(() => [createVNode(_component_el_dropdown_item_impl, mergeProps(_ctx.propsAndAttrs, { onPointerleave: _ctx.handlePointerLeave, onPointermove: _ctx.handlePointerMove, onClickimpl: _ctx.handleClick }), createSlots({ default: withCtx(() => [renderSlot(_ctx.$slots, "default")]), _: 2 }, [_ctx.$slots.icon ? { name: "icon", fn: withCtx(() => [renderSlot(_ctx.$slots, "icon")]), key: "0" } : void 0]), 1040, [ "onPointerleave", "onPointermove", "onClickimpl" ])]), _: 3 }, 8, ["focusable"]); } var dropdown_item_default = /* @__PURE__ */ _plugin_vue_export_helper_default(dropdown_item_vue_vue_type_script_lang_default, [["render", _sfc_render$9]]); //#endregion //#region ../../packages/components/dropdown/src/dropdown-menu.vue?vue&type=script&lang.ts var dropdown_menu_vue_vue_type_script_lang_default = defineComponent({ name: "ElDropdownMenu", props: dropdownMenuProps, setup(props) { const ns = useNamespace("dropdown"); const { _elDropdownSize } = useDropdown(); const size = _elDropdownSize.value; const { contentRef, role, triggerId, isUsingKeyboard, handleClose } = inject(DROPDOWN_INJECTION_KEY, void 0); const { rovingFocusGroupRef, rovingFocusGroupRootStyle, onBlur, onFocus, onKeydown, onMousedown } = inject(ROVING_FOCUS_GROUP_INJECTION_KEY, void 0); const { collectionRef: rovingFocusGroupCollectionRef } = inject(COLLECTION_INJECTION_KEY, void 0); const dropdownKls = computed(() => { return [ns.b("menu"), ns.bm("menu", size?.value)]; }); const dropdownListWrapperRef = composeRefs(contentRef, rovingFocusGroupRef, rovingFocusGroupCollectionRef); const handleKeydown = composeEventHandlers((e) => { props.onKeydown?.(e); }, (e) => { const { currentTarget, target } = e; const code = getEventCode(e); if (currentTarget.contains(target)) {} if (EVENT_CODE.tab === code) return handleClose(); onKeydown(e); }); function handleFocus(e) { isUsingKeyboard.value && onFocus(e); } return { size, rovingFocusGroupRootStyle, dropdownKls, role, triggerId, dropdownListWrapperRef, handleKeydown, onBlur, handleFocus, onMousedown }; } }); //#endregion //#region ../../packages/components/dropdown/src/dropdown-menu.vue const _hoisted_1$39 = ["role", "aria-labelledby"]; function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) { return openBlock(), createElementBlock("ul", { ref: _ctx.dropdownListWrapperRef, class: normalizeClass(_ctx.dropdownKls), style: normalizeStyle(_ctx.rovingFocusGroupRootStyle), tabindex: -1, role: _ctx.role, "aria-labelledby": _ctx.triggerId, onFocusin: _cache[0] || (_cache[0] = (...args) => _ctx.handleFocus && _ctx.handleFocus(...args)), onFocusout: _cache[1] || (_cache[1] = (...args) => _ctx.onBlur && _ctx.onBlur(...args)), onKeydown: _cache[2] || (_cache[2] = withModifiers((...args) => _ctx.handleKeydown && _ctx.handleKeydown(...args), ["self"])), onMousedown: _cache[3] || (_cache[3] = withModifiers((...args) => _ctx.onMousedown && _ctx.onMousedown(...args), ["self"])) }, [renderSlot(_ctx.$slots, "default")], 46, _hoisted_1$39); } var dropdown_menu_default = /* @__PURE__ */ _plugin_vue_export_helper_default(dropdown_menu_vue_vue_type_script_lang_default, [["render", _sfc_render$8]]); //#endregion //#region ../../packages/components/dropdown/index.ts const ElDropdown = withInstall(dropdown_default, { DropdownItem: dropdown_item_default, DropdownMenu: dropdown_menu_default }); const ElDropdownItem = withNoopInstall(dropdown_item_default); const ElDropdownMenu = withNoopInstall(dropdown_menu_default); //#endregion //#region ../../packages/components/empty/src/empty.ts /** * @deprecated Removed after 3.0.0, Use `EmptyProps` instead. */ const emptyProps = buildProps({ /** * @description image URL of empty */ image: { type: String, default: "" }, /** * @description image size (width) of empty */ imageSize: Number, /** * @description description of empty */ description: { type: String, default: "" } }); //#endregion //#region ../../packages/components/empty/src/img-empty.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$38 = { viewBox: "0 0 79 86", version: "1.1", xmlns: "http://www.w3.org/2000/svg", "xmlns:xlink": "http://www.w3.org/1999/xlink" }; const _hoisted_2$24 = ["id"]; const _hoisted_3$8 = ["stop-color"]; const _hoisted_4$6 = ["stop-color"]; const _hoisted_5$4 = ["id"]; const _hoisted_6$1 = ["stop-color"]; const _hoisted_7 = ["stop-color"]; const _hoisted_8 = ["id"]; const _hoisted_9 = { stroke: "none", "stroke-width": "1", fill: "none", "fill-rule": "evenodd" }; const _hoisted_10 = { transform: "translate(-1268.000000, -535.000000)" }; const _hoisted_11 = { transform: "translate(1268.000000, 535.000000)" }; const _hoisted_12 = ["fill"]; const _hoisted_13 = ["fill"]; const _hoisted_14 = { transform: "translate(34.500000, 31.500000) scale(-1, 1) rotate(-25.000000) translate(-34.500000, -31.500000) translate(7.000000, 10.000000)" }; const _hoisted_15 = ["fill"]; const _hoisted_16 = ["fill"]; const _hoisted_17 = ["fill"]; const _hoisted_18 = ["fill"]; const _hoisted_19 = ["fill"]; const _hoisted_20 = { transform: "translate(53.000000, 45.000000)" }; const _hoisted_21 = ["fill", "xlink:href"]; const _hoisted_22 = ["fill", "mask"]; const _hoisted_23 = ["fill"]; var img_empty_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ImgEmpty", __name: "img-empty", setup(__props) { const ns = useNamespace("empty"); const id = useId(); return (_ctx, _cache) => { return openBlock(), createElementBlock("svg", _hoisted_1$38, [createElementVNode("defs", null, [ createElementVNode("linearGradient", { id: `linearGradient-1-${unref(id)}`, x1: "38.8503086%", y1: "0%", x2: "61.1496914%", y2: "100%" }, [createElementVNode("stop", { "stop-color": `var(${unref(ns).cssVarBlockName("fill-color-1")})`, offset: "0%" }, null, 8, _hoisted_3$8), createElementVNode("stop", { "stop-color": `var(${unref(ns).cssVarBlockName("fill-color-4")})`, offset: "100%" }, null, 8, _hoisted_4$6)], 8, _hoisted_2$24), createElementVNode("linearGradient", { id: `linearGradient-2-${unref(id)}`, x1: "0%", y1: "9.5%", x2: "100%", y2: "90.5%" }, [createElementVNode("stop", { "stop-color": `var(${unref(ns).cssVarBlockName("fill-color-1")})`, offset: "0%" }, null, 8, _hoisted_6$1), createElementVNode("stop", { "stop-color": `var(${unref(ns).cssVarBlockName("fill-color-6")})`, offset: "100%" }, null, 8, _hoisted_7)], 8, _hoisted_5$4), createElementVNode("rect", { id: `path-3-${unref(id)}`, x: "0", y: "0", width: "17", height: "36" }, null, 8, _hoisted_8) ]), createElementVNode("g", _hoisted_9, [createElementVNode("g", _hoisted_10, [createElementVNode("g", _hoisted_11, [ createElementVNode("path", { d: "M39.5,86 C61.3152476,86 79,83.9106622 79,81.3333333 C79,78.7560045 57.3152476,78 35.5,78 C13.6847524,78 0,78.7560045 0,81.3333333 C0,83.9106622 17.6847524,86 39.5,86 Z", fill: `var(${unref(ns).cssVarBlockName("fill-color-3")})` }, null, 8, _hoisted_12), createElementVNode("polygon", { fill: `var(${unref(ns).cssVarBlockName("fill-color-7")})`, transform: "translate(27.500000, 51.500000) scale(1, -1) translate(-27.500000, -51.500000) ", points: "13 58 53 58 42 45 2 45" }, null, 8, _hoisted_13), createElementVNode("g", _hoisted_14, [ createElementVNode("polygon", { fill: `var(${unref(ns).cssVarBlockName("fill-color-7")})`, transform: "translate(11.500000, 5.000000) scale(1, -1) translate(-11.500000, -5.000000) ", points: "2.84078316e-14 3 18 3 23 7 5 7" }, null, 8, _hoisted_15), createElementVNode("polygon", { fill: `var(${unref(ns).cssVarBlockName("fill-color-5")})`, points: "-3.69149156e-15 7 38 7 38 43 -3.69149156e-15 43" }, null, 8, _hoisted_16), createElementVNode("rect", { fill: `url(#linearGradient-1-${unref(id)})`, transform: "translate(46.500000, 25.000000) scale(-1, 1) translate(-46.500000, -25.000000) ", x: "38", y: "7", width: "17", height: "36" }, null, 8, _hoisted_17), createElementVNode("polygon", { fill: `var(${unref(ns).cssVarBlockName("fill-color-2")})`, transform: "translate(39.500000, 3.500000) scale(-1, 1) translate(-39.500000, -3.500000) ", points: "24 7 41 7 55 -3.63806207e-12 38 -3.63806207e-12" }, null, 8, _hoisted_18) ]), createElementVNode("rect", { fill: `url(#linearGradient-2-${unref(id)})`, x: "13", y: "45", width: "40", height: "36" }, null, 8, _hoisted_19), createElementVNode("g", _hoisted_20, [createElementVNode("use", { fill: `var(${unref(ns).cssVarBlockName("fill-color-8")})`, transform: "translate(8.500000, 18.000000) scale(-1, 1) translate(-8.500000, -18.000000) ", "xlink:href": `#path-3-${unref(id)}` }, null, 8, _hoisted_21), createElementVNode("polygon", { fill: `var(${unref(ns).cssVarBlockName("fill-color-9")})`, mask: `url(#mask-4-${unref(id)})`, transform: "translate(12.000000, 9.000000) scale(-1, 1) translate(-12.000000, -9.000000) ", points: "7 0 24 0 20 18 7 16.5" }, null, 8, _hoisted_22)]), createElementVNode("polygon", { fill: `var(${unref(ns).cssVarBlockName("fill-color-2")})`, transform: "translate(66.000000, 51.500000) scale(-1, 1) translate(-66.000000, -51.500000) ", points: "62 45 79 45 70 58 53 58" }, null, 8, _hoisted_23) ])])])]); }; } }); //#endregion //#region ../../packages/components/empty/src/img-empty.vue var img_empty_default = img_empty_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/empty/src/empty.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$37 = ["src"]; const _hoisted_2$23 = { key: 1 }; var empty_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElEmpty", __name: "empty", props: emptyProps, setup(__props) { const props = __props; const { t } = useLocale(); const ns = useNamespace("empty"); const emptyDescription = computed(() => props.description || t("el.table.emptyText")); const imageStyle = computed(() => ({ width: addUnit(props.imageSize) })); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass(unref(ns).b()) }, [ createElementVNode("div", { class: normalizeClass(unref(ns).e("image")), style: normalizeStyle(imageStyle.value) }, [__props.image ? (openBlock(), createElementBlock("img", { key: 0, src: __props.image, ondragstart: "return false" }, null, 8, _hoisted_1$37)) : renderSlot(_ctx.$slots, "image", { key: 1 }, () => [createVNode(img_empty_default)])], 6), createElementVNode("div", { class: normalizeClass(unref(ns).e("description")) }, [_ctx.$slots.description ? renderSlot(_ctx.$slots, "description", { key: 0 }) : (openBlock(), createElementBlock("p", _hoisted_2$23, toDisplayString(emptyDescription.value), 1))], 2), _ctx.$slots.default ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ns).e("bottom")) }, [renderSlot(_ctx.$slots, "default")], 2)) : createCommentVNode("v-if", true) ], 2); }; } }); //#endregion //#region ../../packages/components/empty/src/empty.vue var empty_default = empty_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/empty/index.ts const ElEmpty = withInstall(empty_default); //#endregion //#region ../../packages/components/image/src/image.ts /** * @deprecated Removed after 3.0.0, Use `ImageProps` instead. */ const imageProps = buildProps({ /** * @description when enabling preview, use this flag to control whether clicking on backdrop can exit preview mode. */ hideOnClickModal: Boolean, /** * @description image source, same as native. */ src: { type: String, default: "" }, /** * @description indicate how the image should be resized to fit its container, same as [object-fit](https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit). */ fit: { type: String, values: [ "", "contain", "cover", "fill", "none", "scale-down" ], default: "" }, /** * @description Indicates how the browser should load the image, same as [native](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/img#loading) */ loading: { type: String, values: ["eager", "lazy"] }, /** * @description whether to use lazy load. */ lazy: Boolean, /** * @description the container to add scroll listener when using lazy load. */ scrollContainer: { type: definePropType([String, Object]) }, /** * @description allow big image preview. */ previewSrcList: { type: definePropType(Array), default: () => mutable([]) }, /** * @description whether to append image-viewer to body. A nested parent element attribute transform should have this attribute set to `true`. */ previewTeleported: Boolean, /** * @description set image preview z-index. */ zIndex: { type: Number }, /** * @description initial preview image index, less than the length of `url-list`. */ initialIndex: { type: Number, default: 0 }, /** * @description whether the viewer preview is infinite. */ infinite: { type: Boolean, default: true }, /** * @description whether the image-viewer can be closed by pressing ESC. */ closeOnPressEscape: { type: Boolean, default: true }, /** * @description the zoom rate of the image viewer zoom event */ zoomRate: { type: Number, default: 1.2 }, /** * @description preview image scale. */ scale: { type: Number, default: 1 }, /** * @description the min scale of the image viewer zoom event. */ minScale: { type: Number, default: .2 }, /** * @description the max scale of the image viewer zoom event. */ maxScale: { type: Number, default: 7 }, /** * @description show preview image progress content. */ showProgress: Boolean, /** * @description set HTML attribute: crossorigin. */ crossorigin: { type: definePropType(String) } }); const imageEmits = { load: (evt) => evt instanceof Event, error: (evt) => evt instanceof Event, switch: (val) => isNumber(val), close: () => true, show: () => true }; //#endregion //#region ../../packages/components/image-viewer/src/image-viewer.ts /** * @deprecated Removed after 3.0.0, Use `ImageViewerProps` instead. */ const imageViewerProps = buildProps({ /** * @description preview link list. */ urlList: { type: definePropType(Array), default: () => mutable([]) }, /** * @description preview backdrop z-index. */ zIndex: { type: Number }, /** * @description the initial preview image index, less than or equal to the length of `url-list`. */ initialIndex: { type: Number, default: 0 }, /** * @description whether preview is infinite. */ infinite: { type: Boolean, default: true }, /** * @description whether user can emit close event when clicking backdrop. */ hideOnClickModal: Boolean, /** * @description whether to append image itself to body. A nested parent element attribute transform should have this attribute set to `true`. */ teleported: Boolean, /** * @description whether the image-viewer can be closed by pressing ESC. */ closeOnPressEscape: { type: Boolean, default: true }, /** * @description the zoom rate of the image viewer zoom event. */ zoomRate: { type: Number, default: 1.2 }, /** * @description preview image scale. */ scale: { type: Number, default: 1 }, /** * @description the min scale of the image viewer zoom event. */ minScale: { type: Number, default: .2 }, /** * @description the max scale of the image viewer zoom event. */ maxScale: { type: Number, default: 7 }, /** * @description show preview image progress content. */ showProgress: Boolean, /** * @description set HTML attribute: crossorigin. */ crossorigin: { type: definePropType(String) } }); const imageViewerEmits = { close: () => true, error: (evt) => evt instanceof Event, switch: (index) => isNumber(index), rotate: (deg) => isNumber(deg) }; //#endregion //#region ../../packages/components/image-viewer/src/image-viewer.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$36 = ["src", "crossorigin"]; var image_viewer_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElImageViewer", __name: "image-viewer", props: imageViewerProps, emits: imageViewerEmits, setup(__props, { expose: __expose, emit: __emit }) { const modes = { CONTAIN: { name: "contain", icon: markRaw(full_screen_default) }, ORIGINAL: { name: "original", icon: markRaw(scale_to_original_default) } }; const props = __props; const emit = __emit; let stopWheelListener; const { t } = useLocale(); const ns = useNamespace("image-viewer"); const { nextZIndex } = useZIndex(); const wrapper = ref(); const imgRef = ref(); const scopeEventListener = effectScope(); const scaleClamped = computed(() => { const { scale, minScale, maxScale } = props; return clamp$2(scale, minScale, maxScale); }); const loading = ref(true); const loadError = ref(false); const visible = ref(false); const activeIndex = ref(props.initialIndex); const mode = shallowRef(modes.CONTAIN); const transform = ref({ scale: scaleClamped.value, deg: 0, offsetX: 0, offsetY: 0, enableTransition: false }); const zIndex = ref(props.zIndex ?? nextZIndex()); useLockscreen(visible, { ns }); const isSingle = computed(() => { const { urlList } = props; return urlList.length <= 1; }); const isFirst = computed(() => activeIndex.value === 0); const isLast = computed(() => activeIndex.value === props.urlList.length - 1); const currentImg = computed(() => props.urlList[activeIndex.value]); const arrowPrevKls = computed(() => [ ns.e("btn"), ns.e("prev"), ns.is("disabled", !props.infinite && isFirst.value) ]); const arrowNextKls = computed(() => [ ns.e("btn"), ns.e("next"), ns.is("disabled", !props.infinite && isLast.value) ]); const imgStyle = computed(() => { const { scale, deg, offsetX, offsetY, enableTransition } = transform.value; let translateX = offsetX / scale; let translateY = offsetY / scale; const radian = deg * Math.PI / 180; const cosRadian = Math.cos(radian); const sinRadian = Math.sin(radian); translateX = translateX * cosRadian + translateY * sinRadian; translateY = translateY * cosRadian - offsetX / scale * sinRadian; const style = { transform: `scale(${scale}) rotate(${deg}deg) translate(${translateX}px, ${translateY}px)`, transition: enableTransition ? "transform .3s" : "" }; if (mode.value.name === modes.CONTAIN.name) style.maxWidth = style.maxHeight = "100%"; return style; }); const progress = computed(() => `${activeIndex.value + 1} / ${props.urlList.length}`); function hide() { unregisterEventListener(); stopWheelListener?.(); visible.value = false; emit("close"); } function registerEventListener() { const keydownHandler = throttle((e) => { switch (getEventCode(e)) { case EVENT_CODE.esc: props.closeOnPressEscape && hide(); break; case EVENT_CODE.space: toggleMode(); break; case EVENT_CODE.left: prev(); break; case EVENT_CODE.up: handleActions("zoomIn"); break; case EVENT_CODE.right: next(); break; case EVENT_CODE.down: handleActions("zoomOut"); break; } }); const mousewheelHandler = throttle((e) => { handleActions((e.deltaY || e.deltaX) < 0 ? "zoomIn" : "zoomOut", { zoomRate: props.zoomRate, enableTransition: false }); }); scopeEventListener.run(() => { useEventListener(document, "keydown", keydownHandler); useEventListener(wrapper, "wheel", mousewheelHandler); }); } function unregisterEventListener() { scopeEventListener.stop(); } function handleImgLoad() { loading.value = false; } function handleImgError(e) { loadError.value = true; loading.value = false; emit("error", e); e.target.alt = t("el.image.error"); } function handleMouseDown(e) { if (loading.value || e.button !== 0 || !wrapper.value) return; transform.value.enableTransition = false; const { offsetX, offsetY } = transform.value; const startX = e.pageX; const startY = e.pageY; const dragHandler = throttle((ev) => { transform.value = { ...transform.value, offsetX: offsetX + ev.pageX - startX, offsetY: offsetY + ev.pageY - startY }; }); const removeMousemove = useEventListener(document, "mousemove", dragHandler); const removeMouseup = useEventListener(document, "mouseup", () => { removeMousemove(); removeMouseup(); }); e.preventDefault(); } function handleTouchStart(e) { if (loading.value || !wrapper.value || e.touches.length !== 1) return; transform.value.enableTransition = false; const { offsetX, offsetY } = transform.value; const { pageX: startX, pageY: startY } = e.touches[0]; const dragHandler = throttle((ev) => { const targetTouch = ev.touches[0]; transform.value = { ...transform.value, offsetX: offsetX + targetTouch.pageX - startX, offsetY: offsetY + targetTouch.pageY - startY }; }); const removeTouchmove = useEventListener(document, "touchmove", dragHandler); const removeTouchend = useEventListener(document, "touchend", () => { removeTouchmove(); removeTouchend(); }); e.preventDefault(); } function reset() { transform.value = { scale: scaleClamped.value, deg: 0, offsetX: 0, offsetY: 0, enableTransition: false }; } function toggleMode() { if (loading.value || loadError.value) return; const modeNames = keysOf(modes); const modeValues = Object.values(modes); const currentMode = mode.value.name; mode.value = modes[modeNames[(modeValues.findIndex((i) => i.name === currentMode) + 1) % modeNames.length]]; reset(); } function setActiveItem(index) { loadError.value = false; const len = props.urlList.length; activeIndex.value = (index + len) % len; } function prev() { if (isFirst.value && !props.infinite) return; setActiveItem(activeIndex.value - 1); } function next() { if (isLast.value && !props.infinite) return; setActiveItem(activeIndex.value + 1); } function handleActions(action, options = {}) { if (loading.value || loadError.value) return; const { minScale, maxScale } = props; const { zoomRate, rotateDeg, enableTransition } = { zoomRate: props.zoomRate, rotateDeg: 90, enableTransition: true, ...options }; switch (action) { case "zoomOut": if (transform.value.scale > minScale) transform.value.scale = Number.parseFloat((transform.value.scale / zoomRate).toFixed(3)); break; case "zoomIn": if (transform.value.scale < maxScale) transform.value.scale = Number.parseFloat((transform.value.scale * zoomRate).toFixed(3)); break; case "clockwise": transform.value.deg += rotateDeg; emit("rotate", transform.value.deg); break; case "anticlockwise": transform.value.deg -= rotateDeg; emit("rotate", transform.value.deg); break; } transform.value.enableTransition = enableTransition; } function onFocusoutPrevented(event) { if (event.detail?.focusReason === "pointer") event.preventDefault(); } function onCloseRequested() { if (props.closeOnPressEscape) hide(); } function wheelHandler(e) { if (!e.ctrlKey) return; if (e.deltaY < 0) { e.preventDefault(); return false; } else if (e.deltaY > 0) { e.preventDefault(); return false; } } watch(() => scaleClamped.value, (val) => { transform.value.scale = val; }); watch(currentImg, () => { nextTick(() => { if (!imgRef.value?.complete) loading.value = true; }); }); watch(activeIndex, (val) => { reset(); emit("switch", val); }); onMounted(() => { visible.value = true; registerEventListener(); stopWheelListener = useEventListener("wheel", wheelHandler, { passive: false }); }); __expose({ /** * @description manually switch image */ setActiveItem }); return (_ctx, _cache) => { return openBlock(), createBlock(Teleport, { to: "body", disabled: !__props.teleported }, [createVNode(Transition, { name: "viewer-fade", appear: "" }, { default: withCtx(() => [createElementVNode("div", { ref_key: "wrapper", ref: wrapper, tabindex: -1, class: normalizeClass(unref(ns).e("wrapper")), style: normalizeStyle({ zIndex: zIndex.value }) }, [createVNode(unref(focus_trap_default), { loop: "", trapped: "", "focus-trap-el": wrapper.value, "focus-start-el": "container", onFocusoutPrevented, onReleaseRequested: onCloseRequested }, { default: withCtx(() => [ createElementVNode("div", { class: normalizeClass(unref(ns).e("mask")), onClick: _cache[0] || (_cache[0] = withModifiers(($event) => __props.hideOnClickModal && hide(), ["self"])) }, null, 2), createCommentVNode(" CLOSE "), createElementVNode("span", { class: normalizeClass([unref(ns).e("btn"), unref(ns).e("close")]), onClick: hide }, [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(close_default))]), _: 1 })], 2), createCommentVNode(" ARROW "), !isSingle.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createElementVNode("span", { class: normalizeClass(arrowPrevKls.value), onClick: prev }, [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(arrow_left_default))]), _: 1 })], 2), createElementVNode("span", { class: normalizeClass(arrowNextKls.value), onClick: next }, [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(arrow_right_default))]), _: 1 })], 2)], 64)) : createCommentVNode("v-if", true), _ctx.$slots.progress || __props.showProgress ? (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass([unref(ns).e("btn"), unref(ns).e("progress")]) }, [renderSlot(_ctx.$slots, "progress", { activeIndex: activeIndex.value, total: __props.urlList.length }, () => [createTextVNode(toDisplayString(progress.value), 1)])], 2)) : createCommentVNode("v-if", true), createCommentVNode(" ACTIONS "), createElementVNode("div", { class: normalizeClass([unref(ns).e("btn"), unref(ns).e("actions")]) }, [createElementVNode("div", { class: normalizeClass(unref(ns).e("actions__inner")) }, [renderSlot(_ctx.$slots, "toolbar", { actions: handleActions, prev, next, reset: toggleMode, activeIndex: activeIndex.value, setActiveItem }, () => [ createVNode(unref(ElIcon), { onClick: _cache[1] || (_cache[1] = ($event) => handleActions("zoomOut")) }, { default: withCtx(() => [createVNode(unref(zoom_out_default))]), _: 1 }), createVNode(unref(ElIcon), { onClick: _cache[2] || (_cache[2] = ($event) => handleActions("zoomIn")) }, { default: withCtx(() => [createVNode(unref(zoom_in_default))]), _: 1 }), createElementVNode("i", { class: normalizeClass(unref(ns).e("actions__divider")) }, null, 2), createVNode(unref(ElIcon), { onClick: toggleMode }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(mode.value.icon)))]), _: 1 }), createElementVNode("i", { class: normalizeClass(unref(ns).e("actions__divider")) }, null, 2), createVNode(unref(ElIcon), { onClick: _cache[3] || (_cache[3] = ($event) => handleActions("anticlockwise")) }, { default: withCtx(() => [createVNode(unref(refresh_left_default))]), _: 1 }), createVNode(unref(ElIcon), { onClick: _cache[4] || (_cache[4] = ($event) => handleActions("clockwise")) }, { default: withCtx(() => [createVNode(unref(refresh_right_default))]), _: 1 }) ])], 2)], 2), createCommentVNode(" CANVAS "), createElementVNode("div", { class: normalizeClass(unref(ns).e("canvas")) }, [loadError.value && _ctx.$slots["viewer-error"] ? renderSlot(_ctx.$slots, "viewer-error", { key: 0, activeIndex: activeIndex.value, src: currentImg.value }) : (openBlock(), createElementBlock("img", { ref_key: "imgRef", ref: imgRef, key: currentImg.value, src: currentImg.value, style: normalizeStyle(imgStyle.value), class: normalizeClass(unref(ns).e("img")), crossorigin: __props.crossorigin, onLoad: handleImgLoad, onError: handleImgError, onMousedown: handleMouseDown, onTouchstart: handleTouchStart }, null, 46, _hoisted_1$36))], 2), renderSlot(_ctx.$slots, "default") ]), _: 3 }, 8, ["focus-trap-el"])], 6)]), _: 3 })], 8, ["disabled"]); }; } }); //#endregion //#region ../../packages/components/image-viewer/src/image-viewer.vue var image_viewer_default = image_viewer_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/image-viewer/index.ts const ElImageViewer = withInstall(image_viewer_default); //#endregion //#region ../../packages/components/image/src/image.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$35 = [ "src", "loading", "crossorigin" ]; const _hoisted_2$22 = { key: 0 }; var image_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElImage", inheritAttrs: false, __name: "image", props: imageProps, emits: imageEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const { t } = useLocale(); const ns = useNamespace("image"); const rawAttrs = useAttrs$1(); const containerAttrs = computed(() => { return fromPairs(Object.entries(rawAttrs).filter(([key]) => /^(data-|on[A-Z])/i.test(key) || ["id", "style"].includes(key))); }); const imgAttrs = useAttrs({ excludeListeners: true, excludeKeys: computed(() => { return Object.keys(containerAttrs.value); }) }); const imageSrc = ref(); const hasLoadError = ref(false); const isLoading = ref(true); const showViewer = ref(false); const container = ref(); const _scrollContainer = ref(); const supportLoading = isClient && "loading" in HTMLImageElement.prototype; let stopScrollListener; const imageKls = computed(() => [ ns.e("inner"), preview.value && ns.e("preview"), isLoading.value && ns.is("loading") ]); const imageStyle = computed(() => { const { fit } = props; if (isClient && fit) return { objectFit: fit }; return {}; }); const preview = computed(() => { const { previewSrcList } = props; return isArray$1(previewSrcList) && previewSrcList.length > 0; }); const imageIndex = computed(() => { const { previewSrcList, initialIndex } = props; let previewIndex = initialIndex; if (initialIndex > previewSrcList.length - 1) previewIndex = 0; return previewIndex; }); const isManual = computed(() => { if (props.loading === "eager") return false; return !supportLoading && props.loading === "lazy" || props.lazy; }); const loadImage = () => { if (!isClient) return; isLoading.value = true; hasLoadError.value = false; imageSrc.value = props.src; }; function handleLoad(event) { isLoading.value = false; hasLoadError.value = false; emit("load", event); } function handleError(event) { isLoading.value = false; hasLoadError.value = true; emit("error", event); } function handleLazyLoad(isIntersecting) { if (isIntersecting) { loadImage(); removeLazyLoadListener(); } } const lazyLoadHandler = useThrottleFn(handleLazyLoad, 200, true); async function addLazyLoadListener() { if (!isClient) return; await nextTick(); const { scrollContainer } = props; if (isElement$1(scrollContainer)) _scrollContainer.value = scrollContainer; else if (isString(scrollContainer) && scrollContainer !== "") _scrollContainer.value = document.querySelector(scrollContainer) ?? void 0; else if (container.value) { const scrollContainer = getScrollContainer(container.value); _scrollContainer.value = isWindow(scrollContainer) ? void 0 : scrollContainer; } const { stop } = useIntersectionObserver(container, ([entry]) => { lazyLoadHandler(entry.isIntersecting); }, { root: _scrollContainer }); stopScrollListener = stop; } function removeLazyLoadListener() { if (!isClient || !lazyLoadHandler) return; stopScrollListener?.(); _scrollContainer.value = void 0; stopScrollListener = void 0; } function clickHandler() { if (!preview.value) return; showViewer.value = true; emit("show"); } function closeViewer() { showViewer.value = false; emit("close"); } function switchViewer(val) { emit("switch", val); } watch(() => props.src, () => { if (isManual.value) { isLoading.value = true; hasLoadError.value = false; removeLazyLoadListener(); addLazyLoadListener(); } else loadImage(); }); onMounted(() => { if (isManual.value) addLazyLoadListener(); else loadImage(); }); __expose({ /** @description manually open preview */ showPreview: clickHandler }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", mergeProps({ ref_key: "container", ref: container }, containerAttrs.value, { class: [unref(ns).b(), _ctx.$attrs.class] }), [hasLoadError.value ? renderSlot(_ctx.$slots, "error", { key: 0 }, () => [createElementVNode("div", { class: normalizeClass(unref(ns).e("error")) }, toDisplayString(unref(t)("el.image.error")), 3)]) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [imageSrc.value !== void 0 ? (openBlock(), createElementBlock("img", mergeProps({ key: 0 }, unref(imgAttrs), { src: imageSrc.value, loading: __props.loading, style: imageStyle.value, class: imageKls.value, crossorigin: __props.crossorigin, onClick: clickHandler, onLoad: handleLoad, onError: handleError }), null, 16, _hoisted_1$35)) : createCommentVNode("v-if", true), isLoading.value ? (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass(unref(ns).e("wrapper")) }, [renderSlot(_ctx.$slots, "placeholder", {}, () => [createElementVNode("div", { class: normalizeClass(unref(ns).e("placeholder")) }, null, 2)])], 2)) : createCommentVNode("v-if", true)], 64)), preview.value ? (openBlock(), createElementBlock(Fragment, { key: 2 }, [showViewer.value ? (openBlock(), createBlock(unref(ElImageViewer), { key: 0, "z-index": __props.zIndex, "initial-index": imageIndex.value, infinite: __props.infinite, "zoom-rate": __props.zoomRate, "min-scale": __props.minScale, "max-scale": __props.maxScale, "show-progress": __props.showProgress, "url-list": __props.previewSrcList, scale: __props.scale, crossorigin: __props.crossorigin, "hide-on-click-modal": __props.hideOnClickModal, teleported: __props.previewTeleported, "close-on-press-escape": __props.closeOnPressEscape, onClose: closeViewer, onSwitch: switchViewer }, createSlots({ toolbar: withCtx((toolbar) => [renderSlot(_ctx.$slots, "toolbar", normalizeProps(guardReactiveProps(toolbar)))]), default: withCtx(() => [_ctx.$slots.viewer ? (openBlock(), createElementBlock("div", _hoisted_2$22, [renderSlot(_ctx.$slots, "viewer")])) : createCommentVNode("v-if", true)]), _: 2 }, [_ctx.$slots.progress ? { name: "progress", fn: withCtx((progress) => [renderSlot(_ctx.$slots, "progress", normalizeProps(guardReactiveProps(progress)))]), key: "0" } : void 0, _ctx.$slots["viewer-error"] ? { name: "viewer-error", fn: withCtx((viewerError) => [renderSlot(_ctx.$slots, "viewer-error", normalizeProps(guardReactiveProps(viewerError)))]), key: "1" } : void 0]), 1032, [ "z-index", "initial-index", "infinite", "zoom-rate", "min-scale", "max-scale", "show-progress", "url-list", "scale", "crossorigin", "hide-on-click-modal", "teleported", "close-on-press-escape" ])) : createCommentVNode("v-if", true)], 64)) : createCommentVNode("v-if", true)], 16); }; } }); //#endregion //#region ../../packages/components/image/src/image.vue var image_default = image_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/image/index.ts const ElImage = withInstall(image_default); //#endregion //#region ../../packages/components/input-number/src/input-number.ts /** * @deprecated Removed after 3.0.0, Use `InputNumberProps` instead. */ const inputNumberProps = buildProps({ /** * @description same as `id` in native input */ id: { type: String, default: void 0 }, /** * @description incremental step */ step: { type: Number, default: 1 }, /** * @description whether input value can only be multiple of step */ stepStrictly: Boolean, /** * @description the maximum allowed value */ max: { type: Number, default: Number.MAX_SAFE_INTEGER }, /** * @description the minimum allowed value */ min: { type: Number, default: Number.MIN_SAFE_INTEGER }, /** * @description binding value */ modelValue: { type: [Number, null] }, /** * @description same as `readonly` in native input */ readonly: Boolean, /** * @description whether the component is disabled */ disabled: { type: Boolean, default: void 0 }, /** * @description size of the component */ size: useSizeProp, /** * @description whether to enable the control buttons */ controls: { type: Boolean, default: true }, /** * @description position of the control buttons */ controlsPosition: { type: String, default: "", values: ["", "right"] }, /** * @description value should be set when input box is cleared */ valueOnClear: { type: definePropType([ String, Number, null ]), validator: (val) => val === null || isNumber(val) || ["min", "max"].includes(val), default: null }, /** * @description same as `name` in native input */ name: String, /** * @description same as `placeholder` in native input */ placeholder: String, /** * @description precision of input value */ precision: { type: Number, validator: (val) => val >= 0 && val === Number.parseInt(`${val}`, 10) }, /** * @description whether to trigger form validation */ validateEvent: { type: Boolean, default: true }, ...useAriaProps(["ariaLabel"]), /** * @description native input mode for virtual keyboards */ inputmode: { type: definePropType(String), default: void 0 }, /** * @description alignment for the inner input text */ align: { type: definePropType(String), default: "center" }, /** * @description whether to disable scientific notation input (e.g. 'e', 'E') */ disabledScientific: Boolean, /** * @description specifies the format of the value presented in the input */ formatter: { type: Function }, /** * @description specifies the value extracted from the formatted input */ parser: { type: Function }, /** * @description same as `tabindex` in native input */ tabindex: { type: [String, Number], default: 0 } }); const inputNumberEmits = { [CHANGE_EVENT]: (cur, prev) => prev !== cur, blur: (e) => e instanceof FocusEvent, focus: (e) => e instanceof FocusEvent, [INPUT_EVENT]: (val) => isNumber(val) || isNil(val), [UPDATE_MODEL_EVENT]: (val) => isNumber(val) || isNil(val) }; //#endregion //#region ../../packages/components/input-number/src/input-number.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$34 = ["aria-label"]; const _hoisted_2$21 = ["aria-label"]; var input_number_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElInputNumber", __name: "input-number", props: inputNumberProps, emits: inputNumberEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const { t } = useLocale(); const ns = useNamespace("input-number"); const input = ref(); const data = reactive({ currentValue: props.modelValue, userInput: null }); const { formItem } = useFormItem(); const minDisabled = computed(() => isNumber(props.modelValue) && props.modelValue <= props.min); const maxDisabled = computed(() => isNumber(props.modelValue) && props.modelValue >= props.max); const numPrecision = computed(() => { const stepPrecision = getPrecision(props.step); if (!isUndefined(props.precision)) { if (stepPrecision > props.precision) /* @__PURE__ */ debugWarn("InputNumber", "precision should not be less than the decimal places of step"); return props.precision; } else return Math.max(getPrecision(props.modelValue), stepPrecision); }); const controlsAtRight = computed(() => { return props.controls && props.controlsPosition === "right"; }); const inputNumberSize = useFormSize(); const inputNumberDisabled = useFormDisabled(); const displayValue = computed(() => { if (data.userInput !== null) return data.userInput; let currentValue = data.currentValue; if (isNil(currentValue)) return ""; if (isNumber(currentValue)) { if (Number.isNaN(currentValue)) return ""; if (!isUndefined(props.precision)) currentValue = currentValue.toFixed(props.precision); } return currentValue; }); const toPrecision = (num, pre) => { if (isUndefined(pre)) pre = numPrecision.value; if (pre === 0) return Math.round(num); let snum = String(num); const pointPos = snum.indexOf("."); if (pointPos === -1) return num; if (!snum.replace(".", "").split("")[pointPos + pre]) return num; const length = snum.length; if (snum.charAt(length - 1) === "5") snum = `${snum.slice(0, Math.max(0, length - 1))}6`; return Number.parseFloat(Number(snum).toFixed(pre)); }; const getPrecision = (value) => { if (isNil(value)) return 0; const valueString = value.toString(); const dotPosition = valueString.indexOf("."); let precision = 0; if (dotPosition !== -1) precision = valueString.length - dotPosition - 1; return precision; }; const ensurePrecision = (val, coefficient = 1) => { if (!isNumber(val)) return data.currentValue; if (val >= Number.MAX_SAFE_INTEGER && coefficient === 1) { /* @__PURE__ */ debugWarn("InputNumber", "The value has reached the maximum safe integer limit."); return val; } else if (val <= Number.MIN_SAFE_INTEGER && coefficient === -1) { /* @__PURE__ */ debugWarn("InputNumber", "The value has reached the minimum safe integer limit."); return val; } return toPrecision(val + props.step * coefficient); }; const handleKeydown = (event) => { const code = getEventCode(event); const key = getEventKey(event); if (props.disabledScientific && ["e", "E"].includes(key)) { event.preventDefault(); return; } switch (code) { case EVENT_CODE.up: event.preventDefault(); increase(); break; case EVENT_CODE.down: event.preventDefault(); decrease(); break; } }; const increase = () => { if (props.readonly || inputNumberDisabled.value || maxDisabled.value) return; setCurrentValue(ensurePrecision(Number(displayValue.value) || 0)); emit(INPUT_EVENT, data.currentValue); setCurrentValueToModelValue(); }; const decrease = () => { if (props.readonly || inputNumberDisabled.value || minDisabled.value) return; setCurrentValue(ensurePrecision(Number(displayValue.value) || 0, -1)); emit(INPUT_EVENT, data.currentValue); setCurrentValueToModelValue(); }; const verifyValue = (value, update) => { const { max, min, step, precision, stepStrictly, valueOnClear } = props; if (max < min) throwError("InputNumber", "min should not be greater than max."); let newVal = !value ? Number(value) : Number.parseFloat(String(value)); if (isNil(value) || Number.isNaN(newVal)) return null; if (value === "") { if (valueOnClear === null) return null; newVal = isString(valueOnClear) ? { min, max }[valueOnClear] : valueOnClear; } if (stepStrictly) { newVal = toPrecision(Math.round(toPrecision(newVal / step)) * step, precision); if (newVal !== value) update && emit("update:modelValue", newVal); } if (!isUndefined(precision)) newVal = toPrecision(newVal, precision); if (newVal > max || newVal < min) { newVal = newVal > max ? max : min; update && emit("update:modelValue", newVal); } return newVal; }; const setCurrentValue = (value, emitChange = true) => { const oldVal = data.currentValue; const newVal = verifyValue(value); if (!emitChange) { emit(UPDATE_MODEL_EVENT, newVal); return; } data.userInput = null; if (oldVal === newVal && value) return; emit(UPDATE_MODEL_EVENT, newVal); if (oldVal !== newVal) emit(CHANGE_EVENT, newVal, oldVal); if (props.validateEvent) formItem?.validate?.("change").catch(NOOP); data.currentValue = newVal; }; const handleInput = (value) => { data.userInput = value; let newVal = value === "" ? null : Number.parseFloat(value); if (Number.isNaN(newVal)) newVal = null; emit(INPUT_EVENT, newVal); setCurrentValue(newVal, false); }; const handleInputChange = (value) => { const newVal = value !== "" ? Number.parseFloat(value) : ""; if (isNumber(newVal) && !Number.isNaN(newVal) || props.formatter && Number.isNaN(newVal) || newVal === "") setCurrentValue(newVal); setCurrentValueToModelValue(); data.userInput = null; }; const focus = () => { input.value?.focus?.(); }; const blur = () => { input.value?.blur?.(); }; const handleFocus = (event) => { emit("focus", event); }; const handleBlur = (event) => { data.userInput = null; if (data.currentValue === null && input.value?.input) input.value.input.value = props.formatter?.("") ?? ""; emit("blur", event); if (props.validateEvent) formItem?.validate?.("blur").catch(NOOP); }; const setCurrentValueToModelValue = () => { if (data.currentValue !== props.modelValue) data.currentValue = props.modelValue; }; const handleWheel = (e) => { if (document.activeElement === e.target) e.preventDefault(); }; watch(() => props.modelValue, (value, oldValue) => { const newValue = verifyValue(value, true); if (data.userInput === null && newValue !== oldValue) data.currentValue = newValue; }, { immediate: true }); watch(() => props.precision, () => { data.currentValue = verifyValue(props.modelValue); }); onMounted(() => { const { min, max, modelValue } = props; const innerInput = input.value?.input; innerInput.setAttribute("role", "spinbutton"); if (Number.isFinite(max)) innerInput.setAttribute("aria-valuemax", String(max)); else innerInput.removeAttribute("aria-valuemax"); if (Number.isFinite(min)) innerInput.setAttribute("aria-valuemin", String(min)); else innerInput.removeAttribute("aria-valuemin"); innerInput.setAttribute("aria-valuenow", data.currentValue || data.currentValue === 0 ? String(data.currentValue) : ""); innerInput.setAttribute("aria-disabled", String(inputNumberDisabled.value)); if (!isNumber(modelValue) && modelValue != null) { let val = Number(modelValue); if (Number.isNaN(val)) val = null; emit(UPDATE_MODEL_EVENT, val); } innerInput.addEventListener("wheel", handleWheel, { passive: false }); }); onUpdated(() => { (input.value?.input)?.setAttribute("aria-valuenow", `${data.currentValue ?? ""}`); }); __expose({ /** @description get focus the input component */ focus, /** @description remove focus the input component */ blur }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass([ unref(ns).b(), unref(ns).m(unref(inputNumberSize)), unref(ns).is("disabled", unref(inputNumberDisabled)), unref(ns).is("without-controls", !__props.controls), unref(ns).is("controls-right", controlsAtRight.value), unref(ns).is(__props.align, !!__props.align) ]), onDragstart: _cache[0] || (_cache[0] = withModifiers(() => {}, ["prevent"])) }, [ __props.controls ? withDirectives((openBlock(), createElementBlock("span", { key: 0, role: "button", "aria-label": unref(t)("el.inputNumber.decrease"), class: normalizeClass([unref(ns).e("decrease"), unref(ns).is("disabled", minDisabled.value)]), onKeydown: withKeys(decrease, ["enter"]) }, [renderSlot(_ctx.$slots, "decrease-icon", {}, () => [createVNode(unref(ElIcon), null, { default: withCtx(() => [controlsAtRight.value ? (openBlock(), createBlock(unref(arrow_down_default), { key: 0 })) : (openBlock(), createBlock(unref(minus_default), { key: 1 }))]), _: 1 })])], 42, _hoisted_1$34)), [[unref(vRepeatClick), decrease]]) : createCommentVNode("v-if", true), __props.controls ? withDirectives((openBlock(), createElementBlock("span", { key: 1, role: "button", "aria-label": unref(t)("el.inputNumber.increase"), class: normalizeClass([unref(ns).e("increase"), unref(ns).is("disabled", maxDisabled.value)]), onKeydown: withKeys(increase, ["enter"]) }, [renderSlot(_ctx.$slots, "increase-icon", {}, () => [createVNode(unref(ElIcon), null, { default: withCtx(() => [controlsAtRight.value ? (openBlock(), createBlock(unref(arrow_up_default), { key: 0 })) : (openBlock(), createBlock(unref(plus_default), { key: 1 }))]), _: 1 })])], 42, _hoisted_2$21)), [[unref(vRepeatClick), increase]]) : createCommentVNode("v-if", true), createVNode(unref(ElInput), { id: __props.id, ref_key: "input", ref: input, type: __props.formatter ? "text" : "number", step: __props.step, "model-value": displayValue.value, placeholder: __props.placeholder, readonly: __props.readonly, disabled: unref(inputNumberDisabled), size: unref(inputNumberSize), max: __props.max, min: __props.min, name: __props.name, "aria-label": __props.ariaLabel, "validate-event": false, inputmode: __props.inputmode, formatter: __props.formatter, parser: __props.parser, tabindex: __props.tabindex, onKeydown: handleKeydown, onBlur: handleBlur, onFocus: handleFocus, onInput: handleInput, onChange: handleInputChange }, createSlots({ _: 2 }, [_ctx.$slots.prefix ? { name: "prefix", fn: withCtx(() => [renderSlot(_ctx.$slots, "prefix")]), key: "0" } : void 0, _ctx.$slots.suffix ? { name: "suffix", fn: withCtx(() => [renderSlot(_ctx.$slots, "suffix")]), key: "1" } : void 0]), 1032, [ "id", "type", "step", "model-value", "placeholder", "readonly", "disabled", "size", "max", "min", "name", "aria-label", "inputmode", "formatter", "parser", "tabindex" ]) ], 34); }; } }); //#endregion //#region ../../packages/components/input-number/src/input-number.vue var input_number_default = input_number_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/input-number/index.ts const ElInputNumber = withInstall(input_number_default); //#endregion //#region ../../packages/components/input-tag/src/input-tag.ts /** * @deprecated Removed after 3.0.0, Use `InputTagProps` instead. */ const inputTagProps = buildProps({ /** * @description binding value */ modelValue: { type: definePropType(Array) }, /** * @description max number tags that can be enter */ max: Number, /** * @description tag type */ tagType: { ...tagProps.type, default: "info" }, /** * @description tag effect */ tagEffect: tagProps.effect, /** * @description tooltip theme, built-in theme: `dark` / `light` */ effect: { type: definePropType(String), default: "light" }, /** * @description the key to trigger input tag */ trigger: { type: definePropType(String), default: EVENT_CODE.enter }, /** * @description whether tags can be dragged */ draggable: Boolean, /** * @description add a tag when a delimiter is matched */ delimiter: { type: [String, RegExp], default: "" }, /** * @description input box size */ size: useSizeProp, /** * @description whether to show clear button */ clearable: Boolean, /** * @description custom clear icon component */ clearIcon: { type: iconPropType, default: circle_close_default }, /** * @description whether to disable input-tag */ disabled: { type: Boolean, default: void 0 }, /** * @description whether to trigger form validation */ validateEvent: { type: Boolean, default: true }, /** * @description native input readonly */ readonly: Boolean, /** * @description native input autofocus */ autofocus: Boolean, /** * @description same as `id` in native input */ id: { type: String, default: void 0 }, /** * @description same as `tabindex` in native input */ tabindex: { type: [String, Number], default: 0 }, /** * @description same as `maxlength` in native input */ maxlength: { type: [String, Number] }, /** * @description same as `minlength` in native input */ minlength: { type: [String, Number] }, /** * @description placeholder of input */ placeholder: String, /** * @description native input autocomplete */ autocomplete: { type: definePropType(String), default: "off" }, /** * @description whether to save the input value when the input loses focus */ saveOnBlur: { type: Boolean, default: true }, /** * @description whether to collapse tags to a text */ collapseTags: Boolean, /** * @description whether show all selected tags when mouse hover text of collapse-tags. To use this, `collapse-tags` must be true */ collapseTagsTooltip: Boolean, /** * @description the max tags number to be shown. To use this, `collapse-tags` must be true */ maxCollapseTags: { type: Number, default: 1 }, /** * @description native `aria-label` attribute */ ariaLabel: String }); const inputTagEmits = { [UPDATE_MODEL_EVENT]: (value) => isArray$1(value) || isUndefined(value), [CHANGE_EVENT]: (value) => isArray$1(value) || isUndefined(value), [INPUT_EVENT]: (value) => isString(value), "add-tag": (value) => isString(value) || isArray$1(value), "remove-tag": (value, index) => isString(value) && isNumber(index), "drag-tag": (oldIndex, newIndex, value) => isNumber(oldIndex) && isNumber(newIndex) && isString(value), focus: (evt) => evt instanceof FocusEvent, blur: (evt) => evt instanceof FocusEvent, clear: () => true }; //#endregion //#region ../../packages/components/input-tag/src/composables/use-drag-tag.ts function useDragTag({ wrapperRef, handleDragged, afterDragged }) { const ns = useNamespace("input-tag"); const dropIndicatorRef = shallowRef(); const showDropIndicator = ref(false); let draggingIndex; let draggingTag; let dropIndex; let dropType; function getTagClassName(index) { return `.${ns.e("inner")} .${ns.namespace.value}-tag:nth-child(${index + 1})`; } function handleDragStart(event, index) { draggingIndex = index; draggingTag = wrapperRef.value.querySelector(getTagClassName(index)); if (draggingTag) draggingTag.style.opacity = "0.5"; event.dataTransfer.effectAllowed = "move"; } function handleDragOver(event, index) { dropIndex = index; event.preventDefault(); event.dataTransfer.dropEffect = "move"; if (isUndefined(draggingIndex) || draggingIndex === index) { showDropIndicator.value = false; return; } const dropPosition = wrapperRef.value.querySelector(getTagClassName(index)).getBoundingClientRect(); const dropPrev = !(draggingIndex + 1 === index); const dropNext = !(draggingIndex - 1 === index); const distance = event.clientX - dropPosition.left; const prevPercent = dropPrev ? dropNext ? .5 : 1 : -1; const nextPercent = dropNext ? dropPrev ? .5 : 0 : 1; if (distance <= dropPosition.width * prevPercent) dropType = "before"; else if (distance > dropPosition.width * nextPercent) dropType = "after"; else dropType = void 0; const innerEl = wrapperRef.value.querySelector(`.${ns.e("inner")}`); const innerPosition = innerEl.getBoundingClientRect(); const gap = Number.parseFloat(getStyle(innerEl, "gap")) / 2; const indicatorTop = dropPosition.top - innerPosition.top; let indicatorLeft = -9999; if (dropType === "before") indicatorLeft = Math.max(dropPosition.left - innerPosition.left - gap, Math.floor(-gap / 2)); else if (dropType === "after") { const left = dropPosition.right - innerPosition.left; indicatorLeft = left + (innerPosition.width === left ? Math.floor(gap / 2) : gap); } setStyle(dropIndicatorRef.value, { top: `${indicatorTop}px`, left: `${indicatorLeft}px` }); showDropIndicator.value = !!dropType; } function handleDragEnd(event) { event.preventDefault(); if (draggingTag) draggingTag.style.opacity = ""; if (dropType && !isUndefined(draggingIndex) && !isUndefined(dropIndex) && draggingIndex !== dropIndex) handleDragged(draggingIndex, dropIndex, dropType); showDropIndicator.value = false; draggingIndex = void 0; draggingTag = null; dropIndex = void 0; dropType = void 0; afterDragged?.(); } return { dropIndicatorRef, showDropIndicator, handleDragStart, handleDragOver, handleDragEnd }; } //#endregion //#region ../../packages/components/input-tag/src/composables/use-hovering.ts function useHovering() { const hovering = ref(false); const handleMouseEnter = () => { hovering.value = true; }; const handleMouseLeave = () => { hovering.value = false; }; return { hovering, handleMouseEnter, handleMouseLeave }; } //#endregion //#region ../../packages/components/input-tag/src/composables/use-input-tag.ts function useInputTag({ props, emit, formItem }) { const disabled = useFormDisabled(); const size = useFormSize(); const inputRef = shallowRef(); const inputValue = ref(); const tagTooltipRef = ref(); const tagSize = computed(() => { return ["small"].includes(size.value) ? "small" : "default"; }); const placeholder = computed(() => { return props.modelValue?.length ? void 0 : props.placeholder; }); const closable = computed(() => !(props.readonly || disabled.value)); const inputLimit = computed(() => { return isUndefined(props.max) ? false : (props.modelValue?.length ?? 0) >= props.max; }); const showTagList = computed(() => { return props.collapseTags ? props.modelValue?.slice(0, props.maxCollapseTags) : props.modelValue; }); const collapseTagList = computed(() => { return props.collapseTags ? props.modelValue?.slice(props.maxCollapseTags) : []; }); const addTagsEmit = (value) => { const list = [...props.modelValue ?? [], ...castArray$1(value)]; emit(UPDATE_MODEL_EVENT, list); emit(CHANGE_EVENT, list); emit("add-tag", value); inputValue.value = void 0; }; const getDelimitedTags = (input) => { const parts = input.split(props.delimiter); const tags = parts.length > 1 ? parts.map((val) => val.trim()).filter(Boolean) : []; if (props.max) { const maxInsert = props.max - (props.modelValue?.length ?? 0); tags.splice(maxInsert); } return tags.length === 1 ? tags[0] : tags; }; const handlePaste = (event) => { const pasted = event.clipboardData?.getData("text"); if (props.readonly || inputLimit.value || !props.delimiter || !pasted) return; const { selectionStart = 0, selectionEnd = 0, value } = event.target; const nextValue = value.slice(0, selectionStart) + pasted + value.slice(selectionEnd); const tags = getDelimitedTags(nextValue); if (tags.length) { addTagsEmit(tags); emit(INPUT_EVENT, nextValue); event.preventDefault(); } }; const handleInput = (event) => { if (inputLimit.value) { inputValue.value = void 0; return; } if (isComposing.value) return; if (props.delimiter && inputValue.value) { const tags = getDelimitedTags(inputValue.value); if (tags.length) addTagsEmit(tags); } emit(INPUT_EVENT, event.target.value); }; const handleKeydown = (event) => { if (isComposing.value) return; switch (getEventCode(event)) { case props.trigger: event.preventDefault(); event.stopPropagation(); handleAddTag(); break; case EVENT_CODE.numpadEnter: if (props.trigger === EVENT_CODE.enter) { event.preventDefault(); event.stopPropagation(); handleAddTag(); } break; case EVENT_CODE.backspace: if (!inputValue.value && props.modelValue?.length) { event.preventDefault(); event.stopPropagation(); handleRemoveTag(props.modelValue.length - 1); } break; } }; const handleKeyup = (event) => { if (isComposing.value || !isAndroid()) return; switch (getEventCode(event)) { case EVENT_CODE.space: if (props.trigger === EVENT_CODE.space) { event.preventDefault(); event.stopPropagation(); handleAddTag(); } break; } }; const handleAddTag = () => { const value = inputValue.value?.trim(); if (!value || inputLimit.value) return; addTagsEmit(value); }; const handleRemoveTag = (index) => { const value = (props.modelValue ?? []).slice(); const [item] = value.splice(index, 1); emit(UPDATE_MODEL_EVENT, value); emit(CHANGE_EVENT, value); emit("remove-tag", item, index); }; const handleClear = () => { inputValue.value = void 0; emit(UPDATE_MODEL_EVENT, void 0); emit(CHANGE_EVENT, void 0); emit("clear"); }; const handleDragged = (draggingIndex, dropIndex, type) => { const value = (props.modelValue ?? []).slice(); const [draggedItem] = value.splice(draggingIndex, 1); const step = dropIndex > draggingIndex && type === "before" ? -1 : dropIndex < draggingIndex && type === "after" ? 1 : 0; value.splice(dropIndex + step, 0, draggedItem); emit(UPDATE_MODEL_EVENT, value); emit(CHANGE_EVENT, value); emit("drag-tag", draggingIndex, dropIndex + step, draggedItem); }; const focus = () => { inputRef.value?.focus(); }; const blur = () => { inputRef.value?.blur(); }; const { wrapperRef, isFocused } = useFocusController(inputRef, { disabled, beforeBlur(event) { return tagTooltipRef.value?.isFocusInsideContent(event); }, afterBlur() { if (props.saveOnBlur) handleAddTag(); else inputValue.value = void 0; if (props.validateEvent) formItem?.validate?.("blur").catch(NOOP); } }); const { isComposing, handleCompositionStart, handleCompositionUpdate, handleCompositionEnd } = useComposition({ afterComposition: handleInput }); watch(() => props.modelValue, () => { if (props.validateEvent) formItem?.validate?.(CHANGE_EVENT).catch(NOOP); }); return { inputRef, wrapperRef, tagTooltipRef, isFocused, isComposing, inputValue, size, tagSize, placeholder, closable, disabled, inputLimit, showTagList, collapseTagList, handleDragged, handlePaste, handleInput, handleKeydown, handleKeyup, handleAddTag, handleRemoveTag, handleClear, handleCompositionStart, handleCompositionUpdate, handleCompositionEnd, focus, blur }; } //#endregion //#region ../../packages/components/input-tag/src/composables/use-input-tag-dom.ts function useInputTagDom({ props, isFocused, hovering, disabled, inputValue, size, validateState, validateIcon, needStatusIcon }) { const attrs = useAttrs$1(); const slots = useSlots(); const ns = useNamespace("input-tag"); const nsInput = useNamespace("input"); const collapseItemRef = ref(); const innerRef = ref(); const containerKls = computed(() => [ ns.b(), ns.is("focused", isFocused.value), ns.is("hovering", hovering.value), ns.is("disabled", disabled.value), ns.m(size.value), ns.e("wrapper"), attrs.class ]); const containerStyle = computed(() => [attrs.style]); const innerKls = computed(() => [ ns.e("inner"), ns.is("draggable", props.draggable), ns.is("left-space", !props.modelValue?.length && !slots.prefix), ns.is("right-space", !props.modelValue?.length && !showSuffix.value) ]); const showClear = computed(() => { return props.clearable && !disabled.value && !props.readonly && (props.modelValue?.length || inputValue.value) && (isFocused.value || hovering.value); }); const showSuffix = computed(() => { return slots.suffix || showClear.value || validateState.value && validateIcon.value && needStatusIcon.value; }); const states = reactive({ innerWidth: 0, collapseItemWidth: 0 }); const getGapWidth = () => { if (!innerRef.value) return 0; const style = window.getComputedStyle(innerRef.value); return Number.parseFloat(style.gap || "6px"); }; const resetInnerWidth = () => { states.innerWidth = Number.parseFloat(window.getComputedStyle(innerRef.value).width); }; const resetCollapseItemWidth = () => { states.collapseItemWidth = collapseItemRef.value.getBoundingClientRect().width; }; const tagStyle = computed(() => { if (!props.collapseTags) return {}; const gapWidth = getGapWidth(); const inputSlotWidth = gapWidth + 11; const maxWidth = collapseItemRef.value && props.maxCollapseTags === 1 ? states.innerWidth - states.collapseItemWidth - gapWidth - inputSlotWidth : states.innerWidth - inputSlotWidth; return { maxWidth: `${Math.max(maxWidth, 0)}px` }; }); useResizeObserver(innerRef, resetInnerWidth); useResizeObserver(collapseItemRef, resetCollapseItemWidth); return { ns, nsInput, containerKls, containerStyle, innerKls, showClear, showSuffix, tagStyle, collapseItemRef, innerRef }; } //#endregion //#region ../../packages/components/input-tag/src/input-tag.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$33 = [ "id", "minlength", "maxlength", "disabled", "readonly", "autocomplete", "tabindex", "placeholder", "autofocus", "ariaLabel" ]; const _hoisted_2$20 = ["textContent"]; var input_tag_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElInputTag", inheritAttrs: false, __name: "input-tag", props: inputTagProps, emits: inputTagEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const attrs = useAttrs(); const slots = useSlots(); const { form, formItem } = useFormItem(); const { inputId } = useFormItemInputId(props, { formItemContext: formItem }); const needStatusIcon = computed(() => form?.statusIcon ?? false); const validateState = computed(() => formItem?.validateState || ""); const validateIcon = computed(() => { return validateState.value && ValidateComponentsMap[validateState.value]; }); const { inputRef, wrapperRef, tagTooltipRef, isFocused, inputValue, size, tagSize, placeholder, closable, disabled, showTagList, collapseTagList, handleDragged, handlePaste, handleInput, handleKeydown, handleKeyup, handleRemoveTag, handleClear, handleCompositionStart, handleCompositionUpdate, handleCompositionEnd, focus, blur } = useInputTag({ props, emit, formItem }); const { hovering, handleMouseEnter, handleMouseLeave } = useHovering(); const { calculatorRef, inputStyle } = useCalcInputWidth(); const { dropIndicatorRef, showDropIndicator, handleDragStart, handleDragOver, handleDragEnd } = useDragTag({ wrapperRef, handleDragged, afterDragged: focus }); const { ns, nsInput, containerKls, containerStyle, innerKls, showClear, showSuffix, tagStyle, collapseItemRef, innerRef } = useInputTagDom({ props, hovering, isFocused, inputValue, disabled, size, validateState, validateIcon, needStatusIcon }); __expose({ focus, blur }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { ref_key: "wrapperRef", ref: wrapperRef, class: normalizeClass(unref(containerKls)), style: normalizeStyle(unref(containerStyle)), onMouseenter: _cache[9] || (_cache[9] = (...args) => unref(handleMouseEnter) && unref(handleMouseEnter)(...args)), onMouseleave: _cache[10] || (_cache[10] = (...args) => unref(handleMouseLeave) && unref(handleMouseLeave)(...args)) }, [ unref(slots).prefix ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ns).e("prefix")) }, [renderSlot(_ctx.$slots, "prefix")], 2)) : createCommentVNode("v-if", true), createElementVNode("div", { ref_key: "innerRef", ref: innerRef, class: normalizeClass(unref(innerKls)) }, [ (openBlock(true), createElementBlock(Fragment, null, renderList(unref(showTagList), (item, index) => { return openBlock(), createBlock(unref(ElTag), { key: index, size: unref(tagSize), closable: unref(closable), type: __props.tagType, effect: __props.tagEffect, draggable: unref(closable) && __props.draggable, style: normalizeStyle(unref(tagStyle)), "disable-transitions": "", onClose: ($event) => unref(handleRemoveTag)(index), onDragstart: (event) => unref(handleDragStart)(event, index), onDragover: (event) => unref(handleDragOver)(event, index), onDragend: unref(handleDragEnd), onDrop: _cache[0] || (_cache[0] = withModifiers(() => {}, ["stop"])) }, { default: withCtx(() => [renderSlot(_ctx.$slots, "tag", { value: item, index }, () => [createTextVNode(toDisplayString(item), 1)])]), _: 2 }, 1032, [ "size", "closable", "type", "effect", "draggable", "style", "onClose", "onDragstart", "onDragover", "onDragend" ]); }), 128)), __props.collapseTags && __props.modelValue && __props.modelValue.length > __props.maxCollapseTags ? (openBlock(), createBlock(unref(ElTooltip), { key: 0, ref_key: "tagTooltipRef", ref: tagTooltipRef, disabled: !__props.collapseTagsTooltip, "fallback-placements": [ "bottom", "top", "right", "left" ], effect: __props.effect, placement: "bottom" }, { default: withCtx(() => [createElementVNode("div", { ref_key: "collapseItemRef", ref: collapseItemRef, class: normalizeClass(unref(ns).e("collapse-tag")) }, [createVNode(unref(ElTag), { closable: false, size: unref(tagSize), type: __props.tagType, effect: __props.tagEffect, "disable-transitions": "" }, { default: withCtx(() => [createTextVNode(" + " + toDisplayString(__props.modelValue.length - __props.maxCollapseTags), 1)]), _: 1 }, 8, [ "size", "type", "effect" ])], 2)]), content: withCtx(() => [createElementVNode("div", { class: normalizeClass(unref(ns).e("input-tag-list")) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(collapseTagList), (item, index) => { return openBlock(), createBlock(unref(ElTag), { key: index, size: unref(tagSize), closable: unref(closable), type: __props.tagType, effect: __props.tagEffect, "disable-transitions": "", onClose: ($event) => unref(handleRemoveTag)(index + __props.maxCollapseTags) }, { default: withCtx(() => [renderSlot(_ctx.$slots, "tag", { value: item, index: index + __props.maxCollapseTags }, () => [createTextVNode(toDisplayString(item), 1)])]), _: 2 }, 1032, [ "size", "closable", "type", "effect", "onClose" ]); }), 128))], 2)]), _: 3 }, 8, ["disabled", "effect"])) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass(unref(ns).e("input-wrapper")) }, [withDirectives(createElementVNode("input", mergeProps({ id: unref(inputId), ref_key: "inputRef", ref: inputRef, "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => isRef(inputValue) ? inputValue.value = $event : null) }, unref(attrs), { type: "text", minlength: __props.minlength, maxlength: __props.maxlength, disabled: unref(disabled), readonly: __props.readonly, autocomplete: __props.autocomplete, tabindex: __props.tabindex, placeholder: unref(placeholder), autofocus: __props.autofocus, ariaLabel: __props.ariaLabel, class: unref(ns).e("input"), style: unref(inputStyle), onCompositionstart: _cache[2] || (_cache[2] = (...args) => unref(handleCompositionStart) && unref(handleCompositionStart)(...args)), onCompositionupdate: _cache[3] || (_cache[3] = (...args) => unref(handleCompositionUpdate) && unref(handleCompositionUpdate)(...args)), onCompositionend: _cache[4] || (_cache[4] = (...args) => unref(handleCompositionEnd) && unref(handleCompositionEnd)(...args)), onPaste: _cache[5] || (_cache[5] = (...args) => unref(handlePaste) && unref(handlePaste)(...args)), onInput: _cache[6] || (_cache[6] = (...args) => unref(handleInput) && unref(handleInput)(...args)), onKeydown: _cache[7] || (_cache[7] = (...args) => unref(handleKeydown) && unref(handleKeydown)(...args)), onKeyup: _cache[8] || (_cache[8] = (...args) => unref(handleKeyup) && unref(handleKeyup)(...args)) }), null, 16, _hoisted_1$33), [[vModelText, unref(inputValue)]]), createElementVNode("span", { ref_key: "calculatorRef", ref: calculatorRef, "aria-hidden": "true", class: normalizeClass(unref(ns).e("input-calculator")), textContent: toDisplayString(unref(inputValue)) }, null, 10, _hoisted_2$20)], 2), withDirectives(createElementVNode("div", { ref_key: "dropIndicatorRef", ref: dropIndicatorRef, class: normalizeClass(unref(ns).e("drop-indicator")) }, null, 2), [[vShow, unref(showDropIndicator)]]) ], 2), unref(showSuffix) ? (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass(unref(ns).e("suffix")) }, [ renderSlot(_ctx.$slots, "suffix"), unref(showClear) ? (openBlock(), createBlock(unref(ElIcon), { key: 0, class: normalizeClass([unref(ns).e("icon"), unref(ns).e("clear")]), onMousedown: withModifiers(unref(NOOP), ["prevent"]), onClick: unref(handleClear) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(__props.clearIcon)))]), _: 1 }, 8, [ "class", "onMousedown", "onClick" ])) : createCommentVNode("v-if", true), validateState.value && validateIcon.value && needStatusIcon.value ? (openBlock(), createBlock(unref(ElIcon), { key: 1, class: normalizeClass([ unref(nsInput).e("icon"), unref(nsInput).e("validateIcon"), unref(nsInput).is("loading", validateState.value === "validating") ]) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(validateIcon.value)))]), _: 1 }, 8, ["class"])) : createCommentVNode("v-if", true) ], 2)) : createCommentVNode("v-if", true) ], 38); }; } }); //#endregion //#region ../../packages/components/input-tag/src/input-tag.vue var input_tag_default = input_tag_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/input-tag/index.ts const ElInputTag = withInstall(input_tag_default); //#endregion //#region ../../packages/components/input-otp/src/input-otp.ts const inputOtpEmits = { [UPDATE_MODEL_EVENT]: (value) => isString(value), [CHANGE_EVENT]: (value) => isString(value), finish: (value) => isString(value), focus: (eve) => eve instanceof FocusEvent, blur: (eve) => eve instanceof FocusEvent }; //#endregion //#region ../../packages/components/input-otp/src/input-otp.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$32 = [ "id", "aria-label", "aria-labelledby" ]; const _hoisted_2$19 = [ "value", "type", "disabled", "readonly", "inputmode", "aria-label", "onClick", "onKeydown", "onInput" ]; var input_otp_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElInputOtp", __name: "input-otp", props: { modelValue: { type: [String, Number], required: false }, length: { type: Number, required: false, default: 6 }, validator: { type: Function, required: false, default: () => true }, inputmode: { type: null, required: false }, type: { type: String, required: false, default: "outlined" }, size: { type: null, required: false, default: "default" }, mask: { type: Boolean, required: false }, disabled: { type: Boolean, required: false, default: void 0 }, readonly: { type: Boolean, required: false }, id: { type: String, required: false }, validateEvent: { type: Boolean, required: false, default: true }, separator: { type: [ String, Object, Function ], required: false }, ariaLabel: { type: String, required: false } }, emits: inputOtpEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const initialValue = computed(() => { const value = String(props.modelValue ?? ""); return Array.from({ length: props.length }, (_, i) => value.charAt(i)); }); const separators = computed(() => { const { separator } = props; const _separator = isFunction$1(separator) ? separator : () => separator; return Array.from({ length: props.length - 1 }, (_, i) => _separator(i)); }); const innerValue = ref(initialValue.value); const isFocused = ref(false); const inputRefs = ref([]); const ns = useNamespace("input-otp"); const { t } = useLocale(); const { formItem } = useFormItem(); const { inputId, isLabeledByFormItem } = useFormItemInputId(props, { formItemContext: formItem }); const disabled = useFormDisabled(); let modelValueOnFocus = props.modelValue; const getFirstIndex = (maxIndex) => { const index = innerValue.value.findIndex((char, i) => !char && i <= maxIndex); return index === -1 ? maxIndex : index; }; const handleFocus = (event) => { if (inputRefs.value?.includes(event.relatedTarget)) return; isFocused.value = true; emit("focus", event); }; const handleBlur = (event) => { if (inputRefs.value?.includes(event.relatedTarget)) return; isFocused.value = false; emit("blur", event); if (props.validateEvent) formItem?.validate?.("blur").catch(NOOP); }; const updateModelValue = (emitFinish = true) => { const value = innerValue.value.join("").slice(0, props.length); if (value !== props.modelValue) { emit(UPDATE_MODEL_EVENT, value); if (emitFinish && value.length === props.length) emit("finish", value); } }; const handleKeydown = (event, index) => { const code = getEventCode(event); let preventDefault = true; switch (code) { case EVENT_CODE.backspace: if (props.readonly) break; innerValue.value[index] = ""; focus(index - 1); updateModelValue(); break; case EVENT_CODE.delete: if (props.readonly) break; innerValue.value[index] = ""; focus(index); updateModelValue(); break; case EVENT_CODE.up: case EVENT_CODE.left: focus(index - 1); break; case EVENT_CODE.down: case EVENT_CODE.right: focus(index + 1); break; default: preventDefault = false; } if (preventDefault) event.preventDefault(); }; const handleInput = (event, index) => { const target = event.target; const targetIndex = getFirstIndex(index); let focusIndex = targetIndex + 1; let value = target.value; if (value.length > 1) { const chars = castValues(value, targetIndex); target.value = innerValue.value[index] ?? ""; chars.forEach((char, i) => innerValue.value[targetIndex + i] = char); focus(targetIndex + chars.length); updateModelValue(); return; } if (!props.validator(value, targetIndex)) { target.value = innerValue.value[index] ?? ""; value = target.value; focusIndex = targetIndex; } innerValue.value[targetIndex] = value; if (targetIndex !== index) target.value = innerValue.value[index] ?? ""; focus(focusIndex); updateModelValue(); }; const castValues = (value, startIndex = 0) => { const chars = `${value ?? ""}`.split(""); const result = []; for (const char of chars) { if (result.length + startIndex >= props.length) break; if (props.validator(char, result.length + startIndex)) result.push(char); } return result; }; const focus = (index = 0) => { const focusIndex = clamp$2(index, 0, props.length - 1); const target = inputRefs.value?.[focusIndex]; if (document.activeElement !== target) target?.focus(); rAF(() => { if (!props.readonly && document.activeElement === target) target?.select(); }); }; const blur = () => { (inputRefs.value?.find((input) => document.activeElement === input))?.blur(); }; watch(() => props.modelValue, () => { innerValue.value = initialValue.value; if (props.validateEvent) formItem?.validate?.("change").catch(NOOP); }); watch(() => props.length, () => { innerValue.value = initialValue.value; updateModelValue(false); }); watch(isFocused, (value) => { if (value) { modelValueOnFocus = props.modelValue; return; } if (modelValueOnFocus !== props.modelValue) emit(CHANGE_EVENT, props.modelValue); }); __expose({ /** * @description HTML input elements array */ inputRefs, /** * @description Focus an OTP input field */ focus, /** * @description Blur the focused OTP input field */ blur }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { id: unref(inputId), class: normalizeClass([ unref(ns).b(), unref(ns).m(__props.size), unref(ns).m(__props.type), unref(ns).is("disabled", unref(disabled)) ]), role: "group", "aria-label": !unref(isLabeledByFormItem) ? __props.ariaLabel || unref(t)("el.inputOTP.groupLabel") : void 0, "aria-labelledby": unref(isLabeledByFormItem) ? unref(formItem)?.labelId : void 0 }, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.length, (_, index) => { return openBlock(), createElementBlock(Fragment, { key: index }, [createElementVNode("label", { class: normalizeClass(unref(ns).e("input-field")) }, [createElementVNode("input", { ref_for: true, ref_key: "inputRefs", ref: inputRefs, value: innerValue.value[index], class: normalizeClass(unref(ns).e("input")), type: __props.mask ? "password" : "text", disabled: unref(disabled), readonly: __props.readonly, inputmode: __props.inputmode, autocomplete: "one-time-code", "aria-label": unref(t)("el.inputOTP.defaultLabel", { index: index + 1 }), onFocus: handleFocus, onBlur: handleBlur, onClick: ($event) => focus(index), onKeydown: ($event) => handleKeydown($event, index), onInput: ($event) => handleInput($event, index) }, null, 42, _hoisted_2$19)], 2), (_ctx.$slots.separator || separators.value[index]) && index < __props.length - 1 ? renderSlot(_ctx.$slots, "separator", { key: 0, index }, () => [(openBlock(), createBlock(resolveDynamicComponent(() => separators.value[index])))]) : createCommentVNode("v-if", true)], 64); }), 128))], 10, _hoisted_1$32); }; } }); //#endregion //#region ../../packages/components/input-otp/src/input-otp.vue var input_otp_default = input_otp_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/input-otp/index.ts const ElInputOtp = withInstall(input_otp_default); //#endregion //#region ../../packages/components/link/src/link.ts /** * @deprecated Removed after 3.0.0, Use `LinkProps` instead. */ const linkProps = buildProps({ /** * @description type */ type: { type: String, values: [ "primary", "success", "warning", "info", "danger", "default" ], default: void 0 }, /** * @description when underlines should appear */ underline: { type: [Boolean, String], values: [ true, false, "always", "never", "hover" ], default: void 0 }, /** * @description whether the component is disabled */ disabled: Boolean, /** * @description same as native hyperlink's `href` */ href: { type: String, default: "" }, /** * @description same as native hyperlink's `target` */ target: { type: String, default: "_self" }, /** * @description icon component */ icon: { type: iconPropType } }); const linkEmits = { click: (evt) => evt instanceof MouseEvent }; //#endregion //#region ../../packages/components/link/src/link.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$31 = ["href", "target"]; var link_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElLink", __name: "link", props: linkProps, emits: linkEmits, setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const globalConfig = useGlobalConfig("link"); useDeprecated({ scope: "el-link", from: "The underline option (boolean)", replacement: "'always' | 'hover' | 'never'", version: "3.0.0", ref: "https://element-plus.org/en-US/component/link.html#underline" }, computed(() => isBoolean(props.underline))); const ns = useNamespace("link"); const linkKls = computed(() => [ ns.b(), ns.m(props.type ?? globalConfig.value?.type ?? "default"), ns.is("disabled", props.disabled), ns.is("underline", underline.value === "always"), ns.is("hover-underline", underline.value === "hover" && !props.disabled) ]); const underline = computed(() => { if (isBoolean(props.underline)) return props.underline ? "hover" : "never"; else return props.underline ?? globalConfig.value?.underline ?? "hover"; }); function handleClick(event) { if (!props.disabled) emit("click", event); } return (_ctx, _cache) => { return openBlock(), createElementBlock("a", { class: normalizeClass(linkKls.value), href: __props.disabled || !__props.href ? void 0 : __props.href, target: __props.disabled || !__props.href ? void 0 : __props.target, onClick: handleClick }, [ __props.icon ? (openBlock(), createBlock(unref(ElIcon), { key: 0 }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(__props.icon)))]), _: 1 })) : createCommentVNode("v-if", true), _ctx.$slots.default ? (openBlock(), createElementBlock("span", { key: 1, class: normalizeClass(unref(ns).e("inner")) }, [renderSlot(_ctx.$slots, "default")], 2)) : createCommentVNode("v-if", true), _ctx.$slots.icon ? renderSlot(_ctx.$slots, "icon", { key: 2 }) : createCommentVNode("v-if", true) ], 10, _hoisted_1$31); }; } }); //#endregion //#region ../../packages/components/link/src/link.vue var link_default = link_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/link/index.ts const ElLink = withInstall(link_default); //#endregion //#region ../../packages/components/menu/src/utils/submenu.ts var SubMenu = class { constructor(parent, domNode) { this.parent = parent; this.domNode = domNode; this.subIndex = 0; this.subMenuItems = this.domNode.querySelectorAll("li"); this.addListeners(); } gotoSubIndex(idx) { if (idx === this.subMenuItems.length) idx = 0; else if (idx < 0) idx = this.subMenuItems.length - 1; this.subMenuItems[idx].focus(); this.subIndex = idx; } addListeners() { const parentNode = this.parent.domNode; this.subMenuItems.forEach((el) => { el.addEventListener("keydown", (event) => { const code = getEventCode(event); let prevDef = false; switch (code) { case EVENT_CODE.down: this.gotoSubIndex(this.subIndex + 1); prevDef = true; break; case EVENT_CODE.up: this.gotoSubIndex(this.subIndex - 1); prevDef = true; break; case EVENT_CODE.tab: triggerEvent(parentNode, "mouseleave"); break; case EVENT_CODE.enter: case EVENT_CODE.numpadEnter: case EVENT_CODE.space: prevDef = true; event.currentTarget.click(); break; } if (prevDef) { event.preventDefault(); event.stopPropagation(); } return false; }); }); } }; //#endregion //#region ../../packages/components/menu/src/utils/menu-item.ts var MenuItem = class { constructor(domNode, namespace) { this.domNode = domNode; this.submenu = null; this.init(namespace); } init(namespace) { this.domNode.setAttribute("tabindex", "0"); const menuChild = this.domNode.querySelector(`.${namespace}-menu`); if (menuChild) this.submenu = new SubMenu(this, menuChild); this.addListeners(); } addListeners() { this.domNode.addEventListener("keydown", (event) => { const code = getEventCode(event); let prevDef = false; switch (code) { case EVENT_CODE.down: triggerEvent(event.currentTarget, "mouseenter"); this.submenu?.gotoSubIndex(0); prevDef = true; break; case EVENT_CODE.up: triggerEvent(event.currentTarget, "mouseenter"); this.submenu?.gotoSubIndex(this.submenu.subMenuItems.length - 1); prevDef = true; break; case EVENT_CODE.tab: triggerEvent(event.currentTarget, "mouseleave"); break; case EVENT_CODE.enter: case EVENT_CODE.numpadEnter: case EVENT_CODE.space: prevDef = true; event.currentTarget.click(); break; } if (prevDef) event.preventDefault(); }); } }; //#endregion //#region ../../packages/components/menu/src/utils/menu-bar.ts var Menu = class { constructor(domNode, namespace) { this.domNode = domNode; this.init(namespace); } init(namespace) { const menuChildren = this.domNode.childNodes; Array.from(menuChildren).forEach((child) => { if (child.nodeType === 1) new MenuItem(child, namespace); }); } }; //#endregion //#region ../../packages/components/menu/src/menu-collapse-transition.vue?vue&type=script&setup=true&lang.ts var menu_collapse_transition_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElMenuCollapseTransition", __name: "menu-collapse-transition", setup(__props) { const ns = useNamespace("menu"); const listeners = { onBeforeEnter: (el) => el.style.opacity = "0.2", onEnter(el, done) { addClass(el, `${ns.namespace.value}-opacity-transition`); el.style.opacity = "1"; done(); }, onAfterEnter(el) { removeClass(el, `${ns.namespace.value}-opacity-transition`); el.style.opacity = ""; }, onBeforeLeave(el) { if (!el.dataset) el.dataset = {}; if (hasClass(el, ns.m("collapse"))) { removeClass(el, ns.m("collapse")); el.dataset.oldOverflow = el.style.overflow; el.dataset.scrollWidth = el.clientWidth.toString(); addClass(el, ns.m("collapse")); } else { addClass(el, ns.m("collapse")); el.dataset.oldOverflow = el.style.overflow; el.dataset.scrollWidth = el.clientWidth.toString(); removeClass(el, ns.m("collapse")); } el.style.width = `${el.scrollWidth}px`; el.style.overflow = "hidden"; }, onLeave(el) { addClass(el, "horizontal-collapse-transition"); el.style.width = `${el.dataset.scrollWidth}px`; } }; return (_ctx, _cache) => { return openBlock(), createBlock(Transition, mergeProps({ mode: "out-in" }, listeners), { default: withCtx(() => [renderSlot(_ctx.$slots, "default")]), _: 3 }, 16); }; } }); //#endregion //#region ../../packages/components/menu/src/menu-collapse-transition.vue var menu_collapse_transition_default = menu_collapse_transition_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/menu/src/use-menu.ts function useMenu(instance, currentIndex) { const indexPath = computed(() => { let parent = instance.parent; const path = [currentIndex.value]; while (parent.type.name !== "ElMenu") { if (parent.props.index) path.unshift(parent.props.index); parent = parent.parent; } return path; }); return { parentMenu: computed(() => { let parent = instance.parent; while (parent && !["ElMenu", "ElSubMenu"].includes(parent.type.name)) parent = parent.parent; return parent; }), indexPath }; } //#endregion //#region ../../packages/components/menu/src/use-menu-color.ts function useMenuColor(props) { return computed(() => { const color = props.backgroundColor; return color ? new TinyColor(color).shade(20).toString() : ""; }); } //#endregion //#region ../../packages/components/menu/src/use-menu-css-var.ts const useMenuCssVar = (props, level) => { const ns = useNamespace("menu"); return computed(() => ns.cssVarBlock({ "text-color": props.textColor || "", "hover-text-color": props.textColor || "", "bg-color": props.backgroundColor || "", "hover-bg-color": useMenuColor(props).value || "", "active-color": props.activeTextColor || "", level: `${level}` })); }; //#endregion //#region ../../packages/components/menu/src/tokens.ts const MENU_INJECTION_KEY = "rootMenu"; const SUB_MENU_INJECTION_KEY = "subMenu:"; //#endregion //#region ../../packages/components/menu/src/sub-menu.ts const subMenuProps = buildProps({ /** * @description unique identification */ index: { type: String, required: true }, /** * @description timeout before showing a sub-menu(inherit `show-timeout` of the menu by default.) */ showTimeout: Number, /** * @description timeout before hiding a sub-menu(inherit `hide-timeout` of the menu by default.) */ hideTimeout: Number, /** * @description custom class name for the popup menu */ popperClass: String, /** * @description custom style for the popup menu */ popperStyle: { type: definePropType([String, Object]) }, /** * @description whether the sub-menu is disabled */ disabled: Boolean, /** * @description whether popup menu is teleported to the body */ teleported: { type: Boolean, default: void 0 }, /** * @description offset of the popper (overrides the `popper` of menu) */ popperOffset: Number, /** * @description Icon when menu are expanded and submenu are closed, `expand-close-icon` and `expand-open-icon` need to be passed together to take effect */ expandCloseIcon: { type: iconPropType }, /** * @description Icon when menu are expanded and submenu are opened, `expand-open-icon` and `expand-close-icon` need to be passed together to take effect */ expandOpenIcon: { type: iconPropType }, /** * @description Icon when menu are collapsed and submenu are closed, `collapse-close-icon` and `collapse-open-icon` need to be passed together to take effect */ collapseCloseIcon: { type: iconPropType }, /** * @description Icon when menu are collapsed and submenu are opened, `collapse-open-icon` and `collapse-close-icon` need to be passed together to take effect */ collapseOpenIcon: { type: iconPropType } }); const COMPONENT_NAME$8 = "ElSubMenu"; var sub_menu_default = defineComponent({ name: COMPONENT_NAME$8, props: subMenuProps, setup(props, { slots, expose }) { const instance = getCurrentInstance(); const { indexPath, parentMenu } = useMenu(instance, computed(() => props.index)); const nsMenu = useNamespace("menu"); const nsSubMenu = useNamespace("sub-menu"); const rootMenu = inject(MENU_INJECTION_KEY); if (!rootMenu) throwError(COMPONENT_NAME$8, "can not inject root menu"); const subMenu = inject(`${SUB_MENU_INJECTION_KEY}${parentMenu.value.uid}`); if (!subMenu) throwError(COMPONENT_NAME$8, "can not inject sub menu"); const items = ref({}); const subMenus = ref({}); let timeout; const mouseInChild = ref(false); const verticalTitleRef = ref(); const vPopper = ref(); const isFirstLevel = computed(() => subMenu.level === 0); const currentPlacement = computed(() => mode.value === "horizontal" && isFirstLevel.value ? "bottom-start" : "right-start"); const subMenuTitleIcon = computed(() => { if (mode.value === "horizontal" && isFirstLevel.value || mode.value === "vertical" && !rootMenu.props.collapse) { if (props.expandCloseIcon && props.expandOpenIcon) return opened.value ? props.expandOpenIcon : props.expandCloseIcon; return arrow_down_default; } else { if (props.collapseCloseIcon && props.collapseOpenIcon) return opened.value ? props.collapseOpenIcon : props.collapseCloseIcon; return arrow_right_default; } }); const appendToBody = computed(() => { const value = props.teleported; return isUndefined(value) ? isFirstLevel.value : value; }); const menuTransitionName = computed(() => rootMenu.props.collapse ? `${nsMenu.namespace.value}-zoom-in-left` : `${nsMenu.namespace.value}-zoom-in-top`); const fallbackPlacements = computed(() => mode.value === "horizontal" && isFirstLevel.value ? [ "bottom-start", "bottom-end", "top-start", "top-end", "right-start", "left-start" ] : [ "right-start", "right", "right-end", "left-start", "bottom-start", "bottom-end", "top-start", "top-end" ]); const opened = computed(() => rootMenu.openedMenus.includes(props.index)); const active = computed(() => [...Object.values(items.value), ...Object.values(subMenus.value)].some(({ active }) => active)); const mode = computed(() => rootMenu.props.mode); const persistent = computed(() => rootMenu.props.persistent); const item = reactive({ index: props.index, indexPath, active }); const ulStyle = useMenuCssVar(rootMenu.props, subMenu.level + 1); const subMenuPopperOffset = computed(() => props.popperOffset ?? rootMenu.props.popperOffset); const subMenuPopperClass = computed(() => props.popperClass ?? rootMenu.props.popperClass); const subMenuPopperStyle = computed(() => props.popperStyle ?? rootMenu.props.popperStyle); const subMenuShowTimeout = computed(() => props.showTimeout ?? rootMenu.props.showTimeout); const subMenuHideTimeout = computed(() => props.hideTimeout ?? rootMenu.props.hideTimeout); const doDestroy = () => vPopper.value?.popperRef?.popperInstanceRef?.destroy(); const handleCollapseToggle = (value) => { if (!value) doDestroy(); }; const handleClick = () => { if (rootMenu.props.menuTrigger === "hover" && rootMenu.props.mode === "horizontal" || rootMenu.props.collapse && rootMenu.props.mode === "vertical" || props.disabled) return; rootMenu.handleSubMenuClick({ index: props.index, indexPath: indexPath.value, active: active.value }); }; const handleMouseenter = (event, showTimeout = subMenuShowTimeout.value) => { if (event.type === "focus") return; if (rootMenu.props.menuTrigger === "click" && rootMenu.props.mode === "horizontal" || !rootMenu.props.collapse && rootMenu.props.mode === "vertical" || props.disabled) { subMenu.mouseInChild.value = true; return; } subMenu.mouseInChild.value = true; timeout?.(); ({stop: timeout} = useTimeoutFn(() => { rootMenu.openMenu(props.index, indexPath.value); }, showTimeout)); if (appendToBody.value) parentMenu.value.vnode.el?.dispatchEvent(new MouseEvent("mouseenter")); if (event.type === "mouseenter" && event.target) nextTick(() => { focusElement(event.target, { preventScroll: true }); }); }; const handleMouseleave = (deepDispatch = false) => { if (rootMenu.props.menuTrigger === "click" && rootMenu.props.mode === "horizontal" || !rootMenu.props.collapse && rootMenu.props.mode === "vertical") { subMenu.mouseInChild.value = false; return; } timeout?.(); subMenu.mouseInChild.value = false; ({stop: timeout} = useTimeoutFn(() => !mouseInChild.value && rootMenu.closeMenu(props.index, indexPath.value), subMenuHideTimeout.value)); if (appendToBody.value && deepDispatch) subMenu.handleMouseleave?.(true); }; watch(() => rootMenu.props.collapse, (value) => handleCollapseToggle(Boolean(value))); { const addSubMenu = (item) => { subMenus.value[item.index] = item; }; const removeSubMenu = (item) => { delete subMenus.value[item.index]; }; provide(`${SUB_MENU_INJECTION_KEY}${instance.uid}`, { addSubMenu, removeSubMenu, handleMouseleave, mouseInChild, level: subMenu.level + 1 }); } expose({ opened }); onMounted(() => { rootMenu.addSubMenu(item); subMenu.addSubMenu(item); }); onBeforeUnmount(() => { subMenu.removeSubMenu(item); rootMenu.removeSubMenu(item); }); return () => { const titleTag = [slots.title?.(), h(ElIcon, { class: nsSubMenu.e("icon-arrow"), style: { transform: opened.value ? props.expandCloseIcon && props.expandOpenIcon || props.collapseCloseIcon && props.collapseOpenIcon && rootMenu.props.collapse ? "none" : "rotateZ(180deg)" : "none" } }, { default: () => isString(subMenuTitleIcon.value) ? h(instance.appContext.components[subMenuTitleIcon.value]) : h(subMenuTitleIcon.value) })]; const child = rootMenu.isMenuPopup ? h(ElTooltip, { ref: vPopper, visible: opened.value, effect: "light", pure: true, offset: subMenuPopperOffset.value, showArrow: false, persistent: persistent.value, popperClass: subMenuPopperClass.value, popperStyle: subMenuPopperStyle.value, placement: currentPlacement.value, teleported: appendToBody.value, fallbackPlacements: fallbackPlacements.value, transition: menuTransitionName.value, gpuAcceleration: false }, { content: () => h("div", { class: [ nsMenu.m(mode.value), nsMenu.m("popup-container"), subMenuPopperClass.value ], onMouseenter: (evt) => handleMouseenter(evt, 100), onMouseleave: () => handleMouseleave(true), onFocus: (evt) => handleMouseenter(evt, 100) }, [h("ul", { class: [ nsMenu.b(), nsMenu.m("popup"), nsMenu.m(`popup-${currentPlacement.value}`) ], style: ulStyle.value }, [slots.default?.()])]), default: () => h("div", { class: nsSubMenu.e("title"), onClick: handleClick }, titleTag) }) : h(Fragment, {}, [h("div", { class: nsSubMenu.e("title"), ref: verticalTitleRef, onClick: handleClick }, titleTag), h(ElCollapseTransition, {}, { default: () => withDirectives(h("ul", { role: "menu", class: [nsMenu.b(), nsMenu.m("inline")], style: ulStyle.value }, [slots.default?.()]), [[vShow, opened.value]]) })]); return h("li", { class: [ nsSubMenu.b(), nsSubMenu.is("active", active.value), nsSubMenu.is("opened", opened.value), nsSubMenu.is("disabled", props.disabled) ], role: "menuitem", ariaHaspopup: true, ariaExpanded: opened.value, onMouseenter: handleMouseenter, onMouseleave: () => handleMouseleave(), onFocus: handleMouseenter }, [child]); }; } }); //#endregion //#region ../../packages/components/menu/src/menu.ts const menuProps = buildProps({ /** * @description menu display mode */ mode: { type: String, values: ["horizontal", "vertical"], default: "vertical" }, /** * @description index of active menu on page load */ defaultActive: { type: String, default: "" }, /** * @description array that contains indexes of currently active sub-menus */ defaultOpeneds: { type: definePropType(Array), default: () => mutable([]) }, /** * @description whether only one sub-menu can be active */ uniqueOpened: Boolean, /** * @description whether `vue-router` mode is activated. If true, index will be used as 'path' to activate the route action. Use with `default-active` to set the active item on load. */ router: Boolean, /** * @description how sub-menus are triggered, only works when `mode` is 'horizontal' */ menuTrigger: { type: String, values: ["hover", "click"], default: "hover" }, /** * @description whether the menu is collapsed (available only in vertical mode) */ collapse: Boolean, /** * @description background color of Menu (hex format) (deprecated, use `--bg-color` instead) * @deprecated use `--bg-color` instead */ backgroundColor: String, /** * @description text color of Menu (hex format) (deprecated, use `--text-color` instead) * @deprecated use `--text-color` instead */ textColor: String, /** * @description text color of currently active menu item (hex format) (deprecated, use `--active-color` instead) * @deprecated use `--active-color` instead */ activeTextColor: String, /** * @description optional, whether menu is collapsed when clicking outside */ closeOnClickOutside: Boolean, /** * @description whether to enable the collapse transition */ collapseTransition: { type: Boolean, default: true }, /** * @description whether the menu is ellipsis (available only in horizontal mode) */ ellipsis: { type: Boolean, default: true }, /** * @description offset of the popper (effective for all submenus) */ popperOffset: { type: Number, default: 6 }, /** * @description custom ellipsis icon (available only in horizontal mode and ellipsis is true) */ ellipsisIcon: { type: iconPropType, default: () => more_default }, /** * @description Tooltip theme, built-in theme: `dark` / `light` when menu is collapsed */ popperEffect: { type: definePropType(String), default: "dark" }, /** * @description custom class name for all popup menus */ popperClass: String, /** * @description custom style for all popup menus */ popperStyle: { type: definePropType([String, Object]) }, /** * @description control timeout for all menus before showing */ showTimeout: { type: Number, default: 300 }, /** * @description control timeout for all menus before hiding */ hideTimeout: { type: Number, default: 300 }, /** * @description when menu inactive and `persistent` is `false` , dropdown menu will be destroyed */ persistent: { type: Boolean, default: true } }); const checkIndexPath = (indexPath) => isArray$1(indexPath) && indexPath.every((path) => isString(path)); const menuEmits = { close: (index, indexPath) => isString(index) && checkIndexPath(indexPath), open: (index, indexPath) => isString(index) && checkIndexPath(indexPath), select: (index, indexPath, item, routerResult) => isString(index) && checkIndexPath(indexPath) && isObject$1(item) && (isUndefined(routerResult) || routerResult instanceof Promise) }; const DEFAULT_MORE_ITEM_WIDTH = 64; var menu_default = defineComponent({ name: "ElMenu", props: menuProps, emits: menuEmits, setup(props, { emit, slots, expose }) { const instance = getCurrentInstance(); const router = instance.appContext.config.globalProperties.$router; const menu = ref(); const subMenu = ref(); const nsMenu = useNamespace("menu"); const nsSubMenu = useNamespace("sub-menu"); let moreItemWidth = DEFAULT_MORE_ITEM_WIDTH; const sliceIndex = ref(-1); const openedMenus = ref(props.defaultOpeneds && !props.collapse ? props.defaultOpeneds.slice(0) : []); const activeIndex = ref(props.defaultActive); const items = ref({}); const subMenus = ref({}); const isMenuPopup = computed(() => props.mode === "horizontal" || props.mode === "vertical" && props.collapse); const initMenu = () => { const activeItem = activeIndex.value && items.value[activeIndex.value]; if (!activeItem || props.mode === "horizontal" || props.collapse) return; activeItem.indexPath.forEach((index) => { const subMenu = subMenus.value[index]; subMenu && openMenu(index, subMenu.indexPath); }); }; const openMenu = (index, indexPath) => { if (openedMenus.value.includes(index)) return; if (props.uniqueOpened) openedMenus.value = openedMenus.value.filter((index) => indexPath.includes(index)); openedMenus.value.push(index); emit("open", index, indexPath); }; const close = (index) => { const i = openedMenus.value.indexOf(index); if (i !== -1) openedMenus.value.splice(i, 1); }; const closeMenu = (index, indexPath) => { close(index); emit("close", index, indexPath); }; const handleSubMenuClick = ({ index, indexPath }) => { openedMenus.value.includes(index) ? closeMenu(index, indexPath) : openMenu(index, indexPath); }; const handleMenuItemClick = (menuItem) => { if (props.mode === "horizontal" || props.collapse) openedMenus.value = []; const { index, indexPath } = menuItem; if (isNil(index) || isNil(indexPath)) return; if (props.router && router) { const route = menuItem.route || index; const routerResult = router.push(route).then((res) => { if (!res) activeIndex.value = index; return res; }); emit("select", index, indexPath, { index, indexPath, route }, routerResult); } else { activeIndex.value = index; emit("select", index, indexPath, { index, indexPath }); } }; const updateActiveIndex = (val) => { const itemsInData = items.value; activeIndex.value = (itemsInData[val] || activeIndex.value && itemsInData[activeIndex.value] || itemsInData[props.defaultActive])?.index ?? val; }; const calcMenuItemWidth = (menuItem) => { const computedStyle = getComputedStyle(menuItem); const marginLeft = Number.parseInt(computedStyle.marginLeft, 10); const marginRight = Number.parseInt(computedStyle.marginRight, 10); return menuItem.offsetWidth + marginLeft + marginRight || 0; }; const calcSliceIndex = () => { if (!menu.value) return -1; const items = Array.from(menu.value.childNodes).filter((item) => item.nodeName !== "#comment" && (item.nodeName !== "#text" || item.nodeValue)); const computedMenuStyle = getComputedStyle(menu.value); const paddingLeft = Number.parseInt(computedMenuStyle.paddingLeft, 10); const paddingRight = Number.parseInt(computedMenuStyle.paddingRight, 10); const menuWidth = menu.value.clientWidth - paddingLeft - paddingRight; let calcWidth = 0; let sliceIndex = 0; items.forEach((item, index) => { calcWidth += calcMenuItemWidth(item); if (calcWidth <= menuWidth - moreItemWidth) sliceIndex = index + 1; }); return sliceIndex === items.length ? -1 : sliceIndex; }; const getIndexPath = (index) => subMenus.value[index].indexPath; const debounce = (fn, wait = 33.34) => { let timer; return () => { timer && clearTimeout(timer); timer = setTimeout(() => { fn(); }, wait); }; }; let isFirstTimeRender = true; const handleResize = () => { const el = unrefElement(subMenu); if (el) moreItemWidth = calcMenuItemWidth(el) || DEFAULT_MORE_ITEM_WIDTH; if (sliceIndex.value === calcSliceIndex()) return; const callback = () => { sliceIndex.value = -1; nextTick(() => { sliceIndex.value = calcSliceIndex(); }); }; isFirstTimeRender ? callback() : debounce(callback)(); isFirstTimeRender = false; }; watch(() => props.defaultActive, (currentActive) => { if (!items.value[currentActive]) activeIndex.value = ""; updateActiveIndex(currentActive); }); watch(() => props.collapse, (value) => { if (value) openedMenus.value = []; }); watch(items.value, initMenu); let resizeStopper; watchEffect(() => { if (props.mode === "horizontal" && props.ellipsis) resizeStopper = useResizeObserver(menu, handleResize).stop; else resizeStopper?.(); }); const mouseInChild = ref(false); { const addSubMenu = (item) => { subMenus.value[item.index] = item; }; const removeSubMenu = (item) => { delete subMenus.value[item.index]; }; const addMenuItem = (item) => { items.value[item.index] = item; }; const removeMenuItem = (item) => { delete items.value[item.index]; }; provide(MENU_INJECTION_KEY, reactive({ props, openedMenus, items, subMenus, activeIndex, isMenuPopup, addMenuItem, removeMenuItem, addSubMenu, removeSubMenu, openMenu, closeMenu, handleMenuItemClick, handleSubMenuClick })); provide(`${SUB_MENU_INJECTION_KEY}${instance.uid}`, { addSubMenu, removeSubMenu, mouseInChild, level: 0 }); } onMounted(() => { if (props.mode === "horizontal") new Menu(instance.vnode.el, nsMenu.namespace.value); }); { const open = (index) => { const { indexPath } = subMenus.value[index]; indexPath.forEach((i) => openMenu(i, indexPath)); }; expose({ open, close, updateActiveIndex, handleResize }); } const ulStyle = useMenuCssVar(props, 0); return () => { let slot = slots.default?.() ?? []; const vShowMore = []; if (props.mode === "horizontal" && menu.value) { const originalSlot = flattedChildren(slot).filter((vnode) => { return vnode?.shapeFlag !== 8; }); const slotDefault = sliceIndex.value === -1 ? originalSlot : originalSlot.slice(0, sliceIndex.value); const slotMore = sliceIndex.value === -1 ? [] : originalSlot.slice(sliceIndex.value); if (slotMore?.length && props.ellipsis) { slot = slotDefault; vShowMore.push(h(sub_menu_default, { ref: subMenu, index: "sub-menu-more", class: nsSubMenu.e("hide-arrow"), popperOffset: props.popperOffset }, { title: () => h(ElIcon, { class: nsSubMenu.e("icon-more") }, { default: () => h(props.ellipsisIcon) }), default: () => slotMore })); } } const directives = props.closeOnClickOutside ? [[ClickOutside, () => { if (!openedMenus.value.length) return; if (!mouseInChild.value) { openedMenus.value.forEach((openedMenu) => emit("close", openedMenu, getIndexPath(openedMenu))); openedMenus.value = []; } }]] : []; const vMenu = withDirectives(h("ul", { key: String(props.collapse), role: "menubar", ref: menu, style: ulStyle.value, class: { [nsMenu.b()]: true, [nsMenu.m(props.mode)]: true, [nsMenu.m("collapse")]: props.collapse } }, [...slot, ...vShowMore]), directives); if (props.collapseTransition && props.mode === "vertical") return h(menu_collapse_transition_default, () => vMenu); return vMenu; }; } }); //#endregion //#region ../../packages/components/menu/src/menu-item.ts /** * @deprecated Removed after 3.0.0, Use `MenuItemProps` instead. */ const menuItemProps = buildProps({ /** * @description unique identification */ index: { type: String, required: true }, /** * @description Vue Router object */ route: { type: definePropType([String, Object]) }, /** * @description whether disabled */ disabled: Boolean }); const menuItemEmits = { click: (item) => isString(item.index) && isArray$1(item.indexPath) }; //#endregion //#region ../../packages/components/menu/src/menu-item.vue?vue&type=script&setup=true&lang.ts const COMPONENT_NAME$7 = "ElMenuItem"; var menu_item_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: COMPONENT_NAME$7, __name: "menu-item", props: menuItemProps, emits: menuItemEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const instance = getCurrentInstance(); const rootMenu = inject(MENU_INJECTION_KEY); const nsMenu = useNamespace("menu"); const nsMenuItem = useNamespace("menu-item"); if (!rootMenu) throwError(COMPONENT_NAME$7, "can not inject root menu"); const { parentMenu, indexPath } = useMenu(instance, toRef(props, "index")); const subMenu = inject(`${SUB_MENU_INJECTION_KEY}${parentMenu.value.uid}`); if (!subMenu) throwError(COMPONENT_NAME$7, "can not inject sub menu"); const active = computed(() => props.index === rootMenu.activeIndex); const item = reactive({ index: props.index, indexPath, active }); const handleClick = () => { if (!props.disabled) { rootMenu.handleMenuItemClick({ index: props.index, indexPath: indexPath.value, route: props.route }); emit("click", item); } }; onMounted(() => { subMenu.addSubMenu(item); rootMenu.addMenuItem(item); }); onBeforeUnmount(() => { subMenu.removeSubMenu(item); rootMenu.removeMenuItem(item); }); __expose({ parentMenu, rootMenu, active, nsMenu, nsMenuItem, handleClick }); return (_ctx, _cache) => { return openBlock(), createElementBlock("li", { class: normalizeClass([ unref(nsMenuItem).b(), unref(nsMenuItem).is("active", active.value), unref(nsMenuItem).is("disabled", __props.disabled) ]), role: "menuitem", tabindex: "-1", onClick: handleClick }, [unref(parentMenu).type.name === "ElMenu" && unref(rootMenu).props.collapse && _ctx.$slots.title ? (openBlock(), createBlock(unref(ElTooltip), { key: 0, effect: unref(rootMenu).props.popperEffect, placement: "right", "fallback-placements": ["left"], "popper-class": unref(rootMenu).props.popperClass, "popper-style": unref(rootMenu).props.popperStyle, persistent: unref(rootMenu).props.persistent, "focus-on-target": "" }, { content: withCtx(() => [renderSlot(_ctx.$slots, "title")]), default: withCtx(() => [createElementVNode("div", { class: normalizeClass(unref(nsMenu).be("tooltip", "trigger")) }, [renderSlot(_ctx.$slots, "default")], 2)]), _: 3 }, 8, [ "effect", "popper-class", "popper-style", "persistent" ])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [renderSlot(_ctx.$slots, "default"), renderSlot(_ctx.$slots, "title")], 64))], 2); }; } }); //#endregion //#region ../../packages/components/menu/src/menu-item.vue var menu_item_default = menu_item_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/menu/src/menu-item-group.ts /** * @deprecated Removed after 3.0.0, Use `MenuItemGroupProps` instead. */ const menuItemGroupProps = { /** * @description group title */ title: String }; //#endregion //#region ../../packages/components/menu/src/menu-item-group.vue?vue&type=script&setup=true&lang.ts var menu_item_group_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElMenuItemGroup", __name: "menu-item-group", props: menuItemGroupProps, setup(__props) { const ns = useNamespace("menu-item-group"); return (_ctx, _cache) => { return openBlock(), createElementBlock("li", { class: normalizeClass(unref(ns).b()) }, [createElementVNode("div", { class: normalizeClass(unref(ns).e("title")) }, [!_ctx.$slots.title ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createTextVNode(toDisplayString(__props.title), 1)], 64)) : renderSlot(_ctx.$slots, "title", { key: 1 })], 2), createElementVNode("ul", null, [renderSlot(_ctx.$slots, "default")])], 2); }; } }); //#endregion //#region ../../packages/components/menu/src/menu-item-group.vue var menu_item_group_default = menu_item_group_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/menu/index.ts const ElMenu = withInstall(menu_default, { MenuItem: menu_item_default, MenuItemGroup: menu_item_group_default, SubMenu: sub_menu_default }); const ElMenuItem = withNoopInstall(menu_item_default); const ElMenuItemGroup = withNoopInstall(menu_item_group_default); const ElSubMenu = withNoopInstall(sub_menu_default); //#endregion //#region ../../packages/components/page-header/src/page-header.ts /** * @deprecated Removed after 3.0.0, Use `PageHeaderProps` instead. */ const pageHeaderProps = buildProps({ /** * @description icon component of page header */ icon: { type: iconPropType, default: () => back_default }, /** * @description main title of page header */ title: String, /** * @description content of page header */ content: { type: String, default: "" } }); const pageHeaderEmits = { back: () => true }; //#endregion //#region ../../packages/components/page-header/src/page-header.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$30 = ["aria-label"]; var page_header_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElPageHeader", __name: "page-header", props: pageHeaderProps, emits: pageHeaderEmits, setup(__props, { emit: __emit }) { const emit = __emit; const { t } = useLocale(); const ns = useNamespace("page-header"); function handleClick() { emit("back"); } return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass([ unref(ns).b(), unref(ns).is("contentful", !!_ctx.$slots.default), { [unref(ns).m("has-breadcrumb")]: !!_ctx.$slots.breadcrumb, [unref(ns).m("has-extra")]: !!_ctx.$slots.extra } ]) }, [ _ctx.$slots.breadcrumb ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ns).e("breadcrumb")) }, [renderSlot(_ctx.$slots, "breadcrumb")], 2)) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass(unref(ns).e("header")) }, [createElementVNode("div", { class: normalizeClass(unref(ns).e("left")) }, [ createElementVNode("div", { class: normalizeClass(unref(ns).e("back")), role: "button", tabindex: "0", onClick: handleClick }, [__props.icon || _ctx.$slots.icon ? (openBlock(), createElementBlock("div", { key: 0, "aria-label": __props.title || unref(t)("el.pageHeader.title"), class: normalizeClass(unref(ns).e("icon")) }, [renderSlot(_ctx.$slots, "icon", {}, () => [__props.icon ? (openBlock(), createBlock(unref(ElIcon), { key: 0 }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(__props.icon)))]), _: 1 })) : createCommentVNode("v-if", true)])], 10, _hoisted_1$30)) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass(unref(ns).e("title")) }, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title || unref(t)("el.pageHeader.title")), 1)])], 2)], 2), createVNode(unref(ElDivider), { direction: "vertical" }), createElementVNode("div", { class: normalizeClass(unref(ns).e("content")) }, [renderSlot(_ctx.$slots, "content", {}, () => [createTextVNode(toDisplayString(__props.content), 1)])], 2) ], 2), _ctx.$slots.extra ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ns).e("extra")) }, [renderSlot(_ctx.$slots, "extra")], 2)) : createCommentVNode("v-if", true)], 2), _ctx.$slots.default ? (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass(unref(ns).e("main")) }, [renderSlot(_ctx.$slots, "default")], 2)) : createCommentVNode("v-if", true) ], 2); }; } }); //#endregion //#region ../../packages/components/page-header/src/page-header.vue var page_header_default = page_header_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/page-header/index.ts const ElPageHeader = withInstall(page_header_default); //#endregion //#region ../../packages/components/pagination/src/constants.ts const elPaginationKey = Symbol("elPaginationKey"); //#endregion //#region ../../packages/components/pagination/src/components/prev.ts const paginationPrevProps = buildProps({ disabled: Boolean, currentPage: { type: Number, default: 1 }, prevText: { type: String }, prevIcon: { type: iconPropType } }); const paginationPrevEmits = { click: (evt) => evt instanceof MouseEvent }; //#endregion //#region ../../packages/components/pagination/src/components/prev.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$29 = [ "disabled", "aria-label", "aria-disabled" ]; const _hoisted_2$18 = { key: 0 }; var prev_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElPaginationPrev", __name: "prev", props: paginationPrevProps, emits: paginationPrevEmits, setup(__props) { const props = __props; const { t } = useLocale(); const internalDisabled = computed(() => props.disabled || props.currentPage <= 1); return (_ctx, _cache) => { return openBlock(), createElementBlock("button", { type: "button", class: "btn-prev", disabled: internalDisabled.value, "aria-label": _ctx.prevText || unref(t)("el.pagination.prev"), "aria-disabled": internalDisabled.value, onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("click", $event)) }, [_ctx.prevText ? (openBlock(), createElementBlock("span", _hoisted_2$18, toDisplayString(_ctx.prevText), 1)) : (openBlock(), createBlock(unref(ElIcon), { key: 1 }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(_ctx.prevIcon)))]), _: 1 }))], 8, _hoisted_1$29); }; } }); //#endregion //#region ../../packages/components/pagination/src/components/prev.vue var prev_default = prev_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/pagination/src/components/next.ts const paginationNextProps = buildProps({ disabled: Boolean, currentPage: { type: Number, default: 1 }, pageCount: { type: Number, default: 50 }, nextText: { type: String }, nextIcon: { type: iconPropType } }); //#endregion //#region ../../packages/components/pagination/src/components/next.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$28 = [ "disabled", "aria-label", "aria-disabled" ]; const _hoisted_2$17 = { key: 0 }; var next_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElPaginationNext", __name: "next", props: paginationNextProps, emits: ["click"], setup(__props) { const props = __props; const { t } = useLocale(); const internalDisabled = computed(() => props.disabled || props.currentPage === props.pageCount || props.pageCount === 0); return (_ctx, _cache) => { return openBlock(), createElementBlock("button", { type: "button", class: "btn-next", disabled: internalDisabled.value, "aria-label": _ctx.nextText || unref(t)("el.pagination.next"), "aria-disabled": internalDisabled.value, onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("click", $event)) }, [_ctx.nextText ? (openBlock(), createElementBlock("span", _hoisted_2$17, toDisplayString(_ctx.nextText), 1)) : (openBlock(), createBlock(unref(ElIcon), { key: 1 }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(_ctx.nextIcon)))]), _: 1 }))], 8, _hoisted_1$28); }; } }); //#endregion //#region ../../packages/components/pagination/src/components/next.vue var next_default = next_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/pagination/src/usePagination.ts const usePagination = () => inject(elPaginationKey, {}); //#endregion //#region ../../packages/components/pagination/src/components/sizes.ts const paginationSizesProps = buildProps({ pageSize: { type: Number, required: true }, pageSizes: { type: definePropType(Array), default: () => mutable([ 10, 20, 30, 40, 50, 100 ]) }, popperClass: { type: String }, popperStyle: { type: definePropType([String, Object]) }, disabled: Boolean, teleported: Boolean, size: { type: String, values: componentSizes }, appendSizeTo: String }); //#endregion //#region ../../packages/components/pagination/src/components/sizes.vue?vue&type=script&setup=true&lang.ts var sizes_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElPaginationSizes", __name: "sizes", props: paginationSizesProps, emits: ["page-size-change"], setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const { t } = useLocale(); const ns = useNamespace("pagination"); const pagination = usePagination(); const innerPageSize = ref(props.pageSize); watch(() => props.pageSizes, (newVal, oldVal) => { if (isEqual$1(newVal, oldVal)) return; if (isArray$1(newVal)) emit("page-size-change", newVal.includes(props.pageSize) ? props.pageSize : props.pageSizes[0]); }); watch(() => props.pageSize, (newVal) => { innerPageSize.value = newVal; }); const innerPageSizes = computed(() => props.pageSizes); function handleChange(val) { if (val !== innerPageSize.value) { innerPageSize.value = val; pagination.handleSizeChange?.(Number(val)); } } return (_ctx, _cache) => { return openBlock(), createElementBlock("span", { class: normalizeClass(unref(ns).e("sizes")) }, [createVNode(unref(ElSelect), { "model-value": innerPageSize.value, disabled: _ctx.disabled, "popper-class": _ctx.popperClass, "popper-style": _ctx.popperStyle, size: _ctx.size, teleported: _ctx.teleported, "validate-event": false, "append-to": _ctx.appendSizeTo, onChange: handleChange }, { default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(innerPageSizes.value, (item) => { return openBlock(), createBlock(unref(ElOption), { key: item, value: item, label: item + unref(t)("el.pagination.pagesize") }, null, 8, ["value", "label"]); }), 128))]), _: 1 }, 8, [ "model-value", "disabled", "popper-class", "popper-style", "size", "teleported", "append-to" ])], 2); }; } }); //#endregion //#region ../../packages/components/pagination/src/components/sizes.vue var sizes_default = sizes_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/pagination/src/components/jumper.ts const paginationJumperProps = buildProps({ size: { type: String, values: componentSizes } }); //#endregion //#region ../../packages/components/pagination/src/components/jumper.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$27 = ["disabled"]; var jumper_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElPaginationJumper", __name: "jumper", props: paginationJumperProps, setup(__props) { const { t } = useLocale(); const ns = useNamespace("pagination"); const { pageCount, disabled, currentPage, changeEvent } = usePagination(); const userInput = ref(); const innerValue = computed(() => userInput.value ?? currentPage?.value); function handleInput(val) { userInput.value = val ? +val : ""; } function handleChange(val) { val = Math.trunc(+val); changeEvent?.(val); userInput.value = void 0; } return (_ctx, _cache) => { return openBlock(), createElementBlock("span", { class: normalizeClass(unref(ns).e("jump")), disabled: unref(disabled) }, [ createElementVNode("span", { class: normalizeClass([unref(ns).e("goto")]) }, toDisplayString(unref(t)("el.pagination.goto")), 3), createVNode(unref(ElInput), { size: _ctx.size, class: normalizeClass([unref(ns).e("editor"), unref(ns).is("in-pagination")]), min: 1, max: unref(pageCount), disabled: unref(disabled), "model-value": innerValue.value, "validate-event": false, "aria-label": unref(t)("el.pagination.page"), type: "number", "onUpdate:modelValue": handleInput, onChange: handleChange }, null, 8, [ "size", "class", "max", "disabled", "model-value", "aria-label" ]), createElementVNode("span", { class: normalizeClass([unref(ns).e("classifier")]) }, toDisplayString(unref(t)("el.pagination.pageClassifier")), 3) ], 10, _hoisted_1$27); }; } }); //#endregion //#region ../../packages/components/pagination/src/components/jumper.vue var jumper_default = jumper_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/pagination/src/components/total.ts const paginationTotalProps = buildProps({ total: { type: Number, default: 1e3 } }); //#endregion //#region ../../packages/components/pagination/src/components/total.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$26 = ["disabled"]; var total_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElPaginationTotal", __name: "total", props: paginationTotalProps, setup(__props) { const { t } = useLocale(); const ns = useNamespace("pagination"); const { disabled } = usePagination(); return (_ctx, _cache) => { return openBlock(), createElementBlock("span", { class: normalizeClass(unref(ns).e("total")), disabled: unref(disabled) }, toDisplayString(unref(t)("el.pagination.total", { total: _ctx.total })), 11, _hoisted_1$26); }; } }); //#endregion //#region ../../packages/components/pagination/src/components/total.vue var total_default = total_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/pagination/src/components/pager.ts const paginationPagerProps = buildProps({ currentPage: { type: Number, default: 1 }, pageCount: { type: Number, required: true }, pagerCount: { type: Number, default: 7 }, disabled: Boolean }); //#endregion //#region ../../packages/components/pagination/src/components/pager.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$25 = [ "aria-current", "aria-label", "tabindex" ]; const _hoisted_2$16 = ["tabindex", "aria-label"]; const _hoisted_3$7 = [ "aria-current", "aria-label", "tabindex" ]; const _hoisted_4$5 = ["tabindex", "aria-label"]; const _hoisted_5$3 = [ "aria-current", "aria-label", "tabindex" ]; var pager_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElPaginationPager", __name: "pager", props: paginationPagerProps, emits: [CHANGE_EVENT], setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const nsPager = useNamespace("pager"); const nsIcon = useNamespace("icon"); const { t } = useLocale(); const showPrevMore = ref(false); const showNextMore = ref(false); const quickPrevHover = ref(false); const quickNextHover = ref(false); const quickPrevFocus = ref(false); const quickNextFocus = ref(false); const pagers = computed(() => { const pagerCount = props.pagerCount; const halfPagerCount = (pagerCount - 1) / 2; const currentPage = Number(props.currentPage); const pageCount = Number(props.pageCount); let showPrevMore = false; let showNextMore = false; if (pageCount > pagerCount) { if (currentPage > pagerCount - halfPagerCount) showPrevMore = true; if (currentPage < pageCount - halfPagerCount) showNextMore = true; } const array = []; if (showPrevMore && !showNextMore) { const startPage = pageCount - (pagerCount - 2); for (let i = startPage; i < pageCount; i++) array.push(i); } else if (!showPrevMore && showNextMore) for (let i = 2; i < pagerCount; i++) array.push(i); else if (showPrevMore && showNextMore) { const offset = Math.floor(pagerCount / 2) - 1; for (let i = currentPage - offset; i <= currentPage + offset; i++) array.push(i); } else for (let i = 2; i < pageCount; i++) array.push(i); return array; }); const prevMoreKls = computed(() => [ "more", "btn-quickprev", nsIcon.b(), nsPager.is("disabled", props.disabled) ]); const nextMoreKls = computed(() => [ "more", "btn-quicknext", nsIcon.b(), nsPager.is("disabled", props.disabled) ]); const tabindex = computed(() => props.disabled ? -1 : 0); watch(() => [ props.pageCount, props.pagerCount, props.currentPage ], ([pageCount, pagerCount, currentPage]) => { const halfPagerCount = (pagerCount - 1) / 2; let showPrev = false; let showNext = false; if (pageCount > pagerCount) { showPrev = currentPage > pagerCount - halfPagerCount; showNext = currentPage < pageCount - halfPagerCount; } quickPrevHover.value &&= showPrev; quickNextHover.value &&= showNext; showPrevMore.value = showPrev; showNextMore.value = showNext; }, { immediate: true }); function onMouseEnter(forward = false) { if (props.disabled) return; if (forward) quickPrevHover.value = true; else quickNextHover.value = true; } function onFocus(forward = false) { if (forward) quickPrevFocus.value = true; else quickNextFocus.value = true; } function onEnter(e) { const target = e.target; if (target.tagName.toLowerCase() === "li" && Array.from(target.classList).includes("number")) { const newPage = Number(target.textContent); if (newPage !== props.currentPage) emit(CHANGE_EVENT, newPage); } else if (target.tagName.toLowerCase() === "li" && Array.from(target.classList).includes("more")) onPagerClick(e); } function onPagerClick(event) { const target = event.target; if (target.tagName.toLowerCase() === "ul" || props.disabled) return; let newPage = Number(target.textContent); const pageCount = props.pageCount; const currentPage = props.currentPage; const pagerCountOffset = props.pagerCount - 2; if (target.className.includes("more")) { if (target.className.includes("quickprev")) newPage = currentPage - pagerCountOffset; else if (target.className.includes("quicknext")) newPage = currentPage + pagerCountOffset; } if (!Number.isNaN(+newPage)) { if (newPage < 1) newPage = 1; if (newPage > pageCount) newPage = pageCount; } if (newPage !== currentPage) emit(CHANGE_EVENT, newPage); } return (_ctx, _cache) => { return openBlock(), createElementBlock("ul", { class: normalizeClass(unref(nsPager).b()), onClick: onPagerClick, onKeyup: withKeys(onEnter, ["enter"]) }, [ _ctx.pageCount > 0 ? (openBlock(), createElementBlock("li", { key: 0, class: normalizeClass([[unref(nsPager).is("active", _ctx.currentPage === 1), unref(nsPager).is("disabled", _ctx.disabled)], "number"]), "aria-current": _ctx.currentPage === 1, "aria-label": unref(t)("el.pagination.currentPage", { pager: 1 }), tabindex: tabindex.value }, " 1 ", 10, _hoisted_1$25)) : createCommentVNode("v-if", true), showPrevMore.value ? (openBlock(), createElementBlock("li", { key: 1, class: normalizeClass(prevMoreKls.value), tabindex: tabindex.value, "aria-label": unref(t)("el.pagination.prevPages", { pager: _ctx.pagerCount - 2 }), onMouseenter: _cache[0] || (_cache[0] = ($event) => onMouseEnter(true)), onMouseleave: _cache[1] || (_cache[1] = ($event) => quickPrevHover.value = false), onFocus: _cache[2] || (_cache[2] = ($event) => onFocus(true)), onBlur: _cache[3] || (_cache[3] = ($event) => quickPrevFocus.value = false) }, [(quickPrevHover.value || quickPrevFocus.value) && !_ctx.disabled ? (openBlock(), createBlock(unref(d_arrow_left_default), { key: 0 })) : (openBlock(), createBlock(unref(more_filled_default), { key: 1 }))], 42, _hoisted_2$16)) : createCommentVNode("v-if", true), (openBlock(true), createElementBlock(Fragment, null, renderList(pagers.value, (pager) => { return openBlock(), createElementBlock("li", { key: pager, class: normalizeClass([[unref(nsPager).is("active", _ctx.currentPage === pager), unref(nsPager).is("disabled", _ctx.disabled)], "number"]), "aria-current": _ctx.currentPage === pager, "aria-label": unref(t)("el.pagination.currentPage", { pager }), tabindex: tabindex.value }, toDisplayString(pager), 11, _hoisted_3$7); }), 128)), showNextMore.value ? (openBlock(), createElementBlock("li", { key: 2, class: normalizeClass(nextMoreKls.value), tabindex: tabindex.value, "aria-label": unref(t)("el.pagination.nextPages", { pager: _ctx.pagerCount - 2 }), onMouseenter: _cache[4] || (_cache[4] = ($event) => onMouseEnter()), onMouseleave: _cache[5] || (_cache[5] = ($event) => quickNextHover.value = false), onFocus: _cache[6] || (_cache[6] = ($event) => onFocus()), onBlur: _cache[7] || (_cache[7] = ($event) => quickNextFocus.value = false) }, [(quickNextHover.value || quickNextFocus.value) && !_ctx.disabled ? (openBlock(), createBlock(unref(d_arrow_right_default), { key: 0 })) : (openBlock(), createBlock(unref(more_filled_default), { key: 1 }))], 42, _hoisted_4$5)) : createCommentVNode("v-if", true), _ctx.pageCount > 1 ? (openBlock(), createElementBlock("li", { key: 3, class: normalizeClass([[unref(nsPager).is("active", _ctx.currentPage === _ctx.pageCount), unref(nsPager).is("disabled", _ctx.disabled)], "number"]), "aria-current": _ctx.currentPage === _ctx.pageCount, "aria-label": unref(t)("el.pagination.currentPage", { pager: _ctx.pageCount }), tabindex: tabindex.value }, toDisplayString(_ctx.pageCount), 11, _hoisted_5$3)) : createCommentVNode("v-if", true) ], 34); }; } }); //#endregion //#region ../../packages/components/pagination/src/components/pager.vue var pager_default = pager_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/pagination/src/pagination.ts /** * It it user's responsibility to guarantee that the value of props.total... is number * (same as pageSize, defaultPageSize, currentPage, defaultCurrentPage, pageCount) * Otherwise we can reasonable infer that the corresponding field is absent */ const isAbsent = (v) => typeof v !== "number"; const paginationProps = buildProps({ /** * @description options of item count per page */ pageSize: Number, /** * @description default initial value of page size, not setting is the same as setting 10 */ defaultPageSize: Number, /** * @description total item count */ total: Number, /** * @description total page count. Set either `total` or `page-count` and pages will be displayed; if you need `page-sizes`, `total` is required */ pageCount: Number, /** * @description number of pagers. Pagination collapses when the total page count exceeds this value */ pagerCount: { type: Number, validator: (value) => { return isNumber(value) && Math.trunc(value) === value && value > 4 && value < 22 && value % 2 === 1; }, default: 7 }, /** * @description current page number */ currentPage: Number, /** * @description default initial value of current-page, not setting is the same as setting 1 */ defaultCurrentPage: Number, /** * @description layout of Pagination, elements separated with a comma */ layout: { type: String, default: [ "prev", "pager", "next", "jumper", "->", "total" ].join(", ") }, /** * @description item count of each page */ pageSizes: { type: definePropType(Array), default: () => mutable([ 10, 20, 30, 40, 50, 100 ]) }, /** * @description custom class name for the page size Select's dropdown */ popperClass: { type: String, default: "" }, /** * @description custom style for the page size Select's dropdown */ popperStyle: { type: definePropType([String, Object]) }, /** * @description text for the prev button */ prevText: { type: String, default: "" }, /** * @description icon for the prev button, higher priority of `prev-text` */ prevIcon: { type: iconPropType, default: () => arrow_left_default }, /** * @description text for the next button */ nextText: { type: String, default: "" }, /** * @description icon for the next button, higher priority of `next-text` */ nextIcon: { type: iconPropType, default: () => arrow_right_default }, /** * @description whether Pagination size is teleported to body */ teleported: { type: Boolean, default: true }, /** * @description whether to use small pagination */ small: Boolean, /** * @description set page size */ size: useSizeProp, /** * @description whether the buttons have a background color */ background: Boolean, /** * @description whether Pagination is disabled */ disabled: Boolean, /** * @description whether to hide when there's only one page */ hideOnSinglePage: Boolean, /** * @description which element the size dropdown appends to. */ appendSizeTo: String }); const paginationEmits = { "update:current-page": (val) => isNumber(val), "update:page-size": (val) => isNumber(val), "size-change": (val) => isNumber(val), change: (currentPage, pageSize) => isNumber(currentPage) && isNumber(pageSize), "current-change": (val) => isNumber(val), "prev-click": (val) => isNumber(val), "next-click": (val) => isNumber(val) }; const componentName = "ElPagination"; var pagination_default = defineComponent({ name: componentName, props: paginationProps, emits: paginationEmits, setup(props, { emit, slots }) { const { t } = useLocale(); const ns = useNamespace("pagination"); const vnodeProps = getCurrentInstance().vnode.props || {}; const _globalSize = useGlobalSize(); const _size = computed(() => props.small ? "small" : props.size ?? _globalSize.value); useDeprecated({ from: "small", replacement: "size", version: "3.0.0", scope: "el-pagination", ref: "https://element-plus.org/zh-CN/component/pagination.html" }, computed(() => !!props.small)); const hasCurrentPageListener = "onUpdate:currentPage" in vnodeProps || "onUpdate:current-page" in vnodeProps || "onCurrentChange" in vnodeProps; const hasPageSizeListener = "onUpdate:pageSize" in vnodeProps || "onUpdate:page-size" in vnodeProps || "onSizeChange" in vnodeProps; const assertValidUsage = computed(() => { if (isAbsent(props.total) && isAbsent(props.pageCount)) return false; if (!isAbsent(props.currentPage) && !hasCurrentPageListener) return false; if (props.layout.includes("sizes")) { if (!isAbsent(props.pageCount)) { if (!hasPageSizeListener) return false; } else if (!isAbsent(props.total)) { if (!isAbsent(props.pageSize)) { if (!hasPageSizeListener) return false; } } } return true; }); const innerPageSize = ref(isAbsent(props.defaultPageSize) ? 10 : props.defaultPageSize); const innerCurrentPage = ref(isAbsent(props.defaultCurrentPage) ? 1 : props.defaultCurrentPage); const pageSizeBridge = computed({ get() { return isAbsent(props.pageSize) ? innerPageSize.value : props.pageSize; }, set(v) { if (isAbsent(props.pageSize)) innerPageSize.value = v; if (hasPageSizeListener) { emit("update:page-size", v); emit("size-change", v); } } }); const pageCountBridge = computed(() => { let pageCount = 0; if (!isAbsent(props.pageCount)) pageCount = props.pageCount; else if (!isAbsent(props.total)) pageCount = Math.max(1, Math.ceil(props.total / pageSizeBridge.value)); return pageCount; }); const currentPageBridge = computed({ get() { return isAbsent(props.currentPage) ? innerCurrentPage.value : props.currentPage; }, set(v) { let newCurrentPage = v; if (v < 1) newCurrentPage = 1; else if (v > pageCountBridge.value) newCurrentPage = pageCountBridge.value; if (isAbsent(props.currentPage)) innerCurrentPage.value = newCurrentPage; if (hasCurrentPageListener) { emit("update:current-page", newCurrentPage); emit("current-change", newCurrentPage); } } }); watch(pageCountBridge, (val) => { if (currentPageBridge.value > val) currentPageBridge.value = val; }); watch([currentPageBridge, pageSizeBridge], (value) => { emit(CHANGE_EVENT, ...value); }, { flush: "post" }); function handleCurrentChange(val) { currentPageBridge.value = val; } function handleSizeChange(val) { pageSizeBridge.value = val; const newPageCount = pageCountBridge.value; if (currentPageBridge.value > newPageCount) currentPageBridge.value = newPageCount; } function prev() { if (props.disabled) return; currentPageBridge.value -= 1; emit("prev-click", currentPageBridge.value); } function next() { if (props.disabled) return; currentPageBridge.value += 1; emit("next-click", currentPageBridge.value); } function addClass(element, cls) { if (element) { if (!element.props) element.props = {}; element.props.class = [element.props.class, cls].join(" "); } } provide(elPaginationKey, { pageCount: pageCountBridge, disabled: computed(() => props.disabled), currentPage: currentPageBridge, changeEvent: handleCurrentChange, handleSizeChange }); return () => { if (!assertValidUsage.value) { /* @__PURE__ */ debugWarn(componentName, t("el.pagination.deprecationWarning")); return null; } if (!props.layout) return null; if (props.hideOnSinglePage && pageCountBridge.value <= 1) return null; const rootChildren = []; const rightWrapperChildren = []; const rightWrapperRoot = h("div", { class: ns.e("rightwrapper") }, rightWrapperChildren); const TEMPLATE_MAP = { prev: h(prev_default, { disabled: props.disabled, currentPage: currentPageBridge.value, prevText: props.prevText, prevIcon: props.prevIcon, onClick: prev }), jumper: h(jumper_default, { size: _size.value }), pager: h(pager_default, { currentPage: currentPageBridge.value, pageCount: pageCountBridge.value, pagerCount: props.pagerCount, onChange: handleCurrentChange, disabled: props.disabled }), next: h(next_default, { disabled: props.disabled, currentPage: currentPageBridge.value, pageCount: pageCountBridge.value, nextText: props.nextText, nextIcon: props.nextIcon, onClick: next }), sizes: h(sizes_default, { pageSize: pageSizeBridge.value, pageSizes: props.pageSizes, popperClass: props.popperClass, popperStyle: props.popperStyle, disabled: props.disabled, teleported: props.teleported, size: _size.value, appendSizeTo: props.appendSizeTo }), slot: slots?.default?.() ?? null, total: h(total_default, { total: isAbsent(props.total) ? 0 : props.total }) }; const components = props.layout.split(",").map((item) => item.trim()); let haveRightWrapper = false; components.forEach((c) => { if (c === "->") { haveRightWrapper = true; return; } if (!haveRightWrapper) rootChildren.push(TEMPLATE_MAP[c]); else rightWrapperChildren.push(TEMPLATE_MAP[c]); }); addClass(rootChildren[0], ns.is("first")); addClass(rootChildren[rootChildren.length - 1], ns.is("last")); if (haveRightWrapper && rightWrapperChildren.length > 0) { addClass(rightWrapperChildren[0], ns.is("first")); addClass(rightWrapperChildren[rightWrapperChildren.length - 1], ns.is("last")); rootChildren.push(rightWrapperRoot); } return h("div", { class: [ ns.b(), ns.is("background", props.background), ns.m(_size.value) ] }, rootChildren); }; } }); //#endregion //#region ../../packages/components/pagination/index.ts const ElPagination = withInstall(pagination_default); //#endregion //#region ../../packages/components/popconfirm/src/popconfirm.ts /** * @deprecated Removed after 3.0.0, Use `PopconfirmProps` instead. */ const popconfirmProps = buildProps({ /** * @description Title */ title: String, /** * @description Confirm button text */ confirmButtonText: String, /** * @description Cancel button text */ cancelButtonText: String, /** * @description Confirm button type */ confirmButtonType: { type: String, values: buttonTypes, default: "primary" }, /** * @description Cancel button type */ cancelButtonType: { type: String, values: buttonTypes, default: "text" }, /** * @description Icon Component */ icon: { type: iconPropType, default: () => question_filled_default }, /** * @description Icon color */ iconColor: { type: String, default: "#f90" }, /** * @description is hide Icon */ hideIcon: Boolean, /** * @description delay of disappear, in millisecond */ hideAfter: { type: Number, default: 200 }, /** * @description Tooltip theme, built-in theme: `dark` / `light` */ effect: { ...useTooltipContentProps.effect, default: "light" }, /** * @description whether popconfirm is teleported to the body */ teleported: useTooltipContentProps.teleported, /** * @description when popconfirm inactive and `persistent` is `false` , popconfirm will be destroyed */ persistent: useTooltipContentProps.persistent, /** * @description popconfirm width, min width 150px */ width: { type: [String, Number], default: 150 }, virtualTriggering: useTooltipTriggerProps.virtualTriggering, virtualRef: useTooltipTriggerProps.virtualRef }); const popconfirmEmits = { /** * @description triggers when click confirm button */ confirm: (e) => e instanceof MouseEvent, /** * @description triggers when click cancel button */ cancel: (e) => e instanceof MouseEvent }; //#endregion //#region ../../packages/components/popconfirm/src/popconfirm.vue?vue&type=script&setup=true&lang.ts var popconfirm_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElPopconfirm", __name: "popconfirm", props: popconfirmProps, emits: popconfirmEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const { t } = useLocale(); const ns = useNamespace("popconfirm"); const tooltipRef = ref(); const rootRef = ref(); const popperRef = computed(() => { return unref(tooltipRef)?.popperRef; }); const showPopper = () => { rootRef.value?.focus?.(); }; const hidePopper = () => { tooltipRef.value?.onClose?.(); }; const style = computed(() => { return { width: addUnit(props.width) }; }); const confirm = (e) => { emit("confirm", e); hidePopper(); }; const cancel = (e) => { emit("cancel", e); hidePopper(); }; const finalConfirmButtonText = computed(() => props.confirmButtonText || t("el.popconfirm.confirmButtonText")); const finalCancelButtonText = computed(() => props.cancelButtonText || t("el.popconfirm.cancelButtonText")); __expose({ popperRef, hide: hidePopper }); return (_ctx, _cache) => { return openBlock(), createBlock(unref(ElTooltip), mergeProps({ ref_key: "tooltipRef", ref: tooltipRef, trigger: "click", effect: __props.effect }, _ctx.$attrs, { "virtual-triggering": __props.virtualTriggering, "virtual-ref": __props.virtualRef, "popper-class": `${unref(ns).namespace.value}-popover`, "popper-style": style.value, teleported: __props.teleported, "fallback-placements": [ "bottom", "top", "right", "left" ], "hide-after": __props.hideAfter, persistent: __props.persistent, loop: "", onShow: showPopper }), { content: withCtx(() => [createElementVNode("div", { ref_key: "rootRef", ref: rootRef, tabindex: "-1", class: normalizeClass(unref(ns).b()) }, [createElementVNode("div", { class: normalizeClass(unref(ns).e("main")) }, [!__props.hideIcon && __props.icon ? (openBlock(), createBlock(unref(ElIcon), { key: 0, class: normalizeClass(unref(ns).e("icon")), style: normalizeStyle({ color: __props.iconColor }) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(__props.icon)))]), _: 1 }, 8, ["class", "style"])) : createCommentVNode("v-if", true), createTextVNode(" " + toDisplayString(__props.title), 1)], 2), createElementVNode("div", { class: normalizeClass(unref(ns).e("action")) }, [renderSlot(_ctx.$slots, "actions", { confirm, cancel }, () => [createVNode(unref(ElButton), { size: "small", type: __props.cancelButtonType === "text" ? "" : __props.cancelButtonType, text: __props.cancelButtonType === "text", onClick: cancel }, { default: withCtx(() => [createTextVNode(toDisplayString(finalCancelButtonText.value), 1)]), _: 1 }, 8, ["type", "text"]), createVNode(unref(ElButton), { size: "small", type: __props.confirmButtonType === "text" ? "" : __props.confirmButtonType, text: __props.confirmButtonType === "text", onClick: confirm }, { default: withCtx(() => [createTextVNode(toDisplayString(finalConfirmButtonText.value), 1)]), _: 1 }, 8, ["type", "text"])])], 2)], 2)]), default: withCtx(() => [_ctx.$slots.reference ? renderSlot(_ctx.$slots, "reference", { key: 0 }) : createCommentVNode("v-if", true)]), _: 3 }, 16, [ "effect", "virtual-triggering", "virtual-ref", "popper-class", "popper-style", "teleported", "hide-after", "persistent" ]); }; } }); //#endregion //#region ../../packages/components/popconfirm/src/popconfirm.vue var popconfirm_default = popconfirm_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/popconfirm/index.ts const ElPopconfirm = withInstall(popconfirm_default); //#endregion //#region ../../packages/components/popover/src/popover.ts /** * @deprecated Removed after 3.0.0, Use `PopoverProps` instead. */ const popoverProps = buildProps({ /** * @description how the popover is triggered, not valid in controlled mode */ trigger: useTooltipTriggerProps.trigger, /** * @description When you click the mouse to focus on the trigger element, you can define a set of keyboard codes to control the display of popover through the keyboard, not valid in controlled mode */ triggerKeys: useTooltipTriggerProps.triggerKeys, /** * @description popover placement */ placement: dropdownProps.placement, /** * @description whether Popover is disabled */ disabled: useTooltipTriggerProps.disabled, /** * @description whether popover is visible */ visible: useTooltipContentProps.visible, /** * @description popover transition animation */ transition: useTooltipContentProps.transition, /** * @description parameters for [popper.js](https://popper.js.org/docs/v2/) */ popperOptions: dropdownProps.popperOptions, /** * @description [tabindex](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex) of Popover */ tabindex: dropdownProps.tabindex, /** * @description popover content, can be replaced with a default `slot` */ content: useTooltipContentProps.content, /** * @description custom style for popover */ popperStyle: useTooltipContentProps.popperStyle, /** * @description custom class name for popover */ popperClass: useTooltipContentProps.popperClass, enterable: { ...useTooltipContentProps.enterable, default: true }, /** * @description Tooltip theme, built-in theme: `dark` / `light` */ effect: { ...useTooltipContentProps.effect, default: "light" }, /** * @description whether popover dropdown is teleported to the body */ teleported: useTooltipContentProps.teleported, /** * @description which select dropdown appends to */ appendTo: useTooltipContentProps.appendTo, /** * @description popover title */ title: String, /** * @description popover width */ width: { type: [String, Number], default: 150 }, /** * @description popover offset */ offset: { type: Number, default: void 0 }, /** * @description delay of appearance, in millisecond, not valid in controlled mode */ showAfter: { type: Number, default: 0 }, /** * @description delay of disappear, in millisecond, not valid in controlled mode */ hideAfter: { type: Number, default: 200 }, /** * @description timeout in milliseconds to hide tooltip, not valid in controlled mode */ autoClose: { type: Number, default: 0 }, /** * @description whether a tooltip arrow is displayed or not. For more info, please refer to [ElPopper](https://github.com/element-plus/element-plus/tree/dev/packages/components/popper) */ showArrow: { type: Boolean, default: true }, /** * @description when popover inactive and `persistent` is `false` , popover will be destroyed */ persistent: { type: Boolean, default: true }, "onUpdate:visible": { type: Function } }); const popoverEmits = { "update:visible": (value) => isBoolean(value), "before-enter": () => true, "before-leave": () => true, "after-enter": () => true, "after-leave": () => true }; /** * @description default values for PopoverProps */ const popoverPropsDefaults = { trigger: "hover", triggerKeys: () => [ EVENT_CODE.enter, EVENT_CODE.numpadEnter, EVENT_CODE.space ], placement: "bottom", visible: null, popperOptions: () => ({}), tabindex: 0, content: "", popperStyle: void 0, enterable: true, effect: "light", teleported: true, width: 150, offset: void 0, showAfter: 0, hideAfter: 200, autoClose: 0, showArrow: true, persistent: true }; //#endregion //#region ../../packages/components/popover/src/popover.vue?vue&type=script&setup=true&lang.ts const updateEventKeyRaw = `onUpdate:visible`; var popover_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElPopover", __name: "popover", props: popoverProps, emits: popoverEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const onUpdateVisible = computed(() => { return props[updateEventKeyRaw]; }); const ns = useNamespace("popover"); const tooltipRef = ref(); const popperRef = computed(() => { return unref(tooltipRef)?.popperRef; }); const style = computed(() => { return [{ width: addUnit(props.width) }, props.popperStyle]; }); const kls = computed(() => { return [ ns.b(), props.popperClass, { [ns.m("plain")]: !!props.content } ]; }); const gpuAcceleration = computed(() => { return props.transition === `${ns.namespace.value}-fade-in-linear`; }); const hide = () => { tooltipRef.value?.hide(); }; const beforeEnter = () => { emit("before-enter"); }; const beforeLeave = () => { emit("before-leave"); }; const afterEnter = () => { emit("after-enter"); }; const afterLeave = () => { emit("update:visible", false); emit("after-leave"); }; __expose({ /** @description popper ref */ popperRef, /** @description hide popover */ hide }); return (_ctx, _cache) => { return openBlock(), createBlock(unref(ElTooltip), mergeProps({ ref_key: "tooltipRef", ref: tooltipRef }, _ctx.$attrs, { trigger: __props.trigger, "trigger-keys": __props.triggerKeys, placement: __props.placement, disabled: __props.disabled, visible: __props.visible, transition: __props.transition, "popper-options": __props.popperOptions, tabindex: __props.tabindex, content: __props.content, offset: __props.offset, "show-after": __props.showAfter, "hide-after": __props.hideAfter, "auto-close": __props.autoClose, "show-arrow": __props.showArrow, "aria-label": __props.title, effect: __props.effect, enterable: __props.enterable, "popper-class": kls.value, "popper-style": style.value, teleported: __props.teleported, "append-to": __props.appendTo, persistent: __props.persistent, "gpu-acceleration": gpuAcceleration.value, "onUpdate:visible": onUpdateVisible.value, onBeforeShow: beforeEnter, onBeforeHide: beforeLeave, onShow: afterEnter, onHide: afterLeave }), { content: withCtx(() => [__props.title ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ns).e("title")), role: "title" }, toDisplayString(__props.title), 3)) : createCommentVNode("v-if", true), renderSlot(_ctx.$slots, "default", { hide }, () => [createTextVNode(toDisplayString(__props.content), 1)])]), default: withCtx(() => [_ctx.$slots.reference ? renderSlot(_ctx.$slots, "reference", { key: 0 }) : createCommentVNode("v-if", true)]), _: 3 }, 16, [ "trigger", "trigger-keys", "placement", "disabled", "visible", "transition", "popper-options", "tabindex", "content", "offset", "show-after", "hide-after", "auto-close", "show-arrow", "aria-label", "effect", "enterable", "popper-class", "popper-style", "teleported", "append-to", "persistent", "gpu-acceleration", "onUpdate:visible" ]); }; } }); //#endregion //#region ../../packages/components/popover/src/popover.vue var popover_default = popover_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/popover/src/directive.ts const attachEvents = (el, binding) => { const popover = (binding.arg || binding.value)?.popperRef; if (popover) popover.triggerRef = el; }; var directive_default = { mounted(el, binding) { attachEvents(el, binding); }, updated(el, binding) { attachEvents(el, binding); } }; const VPopover = "popover"; //#endregion //#region ../../packages/components/popover/index.ts const ElPopoverDirective = withInstallDirective(directive_default, VPopover); const ElPopover = withInstall(popover_default, { directive: ElPopoverDirective }); //#endregion //#region ../../packages/components/progress/src/progress.ts /** * @deprecated Removed after 3.0.0, Use `ProgressProps` instead. */ const progressProps = buildProps({ /** * @description type of progress bar */ type: { type: String, default: "line", values: [ "line", "circle", "dashboard" ] }, /** * @description percentage, required */ percentage: { type: Number, default: 0, validator: (val) => val >= 0 && val <= 100 }, /** * @description the current status of progress bar */ status: { type: String, default: "", values: [ "", "success", "exception", "warning" ] }, /** * @description set indeterminate progress */ indeterminate: Boolean, /** * @description control the animation duration of indeterminate progress or striped flow progress */ duration: { type: Number, default: 3 }, /** * @description the width of progress bar */ strokeWidth: { type: Number, default: 6 }, /** * @description butt/circle/dashboard type shape at the end path */ strokeLinecap: { type: definePropType(String), default: "round" }, /** * @description whether to place the percentage inside progress bar, only works when `type` is 'line' */ textInside: Boolean, /** * @description the canvas width of circle progress bar */ width: { type: Number, default: 126 }, /** * @description whether to show percentage */ showText: { type: Boolean, default: true }, /** * @description background color of progress bar. Overrides `status` prop */ color: { type: definePropType([ String, Array, Function ]), default: "" }, /** * @description stripe over the progress bar's color */ striped: Boolean, /** * @description get the stripes to flow */ stripedFlow: Boolean, /** * @description custom text format */ format: { type: definePropType(Function), default: (percentage) => `${percentage}%` } }); //#endregion //#region ../../packages/components/progress/src/progress.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$24 = ["aria-valuenow"]; const _hoisted_2$15 = { viewBox: "0 0 100 100" }; const _hoisted_3$6 = [ "d", "stroke", "stroke-linecap", "stroke-width" ]; const _hoisted_4$4 = [ "d", "stroke", "opacity", "stroke-linecap", "stroke-width" ]; const _hoisted_5$2 = { key: 0 }; var progress_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElProgress", __name: "progress", props: progressProps, setup(__props) { const STATUS_COLOR_MAP = { success: "#13ce66", exception: "#ff4949", warning: "#e6a23c", default: "#20a0ff" }; const props = __props; const ns = useNamespace("progress"); const barStyle = computed(() => { const barStyle = { width: `${props.percentage}%`, animationDuration: `${props.duration}s` }; const color = getCurrentColor(props.percentage); if (color.includes("gradient")) barStyle.background = color; else barStyle.backgroundColor = color; return barStyle; }); const relativeStrokeWidth = computed(() => (props.strokeWidth / props.width * 100).toFixed(1)); const radius = computed(() => { if (["circle", "dashboard"].includes(props.type)) return Number.parseInt(`${50 - Number.parseFloat(relativeStrokeWidth.value) / 2}`, 10); return 0; }); const trackPath = computed(() => { const r = radius.value; const isDashboard = props.type === "dashboard"; return ` M 50 50 m 0 ${isDashboard ? "" : "-"}${r} a ${r} ${r} 0 1 1 0 ${isDashboard ? "-" : ""}${r * 2} a ${r} ${r} 0 1 1 0 ${isDashboard ? "" : "-"}${r * 2} `; }); const perimeter = computed(() => 2 * Math.PI * radius.value); const rate = computed(() => props.type === "dashboard" ? .75 : 1); const strokeDashoffset = computed(() => { return `${-1 * perimeter.value * (1 - rate.value) / 2}px`; }); const trailPathStyle = computed(() => ({ strokeDasharray: `${perimeter.value * rate.value}px, ${perimeter.value}px`, strokeDashoffset: strokeDashoffset.value })); const circlePathStyle = computed(() => ({ strokeDasharray: `${perimeter.value * rate.value * (props.percentage / 100)}px, ${perimeter.value}px`, strokeDashoffset: strokeDashoffset.value, transition: "stroke-dasharray 0.6s ease 0s, stroke 0.6s ease, opacity ease 0.6s" })); const stroke = computed(() => { let ret; if (props.color) ret = getCurrentColor(props.percentage); else ret = STATUS_COLOR_MAP[props.status] || STATUS_COLOR_MAP.default; return ret; }); const statusIcon = computed(() => { if (props.status === "warning") return warning_filled_default; if (props.type === "line") return props.status === "success" ? circle_check_default : circle_close_default; else return props.status === "success" ? check_default : close_default; }); const progressTextSize = computed(() => { return props.type === "line" ? 12 + props.strokeWidth * .4 : props.width * .111111 + 2; }); const content = computed(() => props.format(props.percentage)); function getColors(color) { const span = 100 / color.length; return color.map((seriesColor, index) => { if (isString(seriesColor)) return { color: seriesColor, percentage: (index + 1) * span }; return seriesColor; }).sort((a, b) => a.percentage - b.percentage); } const getCurrentColor = (percentage) => { const { color } = props; if (isFunction$1(color)) return color(percentage); else if (isString(color)) return color; else { const colors = getColors(color); for (const color of colors) if (color.percentage > percentage) return color.color; return colors[colors.length - 1]?.color; } }; return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass([ unref(ns).b(), unref(ns).m(__props.type), unref(ns).is(__props.status), { [unref(ns).m("without-text")]: !__props.showText, [unref(ns).m("text-inside")]: __props.textInside } ]), role: "progressbar", "aria-valuenow": __props.percentage, "aria-valuemin": "0", "aria-valuemax": "100" }, [__props.type === "line" ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ns).b("bar")) }, [createElementVNode("div", { class: normalizeClass(unref(ns).be("bar", "outer")), style: normalizeStyle({ height: `${__props.strokeWidth}px` }) }, [createElementVNode("div", { class: normalizeClass([ unref(ns).be("bar", "inner"), { [unref(ns).bem("bar", "inner", "indeterminate")]: __props.indeterminate }, { [unref(ns).bem("bar", "inner", "striped")]: __props.striped }, { [unref(ns).bem("bar", "inner", "striped-flow")]: __props.stripedFlow } ]), style: normalizeStyle(barStyle.value) }, [(__props.showText || _ctx.$slots.default) && __props.textInside ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ns).be("bar", "innerText")) }, [renderSlot(_ctx.$slots, "default", { percentage: __props.percentage }, () => [createElementVNode("span", null, toDisplayString(content.value), 1)])], 2)) : createCommentVNode("v-if", true)], 6)], 6)], 2)) : (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass(unref(ns).b("circle")), style: normalizeStyle({ height: `${__props.width}px`, width: `${__props.width}px` }) }, [(openBlock(), createElementBlock("svg", _hoisted_2$15, [createElementVNode("path", { class: normalizeClass(unref(ns).be("circle", "track")), d: trackPath.value, stroke: `var(${unref(ns).cssVarName("fill-color-light")}, #e5e9f2)`, "stroke-linecap": __props.strokeLinecap, "stroke-width": relativeStrokeWidth.value, fill: "none", style: normalizeStyle(trailPathStyle.value) }, null, 14, _hoisted_3$6), createElementVNode("path", { class: normalizeClass(unref(ns).be("circle", "path")), d: trackPath.value, stroke: stroke.value, fill: "none", opacity: __props.percentage ? 1 : 0, "stroke-linecap": __props.strokeLinecap, "stroke-width": relativeStrokeWidth.value, style: normalizeStyle(circlePathStyle.value) }, null, 14, _hoisted_4$4)]))], 6)), (__props.showText || _ctx.$slots.default) && !__props.textInside ? (openBlock(), createElementBlock("div", { key: 2, class: normalizeClass(unref(ns).e("text")), style: normalizeStyle({ fontSize: `${progressTextSize.value}px` }) }, [renderSlot(_ctx.$slots, "default", { percentage: __props.percentage }, () => [!__props.status ? (openBlock(), createElementBlock("span", _hoisted_5$2, toDisplayString(content.value), 1)) : (openBlock(), createBlock(unref(ElIcon), { key: 1 }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(statusIcon.value)))]), _: 1 }))])], 6)) : createCommentVNode("v-if", true)], 10, _hoisted_1$24); }; } }); //#endregion //#region ../../packages/components/progress/src/progress.vue var progress_default = progress_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/progress/index.ts const ElProgress = withInstall(progress_default); //#endregion //#region ../../packages/components/rate/src/rate.ts /** * @deprecated Removed after 3.0.0, Use `RateProps` instead. */ const rateProps = buildProps({ /** * @description binding value */ modelValue: { type: Number, default: 0 }, /** * @description native `id` attribute */ id: { type: String, default: void 0 }, /** * @description threshold value between low and medium level. The value itself will be included in low level */ lowThreshold: { type: Number, default: 2 }, /** * @description threshold value between medium and high level. The value itself will be included in high level */ highThreshold: { type: Number, default: 4 }, /** * @description max rating score */ max: { type: Number, default: 5 }, /** * @description colors for icons. If array, it should have 3 elements, each of which corresponds with a score level, else if object, the key should be threshold value between two levels, and the value should be corresponding color */ colors: { type: definePropType([Array, Object]), default: () => mutable([ "", "", "" ]) }, /** * @description color of unselected icons */ voidColor: { type: String, default: "" }, /** * @description color of unselected read-only icons */ disabledVoidColor: { type: String, default: "" }, /** * @description icon components. If array, it should have 3 elements, each of which corresponds with a score level, else if object, the key should be threshold value between two levels, and the value should be corresponding icon component */ icons: { type: definePropType([Array, Object]), default: () => [ star_filled_default, star_filled_default, star_filled_default ] }, /** * @description component of unselected icons */ voidIcon: { type: iconPropType, default: () => star_default }, /** * @description component of unselected read-only icons */ disabledVoidIcon: { type: iconPropType, default: () => star_filled_default }, /** * @description whether Rate is read-only */ disabled: { type: Boolean, default: void 0 }, /** * @description whether picking half start is allowed */ allowHalf: Boolean, /** * @description whether to display texts */ showText: Boolean, /** * @description whether to display current score. show-score and show-text cannot be true at the same time */ showScore: Boolean, /** * @description color of texts */ textColor: { type: String, default: "" }, /** * @description text array */ texts: { type: definePropType(Array), default: () => mutable([ "Extremely bad", "Disappointed", "Fair", "Satisfied", "Surprise" ]) }, /** * @description score template */ scoreTemplate: { type: String, default: "{value}" }, /** * @description size of Rate */ size: useSizeProp, /** * @description whether value can be reset to `0` */ clearable: Boolean, ...useAriaProps(["ariaLabel"]) }); const rateEmits = { [CHANGE_EVENT]: (value) => isNumber(value), [UPDATE_MODEL_EVENT]: (value) => isNumber(value) }; //#endregion //#region ../../packages/components/rate/src/rate.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$23 = [ "id", "aria-label", "aria-labelledby", "aria-valuenow", "aria-valuetext", "aria-valuemax", "tabindex", "aria-disabled" ]; const _hoisted_2$14 = ["onMousemove", "onClick"]; var rate_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElRate", __name: "rate", props: rateProps, emits: rateEmits, setup(__props, { expose: __expose, emit: __emit }) { function getValueFromMap(value, map) { const isExcludedObject = (val) => isObject$1(val); const matchedValue = map[Object.keys(map).map((key) => +key).filter((key) => { const val = map[key]; return (isExcludedObject(val) ? val.excluded : false) ? value < key : value <= key; }).sort((a, b) => a - b)[0]]; return isExcludedObject(matchedValue) && matchedValue.value || matchedValue; } const props = __props; const emit = __emit; const formItemContext = inject(formItemContextKey, void 0); const rateSize = useFormSize(); const ns = useNamespace("rate"); const { inputId, isLabeledByFormItem } = useFormItemInputId(props, { formItemContext }); const currentValue = ref(clamp$1(props.modelValue, 0, props.max)); const hoverIndex = ref(-1); const pointerAtLeftHalf = ref(true); const iconRefs = ref([]); const iconClientWidths = computed(() => iconRefs.value.map((icon) => icon.$el.clientWidth)); const rateClasses = computed(() => [ns.b(), ns.m(rateSize.value)]); const rateDisabled = useFormDisabled(); const rateStyles = computed(() => { return ns.cssVarBlock({ "void-color": props.voidColor, "disabled-void-color": props.disabledVoidColor, "fill-color": activeColor.value }); }); const text = computed(() => { let result = ""; if (props.showScore) result = props.scoreTemplate.replace(/\{\s*value\s*\}/, rateDisabled.value ? `${props.modelValue}` : `${currentValue.value}`); else if (props.showText) result = props.texts[Math.ceil(currentValue.value) - 1]; return result; }); const valueDecimal = computed(() => props.modelValue * 100 - Math.floor(props.modelValue) * 100); const colorMap = computed(() => isArray$1(props.colors) ? { [props.lowThreshold]: props.colors[0], [props.highThreshold]: { value: props.colors[1], excluded: true }, [props.max]: props.colors[2] } : props.colors); const activeColor = computed(() => { const color = getValueFromMap(currentValue.value, colorMap.value); return isObject$1(color) ? "" : color; }); const decimalStyle = computed(() => { let width = ""; if (rateDisabled.value) width = `${valueDecimal.value}%`; else if (props.allowHalf) width = "50%"; return { color: activeColor.value, width }; }); const componentMap = computed(() => { let icons = isArray$1(props.icons) ? [...props.icons] : { ...props.icons }; icons = markRaw(icons); return isArray$1(icons) ? { [props.lowThreshold]: icons[0], [props.highThreshold]: { value: icons[1], excluded: true }, [props.max]: icons[2] } : icons; }); const decimalIconComponent = computed(() => getValueFromMap(props.modelValue, componentMap.value)); const voidComponent = computed(() => rateDisabled.value ? isString(props.disabledVoidIcon) ? props.disabledVoidIcon : markRaw(props.disabledVoidIcon) : isString(props.voidIcon) ? props.voidIcon : markRaw(props.voidIcon)); const activeComponent = computed(() => getValueFromMap(currentValue.value, componentMap.value)); function showDecimalIcon(item) { const showWhenDisabled = rateDisabled.value && valueDecimal.value > 0 && item - 1 < props.modelValue && item > props.modelValue; const showWhenAllowHalf = props.allowHalf && pointerAtLeftHalf.value && item - .5 <= currentValue.value && item > currentValue.value; return showWhenDisabled || showWhenAllowHalf; } function emitValue(value) { if (props.clearable && value === props.modelValue) value = 0; emit(UPDATE_MODEL_EVENT, value); if (props.modelValue !== value) emit(CHANGE_EVENT, value); } function selectValue(value) { if (rateDisabled.value) return; if (props.allowHalf && pointerAtLeftHalf.value) emitValue(currentValue.value); else emitValue(value); } function handleKey(e) { if (rateDisabled.value) return; const code = getEventCode(e); const step = props.allowHalf ? .5 : 1; let _currentValue = currentValue.value; switch (code) { case EVENT_CODE.up: case EVENT_CODE.right: _currentValue += step; break; case EVENT_CODE.left: case EVENT_CODE.down: _currentValue -= step; break; } _currentValue = clamp$1(_currentValue, 0, props.max); if (_currentValue === currentValue.value) return; e.stopPropagation(); e.preventDefault(); emit(UPDATE_MODEL_EVENT, _currentValue); emit(CHANGE_EVENT, _currentValue); return _currentValue; } function setCurrentValue(value, event) { if (rateDisabled.value) return; if (props.allowHalf && event) { pointerAtLeftHalf.value = event.offsetX * 2 <= iconClientWidths.value[value - 1]; currentValue.value = pointerAtLeftHalf.value ? value - .5 : value; } else currentValue.value = value; hoverIndex.value = value; } function resetCurrentValue() { if (rateDisabled.value) return; if (props.allowHalf) pointerAtLeftHalf.value = props.modelValue !== Math.floor(props.modelValue); currentValue.value = clamp$1(props.modelValue, 0, props.max); hoverIndex.value = -1; } watch(() => props.modelValue, (val) => { currentValue.value = clamp$1(val, 0, props.max); pointerAtLeftHalf.value = props.modelValue !== Math.floor(props.modelValue); }); if (!props.modelValue) emit(UPDATE_MODEL_EVENT, 0); __expose({ /** @description set current value */ setCurrentValue, /** @description reset current value */ resetCurrentValue }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { id: unref(inputId), class: normalizeClass([rateClasses.value, unref(ns).is("disabled", unref(rateDisabled))]), role: "slider", "aria-label": !unref(isLabeledByFormItem) ? __props.ariaLabel || "rating" : void 0, "aria-labelledby": unref(isLabeledByFormItem) ? unref(formItemContext)?.labelId : void 0, "aria-valuenow": currentValue.value, "aria-valuetext": text.value || void 0, "aria-valuemin": "0", "aria-valuemax": __props.max, style: normalizeStyle(rateStyles.value), tabindex: unref(rateDisabled) ? void 0 : 0, "aria-disabled": unref(rateDisabled), onKeydown: handleKey }, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.max, (item, key) => { return openBlock(), createElementBlock("span", { key, class: normalizeClass(unref(ns).e("item")), onMousemove: ($event) => setCurrentValue(item, $event), onMouseleave: resetCurrentValue, onClick: ($event) => selectValue(item) }, [createVNode(unref(ElIcon), { ref_for: true, ref_key: "iconRefs", ref: iconRefs, class: normalizeClass([ unref(ns).e("icon"), { hover: hoverIndex.value === item }, unref(ns).is("active", item <= currentValue.value), unref(ns).is("focus-visible", item === Math.ceil(currentValue.value || 1)) ]) }, { default: withCtx(() => [ withDirectives((openBlock(), createBlock(resolveDynamicComponent(activeComponent.value), null, null, 512)), [[vShow, !showDecimalIcon(item) && item <= currentValue.value]]), withDirectives((openBlock(), createBlock(resolveDynamicComponent(voidComponent.value), null, null, 512)), [[vShow, !showDecimalIcon(item) && item > currentValue.value]]), withDirectives((openBlock(), createBlock(resolveDynamicComponent(voidComponent.value), { class: normalizeClass([unref(ns).em("decimal", "box")]) }, null, 8, ["class"])), [[vShow, showDecimalIcon(item)]]), withDirectives(createVNode(unref(ElIcon), { style: normalizeStyle(decimalStyle.value), class: normalizeClass([unref(ns).e("icon"), unref(ns).e("decimal")]) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(decimalIconComponent.value)))]), _: 1 }, 8, ["style", "class"]), [[vShow, showDecimalIcon(item)]]) ]), _: 2 }, 1032, ["class"])], 42, _hoisted_2$14); }), 128)), __props.showText || __props.showScore ? (openBlock(), createElementBlock("span", { key: 0, class: normalizeClass(unref(ns).e("text")), style: normalizeStyle({ color: __props.textColor }) }, toDisplayString(text.value), 7)) : createCommentVNode("v-if", true)], 46, _hoisted_1$23); }; } }); //#endregion //#region ../../packages/components/rate/src/rate.vue var rate_default = rate_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/rate/index.ts const ElRate = withInstall(rate_default); //#endregion //#region ../../packages/components/result/src/result.ts const IconMap = { primary: "icon-primary", success: "icon-success", warning: "icon-warning", error: "icon-error", info: "icon-info" }; const IconComponentMap = { [IconMap.primary]: info_filled_default, [IconMap.success]: circle_check_filled_default, [IconMap.warning]: warning_filled_default, [IconMap.error]: circle_close_filled_default, [IconMap.info]: info_filled_default }; /** * @deprecated Removed after 3.0.0, Use `ResultProps` instead. */ const resultProps = buildProps({ /** * @description title of result */ title: { type: String, default: "" }, /** * @description sub title of result */ subTitle: { type: String, default: "" }, /** * @description icon type of result */ icon: { type: String, values: [ "primary", "success", "warning", "info", "error" ], default: "info" } }); //#endregion //#region ../../packages/components/result/src/result.vue?vue&type=script&setup=true&lang.ts var result_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElResult", __name: "result", props: resultProps, setup(__props) { const props = __props; const ns = useNamespace("result"); const resultIcon = computed(() => { const icon = props.icon; const iconClass = icon && IconMap[icon] ? IconMap[icon] : "icon-info"; return { class: iconClass, component: IconComponentMap[iconClass] || IconComponentMap["icon-info"] }; }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass(unref(ns).b()) }, [ createElementVNode("div", { class: normalizeClass(unref(ns).e("icon")) }, [renderSlot(_ctx.$slots, "icon", {}, () => [resultIcon.value.component ? (openBlock(), createBlock(resolveDynamicComponent(resultIcon.value.component), { key: 0, class: normalizeClass(resultIcon.value.class) }, null, 8, ["class"])) : createCommentVNode("v-if", true)])], 2), __props.title || _ctx.$slots.title ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ns).e("title")) }, [renderSlot(_ctx.$slots, "title", {}, () => [createElementVNode("p", null, toDisplayString(__props.title), 1)])], 2)) : createCommentVNode("v-if", true), __props.subTitle || _ctx.$slots["sub-title"] ? (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass(unref(ns).e("subtitle")) }, [renderSlot(_ctx.$slots, "sub-title", {}, () => [createElementVNode("p", null, toDisplayString(__props.subTitle), 1)])], 2)) : createCommentVNode("v-if", true), _ctx.$slots.extra ? (openBlock(), createElementBlock("div", { key: 2, class: normalizeClass(unref(ns).e("extra")) }, [renderSlot(_ctx.$slots, "extra")], 2)) : createCommentVNode("v-if", true) ], 2); }; } }); //#endregion //#region ../../packages/components/result/src/result.vue var result_default = result_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/result/index.ts const ElResult = withInstall(result_default); //#endregion //#region ../../packages/components/select-v2/src/group-item.vue?vue&type=script&lang.ts var group_item_vue_vue_type_script_lang_default = defineComponent({ props: { item: { type: Object, required: true }, style: { type: Object }, height: Number }, setup() { return { ns: useNamespace("select") }; } }); //#endregion //#region ../../packages/components/select-v2/src/group-item.vue function _sfc_render$7(_ctx, _cache, $props, $setup, $data, $options) { return openBlock(), createElementBlock("div", { class: normalizeClass(_ctx.ns.be("group", "title")), style: normalizeStyle({ ..._ctx.style, lineHeight: `${_ctx.height}px` }) }, toDisplayString(_ctx.item.label), 7); } var group_item_default = /* @__PURE__ */ _plugin_vue_export_helper_default(group_item_vue_vue_type_script_lang_default, [["render", _sfc_render$7]]); //#endregion //#region ../../packages/components/select-v2/src/useOption.ts function useOption(props, { emit }) { return { hoverItem: () => { if (!props.disabled) emit("hover", props.index); }, selectOptionClick: () => { if (!props.disabled) emit("select", props.item, props.index); } }; } //#endregion //#region ../../packages/components/select-v2/src/defaults.ts const selectV2Props = buildProps({ /** * @description whether creating new items is allowed. To use this, `filterable` must be true */ allowCreate: Boolean, /** * @description autocomplete of select input */ autocomplete: { type: definePropType(String), default: "none" }, /** * @description for non-filterable Select, this prop decides if the option menu pops up when the input is focused */ automaticDropdown: Boolean, /** * @description whether select can be cleared */ clearable: Boolean, /** * @description custom clear icon */ clearIcon: { type: iconPropType, default: circle_close_default }, /** * @description tooltip theme, built-in theme: `dark` / `light` */ effect: { type: definePropType(String), default: "light" }, /** * @description whether to collapse tags to a text when multiple selecting */ collapseTags: Boolean, /** * @description whether show all selected tags when mouse hover text of collapse-tags. To use this, `collapse-tags` must be true */ collapseTagsTooltip: Boolean, /** * @description configuration object for the collapse-tags tooltip. To use this, `collapse-tags` and `collapse-tags-tooltip` must be true */ tagTooltip: { type: definePropType(Object), default: () => ({}) }, /** * @description The max tags number to be shown. To use this, `collapse-tags` must be true */ maxCollapseTags: { type: Number, default: 1 }, /** * @description */ defaultFirstOption: Boolean, /** * @description is disabled */ disabled: { type: Boolean, default: void 0 }, /** * @description Estimated item height for variable option sizes. Defaults to fixed `itemHeight` when omitted. */ estimatedOptionHeight: { type: Number, default: void 0 }, /** * @description whether Select is filterable */ filterable: Boolean, /** * @description custom filter method, the first parameter is the current input value. To use this, `filterable` must be true */ filterMethod: { type: definePropType(Function) }, /** * @description The height of the dropdown panel, 34px for each item */ height: { type: Number, default: 274 }, /** * @description The height of the dropdown item */ itemHeight: { type: Number, default: 34 }, /** * @description native input id */ id: String, /** * @description whether Select is loading data from server */ loading: Boolean, /** * @description displayed text while loading data from server, default is 'Loading' */ loadingText: String, /** * @description biding value */ modelValue: { type: definePropType([ Array, String, Number, Boolean, Object ]), default: void 0 }, /** * @description is multiple */ multiple: Boolean, /** * @description maximum number of options user can select when multiple is true. No limit when set to 0 */ multipleLimit: { type: Number, default: 0 }, /** * @description the name attribute of select input */ name: String, /** * @description displayed text when there is no options, you can also use slot empty, the default is 'No Data' */ noDataText: String, /** * @description displayed text when no data matches the filtering query, you can also use slot `empty`, default is 'No matching data' */ noMatchText: String, /** * @description function that gets called when the input value changes. Its parameter is the current input value. To use this, `filterable` must be true */ remoteMethod: { type: definePropType(Function) }, /** * @description whether reserve the keyword after select filtered option. */ reserveKeyword: { type: Boolean, default: true }, /** * @description data of the options, the key of `value` and `label` can be customize by `props` */ options: { type: definePropType(Array), required: true }, /** * @description placeholder, the default is 'Please select' */ placeholder: { type: String }, /** * @description whether select dropdown is teleported, if `true` it will be teleported to where `append-to` sets */ teleported: useTooltipContentProps.teleported, /** * @description when select dropdown is inactive and `persistent` is `false`, select dropdown will be destroyed */ persistent: { type: Boolean, default: true }, /** * @description custom class name for Select's dropdown */ popperClass: useTooltipContentProps.popperClass, /** * @description custom style for Select's dropdown */ popperStyle: useTooltipContentProps.popperStyle, /** * @description [popper.js](https://popper.js.org/docs/v2/) parameters */ popperOptions: { type: definePropType(Object), default: () => ({}) }, /** * @description whether search data from server */ remote: Boolean, /** * @description debounce delay during remote search, in milliseconds */ debounce: { type: Number, default: 300 }, /** * @description size of component */ size: useSizeProp, /** * @description configuration options, see the following table */ props: { type: definePropType(Object), default: () => defaultProps$2 }, /** * @description unique identity key name for value, required when value is an object */ valueKey: { type: String, default: "value" }, /** * @description Controls whether the scrollbar is always displayed */ scrollbarAlwaysOn: Boolean, /** * @description whether to trigger form validation */ validateEvent: { type: Boolean, default: true }, /** * @description offset of the dropdown */ offset: { type: Number, default: 12 }, /** * @description in remote search method show suffix icon */ remoteShowSuffix: Boolean, /** * @description Determines whether the arrow is displayed */ showArrow: { type: Boolean, default: true }, /** * @description position of dropdown */ placement: { type: definePropType(String), values: Ee, default: "bottom-start" }, /** * @description list of possible positions for dropdown */ fallbackPlacements: { type: definePropType(Array), default: [ "bottom-start", "top-start", "right", "left" ] }, /** * @description tag type */ tagType: { ...tagProps.type, default: "info" }, /** * @description tag effect */ tagEffect: { ...tagProps.effect, default: "light" }, /** * @description tabindex for input */ tabindex: { type: [String, Number], default: 0 }, /** * @description which element the select dropdown appends to */ appendTo: useTooltipContentProps.appendTo, /** * @description if it is `true`, the width of the dropdown panel is the same as the input box. * if it is `false`, the width is automatically calculated based on the value of `label`, * or it can be set to a number to make it a fixed width */ fitInputWidth: { type: [Boolean, Number], default: true, validator(val) { return isBoolean(val) || isNumber(val); } }, suffixIcon: { type: iconPropType, default: arrow_down_default }, ...useEmptyValuesProps, ...useAriaProps(["ariaLabel"]) }); const optionV2Props = buildProps({ data: Array, disabled: Boolean, hovering: Boolean, item: { type: definePropType(Object), required: true }, index: Number, style: Object, selected: Boolean, created: Boolean }); const selectV2Emits = { [UPDATE_MODEL_EVENT]: (val) => true, [CHANGE_EVENT]: (val) => true, "end-reached": scrollbarEmits["end-reached"], "remove-tag": (val) => true, "visible-change": (visible) => true, focus: (evt) => evt instanceof FocusEvent, blur: (evt) => evt instanceof FocusEvent, clear: () => true }; const optionV2Emits = { hover: (index) => isNumber(index), select: (val, index) => true }; //#endregion //#region ../../packages/components/select-v2/src/token.ts const selectV2InjectionKey = Symbol("ElSelectV2Injection"); //#endregion //#region ../../packages/components/select-v2/src/option-item.vue?vue&type=script&lang.ts var option_item_vue_vue_type_script_lang_default = defineComponent({ props: optionV2Props, emits: optionV2Emits, setup(props, { emit }) { const select = inject(selectV2InjectionKey); const ns = useNamespace("select"); const { hoverItem, selectOptionClick } = useOption(props, { emit }); const { getLabel } = useProps(select.props); const contentId = select.contentId; const handleMousedown = (event) => { let target = event.target; const currentTarget = event.currentTarget; while (target && target !== currentTarget) { if (isFocusable(target)) return; target = target.parentElement; } event.preventDefault(); }; return { ns, contentId, hoverItem, handleMousedown, selectOptionClick, getLabel }; } }); //#endregion //#region ../../packages/components/select-v2/src/option-item.vue const _hoisted_1$22 = [ "id", "aria-selected", "aria-disabled" ]; function _sfc_render$6(_ctx, _cache, $props, $setup, $data, $options) { return openBlock(), createElementBlock("li", { id: `${_ctx.contentId}-${_ctx.index}`, role: "option", "aria-selected": _ctx.selected, "aria-disabled": _ctx.disabled || void 0, style: normalizeStyle(_ctx.style), class: normalizeClass([ _ctx.ns.be("dropdown", "item"), _ctx.ns.is("selected", _ctx.selected), _ctx.ns.is("disabled", _ctx.disabled), _ctx.ns.is("created", _ctx.created), _ctx.ns.is("hovering", _ctx.hovering) ]), onMousemove: _cache[0] || (_cache[0] = (...args) => _ctx.hoverItem && _ctx.hoverItem(...args)), onMousedown: _cache[1] || (_cache[1] = (...args) => _ctx.handleMousedown && _ctx.handleMousedown(...args)), onClick: _cache[2] || (_cache[2] = withModifiers((...args) => _ctx.selectOptionClick && _ctx.selectOptionClick(...args), ["stop"])) }, [renderSlot(_ctx.$slots, "default", { item: _ctx.item, index: _ctx.index, disabled: _ctx.disabled }, () => [createElementVNode("span", null, toDisplayString(_ctx.getLabel(_ctx.item)), 1)])], 46, _hoisted_1$22); } var option_item_default = /* @__PURE__ */ _plugin_vue_export_helper_default(option_item_vue_vue_type_script_lang_default, [["render", _sfc_render$6]]); //#endregion //#region ../../packages/components/select-v2/src/select-dropdown.tsx const props = { loading: Boolean, data: { type: Array, required: true }, hoveringIndex: Number, width: Number, id: String, ariaLabel: String }; var select_dropdown_default = /* @__PURE__ */ defineComponent({ name: "ElSelectDropdown", props, emits: { "end-reached": scrollbarEmits["end-reached"] }, setup(props, { slots, expose, emit }) { const select = inject(selectV2InjectionKey); const ns = useNamespace("select"); const { getLabel, getValue, getDisabled } = useProps(select.props); const cachedHeights = ref([]); const listRef = ref(); const size = computed(() => props.data.length); watch(() => size.value, () => { select.tooltipRef.value?.updatePopper?.(); }); const isSized = computed(() => isUndefined(select.props.estimatedOptionHeight)); const listProps = computed(() => { if (isSized.value) return { itemSize: select.props.itemHeight }; return { estimatedSize: select.props.estimatedOptionHeight, itemSize: (idx) => cachedHeights.value[idx] }; }); const contains = (arr = [], target) => { const { props: { valueKey } } = select; if (!isObject$1(target)) return arr.includes(target); return arr && arr.some((item) => { return toRaw(get(item, valueKey)) === get(target, valueKey); }); }; const isEqual = (selected, target) => { if (!isObject$1(target)) return selected === target; else { const { valueKey } = select.props; return get(selected, valueKey) === get(target, valueKey); } }; const isItemSelected = (modelValue, target) => { if (select.props.multiple) return contains(modelValue, getValue(target)); return isEqual(modelValue, getValue(target)); }; const isItemDisabled = (modelValue, selected) => { const { disabled, multiple, multipleLimit } = select.props; return disabled || !selected && (multiple ? multipleLimit > 0 && modelValue.length >= multipleLimit : false); }; const isItemHovering = (target) => props.hoveringIndex === target; const scrollToItem = (index) => { const list = listRef.value; if (list) list.scrollToItem(index); }; const resetScrollTop = () => { const list = listRef.value; if (list) list.resetScrollTop(); }; expose({ listRef, isSized, isItemDisabled, isItemHovering, isItemSelected, scrollToItem, resetScrollTop }); const Item = (itemProps) => { const { index, data, style } = itemProps; const sized = unref(isSized); const { itemSize, estimatedSize } = unref(listProps); const { modelValue } = select.props; const { onSelect, onHover } = select; const item = data[index]; if (item.type === "Group") return createVNode(group_item_default, { "item": item, "style": style, "height": sized ? itemSize : estimatedSize }, null); const isSelected = isItemSelected(modelValue, item); const isDisabled = isItemDisabled(modelValue, isSelected); const isHovering = isItemHovering(index); return createVNode(option_item_default, mergeProps(itemProps, { "selected": isSelected, "disabled": getDisabled(item) || isDisabled, "created": !!item.created, "hovering": isHovering, "item": item, "onSelect": onSelect, "onHover": onHover }), { default: (props) => slots.default?.(props) || createVNode("span", null, [getLabel(item)]) }); }; const { onKeyboardNavigate, onKeyboardSelect } = select; const onForward = () => { onKeyboardNavigate("forward"); }; const onBackward = () => { onKeyboardNavigate("backward"); }; const onKeydown = (e) => { const code = getEventCode(e); const { tab, esc, down, up, enter, numpadEnter } = EVENT_CODE; if ([ esc, down, up, enter, numpadEnter ].includes(code)) { e.preventDefault(); e.stopPropagation(); } switch (code) { case tab: case esc: break; case down: onForward(); break; case up: onBackward(); break; case enter: case numpadEnter: onKeyboardSelect(); break; } }; const onEndReached = (direction) => { emit("end-reached", direction); }; return () => { const { data, width } = props; const { height, multiple, scrollbarAlwaysOn } = select.props; const isScrollbarAlwaysOn = isIOS ? true : scrollbarAlwaysOn; const List = unref(isSized) ? FixedSizeList : DynamicSizeList; return createVNode("div", { "class": [ns.b("dropdown"), ns.is("multiple", multiple)], "style": { width: `${width}px` } }, [ slots.header?.(), slots.loading?.() || slots.empty?.() || createVNode(List, mergeProps({ "ref": listRef }, unref(listProps), { "className": ns.be("dropdown", "list"), "scrollbarAlwaysOn": isScrollbarAlwaysOn, "data": data, "height": height, "width": width, "total": data.length, "innerElement": "ul", "innerProps": { id: props.id, role: "listbox", "aria-label": props.ariaLabel, "aria-orientation": "vertical" }, "onEndReached": onEndReached, "onKeydown": onKeydown }), { default: (props) => createVNode(Item, props, null) }), slots.footer?.() ]); }; } }); //#endregion //#region ../../packages/components/select-v2/src/useAllowCreate.ts function useAllowCreate(props, states) { const { aliasProps, getLabel, getValue } = useProps(props); const createOptionCount = ref(0); const cachedSelectedOption = ref(); const enableAllowCreateMode = computed(() => { return props.allowCreate && props.filterable; }); watch(() => props.options, (options) => { const optionLabelsSet = new Set(options.map((option) => getLabel(option))); states.createdOptions = states.createdOptions.filter((createdOption) => !optionLabelsSet.has(getLabel(createdOption))); }); function hasExistingOption(query) { const hasOption = (option) => getLabel(option) === query; return props.options && props.options.some(hasOption) || states.createdOptions.some(hasOption); } function selectNewOption(option) { if (!enableAllowCreateMode.value) return; if (props.multiple && option.created) createOptionCount.value++; else cachedSelectedOption.value = option; } function createNewOption(query) { if (enableAllowCreateMode.value) if (query && query.length > 0) { if (hasExistingOption(query)) { states.createdOptions = states.createdOptions.filter((createdOption) => getLabel(createdOption) !== states.previousQuery); return; } const newOption = { [aliasProps.value.value]: query, [aliasProps.value.label]: query, created: true, [aliasProps.value.disabled]: false }; if (states.createdOptions.length >= createOptionCount.value) states.createdOptions[createOptionCount.value] = newOption; else states.createdOptions.push(newOption); } else if (props.multiple) states.createdOptions.length = createOptionCount.value; else { const selectedOption = cachedSelectedOption.value; states.createdOptions.length = 0; if (selectedOption && selectedOption.created) states.createdOptions.push(selectedOption); } } function removeNewOption(option) { if (!enableAllowCreateMode.value || !option || !option.created || option.created && props.reserveKeyword && states.inputValue === getLabel(option)) return; const idx = states.createdOptions.findIndex((it) => getValue(it) === getValue(option)); if (~idx) { states.createdOptions.splice(idx, 1); createOptionCount.value--; } } function clearAllNewOption() { if (enableAllowCreateMode.value) { states.createdOptions.length = 0; createOptionCount.value = 0; } } return { createNewOption, removeNewOption, selectNewOption, clearAllNewOption }; } //#endregion //#region ../../packages/components/select-v2/src/useSelect.ts const useSelect$1 = (props, emit) => { const { t } = useLocale(); const slots = useSlots(); const nsSelect = useNamespace("select"); const nsInput = useNamespace("input"); const { form: elForm, formItem: elFormItem } = useFormItem(); const { inputId } = useFormItemInputId(props, { formItemContext: elFormItem }); const { aliasProps, getLabel, getValue, getDisabled, getOptions } = useProps(props); const { valueOnClear, isEmptyValue } = useEmptyValues(props); const states = reactive({ inputValue: "", cachedOptions: [], createdOptions: [], hoveringIndex: -1, inputHovering: false, selectionWidth: 0, collapseItemWidth: 0, previousQuery: null, previousValue: void 0, selectedLabel: "", menuVisibleOnFocus: false, isBeforeHide: false }); const popperSize = ref(-1); const debouncing = ref(false); const selectRef = ref(); const selectionRef = ref(); const tooltipRef = ref(); const tagTooltipRef = ref(); const inputRef = ref(); const prefixRef = ref(); const suffixRef = ref(); const menuRef = ref(); const tagMenuRef = ref(); const collapseItemRef = ref(); const { isComposing, handleCompositionStart, handleCompositionEnd, handleCompositionUpdate } = useComposition({ afterComposition: (e) => onInput(e) }); const selectDisabled = useFormDisabled(); const { wrapperRef, isFocused, handleBlur } = useFocusController(inputRef, { disabled: selectDisabled, afterFocus() { if (props.automaticDropdown && !expanded.value) { expanded.value = true; states.menuVisibleOnFocus = true; } }, beforeBlur(event) { return tooltipRef.value?.isFocusInsideContent(event) || tagTooltipRef.value?.isFocusInsideContent(event); }, afterBlur() { expanded.value = false; states.menuVisibleOnFocus = false; if (props.validateEvent) elFormItem?.validate?.("blur").catch(NOOP); } }); const allOptions = computed(() => filterOptions("")); const hasOptions = computed(() => { if (props.loading) return false; return props.options.length > 0 || states.createdOptions.length > 0; }); const filteredOptions = ref([]); const expanded = ref(false); const needStatusIcon = computed(() => elForm?.statusIcon ?? false); const popupHeight = computed(() => { const totalHeight = filteredOptions.value.length * props.itemHeight; return totalHeight > props.height ? props.height : totalHeight; }); const hasModelValue = computed(() => { return props.multiple ? isArray$1(props.modelValue) && props.modelValue.length > 0 : !isEmptyValue(props.modelValue); }); const showClearBtn = computed(() => { return props.clearable && !selectDisabled.value && hasModelValue.value && (isFocused.value || states.inputHovering); }); const iconComponent = computed(() => props.remote && props.filterable && !props.remoteShowSuffix ? "" : props.suffixIcon); const iconReverse = computed(() => iconComponent.value && nsSelect.is("reverse", expanded.value)); const validateState = computed(() => elFormItem?.validateState || ""); const validateIcon = computed(() => { if (!validateState.value) return; return ValidateComponentsMap[validateState.value]; }); const debounce = computed(() => props.remote ? props.debounce : 0); const isRemoteSearchEmpty = computed(() => props.remote && !states.inputValue && !hasOptions.value); const emptyText = computed(() => { if (props.loading) return props.loadingText || t("el.select.loading"); else { if (props.filterable && states.inputValue && hasOptions.value && filteredOptions.value.length === 0) return props.noMatchText || t("el.select.noMatch"); if (!hasOptions.value) return props.noDataText || t("el.select.noData"); } return null; }); const isFilterMethodValid = computed(() => props.filterable && isFunction$1(props.filterMethod)); const isRemoteMethodValid = computed(() => props.filterable && props.remote && isFunction$1(props.remoteMethod)); const filterOptions = (query) => { const regexp = new RegExp(escapeStringRegexp(query), "i"); const isValidOption = (o) => { if (isFilterMethodValid.value || isRemoteMethodValid.value) return true; return query ? regexp.test(getLabel(o) || "") : true; }; if (props.loading) return []; return [...states.createdOptions, ...props.options].reduce((all, item) => { const options = getOptions(item); if (isArray$1(options)) { const filtered = options.filter(isValidOption); if (filtered.length > 0) all.push({ label: getLabel(item), type: "Group" }, ...filtered); } else if (props.remote || isValidOption(item)) all.push(item); return all; }, []); }; const updateOptions = () => { filteredOptions.value = filterOptions(states.inputValue); }; const allOptionsValueMap = computed(() => { const valueMap = /* @__PURE__ */ new Map(); allOptions.value.forEach((option, index) => { valueMap.set(getValueKey(getValue(option)), { option, index }); }); return valueMap; }); const filteredOptionsValueMap = computed(() => { const valueMap = /* @__PURE__ */ new Map(); filteredOptions.value.forEach((option, index) => { valueMap.set(getValueKey(getValue(option)), { option, index }); }); return valueMap; }); const optionsAllDisabled = computed(() => filteredOptions.value.every((option) => getDisabled(option))); const selectSize = useFormSize(); const collapseTagSize = computed(() => "small" === selectSize.value ? "small" : "default"); const calculatePopperSize = () => { if (isNumber(props.fitInputWidth)) { popperSize.value = props.fitInputWidth; return; } const width = selectRef.value?.offsetWidth || 200; if (!props.fitInputWidth && hasOptions.value) nextTick(() => { popperSize.value = Math.max(width, calculateLabelMaxWidth()); }); else popperSize.value = width; }; const calculateLabelMaxWidth = () => { const ctx = document.createElement("canvas").getContext("2d"); const selector = nsSelect.be("dropdown", "item"); const dropdownItemEl = (menuRef.value?.listRef?.innerRef || document).querySelector(`.${selector}`); if (dropdownItemEl === null || ctx === null) return 0; const style = getComputedStyle(dropdownItemEl); const padding = Number.parseFloat(style.paddingLeft) + Number.parseFloat(style.paddingRight); ctx.font = `bold ${style.font.replace(new RegExp(`\\b${style.fontWeight}\\b`), "")}`; return filteredOptions.value.reduce((max, option) => { const metrics = ctx.measureText(getLabel(option)); return Math.max(metrics.width, max); }, 0) + padding; }; const getGapWidth = () => { if (!selectionRef.value) return 0; const style = window.getComputedStyle(selectionRef.value); return Number.parseFloat(style.gap || "6px"); }; const tagStyle = computed(() => { const gapWidth = getGapWidth(); const inputSlotWidth = props.filterable ? gapWidth + 11 : 0; return { maxWidth: `${collapseItemRef.value && props.maxCollapseTags === 1 ? states.selectionWidth - states.collapseItemWidth - gapWidth - inputSlotWidth : states.selectionWidth - inputSlotWidth}px` }; }); const collapseTagStyle = computed(() => { return { maxWidth: `${states.selectionWidth}px` }; }); const shouldShowPlaceholder = computed(() => { if (isArray$1(props.modelValue)) return props.modelValue.length === 0 && !states.inputValue; return props.filterable ? !states.inputValue : true; }); const currentPlaceholder = computed(() => { const _placeholder = props.placeholder ?? t("el.select.placeholder"); return props.multiple || !hasModelValue.value ? _placeholder : states.selectedLabel; }); const popperRef = computed(() => tooltipRef.value?.popperRef?.contentRef); const indexRef = computed(() => { if (props.multiple) { const len = props.modelValue.length; if (len > 0 && filteredOptionsValueMap.value.has(props.modelValue[len - 1])) { const { index } = filteredOptionsValueMap.value.get(props.modelValue[len - 1]); return index; } } else if (!isEmptyValue(props.modelValue) && filteredOptionsValueMap.value.has(props.modelValue)) { const { index } = filteredOptionsValueMap.value.get(props.modelValue); return index; } return -1; }); const dropdownMenuVisible = computed({ get() { return expanded.value && (props.loading || !isRemoteSearchEmpty.value || props.remote && !!slots.empty) && (!debouncing.value || !isEmpty(states.previousQuery) || hasOptions.value); }, set(val) { expanded.value = val; } }); const showTagList = computed(() => { if (!props.multiple) return []; return props.collapseTags ? states.cachedOptions.slice(0, props.maxCollapseTags) : states.cachedOptions; }); const collapseTagList = computed(() => { if (!props.multiple) return []; return props.collapseTags ? states.cachedOptions.slice(props.maxCollapseTags) : []; }); const { createNewOption, removeNewOption, selectNewOption, clearAllNewOption } = useAllowCreate(props, states); const toggleMenu = (event) => { if (selectDisabled.value || props.filterable && expanded.value && event && !suffixRef.value?.contains(event.target)) return; if (states.menuVisibleOnFocus) states.menuVisibleOnFocus = false; else expanded.value = !expanded.value; }; const onInputChange = () => { if (states.inputValue.length > 0 && !expanded.value) expanded.value = true; createNewOption(states.inputValue); nextTick(() => { handleQueryChange(states.inputValue); }); }; const debouncedOnInputChange = useDebounceFn(() => { onInputChange(); debouncing.value = false; }, debounce); const handleQueryChange = (val) => { if (states.previousQuery === val || isComposing.value) return; states.previousQuery = val; if (props.filterable && isFunction$1(props.filterMethod)) props.filterMethod(val); else if (props.filterable && props.remote && isFunction$1(props.remoteMethod)) props.remoteMethod(val); if (props.defaultFirstOption && (props.filterable || props.remote) && filteredOptions.value.length) nextTick(checkDefaultFirstOption); else nextTick(updateHoveringIndex); }; /** * find and highlight first option as default selected * @remark * - if the first option in dropdown list is user-created, * it would be at the end of the optionsArray * so find it and set hover. * (NOTE: there must be only one user-created option in dropdown list with query) * - if there's no user-created option in list, just find the first one as usual * (NOTE: exclude options that are disabled or in disabled-group) */ const checkDefaultFirstOption = () => { const optionsInDropdown = filteredOptions.value.filter((n) => !n.disabled && n.type !== "Group"); const userCreatedOption = optionsInDropdown.find((n) => n.created); const firstOriginOption = optionsInDropdown[0]; states.hoveringIndex = getValueIndex(filteredOptions.value, userCreatedOption || firstOriginOption); }; const emitChange = (val) => { if (!isEqual$1(props.modelValue, val)) emit(CHANGE_EVENT, val); }; const update = (val) => { emit(UPDATE_MODEL_EVENT, val); emitChange(val); states.previousValue = props.multiple ? String(val) : val; nextTick(() => { if (props.multiple && isArray$1(props.modelValue)) { const cachedOptions = states.cachedOptions.slice(); const selectedOptions = props.modelValue.map((value) => getOption(value, cachedOptions)); if (!isEqual$1(states.cachedOptions, selectedOptions)) states.cachedOptions = selectedOptions; } else initStates(true); }); }; const getValueIndex = (arr = [], value) => { if (!isObject$1(value)) return arr.indexOf(value); const valueKey = props.valueKey; let index = -1; arr.some((item, i) => { if (get(item, valueKey) === get(value, valueKey)) { index = i; return true; } return false; }); return index; }; const getValueKey = (item) => { return isObject$1(item) ? get(item, props.valueKey) : item; }; const handleResize = () => { calculatePopperSize(); }; const onEndReached = (direction) => { emit("end-reached", direction); }; const resetSelectionWidth = () => { states.selectionWidth = Number.parseFloat(window.getComputedStyle(selectionRef.value).width); }; const resetCollapseItemWidth = () => { states.collapseItemWidth = collapseItemRef.value.getBoundingClientRect().width; }; const updateTooltip = () => { tooltipRef.value?.updatePopper?.(); }; const updateTagTooltip = () => { tagTooltipRef.value?.updatePopper?.(); }; const onSelect = (option) => { const optionValue = getValue(option); if (props.multiple) { let selectedOptions = props.modelValue.slice(); const index = getValueIndex(selectedOptions, optionValue); if (index > -1) { selectedOptions = [...selectedOptions.slice(0, index), ...selectedOptions.slice(index + 1)]; states.cachedOptions.splice(index, 1); removeNewOption(option); } else if (props.multipleLimit <= 0 || selectedOptions.length < props.multipleLimit) { selectedOptions = [...selectedOptions, optionValue]; states.cachedOptions.push(option); selectNewOption(option); } update(selectedOptions); if (option.created) handleQueryChange(""); if (props.filterable && (option.created || !props.reserveKeyword)) states.inputValue = ""; } else { states.selectedLabel = getLabel(option); !isEqual$1(props.modelValue, optionValue) && update(optionValue); expanded.value = false; selectNewOption(option); if (!option.created) clearAllNewOption(); } focus(); }; const deleteTag = (event, option) => { let selectedOptions = props.modelValue.slice(); const index = getValueIndex(selectedOptions, getValue(option)); if (index > -1 && !selectDisabled.value) { selectedOptions = [...props.modelValue.slice(0, index), ...props.modelValue.slice(index + 1)]; states.cachedOptions.splice(index, 1); update(selectedOptions); emit("remove-tag", getValue(option)); removeNewOption(option); } event.stopPropagation(); focus(); }; const focus = () => { inputRef.value?.focus(); }; const blur = () => { if (expanded.value) { expanded.value = false; nextTick(() => inputRef.value?.blur()); return; } inputRef.value?.blur(); }; const handleEsc = () => { if (states.inputValue.length > 0) states.inputValue = ""; else expanded.value = false; }; const getLastNotDisabledIndex = (value) => findLastIndex(value, (it) => !states.cachedOptions.some((option) => getValue(option) === it && getDisabled(option))); const handleDel = (e) => { const code = getEventCode(e); if (!props.multiple) return; if (code === EVENT_CODE.delete) return; if (states.inputValue.length === 0) { e.preventDefault(); const selected = props.modelValue.slice(); const lastNotDisabledIndex = getLastNotDisabledIndex(selected); if (lastNotDisabledIndex < 0) return; const removeTagValue = selected[lastNotDisabledIndex]; selected.splice(lastNotDisabledIndex, 1); const option = states.cachedOptions[lastNotDisabledIndex]; states.cachedOptions.splice(lastNotDisabledIndex, 1); removeNewOption(option); update(selected); emit("remove-tag", removeTagValue); } }; const handleClear = () => { let emptyValue; if (isArray$1(props.modelValue)) emptyValue = []; else emptyValue = valueOnClear.value; states.selectedLabel = ""; expanded.value = false; update(emptyValue); emit("clear"); clearAllNewOption(); focus(); }; const onKeyboardNavigate = (direction, hoveringIndex = void 0) => { const options = filteredOptions.value; if (!["forward", "backward"].includes(direction) || selectDisabled.value || options.length <= 0 || optionsAllDisabled.value || isComposing.value) return; if (!expanded.value) return toggleMenu(); if (isUndefined(hoveringIndex)) hoveringIndex = states.hoveringIndex; let newIndex = -1; if (direction === "forward") { newIndex = hoveringIndex + 1; if (newIndex >= options.length) newIndex = 0; } else if (direction === "backward") { newIndex = hoveringIndex - 1; if (newIndex < 0 || newIndex >= options.length) newIndex = options.length - 1; } const option = options[newIndex]; if (getDisabled(option) || option.type === "Group") return onKeyboardNavigate(direction, newIndex); else { states.hoveringIndex = newIndex; scrollToItem(newIndex); } }; const onKeyboardSelect = () => { if (!expanded.value) return toggleMenu(); else if (~states.hoveringIndex && filteredOptions.value[states.hoveringIndex]) onSelect(filteredOptions.value[states.hoveringIndex]); }; const onHoverOption = (idx) => { states.hoveringIndex = idx ?? -1; }; const updateHoveringIndex = () => { if (!props.multiple) states.hoveringIndex = filteredOptions.value.findIndex((item) => { return getValueKey(getValue(item)) === getValueKey(props.modelValue); }); else { const length = props.modelValue.length; if (length > 0) { const lastValue = props.modelValue[length - 1]; states.hoveringIndex = filteredOptions.value.findIndex((item) => getValueKey(lastValue) === getValueKey(getValue(item))); } else states.hoveringIndex = -1; } }; const onInput = (event) => { states.inputValue = event.target.value; if (props.remote) { debouncing.value = true; debouncedOnInputChange(); } else return onInputChange(); }; const handleClickOutside = (event) => { expanded.value = false; if (isFocused.value) handleBlur(new FocusEvent("blur", event)); }; const handleMenuEnter = () => { states.isBeforeHide = false; return nextTick(() => { if (~indexRef.value) scrollToItem(indexRef.value); }); }; const scrollToItem = (index) => { menuRef.value.scrollToItem(index); }; const getOption = (value, cachedOptions) => { const selectValue = getValueKey(value); if (allOptionsValueMap.value.has(selectValue)) { const { option } = allOptionsValueMap.value.get(selectValue); return option; } if (cachedOptions && cachedOptions.length) { const option = cachedOptions.find((option) => getValueKey(getValue(option)) === selectValue); if (option) return option; } return { [aliasProps.value.value]: value, [aliasProps.value.label]: value }; }; const getIndex = (option) => allOptionsValueMap.value.get(getValue(option))?.index ?? -1; const initStates = (needUpdateSelectedLabel = false) => { if (props.multiple) if (props.modelValue.length > 0) { const cachedOptions = states.cachedOptions.slice(); states.cachedOptions.length = 0; states.previousValue = props.modelValue.toString(); for (const value of props.modelValue) { const option = getOption(value, cachedOptions); states.cachedOptions.push(option); } } else { states.cachedOptions = []; states.previousValue = void 0; } else if (hasModelValue.value) { states.previousValue = props.modelValue; const options = filteredOptions.value; const selectedItemIndex = options.findIndex((option) => getValueKey(getValue(option)) === getValueKey(props.modelValue)); if (~selectedItemIndex) states.selectedLabel = getLabel(options[selectedItemIndex]); else if (!states.selectedLabel || needUpdateSelectedLabel) states.selectedLabel = getValueKey(props.modelValue); } else { states.selectedLabel = ""; states.previousValue = void 0; } clearAllNewOption(); calculatePopperSize(); }; watch(() => props.fitInputWidth, () => { calculatePopperSize(); }); watch(expanded, (val) => { if (val) { if (!props.persistent) calculatePopperSize(); handleQueryChange(""); } else { states.inputValue = ""; states.previousQuery = null; states.isBeforeHide = true; states.menuVisibleOnFocus = false; createNewOption(""); } }); watch(() => props.modelValue, (val, oldVal) => { if (!val || isArray$1(val) && val.length === 0 || props.multiple && !isEqual$1(val.toString(), states.previousValue) || !props.multiple && getValueKey(val) !== getValueKey(states.previousValue)) initStates(true); if (!isEqual$1(val, oldVal) && props.validateEvent) elFormItem?.validate?.("change").catch(NOOP); }, { deep: true }); watch(() => props.options, () => { const input = inputRef.value; if (!input || input && document.activeElement !== input) initStates(); }, { deep: true, flush: "post" }); watch(() => filteredOptions.value, () => { calculatePopperSize(); return menuRef.value && nextTick(menuRef.value.resetScrollTop); }); watchEffect(() => { if (states.isBeforeHide) return; updateOptions(); }); watchEffect(() => { const { valueKey, options } = props; const duplicateValue = /* @__PURE__ */ new Map(); for (const item of options) { const optionValue = getValue(item); let v = optionValue; if (isObject$1(v)) v = get(optionValue, valueKey); if (duplicateValue.get(v)) { /* @__PURE__ */ debugWarn("ElSelectV2", `The option values you provided seem to be duplicated, which may cause some problems, please check.`); break; } else duplicateValue.set(v, true); } }); onMounted(() => { initStates(); }); useResizeObserver(selectRef, handleResize); useResizeObserver(selectionRef, resetSelectionWidth); useResizeObserver(wrapperRef, updateTooltip); useResizeObserver(tagMenuRef, updateTagTooltip); useResizeObserver(collapseItemRef, resetCollapseItemWidth); let stop; watch(() => dropdownMenuVisible.value, (newVal) => { if (newVal) stop = useResizeObserver(menuRef, updateTooltip).stop; else { stop?.(); stop = void 0; } emit("visible-change", newVal); }); return { inputId, collapseTagSize, currentPlaceholder, expanded, emptyText, popupHeight, debounce, allOptions, allOptionsValueMap, filteredOptions, iconComponent, iconReverse, tagStyle, collapseTagStyle, popperSize, dropdownMenuVisible, hasModelValue, shouldShowPlaceholder, selectDisabled, selectSize, needStatusIcon, showClearBtn, states, isFocused, nsSelect, nsInput, inputRef, menuRef, tagMenuRef, tooltipRef, tagTooltipRef, selectRef, wrapperRef, selectionRef, prefixRef, suffixRef, collapseItemRef, popperRef, validateState, validateIcon, showTagList, collapseTagList, debouncedOnInputChange, deleteTag, getLabel, getValue, getDisabled, getValueKey, getIndex, handleClear, handleClickOutside, handleDel, handleEsc, focus, blur, handleMenuEnter, handleResize, resetSelectionWidth, updateTooltip, updateTagTooltip, updateOptions, toggleMenu, scrollTo: scrollToItem, onInput, onKeyboardNavigate, onKeyboardSelect, onEndReached, onSelect, onHover: onHoverOption, handleCompositionStart, handleCompositionEnd, handleCompositionUpdate }; }; //#endregion //#region ../../packages/components/select-v2/src/select.vue?vue&type=script&lang.ts var select_vue_vue_type_script_lang_default = defineComponent({ name: "ElSelectV2", components: { ElSelectMenu: select_dropdown_default, ElTag, ElTooltip, ElIcon }, directives: { ClickOutside }, props: selectV2Props, emits: selectV2Emits, setup(props, { emit }) { const modelValue = computed(() => { const { modelValue: rawModelValue, multiple } = props; const fallback = multiple ? [] : void 0; if (isArray$1(rawModelValue)) return multiple ? rawModelValue : fallback; return multiple ? fallback : rawModelValue; }); const API = useSelect$1(reactive({ ...toRefs(props), modelValue }), emit); const { calculatorRef, inputStyle } = useCalcInputWidth(); const contentId = useId(); provide(selectV2InjectionKey, { props: reactive({ ...toRefs(props), height: API.popupHeight, modelValue }), expanded: API.expanded, tooltipRef: API.tooltipRef, contentId, onSelect: API.onSelect, onHover: API.onHover, onKeyboardNavigate: API.onKeyboardNavigate, onKeyboardSelect: API.onKeyboardSelect }); const selectedLabel = computed(() => { if (!props.multiple) return API.states.selectedLabel; return API.states.cachedOptions.map((i) => API.getLabel(i)); }); return { ...API, modelValue, selectedLabel, calculatorRef, inputStyle, contentId, BORDER_HORIZONTAL_WIDTH: 2 }; } }); //#endregion //#region ../../packages/components/select-v2/src/select.vue const _hoisted_1$21 = [ "id", "value", "autocomplete", "tabindex", "aria-expanded", "aria-label", "disabled", "aria-controls", "aria-activedescendant", "readonly", "name" ]; const _hoisted_2$13 = ["textContent"]; const _hoisted_3$5 = { key: 1 }; function _sfc_render$5(_ctx, _cache, $props, $setup, $data, $options) { const _component_el_tag = resolveComponent("el-tag"); const _component_el_tooltip = resolveComponent("el-tooltip"); const _component_el_icon = resolveComponent("el-icon"); const _component_el_select_menu = resolveComponent("el-select-menu"); const _directive_click_outside = resolveDirective("click-outside"); return withDirectives((openBlock(), createElementBlock("div", { ref: "selectRef", class: normalizeClass([_ctx.nsSelect.b(), _ctx.nsSelect.m(_ctx.selectSize)]), onMouseenter: _cache[15] || (_cache[15] = ($event) => _ctx.states.inputHovering = true), onMouseleave: _cache[16] || (_cache[16] = ($event) => _ctx.states.inputHovering = false) }, [createVNode(_component_el_tooltip, { ref: "tooltipRef", visible: _ctx.dropdownMenuVisible, teleported: _ctx.teleported, "popper-class": [_ctx.nsSelect.e("popper"), _ctx.popperClass], "popper-style": _ctx.popperStyle, "gpu-acceleration": false, "stop-popper-mouse-event": false, "popper-options": _ctx.popperOptions, "fallback-placements": _ctx.fallbackPlacements, effect: _ctx.effect, placement: _ctx.placement, pure: "", transition: `${_ctx.nsSelect.namespace.value}-zoom-in-top`, trigger: "click", persistent: _ctx.persistent, "append-to": _ctx.appendTo, "show-arrow": _ctx.showArrow, offset: _ctx.offset, onBeforeShow: _ctx.handleMenuEnter, onHide: _cache[14] || (_cache[14] = ($event) => _ctx.states.isBeforeHide = false) }, { default: withCtx(() => [createElementVNode("div", { ref: "wrapperRef", class: normalizeClass([ _ctx.nsSelect.e("wrapper"), _ctx.nsSelect.is("focused", _ctx.isFocused), _ctx.nsSelect.is("hovering", _ctx.states.inputHovering), _ctx.nsSelect.is("filterable", _ctx.filterable), _ctx.nsSelect.is("disabled", _ctx.selectDisabled) ]), onClick: _cache[11] || (_cache[11] = withModifiers((...args) => _ctx.toggleMenu && _ctx.toggleMenu(...args), ["prevent"])) }, [ _ctx.$slots.prefix ? (openBlock(), createElementBlock("div", { key: 0, ref: "prefixRef", class: normalizeClass(_ctx.nsSelect.e("prefix")) }, [renderSlot(_ctx.$slots, "prefix")], 2)) : createCommentVNode("v-if", true), createElementVNode("div", { ref: "selectionRef", class: normalizeClass([_ctx.nsSelect.e("selection"), _ctx.nsSelect.is("near", _ctx.multiple && !_ctx.$slots.prefix && !!_ctx.modelValue.length)]) }, [ _ctx.multiple ? renderSlot(_ctx.$slots, "tag", { key: 0, data: _ctx.states.cachedOptions, deleteTag: _ctx.deleteTag, selectDisabled: _ctx.selectDisabled }, () => [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.showTagList, (item) => { return openBlock(), createElementBlock("div", { key: _ctx.getValueKey(_ctx.getValue(item)), class: normalizeClass(_ctx.nsSelect.e("selected-item")) }, [createVNode(_component_el_tag, { closable: !_ctx.selectDisabled && !_ctx.getDisabled(item), size: _ctx.collapseTagSize, type: _ctx.tagType, effect: _ctx.tagEffect, "disable-transitions": "", style: normalizeStyle(_ctx.tagStyle), onClose: ($event) => _ctx.deleteTag($event, item) }, { default: withCtx(() => [createElementVNode("span", { class: normalizeClass(_ctx.nsSelect.e("tags-text")) }, [renderSlot(_ctx.$slots, "label", { index: _ctx.getIndex(item), label: _ctx.getLabel(item), value: _ctx.getValue(item) }, () => [createTextVNode(toDisplayString(_ctx.getLabel(item)), 1)])], 2)]), _: 2 }, 1032, [ "closable", "size", "type", "effect", "style", "onClose" ])], 2); }), 128)), _ctx.collapseTags && _ctx.states.cachedOptions.length > _ctx.maxCollapseTags ? (openBlock(), createBlock(_component_el_tooltip, { key: 0, ref: "tagTooltipRef", disabled: _ctx.dropdownMenuVisible || !_ctx.collapseTagsTooltip, "fallback-placements": _ctx.tagTooltip?.fallbackPlacements ?? [ "bottom", "top", "right", "left" ], effect: _ctx.tagTooltip?.effect ?? _ctx.effect, placement: _ctx.tagTooltip?.placement ?? "bottom", "popper-class": _ctx.tagTooltip?.popperClass ?? _ctx.popperClass, "popper-style": _ctx.tagTooltip?.popperStyle ?? _ctx.popperStyle, teleported: _ctx.tagTooltip?.teleported ?? _ctx.teleported, "append-to": _ctx.tagTooltip?.appendTo ?? _ctx.appendTo, "popper-options": _ctx.tagTooltip?.popperOptions ?? _ctx.popperOptions, transition: _ctx.tagTooltip?.transition, "show-after": _ctx.tagTooltip?.showAfter, "hide-after": _ctx.tagTooltip?.hideAfter, "auto-close": _ctx.tagTooltip?.autoClose, offset: _ctx.tagTooltip?.offset }, { default: withCtx(() => [createElementVNode("div", { ref: "collapseItemRef", class: normalizeClass(_ctx.nsSelect.e("selected-item")) }, [createVNode(_component_el_tag, { closable: false, size: _ctx.collapseTagSize, type: _ctx.tagType, effect: _ctx.tagEffect, style: normalizeStyle(_ctx.collapseTagStyle), "disable-transitions": "" }, { default: withCtx(() => [createElementVNode("span", { class: normalizeClass(_ctx.nsSelect.e("tags-text")) }, " + " + toDisplayString(_ctx.states.cachedOptions.length - _ctx.maxCollapseTags), 3)]), _: 1 }, 8, [ "size", "type", "effect", "style" ])], 2)]), content: withCtx(() => [createElementVNode("div", { ref: "tagMenuRef", class: normalizeClass(_ctx.nsSelect.e("selection")) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.collapseTagList, (selected) => { return openBlock(), createElementBlock("div", { key: _ctx.getValueKey(_ctx.getValue(selected)), class: normalizeClass(_ctx.nsSelect.e("selected-item")) }, [createVNode(_component_el_tag, { class: "in-tooltip", closable: !_ctx.selectDisabled && !_ctx.getDisabled(selected), size: _ctx.collapseTagSize, type: _ctx.tagType, effect: _ctx.tagEffect, "disable-transitions": "", onClose: ($event) => _ctx.deleteTag($event, selected) }, { default: withCtx(() => [createElementVNode("span", { class: normalizeClass(_ctx.nsSelect.e("tags-text")) }, [renderSlot(_ctx.$slots, "label", { index: _ctx.getIndex(selected), label: _ctx.getLabel(selected), value: _ctx.getValue(selected) }, () => [createTextVNode(toDisplayString(_ctx.getLabel(selected)), 1)])], 2)]), _: 2 }, 1032, [ "closable", "size", "type", "effect", "onClose" ])], 2); }), 128))], 2)]), _: 3 }, 8, [ "disabled", "fallback-placements", "effect", "placement", "popper-class", "popper-style", "teleported", "append-to", "popper-options", "transition", "show-after", "hide-after", "auto-close", "offset" ])) : createCommentVNode("v-if", true)]) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass([ _ctx.nsSelect.e("selected-item"), _ctx.nsSelect.e("input-wrapper"), _ctx.nsSelect.is("hidden", !_ctx.filterable || _ctx.selectDisabled || !_ctx.states.inputValue && !_ctx.isFocused) ]) }, [createElementVNode("input", { id: _ctx.inputId, ref: "inputRef", value: _ctx.states.inputValue, style: normalizeStyle(_ctx.inputStyle), autocomplete: _ctx.autocomplete, tabindex: _ctx.tabindex, "aria-autocomplete": "none", "aria-haspopup": "listbox", autocapitalize: "off", "aria-expanded": _ctx.expanded, "aria-label": _ctx.ariaLabel, class: normalizeClass([_ctx.nsSelect.e("input"), _ctx.nsSelect.is(_ctx.selectSize)]), disabled: _ctx.selectDisabled, role: "combobox", "aria-controls": _ctx.contentId, "aria-activedescendant": _ctx.states.hoveringIndex >= 0 ? `${_ctx.contentId}-${_ctx.states.hoveringIndex}` : "", readonly: !_ctx.filterable, spellcheck: "false", type: "text", name: _ctx.name, onInput: _cache[0] || (_cache[0] = (...args) => _ctx.onInput && _ctx.onInput(...args)), onChange: _cache[1] || (_cache[1] = withModifiers(() => {}, ["stop"])), onCompositionstart: _cache[2] || (_cache[2] = (...args) => _ctx.handleCompositionStart && _ctx.handleCompositionStart(...args)), onCompositionupdate: _cache[3] || (_cache[3] = (...args) => _ctx.handleCompositionUpdate && _ctx.handleCompositionUpdate(...args)), onCompositionend: _cache[4] || (_cache[4] = (...args) => _ctx.handleCompositionEnd && _ctx.handleCompositionEnd(...args)), onKeydown: [ _cache[5] || (_cache[5] = withKeys(withModifiers(($event) => _ctx.onKeyboardNavigate("backward"), ["stop", "prevent"]), ["up"])), _cache[6] || (_cache[6] = withKeys(withModifiers(($event) => _ctx.onKeyboardNavigate("forward"), ["stop", "prevent"]), ["down"])), _cache[7] || (_cache[7] = withKeys(withModifiers((...args) => _ctx.onKeyboardSelect && _ctx.onKeyboardSelect(...args), ["stop", "prevent"]), ["enter"])), _cache[8] || (_cache[8] = withKeys(withModifiers((...args) => _ctx.handleEsc && _ctx.handleEsc(...args), ["stop", "prevent"]), ["esc"])), _cache[9] || (_cache[9] = withKeys(withModifiers((...args) => _ctx.handleDel && _ctx.handleDel(...args), ["stop"]), ["delete"])) ], onClick: _cache[10] || (_cache[10] = withModifiers((...args) => _ctx.toggleMenu && _ctx.toggleMenu(...args), ["stop"])) }, null, 46, _hoisted_1$21), _ctx.filterable ? (openBlock(), createElementBlock("span", { key: 0, ref: "calculatorRef", "aria-hidden": "true", class: normalizeClass(_ctx.nsSelect.e("input-calculator")), textContent: toDisplayString(_ctx.states.inputValue) }, null, 10, _hoisted_2$13)) : createCommentVNode("v-if", true)], 2), _ctx.shouldShowPlaceholder ? (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass([ _ctx.nsSelect.e("selected-item"), _ctx.nsSelect.e("placeholder"), _ctx.nsSelect.is("transparent", !_ctx.hasModelValue || _ctx.expanded && !_ctx.states.inputValue) ]) }, [_ctx.hasModelValue ? renderSlot(_ctx.$slots, "label", { key: 0, index: _ctx.allOptionsValueMap.get(_ctx.modelValue)?.index ?? -1, label: _ctx.currentPlaceholder, value: _ctx.modelValue }, () => [createElementVNode("span", null, toDisplayString(_ctx.currentPlaceholder), 1)]) : (openBlock(), createElementBlock("span", _hoisted_3$5, toDisplayString(_ctx.currentPlaceholder), 1))], 2)) : createCommentVNode("v-if", true) ], 2), createElementVNode("div", { ref: "suffixRef", class: normalizeClass(_ctx.nsSelect.e("suffix")) }, [ _ctx.iconComponent ? withDirectives((openBlock(), createBlock(_component_el_icon, { key: 0, class: normalizeClass([ _ctx.nsSelect.e("caret"), _ctx.nsInput.e("icon"), _ctx.iconReverse ]) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(_ctx.iconComponent)))]), _: 1 }, 8, ["class"])), [[vShow, !_ctx.showClearBtn]]) : createCommentVNode("v-if", true), _ctx.showClearBtn && _ctx.clearIcon ? (openBlock(), createBlock(_component_el_icon, { key: 1, class: normalizeClass([ _ctx.nsSelect.e("caret"), _ctx.nsInput.e("icon"), _ctx.nsSelect.e("clear") ]), onClick: withModifiers(_ctx.handleClear, ["prevent", "stop"]) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(_ctx.clearIcon)))]), _: 1 }, 8, ["class", "onClick"])) : createCommentVNode("v-if", true), _ctx.validateState && _ctx.validateIcon && _ctx.needStatusIcon ? (openBlock(), createBlock(_component_el_icon, { key: 2, class: normalizeClass([ _ctx.nsInput.e("icon"), _ctx.nsInput.e("validateIcon"), _ctx.nsInput.is("loading", _ctx.validateState === "validating") ]) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(_ctx.validateIcon)))]), _: 1 }, 8, ["class"])) : createCommentVNode("v-if", true) ], 2) ], 2)]), content: withCtx(() => [createVNode(_component_el_select_menu, { id: _ctx.contentId, ref: "menuRef", data: _ctx.filteredOptions, width: _ctx.popperSize - _ctx.BORDER_HORIZONTAL_WIDTH, "hovering-index": _ctx.states.hoveringIndex, "scrollbar-always-on": _ctx.scrollbarAlwaysOn, "aria-label": _ctx.ariaLabel, onEndReached: _ctx.onEndReached }, createSlots({ default: withCtx((scope) => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(scope)))]), _: 2 }, [ _ctx.$slots.header ? { name: "header", fn: withCtx(() => [createElementVNode("div", { class: normalizeClass(_ctx.nsSelect.be("dropdown", "header")), onClick: _cache[12] || (_cache[12] = withModifiers(() => {}, ["stop"])) }, [renderSlot(_ctx.$slots, "header")], 2)]), key: "0" } : void 0, _ctx.$slots.loading && _ctx.loading ? { name: "loading", fn: withCtx(() => [createElementVNode("div", { class: normalizeClass(_ctx.nsSelect.be("dropdown", "loading")) }, [renderSlot(_ctx.$slots, "loading")], 2)]), key: "1" } : _ctx.loading || _ctx.filteredOptions.length === 0 ? { name: "empty", fn: withCtx(() => [createElementVNode("div", { class: normalizeClass(_ctx.nsSelect.be("dropdown", "empty")) }, [renderSlot(_ctx.$slots, "empty", {}, () => [createElementVNode("span", null, toDisplayString(_ctx.emptyText), 1)])], 2)]), key: "2" } : void 0, _ctx.$slots.footer ? { name: "footer", fn: withCtx(() => [createElementVNode("div", { class: normalizeClass(_ctx.nsSelect.be("dropdown", "footer")), onClick: _cache[13] || (_cache[13] = withModifiers(() => {}, ["stop"])) }, [renderSlot(_ctx.$slots, "footer")], 2)]), key: "3" } : void 0 ]), 1032, [ "id", "data", "width", "hovering-index", "scrollbar-always-on", "aria-label", "onEndReached" ])]), _: 3 }, 8, [ "visible", "teleported", "popper-class", "popper-style", "popper-options", "fallback-placements", "effect", "placement", "transition", "persistent", "append-to", "show-arrow", "offset", "onBeforeShow" ])], 34)), [[ _directive_click_outside, _ctx.handleClickOutside, _ctx.popperRef ]]); } var select_default = /* @__PURE__ */ _plugin_vue_export_helper_default(select_vue_vue_type_script_lang_default, [["render", _sfc_render$5]]); //#endregion //#region ../../packages/components/select-v2/index.ts const ElSelectV2 = withInstall(select_default); //#endregion //#region ../../packages/components/skeleton/src/skeleton.ts /** * @deprecated Removed after 3.0.0, Use `SkeletonProps` instead. */ const skeletonProps = buildProps({ /** * @description whether showing the animation */ animated: Boolean, /** * @description how many fake items to render to the DOM */ count: { type: Number, default: 1 }, /** * @description numbers of the row, only useful when no template slot were given */ rows: { type: Number, default: 3 }, /** * @description whether showing the real DOM */ loading: { type: Boolean, default: true }, /** * @description rendering delay in milliseconds */ throttle: { type: definePropType([Number, Object]) } }); //#endregion //#region ../../packages/components/skeleton/src/skeleton-item.ts /** * @deprecated Removed after 3.0.0, Use `SkeletonItemProps` instead. */ const skeletonItemProps = buildProps({ /** * @description the current rendering skeleton type */ variant: { type: String, values: [ "circle", "rect", "h1", "h3", "text", "caption", "p", "image", "button" ], default: "text" } }); //#endregion //#region ../../packages/components/skeleton/src/skeleton-item.vue?vue&type=script&setup=true&lang.ts var skeleton_item_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElSkeletonItem", __name: "skeleton-item", props: skeletonItemProps, setup(__props) { const ns = useNamespace("skeleton"); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass([unref(ns).e("item"), unref(ns).e(__props.variant)]) }, [__props.variant === "image" ? (openBlock(), createBlock(unref(picture_filled_default), { key: 0 })) : createCommentVNode("v-if", true)], 2); }; } }); //#endregion //#region ../../packages/components/skeleton/src/skeleton-item.vue var skeleton_item_default = skeleton_item_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/skeleton/src/skeleton.vue?vue&type=script&setup=true&lang.ts var skeleton_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElSkeleton", __name: "skeleton", props: skeletonProps, setup(__props, { expose: __expose }) { const props = __props; const ns = useNamespace("skeleton"); const uiLoading = useThrottleRender(toRef(props, "loading"), props.throttle); __expose({ /** @description loading state */ uiLoading }); return (_ctx, _cache) => { return unref(uiLoading) ? (openBlock(), createElementBlock("div", mergeProps({ key: 0, class: [unref(ns).b(), unref(ns).is("animated", __props.animated)] }, _ctx.$attrs), [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.count, (i) => { return openBlock(), createElementBlock(Fragment, { key: i }, [unref(uiLoading) ? renderSlot(_ctx.$slots, "template", { key: i }, () => [createVNode(skeleton_item_default, { class: normalizeClass(unref(ns).is("first")), variant: "p" }, null, 8, ["class"]), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.rows, (item) => { return openBlock(), createBlock(skeleton_item_default, { key: item, class: normalizeClass([unref(ns).e("paragraph"), unref(ns).is("last", item === __props.rows && __props.rows > 1)]), variant: "p" }, null, 8, ["class"]); }), 128))]) : createCommentVNode("v-if", true)], 64); }), 128))], 16)) : renderSlot(_ctx.$slots, "default", normalizeProps(mergeProps({ key: 1 }, _ctx.$attrs))); }; } }); //#endregion //#region ../../packages/components/skeleton/src/skeleton.vue var skeleton_default = skeleton_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/skeleton/index.ts const ElSkeleton = withInstall(skeleton_default, { SkeletonItem: skeleton_item_default }); const ElSkeletonItem = withNoopInstall(skeleton_item_default); //#endregion //#region ../../packages/components/slider/src/constants.ts const sliderContextKey = Symbol("sliderContextKey"); //#endregion //#region ../../packages/components/slider/src/slider.ts const sliderProps = buildProps({ /** * @description binding value */ modelValue: { type: definePropType([Number, Array]), default: 0 }, id: { type: String, default: void 0 }, /** * @description minimum value */ min: { type: Number, default: 0 }, /** * @description maximum value */ max: { type: Number, default: 100 }, /** * @description step size, can be a number or `'mark'` to restrict values to marks. When set to `'mark'`, the `marks` attribute must be set */ step: { type: definePropType([Number, String]), default: 1 }, /** * @description whether to display an input box, works when `range` is false and `step` is not `'mark'` */ showInput: Boolean, /** * @description whether to display control buttons when `show-input` is true */ showInputControls: { type: Boolean, default: true }, /** * @description size of the slider wrapper, will not work in vertical mode */ size: useSizeProp, /** * @description size of the input box, when set `size`, the default is the value of `size` */ inputSize: useSizeProp, /** * @description whether to display breakpoints */ showStops: Boolean, /** * @description whether to display tooltip value */ showTooltip: { type: Boolean, default: true }, /** * @description format to display tooltip value */ formatTooltip: { type: definePropType(Function), default: void 0 }, /** * @description whether Slider is disabled */ disabled: { type: Boolean, default: void 0 }, /** * @description whether to select a range */ range: Boolean, /** * @description vertical mode */ vertical: Boolean, /** * @description slider height, required in vertical mode */ height: String, /** * @description when `range` is true, screen reader label for the start of the range */ rangeStartLabel: { type: String, default: void 0 }, /** * @description when `range` is true, screen reader label for the end of the range */ rangeEndLabel: { type: String, default: void 0 }, /** * @description format to display the `aria-valuenow` attribute for screen readers */ formatValueText: { type: definePropType(Function), default: void 0 }, /** * @description custom class name for the tooltip */ tooltipClass: { type: String, default: void 0 }, /** * @description position of Tooltip */ placement: { type: String, values: Ee, default: "top" }, /** * @description marks, type of key must be `number` and must in closed interval `[min, max]`, each mark can custom style */ marks: { type: definePropType(Object) }, /** * @description whether to trigger form validation */ validateEvent: { type: Boolean, default: true }, /** * @description when slider tooltip inactive and `persistent` is `false` , popconfirm will be destroyed. `persistent` always be `false` when `show-tooltip ` is `false` */ persistent: { type: Boolean, default: true }, ...useAriaProps(["ariaLabel"]) }); const isValidValue$1 = (value) => isNumber(value) || isArray$1(value) && value.every(isNumber); const sliderEmits = { [UPDATE_MODEL_EVENT]: isValidValue$1, [INPUT_EVENT]: isValidValue$1, [CHANGE_EVENT]: isValidValue$1 }; //#endregion //#region ../../packages/components/slider/src/composables/use-lifecycle.ts const useLifecycle = (props, initData, resetSize) => { const sliderWrapper = ref(); onMounted(async () => { if (props.range) { if (isArray$1(props.modelValue)) { initData.firstValue = Math.max(props.min, props.modelValue[0]); initData.secondValue = Math.min(props.max, props.modelValue[1]); } else { initData.firstValue = props.min; initData.secondValue = props.max; } initData.oldValue = [initData.firstValue, initData.secondValue]; } else { if (!isNumber(props.modelValue) || Number.isNaN(props.modelValue)) initData.firstValue = props.min; else initData.firstValue = Math.min(props.max, Math.max(props.min, props.modelValue)); initData.oldValue = initData.firstValue; } useEventListener(window, "resize", resetSize); await nextTick(); resetSize(); }); return { sliderWrapper }; }; //#endregion //#region ../../packages/components/slider/src/composables/use-marks.ts const useMarks = (props) => { const markList = computed(() => { if (!props.marks) return []; return Object.keys(props.marks).map(Number.parseFloat).sort((a, b) => a - b).filter((point) => point <= props.max && point >= props.min).map((point) => ({ point, position: (point - props.min) * 100 / (props.max - props.min), mark: props.marks[point] })); }); watchEffect(() => { if (props.step === "mark" && !props.marks) /* @__PURE__ */ debugWarn("ElSlider", "marks prop must be provided when step is mark"); if (props.marks) { const keys = Object.keys(props.marks); const validPoints = markList.value.map((m) => m.point); const invalidKeys = keys.filter((key) => { const parsed = Number.parseFloat(key); return Number.isNaN(parsed) || !validPoints.includes(parsed); }); if (invalidKeys.length > 0) /* @__PURE__ */ debugWarn("ElSlider", `Some marks keys are invalid (not a number or out of [min, max]): [${invalidKeys.map((k) => `'${k}'`).join(", ")}] and will be ignored.`); } }); return markList; }; //#endregion //#region ../../packages/components/slider/src/composables/use-slide.ts const useSlide = (props, initData, emit) => { const { formItem: elFormItem } = useFormItem(); const slider = shallowRef(); const firstButton = ref(); const secondButton = ref(); const buttonRefs = { firstButton, secondButton }; const sliderDisabled = useFormDisabled(); const minValue = computed(() => { return Math.min(initData.firstValue, initData.secondValue); }); const maxValue = computed(() => { return Math.max(initData.firstValue, initData.secondValue); }); const barSize = computed(() => { return props.range ? `${100 * (maxValue.value - minValue.value) / (props.max - props.min)}%` : `${100 * (initData.firstValue - props.min) / (props.max - props.min)}%`; }); const barStart = computed(() => { return props.range ? `${100 * (minValue.value - props.min) / (props.max - props.min)}%` : "0%"; }); const runwayStyle = computed(() => { return props.vertical ? { height: props.height } : {}; }); const barStyle = computed(() => { return props.vertical ? { height: barSize.value, bottom: barStart.value } : { width: barSize.value, left: barStart.value }; }); const resetSize = () => { if (slider.value) initData.sliderSize = slider.value.getBoundingClientRect()[props.vertical ? "height" : "width"]; }; const getButtonRefByPercent = (percent) => { const targetValue = props.min + percent * (props.max - props.min) / 100; if (!props.range) return firstButton; let buttonRefName; if (Math.abs(minValue.value - targetValue) < Math.abs(maxValue.value - targetValue)) buttonRefName = initData.firstValue < initData.secondValue ? "firstButton" : "secondButton"; else buttonRefName = initData.firstValue > initData.secondValue ? "firstButton" : "secondButton"; return buttonRefs[buttonRefName]; }; const setPosition = (percent) => { const buttonRef = getButtonRefByPercent(percent); buttonRef.value.setPosition(percent); return buttonRef; }; const setFirstValue = (firstValue) => { initData.firstValue = firstValue ?? props.min; _emit(props.range ? [minValue.value, maxValue.value] : firstValue ?? props.min); }; const setSecondValue = (secondValue) => { initData.secondValue = secondValue; if (props.range) _emit([minValue.value, maxValue.value]); }; const _emit = (val) => { emit(UPDATE_MODEL_EVENT, val); emit(INPUT_EVENT, val); }; const emitChange = async () => { await nextTick(); emit(CHANGE_EVENT, props.range ? [minValue.value, maxValue.value] : props.modelValue); }; const handleSliderPointerEvent = (event) => { if (sliderDisabled.value || initData.dragging) return; resetSize(); let newPercent = 0; if (props.vertical) { const clientY = event.touches?.item(0)?.clientY ?? event.clientY; newPercent = (slider.value.getBoundingClientRect().bottom - clientY) / initData.sliderSize * 100; } else newPercent = ((event.touches?.item(0)?.clientX ?? event.clientX) - slider.value.getBoundingClientRect().left) / initData.sliderSize * 100; if (newPercent < 0 || newPercent > 100) return; return setPosition(newPercent); }; const onSliderWrapperPrevent = (event) => { if (buttonRefs["firstButton"].value?.dragging || buttonRefs["secondButton"].value?.dragging) event.preventDefault(); }; const onSliderDown = async (event) => { const buttonRef = handleSliderPointerEvent(event); if (buttonRef) { await nextTick(); buttonRef.value.onButtonDown(event); } }; const onSliderClick = (event) => { if (handleSliderPointerEvent(event)) emitChange(); }; const onSliderMarkerDown = (position) => { if (sliderDisabled.value || initData.dragging) return; if (setPosition(position)) emitChange(); }; return { elFormItem, slider, firstButton, secondButton, sliderDisabled, minValue, maxValue, runwayStyle, barStyle, resetSize, setPosition, emitChange, onSliderWrapperPrevent, onSliderClick, onSliderDown, onSliderMarkerDown, setFirstValue, setSecondValue }; }; //#endregion //#region ../../packages/components/slider/src/composables/use-slider-button.ts const useTooltip = (props, formatTooltip, showTooltip) => { const tooltip = ref(); const tooltipVisible = ref(false); const enableFormat = computed(() => { return formatTooltip.value instanceof Function; }); return { tooltip, tooltipVisible, formatValue: computed(() => { return enableFormat.value && formatTooltip.value(props.modelValue) || props.modelValue; }), displayTooltip: debounce(() => { showTooltip.value && (tooltipVisible.value = true); }, 50), hideTooltip: debounce(() => { showTooltip.value && (tooltipVisible.value = false); }, 50) }; }; const useSliderButton = (props, initData, emit) => { const { disabled, min, max, step, showTooltip, persistent, precision, sliderSize, formatTooltip, emitChange, resetSize, updateDragging, markList } = inject(sliderContextKey); const { tooltip, tooltipVisible, formatValue, displayTooltip, hideTooltip } = useTooltip(props, formatTooltip, showTooltip); const button = ref(); const currentPosition = computed(() => { return `${(props.modelValue - min.value) / (max.value - min.value) * 100}%`; }); const wrapperStyle = computed(() => { return props.vertical ? { bottom: currentPosition.value } : { left: currentPosition.value }; }); const shouldMoveToMark = computed(() => { return step.value === "mark" && markList.value.length > 0; }); const handleMouseEnter = () => { initData.hovering = true; displayTooltip(); }; const handleMouseLeave = () => { initData.hovering = false; if (!initData.dragging) hideTooltip(); }; const onButtonDown = (event) => { if (disabled.value) return; event.preventDefault(); onDragStart(event); window.addEventListener("mousemove", onDragging); window.addEventListener("touchmove", onDragging); window.addEventListener("mouseup", onDragEnd); window.addEventListener("touchend", onDragEnd); window.addEventListener("contextmenu", onDragEnd); button.value.focus(); }; const incrementPosition = (amount) => { if (disabled.value) return; initData.newPosition = Number.parseFloat(currentPosition.value) + amount / (max.value - min.value) * 100; setPosition(initData.newPosition); emitChange(); }; const moveToMark = (amount) => { if (disabled.value || !markList.value.length) return; const current = props.modelValue; const epsilon = Number.EPSILON; const stride = Math.abs(amount); let target; if (amount > 0) { const startIndex = markList.value.findIndex((m) => m.point > current + epsilon); if (startIndex !== -1) { const targetIndex = Math.min(startIndex + stride - 1, markList.value.length - 1); target = markList.value[targetIndex].point; } } else { let startIndex = -1; for (let i = markList.value.length - 1; i >= 0; i--) if (markList.value[i].point < current - epsilon) { startIndex = i; break; } if (startIndex !== -1) { const targetIndex = Math.max(startIndex - (stride - 1), 0); target = markList.value[targetIndex].point; } } if (target !== void 0 && target !== current) { setPosition((target - min.value) / (max.value - min.value) * 100); emitChange(); } }; const onLeftKeyDown = () => { if (shouldMoveToMark.value) moveToMark(-1); else if (isNumber(step.value)) incrementPosition(-step.value); }; const onRightKeyDown = () => { if (shouldMoveToMark.value) moveToMark(1); else if (isNumber(step.value)) incrementPosition(step.value); }; const onPageDownKeyDown = () => { if (shouldMoveToMark.value) moveToMark(-4); else if (isNumber(step.value)) incrementPosition(-step.value * 4); }; const onPageUpKeyDown = () => { if (shouldMoveToMark.value) moveToMark(4); else if (isNumber(step.value)) incrementPosition(step.value * 4); }; const onHomeKeyDown = () => { if (disabled.value) return; setPosition(0); emitChange(); }; const onEndKeyDown = () => { if (disabled.value) return; setPosition(100); emitChange(); }; const onKeyDown = (event) => { const code = getEventCode(event); let isPreventDefault = true; switch (code) { case EVENT_CODE.left: case EVENT_CODE.down: onLeftKeyDown(); break; case EVENT_CODE.right: case EVENT_CODE.up: onRightKeyDown(); break; case EVENT_CODE.home: onHomeKeyDown(); break; case EVENT_CODE.end: onEndKeyDown(); break; case EVENT_CODE.pageDown: onPageDownKeyDown(); break; case EVENT_CODE.pageUp: onPageUpKeyDown(); break; default: isPreventDefault = false; break; } isPreventDefault && event.preventDefault(); }; const getClientXY = (event) => { let clientX; let clientY; if (event.type.startsWith("touch")) { clientY = event.touches[0].clientY; clientX = event.touches[0].clientX; } else { clientY = event.clientY; clientX = event.clientX; } return { clientX, clientY }; }; const onDragStart = (event) => { initData.dragging = true; initData.isClick = true; const { clientX, clientY } = getClientXY(event); if (props.vertical) initData.startY = clientY; else initData.startX = clientX; initData.startPosition = Number.parseFloat(currentPosition.value); initData.newPosition = initData.startPosition; }; const onDragging = (event) => { if (initData.dragging) { initData.isClick = false; displayTooltip(); resetSize(); let diff; const { clientX, clientY } = getClientXY(event); if (props.vertical) { initData.currentY = clientY; diff = (initData.startY - initData.currentY) / sliderSize.value * 100; } else { initData.currentX = clientX; diff = (initData.currentX - initData.startX) / sliderSize.value * 100; } initData.newPosition = initData.startPosition + diff; setPosition(initData.newPosition); } }; const onDragEnd = () => { if (initData.dragging) { setTimeout(() => { initData.dragging = false; if (!initData.hovering) hideTooltip(); if (!initData.isClick) setPosition(initData.newPosition); emitChange(); }, 0); window.removeEventListener("mousemove", onDragging); window.removeEventListener("touchmove", onDragging); window.removeEventListener("mouseup", onDragEnd); window.removeEventListener("touchend", onDragEnd); window.removeEventListener("contextmenu", onDragEnd); } }; const setPosition = async (newPosition) => { if (newPosition === null || Number.isNaN(+newPosition)) return; newPosition = clamp$1(newPosition, 0, 100); let value; if (step.value === "mark") if (markList.value.length === 0) value = newPosition <= 50 ? min.value : max.value; else value = markList.value.reduce((prev, curr) => { return Math.abs(curr.position - newPosition) < Math.abs(prev.position - newPosition) ? curr : prev; }).point; else { const fullSteps = Math.floor((max.value - min.value) / step.value); const fullRangePercentage = fullSteps * step.value / (max.value - min.value) * 100; const threshold = fullRangePercentage + (100 - fullRangePercentage) / 2; if (newPosition < fullRangePercentage) { const valueBetween = fullRangePercentage / fullSteps; const steps = Math.round(newPosition / valueBetween); value = min.value + steps * step.value; } else if (newPosition < threshold) value = min.value + fullSteps * step.value; else value = max.value; value = Number.parseFloat(value.toFixed(precision.value)); } if (value !== props.modelValue) emit(UPDATE_MODEL_EVENT, value); if (!initData.dragging && props.modelValue !== initData.oldValue) initData.oldValue = props.modelValue; await nextTick(); initData.dragging && displayTooltip(); tooltip.value.updatePopper(); }; watch(() => initData.dragging, (val) => { updateDragging(val); }); useEventListener(button, "touchstart", onButtonDown, { passive: false }); return { disabled, button, tooltip, tooltipVisible, showTooltip, persistent, wrapperStyle, formatValue, handleMouseEnter, handleMouseLeave, onButtonDown, onKeyDown, setPosition }; }; //#endregion //#region ../../packages/components/slider/src/composables/use-stops.ts const useStops = (props, initData, minValue, maxValue) => { const stops = computed(() => { if (!props.showStops || props.min > props.max) return []; if (props.step === "mark" || props.step === 0) { if (props.step === 0) /* @__PURE__ */ debugWarn("ElSlider", "step should not be 0."); return []; } const stopCount = Math.ceil((props.max - props.min) / props.step); const stepWidth = 100 * props.step / (props.max - props.min); const result = Array.from({ length: stopCount - 1 }).map((_, index) => (index + 1) * stepWidth); if (props.range) return result.filter((step) => { return step < 100 * (minValue.value - props.min) / (props.max - props.min) || step > 100 * (maxValue.value - props.min) / (props.max - props.min); }); else return result.filter((step) => step > 100 * (initData.firstValue - props.min) / (props.max - props.min)); }); const getStopStyle = (position) => { return props.vertical ? { bottom: `${position}%` } : { left: `${position}%` }; }; return { stops, getStopStyle }; }; //#endregion //#region ../../packages/components/slider/src/composables/use-watch.ts const useWatch = (props, initData, minValue, maxValue, emit, elFormItem) => { const _emit = (val) => { emit(UPDATE_MODEL_EVENT, val); emit(INPUT_EVENT, val); }; const valueChanged = () => { if (props.range) return ![minValue.value, maxValue.value].every((item, index) => item === initData.oldValue[index]); else return props.modelValue !== initData.oldValue; }; const setValues = () => { if (props.min > props.max) throwError("Slider", "min should not be greater than max."); const val = props.modelValue; if (props.range && isArray$1(val)) if (val[1] < props.min) _emit([props.min, props.min]); else if (val[0] > props.max) _emit([props.max, props.max]); else if (val[0] < props.min) _emit([props.min, val[1]]); else if (val[1] > props.max) _emit([val[0], props.max]); else { initData.firstValue = val[0]; initData.secondValue = val[1]; if (valueChanged()) { if (props.validateEvent) elFormItem?.validate?.("change").catch(NOOP); initData.oldValue = val.slice(); } } else if (!props.range && isNumber(val) && !Number.isNaN(val)) if (val < props.min) _emit(props.min); else if (val > props.max) _emit(props.max); else { initData.firstValue = val; if (valueChanged()) { if (props.validateEvent) elFormItem?.validate?.("change").catch(NOOP); initData.oldValue = val; } } }; setValues(); watch(() => initData.dragging, (val) => { if (!val) setValues(); }); watch(() => props.modelValue, (val, oldVal) => { if (initData.dragging || isArray$1(val) && isArray$1(oldVal) && val.every((item, index) => item === oldVal[index]) && initData.firstValue === val[0] && initData.secondValue === val[1]) return; setValues(); }, { deep: true }); watch(() => [props.min, props.max], () => { setValues(); }); }; //#endregion //#region ../../packages/components/slider/src/button.ts const sliderButtonProps = buildProps({ modelValue: { type: Number, default: 0 }, vertical: Boolean, tooltipClass: String, placement: { type: String, values: Ee, default: "top" } }); const sliderButtonEmits = { [UPDATE_MODEL_EVENT]: (value) => isNumber(value) }; //#endregion //#region ../../packages/components/slider/src/button.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$20 = ["tabindex"]; var button_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElSliderButton", __name: "button", props: sliderButtonProps, emits: sliderButtonEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const ns = useNamespace("slider"); const initData = reactive({ hovering: false, dragging: false, isClick: false, startX: 0, currentX: 0, startY: 0, currentY: 0, startPosition: 0, newPosition: 0, oldValue: props.modelValue }); const tooltipPersistent = computed(() => !showTooltip.value ? false : persistent.value); const { disabled, button, tooltip, showTooltip, persistent, tooltipVisible, wrapperStyle, formatValue, handleMouseEnter, handleMouseLeave, onButtonDown, onKeyDown, setPosition } = useSliderButton(props, initData, emit); const { hovering, dragging } = toRefs(initData); __expose({ onButtonDown, onKeyDown, setPosition, hovering, dragging }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { ref_key: "button", ref: button, class: normalizeClass([unref(ns).e("button-wrapper"), { hover: unref(hovering), dragging: unref(dragging) }]), style: normalizeStyle(unref(wrapperStyle)), tabindex: unref(disabled) ? void 0 : 0, onMouseenter: _cache[0] || (_cache[0] = (...args) => unref(handleMouseEnter) && unref(handleMouseEnter)(...args)), onMouseleave: _cache[1] || (_cache[1] = (...args) => unref(handleMouseLeave) && unref(handleMouseLeave)(...args)), onMousedown: _cache[2] || (_cache[2] = (...args) => unref(onButtonDown) && unref(onButtonDown)(...args)), onFocus: _cache[3] || (_cache[3] = (...args) => unref(handleMouseEnter) && unref(handleMouseEnter)(...args)), onBlur: _cache[4] || (_cache[4] = (...args) => unref(handleMouseLeave) && unref(handleMouseLeave)(...args)), onKeydown: _cache[5] || (_cache[5] = (...args) => unref(onKeyDown) && unref(onKeyDown)(...args)) }, [createVNode(unref(ElTooltip), { ref_key: "tooltip", ref: tooltip, visible: unref(tooltipVisible), placement: _ctx.placement, "fallback-placements": [ "top", "bottom", "right", "left" ], "stop-popper-mouse-event": false, "popper-class": _ctx.tooltipClass, disabled: !unref(showTooltip), persistent: tooltipPersistent.value }, { content: withCtx(() => [createElementVNode("span", null, toDisplayString(unref(formatValue)), 1)]), default: withCtx(() => [createElementVNode("div", { class: normalizeClass([unref(ns).e("button"), { hover: unref(hovering), dragging: unref(dragging) }]) }, null, 2)]), _: 1 }, 8, [ "visible", "placement", "popper-class", "disabled", "persistent" ])], 46, _hoisted_1$20); }; } }); //#endregion //#region ../../packages/components/slider/src/button.vue var button_default = button_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/slider/src/marker.ts const sliderMarkerProps = buildProps({ mark: { type: definePropType([String, Object]), default: void 0 } }); var marker_default = defineComponent({ name: "ElSliderMarker", props: sliderMarkerProps, setup(props) { const ns = useNamespace("slider"); const label = computed(() => { return isString(props.mark) ? props.mark : props.mark.label; }); const style = computed(() => isString(props.mark) ? void 0 : props.mark.style); return () => h("div", { class: ns.e("marks-text"), style: style.value }, label.value); } }); //#endregion //#region ../../packages/components/slider/src/slider.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$19 = [ "id", "role", "aria-label", "aria-labelledby" ]; const _hoisted_2$12 = { key: 1 }; var slider_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElSlider", __name: "slider", props: sliderProps, emits: sliderEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const ns = useNamespace("slider"); const { t } = useLocale(); const initData = reactive({ firstValue: 0, secondValue: 0, oldValue: 0, dragging: false, sliderSize: 1 }); const { elFormItem, slider, firstButton, secondButton, sliderDisabled, minValue, maxValue, runwayStyle, barStyle, resetSize, emitChange, onSliderWrapperPrevent, onSliderClick, onSliderDown, onSliderMarkerDown, setFirstValue, setSecondValue } = useSlide(props, initData, emit); const { stops, getStopStyle } = useStops(props, initData, minValue, maxValue); const { inputId, isLabeledByFormItem } = useFormItemInputId(props, { formItemContext: elFormItem }); const sliderWrapperSize = useFormSize(); const sliderInputSize = computed(() => props.inputSize || sliderWrapperSize.value); const renderInput = computed(() => { return props.showInput && !props.range && props.step !== "mark"; }); const groupLabel = computed(() => { return props.ariaLabel || t("el.slider.defaultLabel", { min: props.min, max: props.max }); }); const firstButtonLabel = computed(() => { if (props.range) return props.rangeStartLabel || t("el.slider.defaultRangeStartLabel"); else return groupLabel.value; }); const firstValueText = computed(() => { return props.formatValueText ? props.formatValueText(firstValue.value) : `${firstValue.value}`; }); const secondButtonLabel = computed(() => { return props.rangeEndLabel || t("el.slider.defaultRangeEndLabel"); }); const secondValueText = computed(() => { return props.formatValueText ? props.formatValueText(secondValue.value) : `${secondValue.value}`; }); const sliderKls = computed(() => [ ns.b(), ns.m(sliderWrapperSize.value), ns.is("vertical", props.vertical), { [ns.m("with-input")]: renderInput.value } ]); const markList = useMarks(props); useWatch(props, initData, minValue, maxValue, emit, elFormItem); const sliderInputStep = computed(() => { return isNumber(props.step) ? props.step : 1; }); const precision = computed(() => { const stepValue = isNumber(props.step) ? props.step : 1; const precisions = [ props.min, props.max, stepValue ].map((item) => { const decimal = `${item}`.split(".")[1]; return decimal ? decimal.length : 0; }); return Math.max.apply(null, precisions); }); const { sliderWrapper } = useLifecycle(props, initData, resetSize); const { firstValue, secondValue, sliderSize } = toRefs(initData); const updateDragging = (val) => { initData.dragging = val; }; useEventListener(sliderWrapper, "touchstart", onSliderWrapperPrevent, { passive: false }); useEventListener(sliderWrapper, "touchmove", onSliderWrapperPrevent, { passive: false }); provide(sliderContextKey, { ...toRefs(props), sliderSize, disabled: sliderDisabled, precision, markList, emitChange, resetSize, updateDragging }); __expose({ onSliderClick }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { id: _ctx.range ? unref(inputId) : void 0, ref_key: "sliderWrapper", ref: sliderWrapper, class: normalizeClass(sliderKls.value), role: _ctx.range ? "group" : void 0, "aria-label": _ctx.range && !unref(isLabeledByFormItem) ? groupLabel.value : void 0, "aria-labelledby": _ctx.range && unref(isLabeledByFormItem) ? unref(elFormItem)?.labelId : void 0 }, [createElementVNode("div", { ref_key: "slider", ref: slider, class: normalizeClass([ unref(ns).e("runway"), { "show-input": renderInput.value }, unref(ns).is("disabled", unref(sliderDisabled)) ]), style: normalizeStyle(unref(runwayStyle)), onMousedown: _cache[0] || (_cache[0] = (...args) => unref(onSliderDown) && unref(onSliderDown)(...args)), onTouchstartPassive: _cache[1] || (_cache[1] = (...args) => unref(onSliderDown) && unref(onSliderDown)(...args)) }, [ createElementVNode("div", { class: normalizeClass(unref(ns).e("bar")), style: normalizeStyle(unref(barStyle)) }, null, 6), createVNode(button_default, { id: !_ctx.range ? unref(inputId) : void 0, ref_key: "firstButton", ref: firstButton, "model-value": unref(firstValue), vertical: _ctx.vertical, "tooltip-class": _ctx.tooltipClass, placement: _ctx.placement, role: "slider", "aria-label": _ctx.range || !unref(isLabeledByFormItem) ? firstButtonLabel.value : void 0, "aria-labelledby": !_ctx.range && unref(isLabeledByFormItem) ? unref(elFormItem)?.labelId : void 0, "aria-valuemin": _ctx.min, "aria-valuemax": _ctx.range ? unref(secondValue) : _ctx.max, "aria-valuenow": unref(firstValue), "aria-valuetext": firstValueText.value, "aria-orientation": _ctx.vertical ? "vertical" : "horizontal", "aria-disabled": unref(sliderDisabled), "onUpdate:modelValue": unref(setFirstValue) }, null, 8, [ "id", "model-value", "vertical", "tooltip-class", "placement", "aria-label", "aria-labelledby", "aria-valuemin", "aria-valuemax", "aria-valuenow", "aria-valuetext", "aria-orientation", "aria-disabled", "onUpdate:modelValue" ]), _ctx.range ? (openBlock(), createBlock(button_default, { key: 0, ref_key: "secondButton", ref: secondButton, "model-value": unref(secondValue), vertical: _ctx.vertical, "tooltip-class": _ctx.tooltipClass, placement: _ctx.placement, role: "slider", "aria-label": secondButtonLabel.value, "aria-valuemin": unref(firstValue), "aria-valuemax": _ctx.max, "aria-valuenow": unref(secondValue), "aria-valuetext": secondValueText.value, "aria-orientation": _ctx.vertical ? "vertical" : "horizontal", "aria-disabled": unref(sliderDisabled), "onUpdate:modelValue": unref(setSecondValue) }, null, 8, [ "model-value", "vertical", "tooltip-class", "placement", "aria-label", "aria-valuemin", "aria-valuemax", "aria-valuenow", "aria-valuetext", "aria-orientation", "aria-disabled", "onUpdate:modelValue" ])) : createCommentVNode("v-if", true), _ctx.showStops ? (openBlock(), createElementBlock("div", _hoisted_2$12, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(stops), (item, key) => { return openBlock(), createElementBlock("div", { key, class: normalizeClass(unref(ns).e("stop")), style: normalizeStyle(unref(getStopStyle)(item)) }, null, 6); }), 128))])) : createCommentVNode("v-if", true), unref(markList).length > 0 ? (openBlock(), createElementBlock(Fragment, { key: 2 }, [createElementVNode("div", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(markList), (item, key) => { return openBlock(), createElementBlock("div", { key, style: normalizeStyle(unref(getStopStyle)(item.position)), class: normalizeClass([unref(ns).e("stop"), unref(ns).e("marks-stop")]) }, null, 6); }), 128))]), createElementVNode("div", { class: normalizeClass(unref(ns).e("marks")) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(markList), (item, key) => { return openBlock(), createBlock(unref(marker_default), { key, mark: item.mark, style: normalizeStyle(unref(getStopStyle)(item.position)), onMousedown: withModifiers(($event) => unref(onSliderMarkerDown)(item.position), ["stop"]) }, null, 8, [ "mark", "style", "onMousedown" ]); }), 128))], 2)], 64)) : createCommentVNode("v-if", true) ], 38), renderInput.value ? (openBlock(), createBlock(unref(ElInputNumber), { key: 0, ref: "input", "model-value": unref(firstValue), class: normalizeClass(unref(ns).e("input")), step: sliderInputStep.value, disabled: unref(sliderDisabled), controls: _ctx.showInputControls, min: _ctx.min, max: _ctx.max, precision: precision.value, size: sliderInputSize.value, "onUpdate:modelValue": unref(setFirstValue), onChange: unref(emitChange) }, null, 8, [ "model-value", "class", "step", "disabled", "controls", "min", "max", "precision", "size", "onUpdate:modelValue", "onChange" ])) : createCommentVNode("v-if", true)], 10, _hoisted_1$19); }; } }); //#endregion //#region ../../packages/components/slider/src/slider.vue var slider_default = slider_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/slider/index.ts const ElSlider = withInstall(slider_default); //#endregion //#region ../../packages/components/space/src/item.ts const spaceItemProps = buildProps({ prefixCls: { type: String } }); const SpaceItem = defineComponent({ name: "ElSpaceItem", props: spaceItemProps, setup(props, { slots }) { const ns = useNamespace("space"); const classes = computed(() => `${props.prefixCls || ns.b()}__item`); return () => h("div", { class: classes.value }, renderSlot(slots, "default")); } }); //#endregion //#region ../../packages/components/space/src/use-space.ts const SIZE_MAP = { small: 8, default: 12, large: 16 }; function useSpace(props) { const ns = useNamespace("space"); const classes = computed(() => [ ns.b(), ns.m(props.direction), props.class ]); const horizontalSize = ref(0); const verticalSize = ref(0); const containerStyle = computed(() => { return [ props.wrap || props.fill ? { flexWrap: "wrap" } : {}, { alignItems: props.alignment }, { rowGap: `${verticalSize.value}px`, columnGap: `${horizontalSize.value}px` }, props.style ]; }); const itemStyle = computed(() => { return props.fill ? { flexGrow: 1, minWidth: `${props.fillRatio}%` } : {}; }); watchEffect(() => { const { size = "small", wrap, direction: dir, fill } = props; if (isArray$1(size)) { const [h = 0, v = 0] = size; horizontalSize.value = h; verticalSize.value = v; } else { let val; if (isNumber(size)) val = size; else val = SIZE_MAP[size || "small"] || SIZE_MAP.small; if ((wrap || fill) && dir === "horizontal") horizontalSize.value = verticalSize.value = val; else if (dir === "horizontal") { horizontalSize.value = val; verticalSize.value = 0; } else { verticalSize.value = val; horizontalSize.value = 0; } } }); return { classes, containerStyle, itemStyle }; } //#endregion //#region ../../packages/components/space/src/space.ts const spaceProps = buildProps({ /** * @description Placement direction */ direction: { type: String, values: ["horizontal", "vertical"], default: "horizontal" }, /** * @description Classname */ class: { type: definePropType([ String, Object, Array ]), default: "" }, /** * @description Extra style rules */ style: { type: definePropType([ String, Array, Object, Boolean ]), default: "" }, /** * @description Controls the alignment of items */ alignment: { type: definePropType(String), default: "center" }, /** * @description Prefix for space-items */ prefixCls: { type: String }, /** * @description Spacer */ spacer: { type: definePropType([ Object, String, Number, Array ]), default: null, validator: (val) => isVNode(val) || isNumber(val) || isString(val) }, /** * @description Auto wrapping */ wrap: Boolean, /** * @description Whether to fill the container */ fill: Boolean, /** * @description Ratio of fill */ fillRatio: { type: Number, default: 100 }, /** * @description Spacing size */ size: { type: [ String, Array, Number ], values: componentSizes, validator: (val) => { return isNumber(val) || isArray$1(val) && val.length === 2 && val.every(isNumber); } } }); const Space = defineComponent({ name: "ElSpace", props: spaceProps, setup(props, { slots }) { const { classes, containerStyle, itemStyle } = useSpace(props); function extractChildren(children, parentKey = "", extractedChildren = []) { const { prefixCls } = props; children.forEach((child, loopKey) => { if (isFragment(child)) { if (isArray$1(child.children)) child.children.forEach((nested, key) => { if (isFragment(nested) && isArray$1(nested.children)) extractChildren(nested.children, `${parentKey + key}-`, extractedChildren); else if (isVNode(nested) && nested?.type === Comment) extractedChildren.push(nested); else extractedChildren.push(createVNode(SpaceItem, { style: itemStyle.value, prefixCls, key: `nested-${parentKey + key}` }, { default: () => [nested] }, 8 | 4, ["style", "prefixCls"])); }); } else if (isValidElementNode(child)) extractedChildren.push(createVNode(SpaceItem, { style: itemStyle.value, prefixCls, key: `LoopKey${parentKey + loopKey}` }, { default: () => [child] }, 8 | 4, ["style", "prefixCls"])); }); return extractedChildren; } return () => { const { spacer, direction } = props; const children = renderSlot(slots, "default", { key: 0 }, () => []); if ((children.children ?? []).length === 0) return null; if (isArray$1(children.children)) { let extractedChildren = extractChildren(children.children); if (spacer) { const len = extractedChildren.length - 1; extractedChildren = extractedChildren.reduce((acc, child, idx) => { const children = [...acc, child]; if (idx !== len) children.push(createVNode("span", { style: [itemStyle.value, direction === "vertical" ? "width: 100%" : null], key: idx }, [isVNode(spacer) ? spacer : createTextVNode(spacer, 1)], 4)); return children; }, []); } return createVNode("div", { class: classes.value, style: containerStyle.value }, extractedChildren, 4 | 2); } return children.children; }; } }); //#endregion //#region ../../packages/components/space/index.ts const ElSpace = withInstall(Space); //#endregion //#region ../../packages/components/statistic/src/statistic.ts /** * @deprecated Removed after 3.0.0, Use `StatisticProps` instead. */ const statisticProps = buildProps({ /** * @description Setting the decimal point */ decimalSeparator: { type: String, default: "." }, /** * @description Sets the thousandth identifier */ groupSeparator: { type: String, default: "," }, /** * @description numerical precision */ precision: { type: Number, default: 0 }, /** * @description Custom numerical presentation */ formatter: Function, /** * @description Numerical content */ value: { type: definePropType([Number, Object]), default: 0 }, /** * @description Sets the prefix of a number */ prefix: String, /** * @description Sets the suffix of a number */ suffix: String, /** * @description Numeric titles */ title: String, /** * @description Styles numeric values */ valueStyle: { type: definePropType([ String, Object, Array, Boolean ]), default: void 0 } }); //#endregion //#region ../../packages/components/statistic/src/statistic.vue?vue&type=script&setup=true&lang.ts var statistic_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElStatistic", __name: "statistic", props: statisticProps, setup(__props, { expose: __expose }) { const props = __props; const ns = useNamespace("statistic"); const displayValue = computed(() => { const { value, formatter, precision, decimalSeparator, groupSeparator } = props; if (isFunction$1(formatter)) return formatter(value); if (!isNumber(value) || Number.isNaN(value)) return value; let [integer, decimal = ""] = String(value).split("."); decimal = decimal.padEnd(precision, "0").slice(0, precision > 0 ? precision : 0); integer = integer.replace(/\B(?=(\d{3})+(?!\d))/g, groupSeparator); return [integer, decimal].join(decimal ? decimalSeparator : ""); }); __expose({ /** * @description current display value */ displayValue }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass(unref(ns).b()) }, [_ctx.$slots.title || __props.title ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ns).e("head")) }, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])], 2)) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass(unref(ns).e("content")) }, [ _ctx.$slots.prefix || __props.prefix ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ns).e("prefix")) }, [renderSlot(_ctx.$slots, "prefix", {}, () => [createElementVNode("span", null, toDisplayString(__props.prefix), 1)])], 2)) : createCommentVNode("v-if", true), createElementVNode("span", { class: normalizeClass(unref(ns).e("number")), style: normalizeStyle(__props.valueStyle) }, toDisplayString(displayValue.value), 7), _ctx.$slots.suffix || __props.suffix ? (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass(unref(ns).e("suffix")) }, [renderSlot(_ctx.$slots, "suffix", {}, () => [createElementVNode("span", null, toDisplayString(__props.suffix), 1)])], 2)) : createCommentVNode("v-if", true) ], 2)], 2); }; } }); //#endregion //#region ../../packages/components/statistic/src/statistic.vue var statistic_default = statistic_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/statistic/index.ts const ElStatistic = withInstall(statistic_default); //#endregion //#region ../../packages/components/countdown/src/countdown.ts /** * @deprecated Removed after 3.0.0, Use `CountdownProps` instead. */ const countdownProps = buildProps({ /** * @description Formatting the countdown display */ format: { type: String, default: "HH:mm:ss" }, /** * @description Sets the prefix of a countdown */ prefix: String, /** * @description Sets the suffix of a countdown */ suffix: String, /** * @description countdown titles */ title: String, /** * @description target time */ value: { type: definePropType([Number, Object]), default: 0 }, /** * @description Styles countdown values */ valueStyle: { type: definePropType([ String, Object, Array, Boolean ]), default: void 0 } }); const countdownEmits = { finish: () => true, [CHANGE_EVENT]: (value) => isNumber(value) }; //#endregion //#region ../../packages/components/countdown/src/utils.ts const timeUnits$1 = [ ["Y", 1e3 * 60 * 60 * 24 * 365], ["M", 1e3 * 60 * 60 * 24 * 30], ["D", 1e3 * 60 * 60 * 24], ["H", 1e3 * 60 * 60], ["m", 1e3 * 60], ["s", 1e3], ["S", 1] ]; const getTime = (value) => { return isNumber(value) ? new Date(value).getTime() : value.valueOf(); }; const formatTime$1 = (timestamp, format) => { let timeLeft = timestamp; return timeUnits$1.reduce((current, [name, unit]) => { const replaceRegex = new RegExp(`${name}+(?![^\\[\\]]*\\])`, "g"); if (replaceRegex.test(current)) { const value = Math.floor(timeLeft / unit); timeLeft -= value * unit; return current.replace(replaceRegex, (match) => String(value).padStart(match.length, "0")); } return current; }, format).replace(/\[([^\]]*)]/g, "$1"); }; //#endregion //#region ../../packages/components/countdown/src/countdown.vue?vue&type=script&setup=true&lang.ts var countdown_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElCountdown", __name: "countdown", props: countdownProps, emits: countdownEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; let timer; const rawValue = ref(0); const displayValue = computed(() => formatTime$1(rawValue.value, props.format)); const formatter = (val) => formatTime$1(val, props.format); const stopTimer = () => { if (timer) { cAF(timer); timer = void 0; } }; const startTimer = () => { const timestamp = getTime(props.value); const frameFunc = () => { let diff = timestamp - Date.now(); emit(CHANGE_EVENT, diff); if (diff <= 0) { diff = 0; stopTimer(); emit("finish"); } else timer = rAF(frameFunc); rawValue.value = diff; }; timer = rAF(frameFunc); }; onMounted(() => { rawValue.value = getTime(props.value) - Date.now(); watch(() => [props.value, props.format], () => { stopTimer(); startTimer(); }, { immediate: true }); }); onBeforeUnmount(() => { stopTimer(); }); __expose({ /** * @description current display value */ displayValue }); return (_ctx, _cache) => { return openBlock(), createBlock(unref(ElStatistic), { value: rawValue.value, title: __props.title, prefix: __props.prefix, suffix: __props.suffix, "value-style": __props.valueStyle, formatter }, createSlots({ _: 2 }, [renderList(_ctx.$slots, (_, name) => { return { name, fn: withCtx(() => [renderSlot(_ctx.$slots, name)]) }; })]), 1032, [ "value", "title", "prefix", "suffix", "value-style" ]); }; } }); //#endregion //#region ../../packages/components/countdown/src/countdown.vue var countdown_default = countdown_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/countdown/index.ts const ElCountdown = withInstall(countdown_default); //#endregion //#region ../../packages/components/steps/src/steps.ts /** * @deprecated Removed after 3.0.0, Use `StepsProps` instead. */ const stepsProps = buildProps({ /** * @description the spacing of each step, will be responsive if omitted. Supports percentage. */ space: { type: [Number, String], default: "" }, /** * @description current activation step */ active: { type: Number, default: 0 }, /** * @description display direction */ direction: { type: String, default: "horizontal", values: ["horizontal", "vertical"] }, /** * @description center title and description */ alignCenter: { type: Boolean }, /** * @description whether to apply simple theme */ simple: { type: Boolean }, /** * @description status of end step */ finishStatus: { type: String, values: [ "wait", "process", "finish", "error", "success" ], default: "finish" }, /** * @description status of current step */ processStatus: { type: String, values: [ "wait", "process", "finish", "error", "success" ], default: "process" } }); const stepsEmits = { [CHANGE_EVENT]: (newVal, oldVal) => [newVal, oldVal].every(isNumber) }; //#endregion //#region ../../packages/components/steps/src/tokens.ts const STEPS_INJECTION_KEY = "ElSteps"; //#endregion //#region ../../packages/components/steps/src/steps.vue?vue&type=script&setup=true&lang.ts var steps_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElSteps", __name: "steps", props: stepsProps, emits: stepsEmits, setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const ns = useNamespace("steps"); const { children: steps, addChild: addStep, removeChild: removeStep, ChildrenSorter: StepsSorter } = useOrderedChildren(getCurrentInstance(), "ElStep"); watch(steps, () => { steps.value.forEach((instance, index) => { instance.setIndex(index); }); }); provide(STEPS_INJECTION_KEY, { props, steps, addStep, removeStep }); watch(() => props.active, (newVal, oldVal) => { emit(CHANGE_EVENT, newVal, oldVal); }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass([unref(ns).b(), unref(ns).m(__props.simple ? "simple" : __props.direction)]) }, [renderSlot(_ctx.$slots, "default"), createVNode(unref(StepsSorter))], 2); }; } }); //#endregion //#region ../../packages/components/steps/src/steps.vue var steps_default$1 = steps_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/steps/src/item.ts /** * @deprecated Removed after 3.0.0, Use `StepProps` instead. */ const stepProps = buildProps({ /** * @description step title */ title: { type: String, default: "" }, /** * @description step custom icon. Icons can be passed via named slot as well */ icon: { type: iconPropType }, /** * @description step description */ description: { type: String, default: "" }, /** * @description current status. It will be automatically set by Steps if not configured. */ status: { type: String, values: [ "", "wait", "process", "finish", "error", "success" ], default: "" } }); //#endregion //#region ../../packages/components/steps/src/item.vue?vue&type=script&setup=true&lang.ts var item_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElStep", __name: "item", props: stepProps, setup(__props) { const props = __props; const ns = useNamespace("step"); const index = ref(-1); const lineStyle = ref({}); const internalStatus = ref(""); const parent = inject(STEPS_INJECTION_KEY); const currentInstance = getCurrentInstance(); let stepDiff = 0; let beforeActive = 0; onMounted(() => { watch([ () => parent.props.active, () => parent.props.processStatus, () => parent.props.finishStatus ], ([active], [oldActive]) => { beforeActive = oldActive || 0; stepDiff = active - beforeActive; updateStatus(active); }, { immediate: true }); }); const currentStatus = computed(() => { return props.status || internalStatus.value; }); const prevInternalStatus = computed(() => { const prevStep = parent.steps.value[index.value - 1]; return prevStep ? prevStep.internalStatus.value : "wait"; }); const isCenter = computed(() => { return parent.props.alignCenter; }); const isVertical = computed(() => { return parent.props.direction === "vertical"; }); const isSimple = computed(() => { return parent.props.simple; }); const stepsCount = computed(() => { return parent.steps.value.length; }); const isLast = computed(() => { return parent.steps.value[stepsCount.value - 1]?.uid === currentInstance.uid; }); const space = computed(() => { return isSimple.value ? "" : parent.props.space; }); const containerKls = computed(() => { return [ ns.b(), ns.is(isSimple.value ? "simple" : parent.props.direction), ns.is("flex", isLast.value && !space.value && !isCenter.value), ns.is("center", isCenter.value && !isVertical.value && !isSimple.value) ]; }); const style = computed(() => { const style = { flexBasis: isNumber(space.value) ? `${space.value}px` : space.value ? space.value : `${100 / (stepsCount.value - (isCenter.value ? 0 : 1))}%` }; if (isVertical.value) return style; if (isLast.value) style.maxWidth = `${100 / stepsCount.value}%`; return style; }); const setIndex = (val) => { index.value = val; }; const calcProgress = (status) => { const isWait = status === "wait"; const style = { transitionDelay: `${Math.abs(stepDiff) === 1 ? 0 : stepDiff > 0 ? (index.value + 1 - beforeActive) * 150 : -(index.value + 1 - parent.props.active) * 150}ms` }; const step = status === parent.props.processStatus || isWait ? 0 : 100; style.borderWidth = step && !isSimple.value ? "1px" : 0; style[parent.props.direction === "vertical" ? "height" : "width"] = `${step}%`; lineStyle.value = style; }; const updateStatus = (activeIndex) => { if (activeIndex > index.value) internalStatus.value = parent.props.finishStatus; else if (activeIndex === index.value && prevInternalStatus.value !== "error") internalStatus.value = parent.props.processStatus; else internalStatus.value = "wait"; const prevChild = parent.steps.value[index.value - 1]; if (prevChild) prevChild.calcProgress(internalStatus.value); }; const stepItemState = { uid: currentInstance.uid, getVnode: () => currentInstance.vnode, currentStatus, internalStatus, setIndex, calcProgress }; parent.addStep(stepItemState); onBeforeUnmount(() => { parent.removeStep(stepItemState); }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { style: normalizeStyle(style.value), class: normalizeClass(containerKls.value) }, [ createCommentVNode(" icon & line "), createElementVNode("div", { class: normalizeClass([unref(ns).e("head"), unref(ns).is(currentStatus.value)]) }, [!isSimple.value ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ns).e("line")) }, [createElementVNode("i", { class: normalizeClass(unref(ns).e("line-inner")), style: normalizeStyle(lineStyle.value) }, null, 6)], 2)) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass([unref(ns).e("icon"), unref(ns).is(__props.icon || _ctx.$slots.icon ? "icon" : "text")]) }, [renderSlot(_ctx.$slots, "icon", {}, () => [__props.icon ? (openBlock(), createBlock(unref(ElIcon), { key: 0, class: normalizeClass(unref(ns).e("icon-inner")) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(__props.icon)))]), _: 1 }, 8, ["class"])) : currentStatus.value === "success" ? (openBlock(), createBlock(unref(ElIcon), { key: 1, class: normalizeClass([unref(ns).e("icon-inner"), unref(ns).is("status")]) }, { default: withCtx(() => [createVNode(unref(check_default))]), _: 1 }, 8, ["class"])) : currentStatus.value === "error" ? (openBlock(), createBlock(unref(ElIcon), { key: 2, class: normalizeClass([unref(ns).e("icon-inner"), unref(ns).is("status")]) }, { default: withCtx(() => [createVNode(unref(close_default))]), _: 1 }, 8, ["class"])) : !isSimple.value ? (openBlock(), createElementBlock("div", { key: 3, class: normalizeClass(unref(ns).e("icon-inner")) }, toDisplayString(index.value + 1), 3)) : createCommentVNode("v-if", true)])], 2)], 2), createCommentVNode(" title & description "), createElementVNode("div", { class: normalizeClass(unref(ns).e("main")) }, [createElementVNode("div", { class: normalizeClass([unref(ns).e("title"), unref(ns).is(currentStatus.value)]) }, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])], 2), isSimple.value ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ns).e("arrow")) }, null, 2)) : (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass([unref(ns).e("description"), unref(ns).is(currentStatus.value)]) }, [renderSlot(_ctx.$slots, "description", {}, () => [createTextVNode(toDisplayString(__props.description), 1)])], 2))], 2) ], 6); }; } }); //#endregion //#region ../../packages/components/steps/src/item.vue var item_default = item_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/steps/index.ts const ElSteps = withInstall(steps_default$1, { Step: item_default }); const ElStep = withNoopInstall(item_default); //#endregion //#region ../../packages/components/switch/src/switch.ts /** * @deprecated Removed after 3.0.0, Use `SwitchProps` instead. */ const switchProps = buildProps({ /** * @description binding value, it should be equivalent to either `active-value` or `inactive-value`, by default it's `boolean` type */ modelValue: { type: [ Boolean, String, Number ], default: false }, /** * @description whether Switch is disabled */ disabled: { type: Boolean, default: void 0 }, /** * @description whether Switch is in loading state */ loading: Boolean, /** * @description size of Switch */ size: { type: String, validator: isValidComponentSize }, /** * @description width of Switch */ width: { type: [String, Number], default: "" }, /** * @description whether icon or text is displayed inside dot, only the first character will be rendered for text */ inlinePrompt: Boolean, /** * @description component of the icon displayed in action when in `off` state */ inactiveActionIcon: { type: iconPropType }, /** * @description component of the icon displayed in action when in `on` state */ activeActionIcon: { type: iconPropType }, /** * @description component of the icon displayed when in `on` state, overrides `active-text` */ activeIcon: { type: iconPropType }, /** * @description component of the icon displayed when in `off` state, overrides `inactive-text` */ inactiveIcon: { type: iconPropType }, /** * @description text displayed when in `on` state */ activeText: { type: String, default: "" }, /** * @description text displayed when in `off` state */ inactiveText: { type: String, default: "" }, /** * @description switch value when in `on` state */ activeValue: { type: [ Boolean, String, Number ], default: true }, /** * @description switch value when in `off` state */ inactiveValue: { type: [ Boolean, String, Number ], default: false }, /** * @description input name of Switch */ name: { type: String, default: "" }, /** * @description whether to trigger form validation */ validateEvent: { type: Boolean, default: true }, /** * @description before-change hook before the switch state changes. If `false` is returned or a `Promise` is returned and then is rejected, will stop switching */ beforeChange: { type: definePropType(Function) }, /** * @description id for input */ id: String, /** * @description tabindex for input */ tabindex: { type: [String, Number] }, ...useAriaProps(["ariaLabel"]) }); const switchEmits = { [UPDATE_MODEL_EVENT]: (val) => isBoolean(val) || isString(val) || isNumber(val), [CHANGE_EVENT]: (val) => isBoolean(val) || isString(val) || isNumber(val), [INPUT_EVENT]: (val) => isBoolean(val) || isString(val) || isNumber(val) }; //#endregion //#region ../../packages/components/switch/src/switch.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$18 = [ "id", "aria-checked", "aria-disabled", "aria-label", "name", "true-value", "false-value", "disabled", "tabindex" ]; const _hoisted_2$11 = ["aria-hidden"]; const _hoisted_3$4 = { key: 1 }; const _hoisted_4$3 = { key: 1 }; const _hoisted_5$1 = ["aria-hidden"]; const COMPONENT_NAME$6 = "ElSwitch"; var switch_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: COMPONENT_NAME$6, __name: "switch", props: switchProps, emits: switchEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const { formItem } = useFormItem(); const switchSize = useFormSize(); const ns = useNamespace("switch"); const { inputId } = useFormItemInputId(props, { formItemContext: formItem }); const switchDisabled = useFormDisabled(computed(() => { if (props.loading) return true; })); const isControlled = ref(props.modelValue !== false); const input = shallowRef(); const switchKls = computed(() => [ ns.b(), ns.m(switchSize.value), ns.is("disabled", switchDisabled.value), ns.is("checked", checked.value) ]); const labelLeftKls = computed(() => [ ns.e("label"), ns.em("label", "left"), ns.is("active", !checked.value) ]); const labelRightKls = computed(() => [ ns.e("label"), ns.em("label", "right"), ns.is("active", checked.value) ]); const coreStyle = computed(() => ({ width: addUnit(props.width) })); watch(() => props.modelValue, () => { isControlled.value = true; }); const actualValue = computed(() => { return isControlled.value ? props.modelValue : false; }); const checked = computed(() => actualValue.value === props.activeValue); if (![props.activeValue, props.inactiveValue].includes(actualValue.value)) { emit(UPDATE_MODEL_EVENT, props.inactiveValue); emit(CHANGE_EVENT, props.inactiveValue); emit(INPUT_EVENT, props.inactiveValue); } watch(checked, (val) => { input.value.checked = val; if (props.validateEvent) formItem?.validate?.("change").catch(NOOP); }); const handleChange = () => { const val = checked.value ? props.inactiveValue : props.activeValue; emit(UPDATE_MODEL_EVENT, val); emit(CHANGE_EVENT, val); emit(INPUT_EVENT, val); nextTick(() => { input.value.checked = checked.value; }); }; const switchValue = () => { if (switchDisabled.value) return; const { beforeChange } = props; if (!beforeChange) { handleChange(); return; } const shouldChange = beforeChange(); if (![isPromise(shouldChange), isBoolean(shouldChange)].includes(true)) throwError(COMPONENT_NAME$6, "beforeChange must return type `Promise` or `boolean`"); if (isPromise(shouldChange)) shouldChange.then((result) => { if (result) handleChange(); }).catch((e) => { /* @__PURE__ */ debugWarn(COMPONENT_NAME$6, `some error occurred: ${e}`); }); else if (shouldChange) handleChange(); }; const focus = () => { input.value?.focus?.(); }; onMounted(() => { input.value.checked = checked.value; }); __expose({ /** * @description manual focus to the switch component **/ focus, /** * @description whether Switch is checked */ checked }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass(switchKls.value), onClick: withModifiers(switchValue, ["prevent"]) }, [ createElementVNode("input", { id: unref(inputId), ref_key: "input", ref: input, class: normalizeClass(unref(ns).e("input")), type: "checkbox", role: "switch", "aria-checked": checked.value, "aria-disabled": unref(switchDisabled), "aria-label": __props.ariaLabel, name: __props.name, "true-value": __props.activeValue, "false-value": __props.inactiveValue, disabled: unref(switchDisabled), tabindex: __props.tabindex, onChange: handleChange, onKeydown: withKeys(switchValue, ["enter"]) }, null, 42, _hoisted_1$18), !__props.inlinePrompt && (__props.inactiveIcon || __props.inactiveText || _ctx.$slots.inactive) ? (openBlock(), createElementBlock("span", { key: 0, class: normalizeClass(labelLeftKls.value) }, [renderSlot(_ctx.$slots, "inactive", {}, () => [__props.inactiveIcon ? (openBlock(), createBlock(unref(ElIcon), { key: 0 }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(__props.inactiveIcon)))]), _: 1 })) : createCommentVNode("v-if", true), !__props.inactiveIcon && __props.inactiveText ? (openBlock(), createElementBlock("span", { key: 1, "aria-hidden": checked.value }, toDisplayString(__props.inactiveText), 9, _hoisted_2$11)) : createCommentVNode("v-if", true)])], 2)) : createCommentVNode("v-if", true), createElementVNode("span", { class: normalizeClass(unref(ns).e("core")), style: normalizeStyle(coreStyle.value) }, [__props.inlinePrompt ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ns).e("inner")) }, [!checked.value ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ns).e("inner-wrapper")) }, [renderSlot(_ctx.$slots, "inactive", {}, () => [__props.inactiveIcon ? (openBlock(), createBlock(unref(ElIcon), { key: 0 }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(__props.inactiveIcon)))]), _: 1 })) : createCommentVNode("v-if", true), !__props.inactiveIcon && __props.inactiveText ? (openBlock(), createElementBlock("span", _hoisted_3$4, toDisplayString(__props.inactiveText), 1)) : createCommentVNode("v-if", true)])], 2)) : (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass(unref(ns).e("inner-wrapper")) }, [renderSlot(_ctx.$slots, "active", {}, () => [__props.activeIcon ? (openBlock(), createBlock(unref(ElIcon), { key: 0 }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(__props.activeIcon)))]), _: 1 })) : createCommentVNode("v-if", true), !__props.activeIcon && __props.activeText ? (openBlock(), createElementBlock("span", _hoisted_4$3, toDisplayString(__props.activeText), 1)) : createCommentVNode("v-if", true)])], 2))], 2)) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass(unref(ns).e("action")) }, [__props.loading ? (openBlock(), createBlock(unref(ElIcon), { key: 0, class: normalizeClass(unref(ns).is("loading")) }, { default: withCtx(() => [createVNode(unref(loading_default))]), _: 1 }, 8, ["class"])) : checked.value ? renderSlot(_ctx.$slots, "active-action", { key: 1 }, () => [__props.activeActionIcon ? (openBlock(), createBlock(unref(ElIcon), { key: 0 }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(__props.activeActionIcon)))]), _: 1 })) : createCommentVNode("v-if", true)]) : !checked.value ? renderSlot(_ctx.$slots, "inactive-action", { key: 2 }, () => [__props.inactiveActionIcon ? (openBlock(), createBlock(unref(ElIcon), { key: 0 }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(__props.inactiveActionIcon)))]), _: 1 })) : createCommentVNode("v-if", true)]) : createCommentVNode("v-if", true)], 2)], 6), !__props.inlinePrompt && (__props.activeIcon || __props.activeText || _ctx.$slots.active) ? (openBlock(), createElementBlock("span", { key: 1, class: normalizeClass(labelRightKls.value) }, [renderSlot(_ctx.$slots, "active", {}, () => [__props.activeIcon ? (openBlock(), createBlock(unref(ElIcon), { key: 0 }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(__props.activeIcon)))]), _: 1 })) : createCommentVNode("v-if", true), !__props.activeIcon && __props.activeText ? (openBlock(), createElementBlock("span", { key: 1, "aria-hidden": !checked.value }, toDisplayString(__props.activeText), 9, _hoisted_5$1)) : createCommentVNode("v-if", true)])], 2)) : createCommentVNode("v-if", true) ], 2); }; } }); //#endregion //#region ../../packages/components/switch/src/switch.vue var switch_default = switch_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/switch/index.ts const ElSwitch = withInstall(switch_default); //#endregion //#region ../../packages/components/table/src/util.ts const getCell = function(event) { return event.target?.closest("td"); }; const orderBy = function(array, sortKey, reverse, sortMethod, sortBy) { if (!sortKey && !sortMethod && (!sortBy || isArray$1(sortBy) && !sortBy.length)) return array; if (isString(reverse)) reverse = reverse === "descending" ? -1 : 1; else reverse = reverse && reverse < 0 ? -1 : 1; const getKey = sortMethod ? null : function(value, index) { if (sortBy) return flatMap(castArray$1(sortBy), (by) => { if (isString(by)) return get(value, by); else return by(value, index, array); }); if (sortKey !== "$key") { if (isObject$1(value) && "$value" in value) value = value.$value; } return [isObject$1(value) ? sortKey ? get(value, sortKey) : null : value]; }; const compare = function(a, b) { if (sortMethod) return sortMethod(a.value, b.value); for (let i = 0, len = a.key?.length ?? 0; i < len; i++) { if (a.key?.[i] < b.key?.[i]) return -1; if (a.key?.[i] > b.key?.[i]) return 1; } return 0; }; return array.map((value, index) => { return { value, index, key: getKey ? getKey(value, index) : null }; }).sort((a, b) => { let order = compare(a, b); if (!order) order = a.index - b.index; return order * +reverse; }).map((item) => item.value); }; const getColumnById = function(table, columnId) { let column = null; table.columns.forEach((item) => { if (item.id === columnId) column = item; }); return column; }; const getColumnByKey = function(table, columnKey) { let column = null; for (let i = 0; i < table.columns.length; i++) { const item = table.columns[i]; if (item.columnKey === columnKey) { column = item; break; } } if (!column) throwError("ElTable", `No column matching with column-key: ${columnKey}`); return column; }; const getColumnByCell = function(table, cell, namespace) { const matches = (cell.className || "").match(new RegExp(`${namespace}-table_[^\\s]+`, "gm")); if (matches) return getColumnById(table, matches[0]); return null; }; const getRowIdentity = (row, rowKey) => { if (!row) throw new Error("Row is required when get row identity"); if (isString(rowKey)) { if (!rowKey.includes(".")) return `${row[rowKey]}`; const key = rowKey.split("."); let current = row; for (const element of key) current = current[element]; return `${current}`; } else if (isFunction$1(rowKey)) return rowKey.call(null, row); return ""; }; const getKeysMap = function(array, rowKey, flatten = false, childrenKey = "children") { const data = array || []; const arrayMap = {}; data.forEach((row, index) => { arrayMap[getRowIdentity(row, rowKey)] = { row, index }; if (flatten) { const children = row[childrenKey]; if (isArray$1(children)) Object.assign(arrayMap, getKeysMap(children, rowKey, true, childrenKey)); } }); return arrayMap; }; function mergeOptions(defaults, config) { const options = {}; let key; for (key in defaults) options[key] = defaults[key]; for (key in config) if (hasOwn(config, key)) { const value = config[key]; if (!isUndefined(value)) options[key] = value; } return options; } function parseWidth(width) { if (width === "") return width; if (!isUndefined(width)) { width = Number.parseInt(width, 10); if (Number.isNaN(width)) width = ""; } return width; } function parseMinWidth(minWidth) { if (minWidth === "") return minWidth; if (!isUndefined(minWidth)) { minWidth = parseWidth(minWidth); if (Number.isNaN(minWidth)) minWidth = 80; } return minWidth; } function parseHeight(height) { if (isNumber(height)) return height; if (isString(height)) if (/^\d+(?:px)?$/.test(height)) return Number.parseInt(height, 10); else return height; return null; } function compose(...funcs) { if (funcs.length === 0) return (arg) => arg; if (funcs.length === 1) return funcs[0]; return funcs.reduce((a, b) => (...args) => a(b(...args))); } function toggleRowStatus(statusArr, row, newVal, tableTreeProps, selectable, rowIndex, rowKey) { let _rowIndex = rowIndex ?? 0; let changed = false; const getIndex = () => { if (!rowKey) return statusArr.indexOf(row); const id = getRowIdentity(row, rowKey); return statusArr.findIndex((item) => getRowIdentity(item, rowKey) === id); }; const index = getIndex(); const included = index !== -1; const isRowSelectable = selectable?.call(null, row, _rowIndex); const toggleStatus = (type) => { if (type === "add") statusArr.push(row); else statusArr.splice(index, 1); changed = true; }; const getChildrenCount = (row) => { let count = 0; const children = tableTreeProps?.children && row[tableTreeProps.children]; if (children && isArray$1(children)) { count += children.length; children.forEach((item) => { count += getChildrenCount(item); }); } return count; }; if (!selectable || isRowSelectable) if (isBoolean(newVal)) { if (newVal && !included) toggleStatus("add"); else if (!newVal && included) toggleStatus("remove"); } else included ? toggleStatus("remove") : toggleStatus("add"); if (!tableTreeProps?.checkStrictly && tableTreeProps?.children && isArray$1(row[tableTreeProps.children])) row[tableTreeProps.children].forEach((item) => { const childChanged = toggleRowStatus(statusArr, item, newVal ?? !included, tableTreeProps, selectable, _rowIndex + 1, rowKey); _rowIndex += getChildrenCount(item) + 1; if (childChanged) changed = childChanged; }); return changed; } function walkTreeNode(root, cb, childrenKey = "children", lazyKey = "hasChildren", lazy = false) { const isNil = (array) => !(isArray$1(array) && array.length); function _walker(parent, children, level) { cb(parent, children, level); children.forEach((item) => { if (item[lazyKey] && lazy) { cb(item, null, level + 1); return; } const children = item[childrenKey]; if (!isNil(children)) _walker(item, children, level + 1); }); } root.forEach((item) => { if (item[lazyKey] && lazy) { cb(item, null, 0); return; } const children = item[childrenKey]; if (!isNil(children)) _walker(item, children, 0); }); } const getTableOverflowTooltipProps = (props, innerText, row, column) => { const popperOptions = { strategy: "fixed", ...props.popperOptions }; const tooltipFormatterContent = isFunction$1(column?.tooltipFormatter) ? column.tooltipFormatter({ row, column, cellValue: getProp(row, column.property).value }) : void 0; if (isVNode(tooltipFormatterContent)) return { slotContent: tooltipFormatterContent, content: null, ...props, popperOptions }; return { slotContent: null, content: tooltipFormatterContent ?? innerText, ...props, popperOptions }; }; let removePopper = null; function createTablePopper(props, popperContent, row, column, trigger, table) { const tableOverflowTooltipProps = getTableOverflowTooltipProps(props, popperContent, row, column); const mergedProps = { ...tableOverflowTooltipProps, slotContent: void 0 }; if (removePopper?.trigger === trigger) { const comp = removePopper.vm?.component; merge(comp?.props, mergedProps); if (comp && tableOverflowTooltipProps.slotContent) comp.slots.content = () => [tableOverflowTooltipProps.slotContent]; return; } removePopper?.(); const parentNode = table?.refs.tableWrapper; const ns = parentNode?.dataset.prefix; const vm = createVNode(ElTooltip, { virtualTriggering: true, virtualRef: trigger, appendTo: parentNode, placement: "top", transition: "none", offset: 0, hideAfter: 0, ...mergedProps }, tableOverflowTooltipProps.slotContent ? { content: () => tableOverflowTooltipProps.slotContent } : void 0); vm.appContext = { ...table.appContext, ...table }; const container = document.createElement("div"); render(vm, container); vm.component.exposed.onOpen(); const scrollContainer = parentNode?.querySelector(`.${ns}-scrollbar__wrap`); removePopper = () => { if (vm.component?.exposed?.onClose) vm.component.exposed.onClose(); render(null, container); const currentRemovePopper = removePopper; scrollContainer?.removeEventListener("scroll", currentRemovePopper); currentRemovePopper.trigger = void 0; currentRemovePopper.vm = void 0; removePopper = null; }; removePopper.trigger = trigger ?? void 0; removePopper.vm = vm; scrollContainer?.addEventListener("scroll", removePopper); } function getCurrentColumns(column) { if (column.children) return flatMap(column.children, getCurrentColumns); else return [column]; } function getColSpan(colSpan, column) { return colSpan + column.colSpan; } const isFixedColumn = (index, fixed, store, realColumns) => { let start = 0; let after = index; const columns = store.states.columns.value; if (realColumns) { const curColumns = getCurrentColumns(realColumns[index]); start = columns.slice(0, columns.indexOf(curColumns[0])).reduce(getColSpan, 0); after = start + curColumns.reduce(getColSpan, 0) - 1; } else start = index; let fixedLayout; switch (fixed) { case "left": if (after < store.states.fixedLeafColumnsLength.value) fixedLayout = "left"; break; case "right": if (start >= columns.length - store.states.rightFixedLeafColumnsLength.value) fixedLayout = "right"; break; default: if (after < store.states.fixedLeafColumnsLength.value) fixedLayout = "left"; else if (start >= columns.length - store.states.rightFixedLeafColumnsLength.value) fixedLayout = "right"; } return fixedLayout ? { direction: fixedLayout, start, after } : {}; }; const getFixedColumnsClass = (namespace, index, fixed, store, realColumns, offset = 0) => { const classes = []; const { direction, start, after } = isFixedColumn(index, fixed, store, realColumns); if (direction) { const isLeft = direction === "left"; classes.push(`${namespace}-fixed-column--${direction}`); if (isLeft && after + offset === store.states.fixedLeafColumnsLength.value - 1) classes.push("is-last-column"); else if (!isLeft && start - offset === store.states.columns.value.length - store.states.rightFixedLeafColumnsLength.value) classes.push("is-first-column"); } return classes; }; function getOffset(offset, column) { return offset + (isNull(column.realWidth) || Number.isNaN(column.realWidth) ? Number(column.width) : column.realWidth); } const getFixedColumnOffset = (index, fixed, store, realColumns) => { const { direction, start = 0, after = 0 } = isFixedColumn(index, fixed, store, realColumns); if (!direction) return; const styles = {}; const isLeft = direction === "left"; const columns = store.states.columns.value; if (isLeft) styles.left = columns.slice(0, start).reduce(getOffset, 0); else styles.right = columns.slice(after + 1).reverse().reduce(getOffset, 0); return styles; }; const ensurePosition = (style, key) => { if (!style) return; if (!Number.isNaN(style[key])) style[key] = `${style[key]}px`; }; function ensureValidVNode(vnodes) { return vnodes.some((child) => { if (!isVNode(child)) return true; if (child.type === Comment) return false; if (child.type === Fragment && !ensureValidVNode(child.children)) return false; return true; }) ? vnodes : null; } //#endregion //#region ../../packages/components/table/src/store/expand.ts function useExpand(watcherData) { const instance = getCurrentInstance(); const defaultExpandAll = ref(false); const expandRows = ref([]); const canRowExpand = (row, index) => { const expandableFn = instance.store.states.rowExpandable.value; return expandableFn?.(row, index) ?? true; }; const updateExpandRows = () => { const data = watcherData.data.value || []; const rowKey = watcherData.rowKey.value; if (defaultExpandAll.value) expandRows.value = instance.store.states.rowExpandable.value ? data.filter(canRowExpand) : data.slice(); else if (rowKey) { const expandRowsMap = getKeysMap(expandRows.value, rowKey); expandRows.value = data.filter((row, index) => { return !!expandRowsMap[getRowIdentity(row, rowKey)] && canRowExpand(row, index); }); } else expandRows.value = []; }; const toggleRowExpansion = (row, expanded) => { const rowIndex = (watcherData.data.value || []).indexOf(row); if (rowIndex > -1 && !canRowExpand(row, rowIndex)) return; if (toggleRowStatus(expandRows.value, row, expanded, void 0, void 0, void 0, watcherData.rowKey.value)) instance.emit("expand-change", row, expandRows.value.slice()); }; const setExpandRowKeys = (rowKeys) => { instance.store.assertRowKey(); const data = watcherData.data.value || []; const rowKey = watcherData.rowKey.value; const keysMap = getKeysMap(data, rowKey); expandRows.value = rowKeys.reduce((prev, cur) => { const info = keysMap[cur]; if (info && canRowExpand(info.row, info.index)) prev.push(info.row); return prev; }, []); }; const isRowExpanded = (row) => { const rowKey = watcherData.rowKey.value; if (rowKey) return !!getKeysMap(expandRows.value, rowKey)[getRowIdentity(row, rowKey)]; return expandRows.value.includes(row); }; return { updateExpandRows, toggleRowExpansion, setExpandRowKeys, isRowExpanded, states: { expandRows, defaultExpandAll } }; } //#endregion //#region ../../packages/components/table/src/store/current.ts function useCurrent(watcherData) { const instance = getCurrentInstance(); const _currentRowKey = ref(null); const currentRow = ref(null); const setCurrentRowKey = (key) => { instance.store.assertRowKey(); _currentRowKey.value = key; setCurrentRowByKey(key); }; const restoreCurrentRowKey = () => { _currentRowKey.value = null; }; const setCurrentRowByKey = (key) => { const { data, rowKey } = watcherData; const oldCurrentRow = currentRow.value; let _currentRow = null; if (rowKey.value) _currentRow = (unref(data) || []).find((item) => getRowIdentity(item, rowKey.value) === key) ?? null; currentRow.value = _currentRow ?? null; instance.emit("current-change", currentRow.value, oldCurrentRow); }; const updateCurrentRow = (_currentRow) => { const oldCurrentRow = currentRow.value; if (_currentRow && _currentRow !== oldCurrentRow) { currentRow.value = _currentRow; instance.emit("current-change", currentRow.value, oldCurrentRow); return; } if (!_currentRow && oldCurrentRow) { currentRow.value = null; instance.emit("current-change", null, oldCurrentRow); } }; const updateCurrentRowData = () => { const rowKey = watcherData.rowKey.value; const data = watcherData.data.value || []; const oldCurrentRow = currentRow.value; if (oldCurrentRow && !data.includes(oldCurrentRow)) if (rowKey) setCurrentRowByKey(getRowIdentity(oldCurrentRow, rowKey)); else { currentRow.value = null; instance.emit("current-change", null, oldCurrentRow); } else if (_currentRowKey.value) { setCurrentRowByKey(_currentRowKey.value); restoreCurrentRowKey(); } }; return { setCurrentRowKey, restoreCurrentRowKey, setCurrentRowByKey, updateCurrentRow, updateCurrentRowData, states: { _currentRowKey, currentRow } }; } //#endregion //#region ../../packages/components/table/src/store/tree.ts function useTree$2(watcherData) { const expandRowKeys = ref([]); const treeData = ref({}); const indent = ref(16); const lazy = ref(false); const lazyTreeNodeMap = ref({}); const lazyColumnIdentifier = ref("hasChildren"); const childrenColumnName = ref("children"); const checkStrictly = ref(false); const instance = getCurrentInstance(); const normalizedData = computed(() => { if (!watcherData.rowKey.value) return {}; return normalize(watcherData.data.value || []); }); const normalizedLazyNode = computed(() => { const rowKey = watcherData.rowKey.value; const keys = Object.keys(lazyTreeNodeMap.value); const res = {}; if (!keys.length) return res; keys.forEach((key) => { if (lazyTreeNodeMap.value[key].length) { const item = { children: [] }; lazyTreeNodeMap.value[key].forEach((row) => { const currentRowKey = getRowIdentity(row, rowKey); item.children.push(currentRowKey); if (row[lazyColumnIdentifier.value] && !res[currentRowKey]) res[currentRowKey] = { children: [] }; }); res[key] = item; } }); return res; }); const normalize = (data) => { const rowKey = watcherData.rowKey.value; const res = {}; walkTreeNode(data, (parent, children, level) => { const parentId = getRowIdentity(parent, rowKey); if (isArray$1(children)) res[parentId] = { children: children.map((row) => getRowIdentity(row, rowKey)), level }; else if (lazy.value) res[parentId] = { children: [], lazy: true, level }; }, childrenColumnName.value, lazyColumnIdentifier.value, lazy.value); return res; }; const updateTreeData = (ifChangeExpandRowKeys = false, ifExpandAll) => { ifExpandAll ||= instance.store?.states.defaultExpandAll.value; const nested = normalizedData.value; const normalizedLazyNode_ = normalizedLazyNode.value; const keys = Object.keys(nested); const newTreeData = {}; if (keys.length) { const oldTreeData = unref(treeData); const rootLazyRowKeys = []; const getExpanded = (oldValue, key) => { if (ifChangeExpandRowKeys) if (expandRowKeys.value) return ifExpandAll || expandRowKeys.value.includes(key); else return !!(ifExpandAll || oldValue?.expanded); else { const included = ifExpandAll || expandRowKeys.value && expandRowKeys.value.includes(key); return !!(oldValue?.expanded || included); } }; keys.forEach((key) => { const oldValue = oldTreeData[key]; const newValue = { ...nested[key] }; newValue.expanded = getExpanded(oldValue, key); if (newValue.lazy) { const { loaded = false, loading = false } = oldValue || {}; newValue.loaded = !!loaded; newValue.loading = !!loading; rootLazyRowKeys.push(key); } newTreeData[key] = newValue; }); const lazyKeys = Object.keys(normalizedLazyNode_); if (lazy.value && lazyKeys.length && rootLazyRowKeys.length) lazyKeys.forEach((key) => { const oldValue = oldTreeData[key]; const lazyNodeChildren = normalizedLazyNode_[key].children; if (rootLazyRowKeys.includes(key)) { if (newTreeData[key].children?.length !== 0) throw new Error("[ElTable]children must be an empty array."); newTreeData[key].children = lazyNodeChildren; } else { const { loaded = false, loading = false } = oldValue || {}; newTreeData[key] = { lazy: true, loaded: !!loaded, loading: !!loading, expanded: getExpanded(oldValue, key), children: lazyNodeChildren, level: void 0 }; } }); } treeData.value = newTreeData; instance.store?.updateTableScrollY(); }; watch(() => expandRowKeys.value, () => { updateTreeData(true); }, { deep: true }); watch(() => normalizedData.value, () => { updateTreeData(); }); watch(() => normalizedLazyNode.value, () => { updateTreeData(); }); const updateTreeExpandKeys = (value) => { expandRowKeys.value = value; updateTreeData(); }; const isUseLazy = (data) => { return lazy.value && data && "loaded" in data && !data.loaded; }; const toggleTreeExpansion = (row, expanded) => { instance.store.assertRowKey(); const rowKey = watcherData.rowKey.value; const id = getRowIdentity(row, rowKey); const data = id && treeData.value[id]; if (id && data && "expanded" in data) { const oldExpanded = data.expanded; expanded = isUndefined(expanded) ? !data.expanded : expanded; treeData.value[id].expanded = expanded; if (oldExpanded !== expanded) instance.emit("expand-change", row, expanded); expanded && isUseLazy(data) && loadData(row, id, data); instance.store.updateTableScrollY(); } }; const loadOrToggle = (row) => { instance.store.assertRowKey(); const rowKey = watcherData.rowKey.value; const id = getRowIdentity(row, rowKey); const data = treeData.value[id]; if (isUseLazy(data)) loadData(row, id, data); else toggleTreeExpansion(row, void 0); }; const loadData = (row, key, treeNode) => { const { load } = instance.props; if (load && !treeData.value[key].loaded) { treeData.value[key].loading = true; load(row, treeNode, (data) => { if (!isArray$1(data)) throw new TypeError("[ElTable] data must be an array"); treeData.value[key].loading = false; treeData.value[key].loaded = true; treeData.value[key].expanded = true; if (data.length) lazyTreeNodeMap.value = { ...lazyTreeNodeMap.value, [key]: data }; instance.emit("expand-change", row, true); }); } }; const updateKeyChildren = (key, data) => { const { lazy, rowKey } = instance.props; if (!lazy) return; if (!rowKey) throw new Error("[Table] rowKey is required in updateKeyChild"); if (lazyTreeNodeMap.value[key]) lazyTreeNodeMap.value = { ...lazyTreeNodeMap.value, [key]: data }; }; return { loadData, loadOrToggle, toggleTreeExpansion, updateTreeExpandKeys, updateTreeData, updateKeyChildren, normalize, states: { expandRowKeys, treeData, indent, lazy, lazyTreeNodeMap, lazyColumnIdentifier, childrenColumnName, checkStrictly } }; } //#endregion //#region ../../packages/components/table/src/store/watcher.ts const sortData = (data, states) => { const sortingColumn = states.sortingColumn; if (!sortingColumn || isString(sortingColumn.sortable)) return data; return orderBy(data, states.sortProp, states.sortOrder, sortingColumn.sortMethod, sortingColumn.sortBy); }; const doFlattenColumns = (columns) => { const result = []; columns.forEach((column) => { if (column.children && column.children.length > 0) result.push.apply(result, doFlattenColumns(column.children)); else result.push(column); }); return result; }; function useWatcher$1() { const instance = getCurrentInstance(); const { size: tableSize } = toRefs(instance.proxy?.$props); const rowKey = ref(null); const data = ref([]); const _data = ref([]); const isComplex = ref(false); const _columns = ref([]); const originColumns = ref([]); const columns = ref([]); const fixedColumns = ref([]); const rightFixedColumns = ref([]); const leafColumns = ref([]); const fixedLeafColumns = ref([]); const rightFixedLeafColumns = ref([]); const updateOrderFns = []; const leafColumnsLength = ref(0); const fixedLeafColumnsLength = ref(0); const rightFixedLeafColumnsLength = ref(0); const isAllSelected = ref(false); const selection = ref([]); const selectionIndeterminate = ref({}); const reserveSelection = ref(false); const selectOnIndeterminate = ref(false); const selectable = ref(null); const rowExpandable = ref(null); const filters = ref({}); const filteredData = ref(null); const sortingColumn = ref(null); const sortProp = ref(null); const sortOrder = ref(null); const hoverRow = ref(null); const selectedMap = computed(() => { return rowKey.value ? getKeysMap(selection.value, rowKey.value) : void 0; }); const getRowChildren = (row) => { const { childrenColumnName, lazyTreeNodeMap } = instance.store.states; const inlineChildren = row[childrenColumnName.value] ?? []; if (!rowKey.value) return inlineChildren; const id = getRowIdentity(row, rowKey.value); return [...lazyTreeNodeMap.value?.[id] ?? [], ...inlineChildren]; }; watch(data, () => { if (instance.state) { scheduleLayout(false); if (instance.props.tableLayout === "auto") instance.refs.tableHeaderRef?.updateFixedColumnStyle(); } }, { deep: true }); const assertRowKey = () => { if (!rowKey.value) throw new Error("[ElTable] prop row-key is required"); }; const updateChildFixed = (column) => { column.children?.forEach((childColumn) => { childColumn.fixed = column.fixed; updateChildFixed(childColumn); }); }; const updateColumns = () => { _columns.value.forEach((column) => { updateChildFixed(column); }); fixedColumns.value = _columns.value.filter((column) => [true, "left"].includes(column.fixed)); const selectColumn = _columns.value.find((column) => column.type === "selection"); let selectColFixLeft; if (selectColumn && selectColumn.fixed !== "right" && !fixedColumns.value.includes(selectColumn)) { if (_columns.value.indexOf(selectColumn) === 0 && fixedColumns.value.length) { fixedColumns.value.unshift(selectColumn); selectColFixLeft = true; } } rightFixedColumns.value = _columns.value.filter((column) => column.fixed === "right"); const notFixedColumns = _columns.value.filter((column) => (selectColFixLeft ? column.type !== "selection" : true) && !column.fixed); originColumns.value = Array.from(fixedColumns.value).concat(notFixedColumns).concat(rightFixedColumns.value); const leafColumns = doFlattenColumns(notFixedColumns); const fixedLeafColumns = doFlattenColumns(fixedColumns.value); const rightFixedLeafColumns = doFlattenColumns(rightFixedColumns.value); leafColumnsLength.value = leafColumns.length; fixedLeafColumnsLength.value = fixedLeafColumns.length; rightFixedLeafColumnsLength.value = rightFixedLeafColumns.length; columns.value = Array.from(fixedLeafColumns).concat(leafColumns).concat(rightFixedLeafColumns); isComplex.value = fixedColumns.value.length > 0 || rightFixedColumns.value.length > 0; }; const scheduleLayout = (needUpdateColumns, immediate = false) => { if (needUpdateColumns) updateColumns(); if (immediate) instance.state.doLayout(); else instance.state.debouncedUpdateLayout(); }; const isSelected = (row) => { if (selectedMap.value) return !!selectedMap.value[getRowIdentity(row, rowKey.value)]; else return selection.value.includes(row); }; const rowIndexMap = computed(() => { const map = /* @__PURE__ */ new Map(); if (!rowKey.value || !selectable.value) return map; let index = 0; const _traverse = (rows) => { if (!isArray$1(rows)) return; rows.forEach((row) => { const id = getRowIdentity(row, rowKey.value); map.set(id, index); index += 1; const children = getRowChildren(row); if (children.length) _traverse(children); }); }; _traverse(data.value || []); return map; }); const updateSelectionByChildren = (options = {}) => { const { emitChange = true } = options; if (treeStates.checkStrictly.value || !rowKey.value) { selectionIndeterminate.value = {}; return; } const rowKeyValue = rowKey.value; const rowIndexMapValue = options.rowIndexMap ?? rowIndexMap.value; const selectableFn = selectable.value; const rowIdCache = /* @__PURE__ */ new WeakMap(); const getCachedRowId = (row) => { const cachedId = rowIdCache.get(row); if (cachedId) return cachedId; const id = getRowIdentity(row, rowKeyValue); rowIdCache.set(row, id); return id; }; const indeterminateMap = {}; const selectedIdSet = new Set(selection.value.map((row) => getCachedRowId(row))); const rowsToAdd = []; let selectionChanged = false; const _updateSelectionForRow = (row, id, selected) => { const isRowSelected = selectedIdSet.has(id); if (selected && !isRowSelected) { rowsToAdd.push(row); selectedIdSet.add(id); selectionChanged = true; } else if (!selected && isRowSelected) { selectedIdSet.delete(id); selectionChanged = true; } }; const _walk = (rows) => { let selectedCount = 0; let selectableCount = 0; if (!isArray$1(rows)) return { selectedCount, selectableCount }; rows.forEach((row) => { const id = getCachedRowId(row); const children = getRowChildren(row); let childSelectedCount = 0; let childSelectableCount = 0; if (children.length) { const childResult = _walk(children); childSelectedCount = childResult.selectedCount; childSelectableCount = childResult.selectableCount; } const rowSelectable = selectableFn ? selectableFn.call(null, row, rowIndexMapValue.get(id) ?? 0) : true; if (rowSelectable) { if (childSelectableCount > 0) { const allSelected = childSelectedCount === childSelectableCount; if (!allSelected && !(childSelectedCount === 0)) indeterminateMap[id] = true; _updateSelectionForRow(row, id, allSelected); } } if (rowSelectable) { selectableCount += 1; if (selectedIdSet.has(id)) selectedCount += 1; } selectedCount += childSelectedCount; selectableCount += childSelectableCount; }); return { selectedCount, selectableCount }; }; _walk(data.value || []); if (selectionChanged) { const nextSelection = selection.value.filter((row) => selectedIdSet.has(getCachedRowId(row))); rowsToAdd.forEach((row) => { if (!selectedIdSet.has(getCachedRowId(row))) return; nextSelection.push(row); }); selection.value = nextSelection; } selectionIndeterminate.value = indeterminateMap; if (selectionChanged && emitChange) instance.emit("selection-change", selection.value ? selection.value.slice() : []); }; const clearSelection = () => { isAllSelected.value = false; const oldSelection = selection.value; selection.value = []; selectionIndeterminate.value = {}; if (oldSelection.length) instance.emit("selection-change", []); }; const cleanSelection = () => { let deleted; if (rowKey.value) { deleted = []; const childrenKey = instance?.store?.states?.childrenColumnName.value; const dataMap = getKeysMap(data.value, rowKey.value, true, childrenKey); const { lazyTreeNodeMap } = instance.store.states; if (lazyTreeNodeMap.value) Object.entries(lazyTreeNodeMap.value).forEach(([parentId, lazyRows]) => { if (dataMap[parentId]) lazyRows.forEach((row) => { const id = getRowIdentity(row, rowKey.value); if (!dataMap[id]) dataMap[id] = { row, index: -1 }; }); }); for (const key in selectedMap.value) if (hasOwn(selectedMap.value, key) && !dataMap[key]) deleted.push(selectedMap.value[key].row); } else deleted = selection.value.filter((item) => !data.value.includes(item)); if (deleted.length) { const newSelection = selection.value.filter((item) => !deleted.includes(item)); selection.value = newSelection; updateSelectionByChildren({ emitChange: false }); instance.emit("selection-change", [...newSelection]); } }; const getSelectionRows = () => { return (selection.value || []).slice(); }; const cascadeToLazyChildren = (row, selected, rowIndexMap) => { if (!rowKey.value || treeStates.checkStrictly.value || !treeStates.lazy.value) return; const { lazyTreeNodeMap, childrenColumnName } = instance.store.states; const id = getRowIdentity(row, rowKey.value); const lazyChildren = lazyTreeNodeMap.value?.[id] ?? []; const inlineChildren = row[childrenColumnName.value] ?? []; const treeProps = { children: childrenColumnName.value, checkStrictly: false }; for (const child of lazyChildren) { const childIndex = rowIndexMap.get(getRowIdentity(child, rowKey.value)) ?? 0; toggleRowStatus(selection.value, child, selected, treeProps, selectable.value, childIndex, rowKey.value); cascadeToLazyChildren(child, selected, rowIndexMap); } for (const child of inlineChildren) cascadeToLazyChildren(child, selected, rowIndexMap); }; const toggleRowSelection = (row, selected, emitChange = true, ignoreSelectable = false) => { const treeProps = { children: instance?.store?.states?.childrenColumnName.value, checkStrictly: instance?.store?.states?.checkStrictly.value }; if (toggleRowStatus(selection.value, row, selected, treeProps, ignoreSelectable ? void 0 : selectable.value, data.value.indexOf(row), rowKey.value)) { if (treeStates.lazy.value && !treeStates.checkStrictly.value) { cascadeToLazyChildren(row, selected ?? isSelected(row), rowIndexMap.value); updateSelectionByChildren({ emitChange: false, rowIndexMap: rowIndexMap.value }); } else updateSelectionByChildren({ emitChange: false }); const newSelection = (selection.value || []).slice(); if (emitChange) instance.emit("select", newSelection, row); instance.emit("selection-change", newSelection); } }; const _toggleAllSelection = () => { const value = selectOnIndeterminate.value ? !isAllSelected.value : !(isAllSelected.value || selection.value.length); isAllSelected.value = value; let selectionChanged = false; let childrenCount = 0; const rowKey = instance?.store?.states?.rowKey.value; const { childrenColumnName } = instance.store.states; const treeProps = { children: childrenColumnName.value, checkStrictly: false }; data.value.forEach((row, index) => { const rowIndex = index + childrenCount; if (toggleRowStatus(selection.value, row, value, treeProps, selectable.value, rowIndex, rowKey)) selectionChanged = true; childrenCount += getChildrenCount(getRowIdentity(row, rowKey)); }); const rowIndexMapVal = rowIndexMap.value; if (treeStates.lazy.value && !treeStates.checkStrictly.value && rowKey) for (const lazyRows of Object.values(treeStates.lazyTreeNodeMap.value)) for (const child of lazyRows) { const childIndex = rowIndexMapVal.get(getRowIdentity(child, rowKey)) ?? 0; if (toggleRowStatus(selection.value, child, value, treeProps, selectable.value, childIndex, rowKey)) selectionChanged = true; cascadeToLazyChildren(child, value, rowIndexMapVal); } updateSelectionByChildren({ emitChange: false, rowIndexMap: rowIndexMapVal }); if (selectionChanged) instance.emit("selection-change", selection.value ? [...selection.value] : []); instance.emit("select-all", (selection.value || []).slice()); }; const updateAllSelected = () => { if (data.value?.length === 0) { isAllSelected.value = false; return; } let rowIndex = 0; let selectedCount = 0; const checkSelectedStatus = (rows) => { for (const row of rows) { const isRowSelectable = selectable.value && selectable.value.call(null, row, rowIndex); if (!isSelected(row)) { if (!selectable.value || isRowSelectable) return false; } else selectedCount++; rowIndex++; const children = getRowChildren(row); if (children.length && !checkSelectedStatus(children)) return false; } return true; }; const isAllSelected_ = checkSelectedStatus(data.value || []); isAllSelected.value = selectedCount === 0 ? false : isAllSelected_; }; const getRowIndeterminate = (row) => { if (!rowKey.value) return false; const id = getRowIdentity(row, rowKey.value); return !!selectionIndeterminate.value[id]; }; const getChildrenCount = (rowKey) => { if (!instance || !instance.store) return 0; const { treeData } = instance.store.states; let count = 0; const children = treeData.value[rowKey]?.children; if (children) { count += children.length; children.forEach((childKey) => { count += getChildrenCount(childKey); }); } return count; }; const updateFilters = (column, values) => { const filters_ = {}; castArray$1(column).forEach((col) => { filters.value[col.id] = values; filters_[col.columnKey || col.id] = values; }); return filters_; }; const updateSort = (column, prop, order) => { if (sortingColumn.value && sortingColumn.value !== column) sortingColumn.value.order = null; sortingColumn.value = column; sortProp.value = prop; sortOrder.value = order; }; const execFilter = () => { let sourceData = unref(_data); Object.keys(filters.value).forEach((columnId) => { const values = filters.value[columnId]; if (!values || values.length === 0) return; const column = getColumnById({ columns: columns.value }, columnId); if (column && column.filterMethod) sourceData = sourceData.filter((row) => { return values.some((value) => column.filterMethod.call(null, value, row, column)); }); }); filteredData.value = sourceData; }; const execSort = () => { data.value = sortData(filteredData.value ?? [], { sortingColumn: sortingColumn.value, sortProp: sortProp.value, sortOrder: sortOrder.value }); }; const execQuery = (ignore = void 0) => { if (!ignore?.filter) execFilter(); execSort(); }; const clearFilter = (columnKeys) => { const { tableHeaderRef } = instance.refs; if (!tableHeaderRef) return; const panels = Object.assign({}, tableHeaderRef.filterPanels); const keys = Object.keys(panels); if (!keys.length) return; if (isString(columnKeys)) columnKeys = [columnKeys]; if (isArray$1(columnKeys)) { const columns_ = columnKeys.map((key) => getColumnByKey({ columns: columns.value }, key)); keys.forEach((key) => { const column = columns_.find((col) => col.id === key); if (column) column.filteredValue = []; }); instance.store.commit("filterChange", { column: columns_, values: [], silent: true, multi: true }); } else { keys.forEach((key) => { const column = columns.value.find((col) => col.id === key); if (column) column.filteredValue = []; }); filters.value = {}; instance.store.commit("filterChange", { column: {}, values: [], silent: true }); } }; const clearSort = () => { if (!sortingColumn.value) return; updateSort(null, null, null); instance.store.commit("changeSortCondition", { silent: true }); }; const { setExpandRowKeys, toggleRowExpansion, updateExpandRows, states: expandStates, isRowExpanded } = useExpand({ data, rowKey }); const { updateTreeExpandKeys, toggleTreeExpansion, updateTreeData, updateKeyChildren, loadOrToggle, states: treeStates } = useTree$2({ data, rowKey }); const { updateCurrentRowData, updateCurrentRow, setCurrentRowKey, states: currentData } = useCurrent({ data, rowKey }); const setExpandRowKeysAdapter = (val) => { setExpandRowKeys(val); updateTreeExpandKeys(val); }; const toggleRowExpansionAdapter = (row, expanded) => { if (columns.value.some(({ type }) => type === "expand")) toggleRowExpansion(row, expanded); else toggleTreeExpansion(row, expanded); }; watch(() => treeStates.checkStrictly.value, (value) => { if (value) selectionIndeterminate.value = {}; else updateSelectionByChildren({ emitChange: false }); updateAllSelected(); }); watch(() => treeStates.lazyTreeNodeMap.value, () => { if (!treeStates.lazy.value || treeStates.checkStrictly.value || !rowKey.value) return; const rowIndexMapVal = rowIndexMap.value; const prevLen = selection.value.length; for (const parentId of Object.keys(treeStates.lazyTreeNodeMap.value)) { if (!selectedMap.value?.[parentId]) continue; cascadeToLazyChildren(selectedMap.value[parentId].row, true, rowIndexMapVal); } const cascadeChanged = selection.value.length !== prevLen; updateSelectionByChildren({ emitChange: !cascadeChanged, rowIndexMap: rowIndexMapVal }); updateAllSelected(); if (cascadeChanged) instance.emit("selection-change", [...selection.value]); }); return { assertRowKey, updateColumns, scheduleLayout, isSelected, clearSelection, cleanSelection, getSelectionRows, toggleRowSelection, _toggleAllSelection, toggleAllSelection: null, updateAllSelected, updateSelectionByChildren, getRowIndeterminate, updateFilters, updateCurrentRow, updateSort, execFilter, execSort, execQuery, clearFilter, clearSort, toggleRowExpansion, setExpandRowKeysAdapter, setCurrentRowKey, toggleRowExpansionAdapter, isRowExpanded, updateExpandRows, updateCurrentRowData, loadOrToggle, updateTreeData, updateKeyChildren, states: { tableSize, rowKey, data, _data, isComplex, _columns, originColumns, columns, fixedColumns, rightFixedColumns, leafColumns, fixedLeafColumns, rightFixedLeafColumns, updateOrderFns, leafColumnsLength, fixedLeafColumnsLength, rightFixedLeafColumnsLength, isAllSelected, selection, selectionIndeterminate, reserveSelection, selectOnIndeterminate, selectable, rowExpandable, filters, filteredData, sortingColumn, sortProp, sortOrder, hoverRow, ...expandStates, ...treeStates, ...currentData } }; } //#endregion //#region ../../packages/components/table/src/store/index.ts function replaceColumn(array, column) { return array.map((item) => { if (item.id === column.id) return column; else if (item.children?.length) item.children = replaceColumn(item.children, column); return item; }); } function sortColumn(array) { array.forEach((item) => { item.no = item.getColumnIndex?.(); if (item.children?.length) sortColumn(item.children); }); array.sort((cur, pre) => cur.no - pre.no); } function useStore() { const instance = getCurrentInstance(); const watcher = useWatcher$1(); const ns = useNamespace("table"); const { t } = useLocale(); const mutations = { setData(states, data) { const dataInstanceChanged = unref(states._data) !== data; states.data.value = data; states._data.value = data; instance.store.execQuery(); instance.store.updateCurrentRowData(); instance.store.updateExpandRows(); instance.store.updateTreeData(instance.store.states.defaultExpandAll.value); if (unref(states.reserveSelection)) instance.store.assertRowKey(); else if (dataInstanceChanged) instance.store.clearSelection(); else instance.store.cleanSelection(); instance.store.updateSelectionByChildren({ emitChange: false }); instance.store.updateAllSelected(); if (instance.$ready) instance.store.scheduleLayout(); }, insertColumn(states, column, parent, updateColumnOrder) { const array = unref(states._columns); let newColumns = []; if (!parent) { array.push(column); newColumns = array; } else { if (parent && !parent.children) parent.children = []; parent.children?.push(column); newColumns = replaceColumn(array, parent); } sortColumn(newColumns); states._columns.value = newColumns; states.updateOrderFns.push(updateColumnOrder); if (column.type === "selection") { states.selectable.value = column.selectable; states.reserveSelection.value = column.reserveSelection; } if (instance.$ready) { instance.store.updateColumns(); instance.store.scheduleLayout(); } }, updateColumnOrder(states, column) { if (column.getColumnIndex?.() === column.no) return; sortColumn(states._columns.value); if (instance.$ready) instance.store.updateColumns(); }, removeColumn(states, column, parent, updateColumnOrder) { const array = unref(states._columns) || []; if (parent) { parent.children?.splice(parent.children.findIndex((item) => item.id === column.id), 1); nextTick(() => { if (parent.children?.length === 0) delete parent.children; }); states._columns.value = replaceColumn(array, parent); } else { const index = array.indexOf(column); if (index > -1) { array.splice(index, 1); states._columns.value = array; } } const updateFnIndex = states.updateOrderFns.indexOf(updateColumnOrder); updateFnIndex > -1 && states.updateOrderFns.splice(updateFnIndex, 1); if (instance.$ready) { instance.store.updateColumns(); instance.store.scheduleLayout(); } }, sort(states, options) { const { prop, order, init } = options; if (prop) { const column = unref(states.columns).find((column) => column.property === prop); if (column) { column.order = order; instance.store.updateSort(column, prop, order); instance.store.commit("changeSortCondition", { init }); } } }, changeSortCondition(states, options) { const { sortingColumn, sortProp, sortOrder } = states; const columnValue = unref(sortingColumn), propValue = unref(sortProp), orderValue = unref(sortOrder); if (isNull(orderValue)) { states.sortingColumn.value = null; states.sortProp.value = null; } instance.store.execQuery({ filter: true }); if (!options || !(options.silent || options.init)) instance.emit("sort-change", { column: columnValue, prop: propValue, order: orderValue }); instance.store.updateTableScrollY(); }, filterChange(_states, options) { const { column, values, silent } = options; const newFilters = instance.store.updateFilters(column, values); instance.store.execQuery(); if (!silent) instance.emit("filter-change", newFilters); instance.store.updateTableScrollY(); }, toggleAllSelection() { instance.store.toggleAllSelection?.(); }, rowSelectedChanged(_states, row) { instance.store.toggleRowSelection(row); instance.store.updateAllSelected(); }, setHoverRow(states, row) { states.hoverRow.value = row; }, setCurrentRow(_states, row) { instance.store.updateCurrentRow(row); } }; const commit = function(name, ...args) { const mutations = instance.store.mutations; if (mutations[name]) mutations[name].apply(instance, [instance.store.states, ...args]); else throw new Error(`Action not found: ${name}`); }; const updateTableScrollY = function() { nextTick(() => instance.layout.updateScrollY.apply(instance.layout)); }; return { ns, t, ...watcher, mutations, commit, updateTableScrollY }; } //#endregion //#region ../../packages/components/table/src/store/helper.ts const InitialStateMap = { rowKey: "rowKey", defaultExpandAll: "defaultExpandAll", rowExpandable: "rowExpandable", selectOnIndeterminate: "selectOnIndeterminate", indent: "indent", lazy: "lazy", ["treeProps.hasChildren"]: { key: "lazyColumnIdentifier", default: "hasChildren" }, ["treeProps.children"]: { key: "childrenColumnName", default: "children" }, ["treeProps.checkStrictly"]: { key: "checkStrictly", default: false } }; function createStore(table, props) { if (!table) throw new Error("Table is required."); const store = useStore(); store.toggleAllSelection = debounce(store._toggleAllSelection, 10); Object.keys(InitialStateMap).forEach((key) => { handleValue(getArrKeysValue(props, key), key, store); }); proxyTableProps(store, props); return store; } function proxyTableProps(store, props) { Object.keys(InitialStateMap).forEach((key) => { watch(() => getArrKeysValue(props, key), (value) => { handleValue(value, key, store); }); }); } function handleValue(value, propsKey, store) { let newVal = value; let storeKey = InitialStateMap[propsKey]; if (isObject$1(storeKey)) { newVal = newVal || storeKey.default; storeKey = storeKey.key; } store.states[storeKey].value = newVal; } function getArrKeysValue(props, key) { if (key.includes(".")) { const keyList = key.split("."); let value = props; keyList.forEach((k) => { value = value[k]; }); return value; } else return props[key]; } //#endregion //#region ../../packages/components/table/src/table-layout.ts var TableLayout = class { constructor(options) { this.observers = []; this.table = null; this.store = null; this.columns = []; this.fit = true; this.showHeader = true; this.heightMap = {}; this.height = ref(null); this.scrollX = ref(false); this.scrollY = ref(false); this.bodyWidth = ref(null); this.fixedWidth = ref(null); this.rightFixedWidth = ref(null); this.gutterWidth = 0; for (const name in options) if (hasOwn(options, name)) if (isRef(this[name])) this[name].value = options[name]; else this[name] = options[name]; if (!this.table) throw new Error("Table is required for Table Layout"); if (!this.store) throw new Error("Store is required for Table Layout"); } updateScrollY() { const height = this.height.value; /** * When the height is not initialized, it is null. * After the table is initialized, when the height is not configured, the height is 0. */ if (isNull(height)) return false; const scrollBarRef = this.table.refs.scrollBarRef; if (this.table.vnode.el && scrollBarRef?.wrapRef) { let scrollY = true; const prevScrollY = this.scrollY.value; scrollY = scrollBarRef.wrapRef.scrollHeight > scrollBarRef.wrapRef.clientHeight; this.scrollY.value = scrollY; return prevScrollY !== scrollY; } return false; } setHeight(value, prop = "height") { if (!isClient) return; const el = this.table.vnode.el; value = parseHeight(value); this.height.value = Number(value); this.heightMap[prop] = value; if (!el && (value || value === 0)) { nextTick(() => { if (this.heightMap[prop] === value) this.setHeight(value, prop); }); return; } if (el && isNumber(value)) { el.style[prop] = `${value}px`; this.updateElsHeight(); } else if (el && isString(value)) { el.style[prop] = value; this.updateElsHeight(); } } setMaxHeight(value) { this.setHeight(value, "max-height"); } getFlattenColumns() { const flattenColumns = []; this.table.store.states.columns.value.forEach((column) => { if (column.isColumnGroup) flattenColumns.push.apply(flattenColumns, column.columns); else flattenColumns.push(column); }); return flattenColumns; } updateElsHeight() { this.updateScrollY(); this.notifyObservers("scrollable"); } headerDisplayNone(elm) { if (!elm) return true; let headerChild = elm; while (headerChild.tagName !== "DIV") { if (getComputedStyle(headerChild).display === "none") return true; headerChild = headerChild.parentElement; } return false; } updateColumnsWidth() { if (!isClient) return; const fit = this.fit; const bodyWidth = this.table.vnode.el?.clientWidth; let bodyMinWidth = 0; const flattenColumns = this.getFlattenColumns(); const flexColumns = flattenColumns.filter((column) => !isNumber(column.width)); flattenColumns.forEach((column) => { if (isNumber(column.width) && column.realWidth) column.realWidth = null; }); if (flexColumns.length > 0 && fit) { flattenColumns.forEach((column) => { bodyMinWidth += Number(column.width || column.minWidth || 80); }); if (bodyMinWidth <= bodyWidth) { this.scrollX.value = false; const totalFlexWidth = bodyWidth - bodyMinWidth; if (flexColumns.length === 1) flexColumns[0].realWidth = Number(flexColumns[0].minWidth || 80) + totalFlexWidth; else { const flexWidthPerPixel = totalFlexWidth / flexColumns.reduce((prev, column) => prev + Number(column.minWidth || 80), 0); let noneFirstWidth = 0; flexColumns.forEach((column, index) => { if (index === 0) return; const flexWidth = Math.floor(Number(column.minWidth || 80) * flexWidthPerPixel); noneFirstWidth += flexWidth; column.realWidth = Number(column.minWidth || 80) + flexWidth; }); flexColumns[0].realWidth = Number(flexColumns[0].minWidth || 80) + totalFlexWidth - noneFirstWidth; } } else { this.scrollX.value = true; flexColumns.forEach((column) => { column.realWidth = Number(column.minWidth); }); } this.bodyWidth.value = Math.max(bodyMinWidth, bodyWidth); this.table.state.resizeState.value.width = this.bodyWidth.value; } else { flattenColumns.forEach((column) => { if (!column.width && !column.minWidth) column.realWidth = 80; else column.realWidth = Number(column.width || column.minWidth); bodyMinWidth += column.realWidth; }); this.scrollX.value = bodyMinWidth > bodyWidth; this.bodyWidth.value = bodyMinWidth; } const fixedColumns = this.store.states.fixedColumns.value; if (fixedColumns.length > 0) { let fixedWidth = 0; fixedColumns.forEach((column) => { fixedWidth += Number(column.realWidth || column.width); }); this.fixedWidth.value = fixedWidth; } const rightFixedColumns = this.store.states.rightFixedColumns.value; if (rightFixedColumns.length > 0) { let rightFixedWidth = 0; rightFixedColumns.forEach((column) => { rightFixedWidth += Number(column.realWidth || column.width); }); this.rightFixedWidth.value = rightFixedWidth; } this.notifyObservers("columns"); } addObserver(observer) { this.observers.push(observer); } removeObserver(observer) { const index = this.observers.indexOf(observer); if (index !== -1) this.observers.splice(index, 1); } notifyObservers(event) { this.observers.forEach((observer) => { switch (event) { case "columns": observer.state?.onColumnsChange(this); break; case "scrollable": observer.state?.onScrollableChange(this); break; default: throw new Error(`Table Layout don't have event ${event}.`); } }); } }; //#endregion //#region ../../packages/components/table/src/filter-panel.vue?vue&type=script&lang.ts var filter_panel_vue_vue_type_script_lang_default = defineComponent({ name: "ElTableFilterPanel", components: { ElCheckbox, ElCheckboxGroup, ElScrollbar, ElTooltip, ElIcon, ArrowDown: arrow_down_default, ArrowUp: arrow_up_default }, props: { placement: { type: String, default: "bottom-start" }, store: { type: Object }, column: { type: Object }, upDataColumn: { type: Function }, appendTo: useTooltipContentProps.appendTo }, setup(props) { const instance = getCurrentInstance(); const { t } = useLocale(); const ns = useNamespace("table-filter"); const parent = instance?.parent; if (props.column && !parent.filterPanels.value[props.column.id]) parent.filterPanels.value[props.column.id] = instance; const tooltipRef = ref(null); const rootRef = ref(null); const checkedIndex = ref(0); const filters = computed(() => { return props.column && props.column.filters; }); const filterClassName = computed(() => { if (props.column && props.column.filterClassName) return `${ns.b()} ${props.column.filterClassName}`; return ns.b(); }); const filterValue = computed({ get: () => (props.column?.filteredValue || [])[0], set: (value) => { if (filteredValue.value) if (!isPropAbsent(value)) filteredValue.value.splice(0, 1, value); else filteredValue.value.splice(0, 1); } }); const filteredValue = computed({ get() { if (props.column) return props.column.filteredValue || []; return []; }, set(value) { if (props.column) props.upDataColumn?.("filteredValue", value); } }); const multiple = computed(() => { if (props.column) return props.column.filterMultiple; return true; }); const isActive = (filter) => { return filter.value === filterValue.value; }; const hidden = () => { tooltipRef.value?.onClose(); }; const handleConfirm = () => { confirmFilter(filteredValue.value); hidden(); }; const handleReset = () => { filteredValue.value = []; confirmFilter(filteredValue.value); hidden(); }; const handleSelect = (_filterValue, index) => { filterValue.value = _filterValue; checkedIndex.value = index; if (!isPropAbsent(_filterValue)) confirmFilter(filteredValue.value); else confirmFilter([]); hidden(); }; const confirmFilter = (filteredValue) => { props.store?.commit("filterChange", { column: props.column, values: filteredValue }); props.store?.updateAllSelected(); }; const handleShowTooltip = () => { rootRef.value?.focus(); !multiple.value && initCheckedIndex(); if (props.column) props.upDataColumn?.("filterOpened", true); }; const handleHideTooltip = () => { if (props.column) props.upDataColumn?.("filterOpened", false); }; const initCheckedIndex = () => { if (isPropAbsent(filterValue)) { checkedIndex.value = 0; return; } const idx = (filters.value || []).findIndex((item) => { return item.value === filterValue.value; }); checkedIndex.value = idx >= 0 ? idx + 1 : 0; }; const handleKeydown = (event) => { const code = getEventCode(event); const len = (filters.value ? filters.value.length : 0) + 1; let index = checkedIndex.value; let isPreventDefault = true; switch (code) { case EVENT_CODE.down: case EVENT_CODE.right: index = (index + 1) % len; break; case EVENT_CODE.up: case EVENT_CODE.left: index = (index - 1 + len) % len; break; case EVENT_CODE.tab: hidden(); isPreventDefault = false; break; case EVENT_CODE.enter: case EVENT_CODE.space: if (index === 0) handleSelect(null, 0); else { const item = (filters.value || [])[index - 1]; item.value && handleSelect(item.value, index); } break; default: isPreventDefault = false; break; } isPreventDefault && event.preventDefault(); checkedIndex.value = index; rootRef.value?.querySelector(`.${ns.e("list-item")}:nth-child(${index + 1})`)?.focus(); }; return { multiple, filterClassName, filteredValue, filterValue, filters, handleConfirm, handleReset, handleSelect, isPropAbsent, isActive, t, ns, tooltipRef, rootRef, checkedIndex, handleShowTooltip, handleHideTooltip, handleKeydown }; } }); //#endregion //#region ../../packages/components/table/src/filter-panel.vue const _hoisted_1$17 = ["disabled"]; const _hoisted_2$10 = ["tabindex", "aria-checked"]; const _hoisted_3$3 = [ "tabindex", "aria-checked", "onClick" ]; const _hoisted_4$2 = ["aria-label"]; function _sfc_render$4(_ctx, _cache, $props, $setup, $data, $options) { const _component_el_checkbox = resolveComponent("el-checkbox"); const _component_el_checkbox_group = resolveComponent("el-checkbox-group"); const _component_el_scrollbar = resolveComponent("el-scrollbar"); const _component_arrow_up = resolveComponent("arrow-up"); const _component_arrow_down = resolveComponent("arrow-down"); const _component_el_icon = resolveComponent("el-icon"); const _component_el_tooltip = resolveComponent("el-tooltip"); return openBlock(), createBlock(_component_el_tooltip, { ref: "tooltipRef", offset: 0, placement: _ctx.placement, "show-arrow": false, trigger: "click", role: "dialog", teleported: "", effect: "light", pure: "", loop: "", "popper-class": _ctx.filterClassName, persistent: "", "append-to": _ctx.appendTo, onShow: _ctx.handleShowTooltip, onHide: _ctx.handleHideTooltip }, { content: withCtx(() => [_ctx.multiple ? (openBlock(), createElementBlock("div", { key: 0, ref: "rootRef", tabindex: "-1", class: normalizeClass(_ctx.ns.e("multiple")) }, [createElementVNode("div", { class: normalizeClass(_ctx.ns.e("content")) }, [createVNode(_component_el_scrollbar, { "wrap-class": _ctx.ns.e("wrap") }, { default: withCtx(() => [createVNode(_component_el_checkbox_group, { modelValue: _ctx.filteredValue, "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.filteredValue = $event), class: normalizeClass(_ctx.ns.e("checkbox-group")) }, { default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.filters, (filter) => { return openBlock(), createBlock(_component_el_checkbox, { key: filter.value, value: filter.value }, { default: withCtx(() => [createTextVNode(toDisplayString(filter.text), 1)]), _: 2 }, 1032, ["value"]); }), 128))]), _: 1 }, 8, ["modelValue", "class"])]), _: 1 }, 8, ["wrap-class"])], 2), createElementVNode("div", { class: normalizeClass(_ctx.ns.e("bottom")) }, [createElementVNode("button", { class: normalizeClass(_ctx.ns.is("disabled", _ctx.filteredValue.length === 0)), disabled: _ctx.filteredValue.length === 0, type: "button", onClick: _cache[1] || (_cache[1] = (...args) => _ctx.handleConfirm && _ctx.handleConfirm(...args)) }, toDisplayString(_ctx.t("el.table.confirmFilter")), 11, _hoisted_1$17), createElementVNode("button", { type: "button", onClick: _cache[2] || (_cache[2] = (...args) => _ctx.handleReset && _ctx.handleReset(...args)) }, toDisplayString(_ctx.t("el.table.resetFilter")), 1)], 2)], 2)) : (openBlock(), createElementBlock("ul", { key: 1, ref: "rootRef", tabindex: "-1", role: "radiogroup", class: normalizeClass(_ctx.ns.e("list")), onKeydown: _cache[4] || (_cache[4] = (...args) => _ctx.handleKeydown && _ctx.handleKeydown(...args)) }, [createElementVNode("li", { role: "radio", class: normalizeClass([_ctx.ns.e("list-item"), _ctx.ns.is("active", _ctx.isPropAbsent(_ctx.filterValue))]), tabindex: _ctx.checkedIndex === 0 ? 0 : -1, "aria-checked": _ctx.isPropAbsent(_ctx.filterValue), onClick: _cache[3] || (_cache[3] = ($event) => _ctx.handleSelect(null, 0)) }, toDisplayString(_ctx.t("el.table.clearFilter")), 11, _hoisted_2$10), (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.filters, (filter, idx) => { return openBlock(), createElementBlock("li", { key: filter.value, role: "radio", class: normalizeClass([_ctx.ns.e("list-item"), _ctx.ns.is("active", _ctx.isActive(filter))]), tabindex: _ctx.checkedIndex === idx + 1 ? 0 : -1, "aria-checked": _ctx.isActive(filter), onClick: ($event) => _ctx.handleSelect(filter.value, idx + 1) }, toDisplayString(filter.text), 11, _hoisted_3$3); }), 128))], 34))]), default: withCtx(() => [createElementVNode("button", { type: "button", class: normalizeClass(`${_ctx.ns.namespace.value}-table__column-filter-trigger`), "aria-label": _ctx.t("el.table.filterLabel", { column: _ctx.column?.label || "" }) }, [createVNode(_component_el_icon, null, { default: withCtx(() => [renderSlot(_ctx.$slots, "filter-icon", {}, () => [_ctx.column?.filterOpened ? (openBlock(), createBlock(_component_arrow_up, { key: 0 })) : (openBlock(), createBlock(_component_arrow_down, { key: 1 }))])]), _: 3 })], 10, _hoisted_4$2)]), _: 3 }, 8, [ "placement", "popper-class", "append-to", "onShow", "onHide" ]); } var filter_panel_default = /* @__PURE__ */ _plugin_vue_export_helper_default(filter_panel_vue_vue_type_script_lang_default, [["render", _sfc_render$4]]); //#endregion //#region ../../packages/components/table/src/layout-observer.ts function useLayoutObserver(root) { const instance = getCurrentInstance(); onBeforeMount(() => { tableLayout.value.addObserver(instance); }); onMounted(() => { onColumnsChange(tableLayout.value); onScrollableChange(tableLayout.value); }); onUpdated(() => { onColumnsChange(tableLayout.value); onScrollableChange(tableLayout.value); }); onUnmounted(() => { tableLayout.value.removeObserver(instance); }); const tableLayout = computed(() => { const layout = root.layout; if (!layout) throw new Error("Can not find table layout."); return layout; }); const onColumnsChange = (layout) => { const cols = root.vnode.el?.querySelectorAll("colgroup > col") || []; if (!cols.length) return; const flattenColumns = layout.getFlattenColumns(); const columnsMap = {}; flattenColumns.forEach((column) => { columnsMap[column.id] = column; }); for (let i = 0, j = cols.length; i < j; i++) { const col = cols[i]; const column = columnsMap[col.getAttribute("name")]; if (column) col.setAttribute("width", column.realWidth || column.width); } }; const onScrollableChange = (layout) => { const cols = root.vnode.el?.querySelectorAll("colgroup > col[name=gutter]") || []; for (let i = 0, j = cols.length; i < j; i++) cols[i].setAttribute("width", layout.scrollY.value ? layout.gutterWidth : "0"); const ths = root.vnode.el?.querySelectorAll("th.gutter") || []; for (let i = 0, j = ths.length; i < j; i++) { const th = ths[i]; th.style.width = layout.scrollY.value ? `${layout.gutterWidth}px` : "0"; th.style.display = layout.scrollY.value ? "" : "none"; } }; return { tableLayout: tableLayout.value, onColumnsChange, onScrollableChange }; } //#endregion //#region ../../packages/components/table/src/tokens.ts const TABLE_INJECTION_KEY = Symbol("ElTable"); //#endregion //#region ../../packages/components/table/src/table-header/event-helper.ts function useEvent(props, emit) { const instance = getCurrentInstance(); const parent = inject(TABLE_INJECTION_KEY); const handleFilterClick = (event) => { event.stopPropagation(); }; const handleHeaderClick = (event, column) => { if (!column.filters && column.sortable) handleSortClick(event, column, false); else if (column.filterable && !column.sortable) handleFilterClick(event); parent?.emit("header-click", column, event); }; const handleHeaderContextMenu = (event, column) => { parent?.emit("header-contextmenu", column, event); }; const draggingColumn = ref(null); const dragging = ref(false); const dragState = ref(); const handleMouseDown = (event, column) => { if (!isClient) return; if (column.children && column.children.length > 0) return; /* istanbul ignore if */ if (draggingColumn.value && props.border && draggingColumn.value.id === column.id) { dragging.value = true; const table = parent; emit("set-drag-visible", true); const tableLeft = (table?.vnode.el)?.getBoundingClientRect().left; const columnEl = instance?.vnode?.el?.querySelector(`th.${column.id}`); const columnRect = columnEl.getBoundingClientRect(); const minLeft = columnRect.left - tableLeft + 30; addClass(columnEl, "noclick"); dragState.value = { startMouseLeft: event.clientX, startLeft: columnRect.right - tableLeft, startColumnLeft: columnRect.left - tableLeft, tableLeft }; const resizeProxy = table?.refs.resizeProxy; resizeProxy.style.left = `${dragState.value.startLeft}px`; document.onselectstart = function() { return false; }; document.ondragstart = function() { return false; }; const handleMouseMove = (event) => { const deltaLeft = event.clientX - dragState.value.startMouseLeft; const proxyLeft = dragState.value.startLeft + deltaLeft; resizeProxy.style.left = `${Math.max(minLeft, proxyLeft)}px`; }; const handleMouseUp = () => { if (dragging.value) { const { startColumnLeft, startLeft } = dragState.value; column.width = column.realWidth = Number.parseInt(resizeProxy.style.left, 10) - startColumnLeft; table?.emit("header-dragend", column.width, startLeft - startColumnLeft, column, event); requestAnimationFrame(() => { props.store.scheduleLayout(false, true); }); document.body.style.cursor = ""; dragging.value = false; draggingColumn.value = null; dragState.value = void 0; emit("set-drag-visible", false); } document.removeEventListener("mousemove", handleMouseMove); document.removeEventListener("mouseup", handleMouseUp); document.onselectstart = null; document.ondragstart = null; setTimeout(() => { removeClass(columnEl, "noclick"); }, 0); }; document.addEventListener("mousemove", handleMouseMove); document.addEventListener("mouseup", handleMouseUp); } }; const handleMouseMove = (event, column) => { if (!props.border || column.children && column.children.length > 0) return; const el = event.target; const target = isElement$1(el) ? el.closest("th") : null; if (!target) return; const isSortable = hasClass(target, "is-sortable"); if (isSortable) { const cursor = dragging.value ? "col-resize" : ""; target.style.cursor = cursor; const caret = target.querySelector(".caret-wrapper"); if (caret) caret.style.cursor = cursor; } if (!column.resizable || dragging.value) { draggingColumn.value = null; return; } const rect = target.getBoundingClientRect(); const isLastTh = target.parentNode?.lastElementChild === target; const allowDrag = props.allowDragLastColumn || !isLastTh; const isResizeHandleActive = rect.width > 12 && rect.right - event.clientX < 8 && allowDrag; const cursor = isResizeHandleActive ? "col-resize" : ""; document.body.style.cursor = cursor; draggingColumn.value = isResizeHandleActive ? column : null; if (isSortable) target.style.cursor = cursor; }; const handleMouseOut = () => { if (!isClient || dragging.value) return; document.body.style.cursor = ""; }; const toggleOrder = ({ order, sortOrders }) => { if (order === "") return sortOrders[0]; const index = sortOrders.indexOf(order || null); return sortOrders[index > sortOrders.length - 2 ? 0 : index + 1]; }; const handleSortClick = (event, column, givenOrder) => { event.stopPropagation(); const order = column.order === givenOrder ? null : givenOrder || toggleOrder(column); const target = event.target?.closest("th"); if (target) { if (hasClass(target, "noclick")) { removeClass(target, "noclick"); return; } } if (!column.sortable) return; const clickTarget = event.currentTarget; if (["ascending", "descending"].some((str) => hasClass(clickTarget, str) && !column.sortOrders.includes(str))) return; const states = props.store.states; let sortProp = states.sortProp.value; let sortOrder; const sortingColumn = states.sortingColumn.value; if (sortingColumn !== column || sortingColumn === column && isNull(sortingColumn.order)) { if (sortingColumn) sortingColumn.order = null; states.sortingColumn.value = column; sortProp = column.property; } if (!order) sortOrder = column.order = null; else sortOrder = column.order = order; states.sortProp.value = sortProp; states.sortOrder.value = sortOrder; parent?.store.commit("changeSortCondition"); }; return { handleHeaderClick, handleHeaderContextMenu, handleMouseDown, handleMouseMove, handleMouseOut, handleSortClick, handleFilterClick }; } //#endregion //#region ../../packages/components/table/src/table-header/style.helper.ts function useStyle$2(props) { const parent = inject(TABLE_INJECTION_KEY); const ns = useNamespace("table"); const getHeaderRowStyle = (rowIndex) => { const headerRowStyle = parent?.props.headerRowStyle; if (isFunction$1(headerRowStyle)) return headerRowStyle.call(null, { rowIndex }); return headerRowStyle; }; const getHeaderRowClass = (rowIndex) => { const classes = []; const headerRowClassName = parent?.props.headerRowClassName; if (isString(headerRowClassName)) classes.push(headerRowClassName); else if (isFunction$1(headerRowClassName)) classes.push(headerRowClassName.call(null, { rowIndex })); return classes.join(" "); }; const getHeaderCellStyle = (rowIndex, columnIndex, row, column) => { let headerCellStyles = parent?.props.headerCellStyle ?? {}; if (isFunction$1(headerCellStyles)) headerCellStyles = headerCellStyles.call(null, { rowIndex, columnIndex, row, column }); const fixedStyle = getFixedColumnOffset(columnIndex, column.fixed, props.store, row); ensurePosition(fixedStyle, "left"); ensurePosition(fixedStyle, "right"); return Object.assign({}, headerCellStyles, fixedStyle); }; const getHeaderCellClass = (rowIndex, columnIndex, row, column) => { const fixedClasses = getFixedColumnsClass(ns.b(), columnIndex, column.fixed, props.store, row); const classes = [ column.id, column.order, column.headerAlign, column.className, column.labelClassName, ...fixedClasses ]; if (!column.children) classes.push("is-leaf"); if (column.sortable) classes.push("is-sortable"); const headerCellClassName = parent?.props.headerCellClassName; if (isString(headerCellClassName)) classes.push(headerCellClassName); else if (isFunction$1(headerCellClassName)) classes.push(headerCellClassName.call(null, { rowIndex, columnIndex, row, column })); classes.push(ns.e("cell")); return classes.filter((className) => Boolean(className)).join(" "); }; return { getHeaderRowStyle, getHeaderRowClass, getHeaderCellStyle, getHeaderCellClass }; } //#endregion //#region ../../packages/components/table/src/table-header/utils-helper.ts const getAllColumns = (columns) => { const result = []; columns.forEach((column) => { if (column.children) { result.push(column); result.push.apply(result, getAllColumns(column.children)); } else result.push(column); }); return result; }; const convertToRows = (originColumns) => { let maxLevel = 1; const traverse = (column, parent) => { if (parent) { column.level = parent.level + 1; if (maxLevel < column.level) maxLevel = column.level; } if (column.children) { let colSpan = 0; column.children.forEach((subColumn) => { traverse(subColumn, column); colSpan += subColumn.colSpan; }); column.colSpan = colSpan; } else column.colSpan = 1; }; originColumns.forEach((column) => { column.level = 1; traverse(column, void 0); }); const rows = []; for (let i = 0; i < maxLevel; i++) rows.push([]); getAllColumns(originColumns).forEach((column) => { if (!column.children) column.rowSpan = maxLevel - column.level + 1; else { column.rowSpan = 1; column.children.forEach((col) => col.isSubColumn = true); } rows[column.level - 1].push(column); }); return rows; }; function useUtils$1(props) { const parent = inject(TABLE_INJECTION_KEY); const columnRows = computed(() => { return convertToRows(props.store.states.originColumns.value); }); const isGroup = computed(() => { const result = columnRows.value.length > 1; if (result && parent) parent.state.isGroup.value = true; return result; }); const toggleAllSelection = (event) => { event.stopPropagation(); parent?.store.commit("toggleAllSelection"); }; return { isGroup, toggleAllSelection, columnRows }; } //#endregion //#region ../../packages/components/table/src/table-header/index.ts var table_header_default = defineComponent({ name: "ElTableHeader", components: { ElCheckbox }, props: { fixed: { type: String, default: "" }, store: { required: true, type: Object }, border: Boolean, defaultSort: { type: Object, default: () => { return { prop: "", order: "" }; } }, appendFilterPanelTo: { type: String }, allowDragLastColumn: { type: Boolean } }, setup(props, { emit }) { const instance = getCurrentInstance(); const parent = inject(TABLE_INJECTION_KEY); const ns = useNamespace("table"); const filterPanels = ref({}); const { onColumnsChange, onScrollableChange } = useLayoutObserver(parent); const isTableLayoutAuto = parent?.props.tableLayout === "auto"; const saveIndexSelection = reactive(/* @__PURE__ */ new Map()); const theadRef = ref(); let delayId; const updateFixedColumnStyle = () => { delayId = setTimeout(() => { if (saveIndexSelection.size > 0) { saveIndexSelection.forEach((column, key) => { const el = theadRef.value.querySelector(`.${key.replace(/\s/g, ".")}`); if (el) column.width = el.getBoundingClientRect().width || column.width; }); saveIndexSelection.clear(); } }); }; watch(saveIndexSelection, updateFixedColumnStyle); onBeforeUnmount(() => { if (delayId) { clearTimeout(delayId); delayId = void 0; } }); onMounted(async () => { await nextTick(); await nextTick(); const { prop, order } = props.defaultSort; parent?.store.commit("sort", { prop, order, init: true }); updateFixedColumnStyle(); }); const { handleHeaderClick, handleHeaderContextMenu, handleMouseDown, handleMouseMove, handleMouseOut, handleSortClick, handleFilterClick } = useEvent(props, emit); const { getHeaderRowStyle, getHeaderRowClass, getHeaderCellStyle, getHeaderCellClass } = useStyle$2(props); const { isGroup, toggleAllSelection, columnRows } = useUtils$1(props); const { t } = useLocale(); instance.state = { onColumnsChange, onScrollableChange }; instance.filterPanels = filterPanels; return { ns, t, filterPanels, onColumnsChange, onScrollableChange, columnRows, getHeaderRowClass, getHeaderRowStyle, getHeaderCellClass, getHeaderCellStyle, handleHeaderClick, handleHeaderContextMenu, handleMouseDown, handleMouseMove, handleMouseOut, handleSortClick, handleFilterClick, isGroup, toggleAllSelection, saveIndexSelection, isTableLayoutAuto, theadRef, updateFixedColumnStyle }; }, render() { const { ns, t, isGroup, columnRows, getHeaderCellStyle, getHeaderCellClass, getHeaderRowClass, getHeaderRowStyle, handleHeaderClick, handleHeaderContextMenu, handleMouseDown, handleMouseMove, handleSortClick, handleMouseOut, store, $parent, saveIndexSelection, isTableLayoutAuto } = this; let rowSpan = 1; return h("thead", { ref: "theadRef", class: ns.is("group", isGroup) }, columnRows.map((subColumns, rowIndex) => h("tr", { class: getHeaderRowClass(rowIndex), key: rowIndex, style: getHeaderRowStyle(rowIndex) }, subColumns.map((column, cellIndex) => { if (column.rowSpan > rowSpan) rowSpan = column.rowSpan; const _class = getHeaderCellClass(rowIndex, cellIndex, subColumns, column); if (isTableLayoutAuto && column.fixed) saveIndexSelection.set(_class, column); return h("th", { class: _class, colspan: column.colSpan, key: `${column.id}-thead`, rowspan: column.rowSpan, scope: column.colSpan > 1 ? "colgroup" : "col", ariaSort: column.sortable ? column.order : void 0, style: getHeaderCellStyle(rowIndex, cellIndex, subColumns, column), onClick: ($event) => { if ($event.currentTarget?.classList.contains("noclick")) return; handleHeaderClick($event, column); }, onContextmenu: ($event) => handleHeaderContextMenu($event, column), onMousedown: ($event) => handleMouseDown($event, column), onMousemove: ($event) => handleMouseMove($event, column), onMouseout: handleMouseOut }, [h("div", { class: ["cell", column.filteredValue && column.filteredValue.length > 0 ? "highlight" : ""] }, [ column.renderHeader ? column.renderHeader({ column, $index: cellIndex, store, _self: $parent }) : column.label, column.sortable && h("button", { type: "button", class: "caret-wrapper", "aria-label": t("el.table.sortLabel", { column: column.label || "" }), onClick: ($event) => handleSortClick($event, column) }, [h("i", { onClick: ($event) => handleSortClick($event, column, "ascending"), class: "sort-caret ascending" }), h("i", { onClick: ($event) => handleSortClick($event, column, "descending"), class: "sort-caret descending" })]), column.filterable && h(filter_panel_default, { store, placement: column.filterPlacement || "bottom-start", appendTo: $parent?.appendFilterPanelTo, column, upDataColumn: (key, value) => { column[key] = value; } }, { "filter-icon": () => column.renderFilterIcon ? column.renderFilterIcon({ filterOpened: column.filterOpened }) : null }) ])]); })))); } }); //#endregion //#region ../../packages/components/table/src/table-body/events-helper.ts function useEvents(props) { const parent = inject(TABLE_INJECTION_KEY); const tooltipContent = ref(""); const tooltipTrigger = ref(h("div")); const handleEvent = (event, row, name) => { const table = parent; const cell = getCell(event); let column = null; const namespace = table?.vnode.el?.dataset.prefix; if (cell) { column = getColumnByCell({ columns: props.store?.states.columns.value ?? [] }, cell, namespace); if (column) table?.emit(`cell-${name}`, row, column, cell, event); } table?.emit(`row-${name}`, row, column, event); }; const handleDoubleClick = (event, row) => { handleEvent(event, row, "dblclick"); }; const handleClick = (event, row) => { props.store?.commit("setCurrentRow", row); handleEvent(event, row, "click"); }; const handleContextMenu = (event, row) => { handleEvent(event, row, "contextmenu"); }; const handleMouseEnter = debounce((index) => { props.store?.commit("setHoverRow", index); }, 30); const handleMouseLeave = debounce(() => { props.store?.commit("setHoverRow", null); }, 30); const getPadding = (el) => { const style = window.getComputedStyle(el, null); return { left: Number.parseInt(style.paddingLeft, 10) || 0, right: Number.parseInt(style.paddingRight, 10) || 0, top: Number.parseInt(style.paddingTop, 10) || 0, bottom: Number.parseInt(style.paddingBottom, 10) || 0 }; }; const toggleRowClassByCell = (rowSpan, event, toggle) => { let node = (event?.target)?.parentNode; while (rowSpan > 1) { node = node?.nextSibling; if (!node || node.nodeName !== "TR") break; toggle(node, "hover-row hover-fixed-row"); rowSpan--; } }; const handleCellMouseEnter = (event, row, tooltipOptions) => { if (!parent) return; const table = parent; const cell = getCell(event); const namespace = table?.vnode.el?.dataset.prefix; let column = null; if (cell) { column = getColumnByCell({ columns: props.store?.states.columns.value ?? [] }, cell, namespace); if (!column) return; if (cell.rowSpan > 1) toggleRowClassByCell(cell.rowSpan, event, addClass); const hoverState = table.hoverState = { cell, column, row }; table?.emit("cell-mouse-enter", hoverState.row, hoverState.column, hoverState.cell, event); } if (!tooltipOptions) { if (removePopper?.trigger === cell) removePopper?.(); return; } const cellChild = event.target.querySelector(".cell"); if (!(hasClass(cellChild, `${namespace}-tooltip`) && cellChild.childNodes.length && cellChild.textContent?.trim())) return; const range = document.createRange(); range.setStart(cellChild, 0); range.setEnd(cellChild, cellChild.childNodes.length); /** detail: https://github.com/element-plus/element-plus/issues/10790 * What went wrong? * UI > Browser > Zoom, In Blink/WebKit, getBoundingClientRect() sometimes returns inexact values, probably due to lost precision during internal calculations. In the example above: * - Expected: 188 * - Actual: 188.00000762939453 */ const { width: rangeWidth, height: rangeHeight } = range.getBoundingClientRect(); const { width: cellChildWidth, height: cellChildHeight } = cellChild.getBoundingClientRect(); const { top, left, right, bottom } = getPadding(cellChild); const horizontalPadding = left + right; const verticalPadding = top + bottom; if (isGreaterThan(rangeWidth + horizontalPadding, cellChildWidth) || isGreaterThan(rangeHeight + verticalPadding, cellChildHeight) || isGreaterThan(cellChild.scrollWidth, cellChildWidth)) createTablePopper(tooltipOptions, (cell?.innerText || cell?.textContent) ?? "", row, column, cell, table); else if (removePopper?.trigger === cell) removePopper?.(); }; const handleCellMouseLeave = (event) => { const cell = getCell(event); if (!cell) return; if (cell.rowSpan > 1) toggleRowClassByCell(cell.rowSpan, event, removeClass); const oldHoverState = parent?.hoverState; parent?.emit("cell-mouse-leave", oldHoverState?.row, oldHoverState?.column, oldHoverState?.cell, event); }; return { handleDoubleClick, handleClick, handleContextMenu, handleMouseEnter, handleMouseLeave, handleCellMouseEnter, handleCellMouseLeave, tooltipContent, tooltipTrigger }; } //#endregion //#region ../../packages/components/table/src/table-body/styles-helper.ts function useStyles$1(props) { const parent = inject(TABLE_INJECTION_KEY); const ns = useNamespace("table"); const getRowStyle = (row, rowIndex) => { const rowStyle = parent?.props.rowStyle; if (isFunction$1(rowStyle)) return rowStyle.call(null, { row, rowIndex }); return rowStyle || null; }; const getRowClass = (row, rowIndex, displayIndex) => { const classes = [ns.e("row")]; if (parent?.props.highlightCurrentRow && row === props.store?.states.currentRow.value) classes.push("current-row"); if (props.stripe && displayIndex % 2 === 1) classes.push(ns.em("row", "striped")); const rowClassName = parent?.props.rowClassName; if (isString(rowClassName)) classes.push(rowClassName); else if (isFunction$1(rowClassName)) classes.push(rowClassName.call(null, { row, rowIndex })); return classes; }; const getCellStyle = (rowIndex, columnIndex, row, column) => { const cellStyle = parent?.props.cellStyle; let cellStyles = cellStyle ?? {}; if (isFunction$1(cellStyle)) cellStyles = cellStyle.call(null, { rowIndex, columnIndex, row, column }); const fixedStyle = getFixedColumnOffset(columnIndex, props?.fixed, props.store); ensurePosition(fixedStyle, "left"); ensurePosition(fixedStyle, "right"); return Object.assign({}, cellStyles, fixedStyle); }; const getCellClass = (rowIndex, columnIndex, row, column, offset) => { const fixedClasses = getFixedColumnsClass(ns.b(), columnIndex, props?.fixed, props.store, void 0, offset); const classes = [ column.id, column.align, column.className, ...fixedClasses ]; const cellClassName = parent?.props.cellClassName; if (isString(cellClassName)) classes.push(cellClassName); else if (isFunction$1(cellClassName)) classes.push(cellClassName.call(null, { rowIndex, columnIndex, row, column })); classes.push(ns.e("cell")); return classes.filter((className) => Boolean(className)).join(" "); }; const getSpan = (row, column, rowIndex, columnIndex) => { let rowspan = 1; let colspan = 1; const fn = parent?.props.spanMethod; if (isFunction$1(fn)) { const result = fn({ row, column, rowIndex, columnIndex }); if (isArray$1(result)) { rowspan = result[0]; colspan = result[1]; } else if (isObject$1(result)) { rowspan = result.rowspan; colspan = result.colspan; } } return { rowspan, colspan }; }; const getColspanRealWidth = (columns, colspan, index) => { if (colspan < 1) return columns[index].realWidth; const widthArr = columns.map(({ realWidth, width }) => realWidth || width).slice(index, index + colspan); return Number(widthArr.reduce((acc, width) => Number(acc) + Number(width), -1)); }; return { getRowStyle, getRowClass, getCellStyle, getCellClass, getSpan, getColspanRealWidth }; } //#endregion //#region ../../packages/components/table/src/table-body/td-wrapper.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$16 = ["colspan", "rowspan"]; var td_wrapper_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "TableTdWrapper", __name: "td-wrapper", props: { colspan: { type: Number, default: 1 }, rowspan: { type: Number, default: 1 } }, setup(__props) { return (_ctx, _cache) => { return openBlock(), createElementBlock("td", { colspan: __props.colspan, rowspan: __props.rowspan }, [renderSlot(_ctx.$slots, "default")], 8, _hoisted_1$16); }; } }); //#endregion //#region ../../packages/components/table/src/table-body/td-wrapper.vue var td_wrapper_default = td_wrapper_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/table/src/table-body/render-helper.ts function useRender$1(props) { const parent = inject(TABLE_INJECTION_KEY); const ns = useNamespace("table"); const { handleDoubleClick, handleClick, handleContextMenu, handleMouseEnter, handleMouseLeave, handleCellMouseEnter, handleCellMouseLeave, tooltipContent, tooltipTrigger } = useEvents(props); const { getRowStyle, getRowClass, getCellStyle, getCellClass, getSpan, getColspanRealWidth } = useStyles$1(props); let displayIndex = -1; const firstDefaultColumnIndex = computed(() => { return props.store?.states.columns.value.findIndex(({ type }) => type === "default"); }); const getKeyOfRow = (row, index) => { const rowKey = (parent?.props)?.rowKey; if (rowKey) return getRowIdentity(row, rowKey); return index; }; const rowRender = (row, $index, treeRowData, expanded = false) => { const { tooltipEffect, tooltipOptions, store } = props; const { indent, columns } = store.states; const rowClasses = []; let display = true; if (treeRowData) { rowClasses.push(ns.em("row", `level-${treeRowData.level}`)); display = !!treeRowData.display; } if ($index === 0) displayIndex = -1; if (props.stripe && display) displayIndex++; rowClasses.push(...getRowClass(row, $index, displayIndex)); return h("tr", { style: [display ? null : { display: "none" }, getRowStyle(row, $index)], class: rowClasses, key: getKeyOfRow(row, $index), onDblclick: ($event) => handleDoubleClick($event, row), onClick: ($event) => handleClick($event, row), onContextmenu: ($event) => handleContextMenu($event, row), onMouseenter: () => handleMouseEnter($index), onMouseleave: handleMouseLeave }, columns.value.map((column, cellIndex) => { const { rowspan, colspan } = getSpan(row, column, $index, cellIndex); if (!rowspan || !colspan) return null; const columnData = Object.assign({}, column); columnData.realWidth = getColspanRealWidth(columns.value, colspan, cellIndex); const data = { store, _self: props.context || parent, column: columnData, row, $index, cellIndex, expanded }; if (cellIndex === firstDefaultColumnIndex.value && treeRowData) { data.treeNode = { indent: treeRowData.level && treeRowData.level * indent.value, level: treeRowData.level }; if (isBoolean(treeRowData.expanded)) { data.treeNode.expanded = treeRowData.expanded; if ("loading" in treeRowData) data.treeNode.loading = treeRowData.loading; if ("noLazyChildren" in treeRowData) data.treeNode.noLazyChildren = treeRowData.noLazyChildren; } } const baseKey = `${getKeyOfRow(row, $index)},${cellIndex}`; const patchKey = columnData.columnKey || columnData.rawColumnKey || ""; const mergedTooltipOptions = column.showOverflowTooltip && merge({ effect: tooltipEffect }, tooltipOptions, column.showOverflowTooltip); return h(td_wrapper_default, { style: getCellStyle($index, cellIndex, row, column), class: getCellClass($index, cellIndex, row, column, colspan - 1), key: `${patchKey}${baseKey}`, rowspan, colspan, onMouseenter: ($event) => handleCellMouseEnter($event, row, mergedTooltipOptions), onMouseleave: handleCellMouseLeave }, { default: () => cellChildren(cellIndex, column, data) }); })); }; const cellChildren = (_cellIndex, column, data) => { return column.renderCell(data); }; const wrappedRowRender = (row, $index) => { const store = props.store; const { isRowExpanded, assertRowKey } = store; const { treeData, lazyTreeNodeMap, childrenColumnName, rowKey } = store.states; const columns = store.states.columns.value; if (columns.some(({ type }) => type === "expand")) { const expanded = isRowExpanded(row); const tr = rowRender(row, $index, void 0, expanded); const renderExpanded = parent?.renderExpanded; if (!renderExpanded) { console.error("[Element Error]renderExpanded is required."); return tr; } const rows = [[tr]]; if (parent.props.preserveExpandedContent || expanded) rows[0].push(h("tr", { key: `expanded-row__${tr.key}`, style: { display: expanded ? "" : "none" } }, [h("td", { colspan: columns.length, class: `${ns.e("cell")} ${ns.e("expanded-cell")}` }, [renderExpanded({ row, $index, store, expanded })])])); return rows; } else if (Object.keys(treeData.value).length) { assertRowKey(); const key = getRowIdentity(row, rowKey.value); let cur = treeData.value[key]; let treeRowData = null; if (cur) { treeRowData = { expanded: cur.expanded, level: cur.level, display: true, noLazyChildren: void 0, loading: void 0 }; if (isBoolean(cur.lazy)) { if (treeRowData && isBoolean(cur.loaded) && cur.loaded) treeRowData.noLazyChildren = !(cur.children && cur.children.length); treeRowData.loading = cur.loading; } } const tmp = [rowRender(row, $index, treeRowData ?? void 0)]; if (cur) { let i = 0; const traverse = (children, parent) => { if (!(children && children.length && parent)) return; children.forEach((node) => { const innerTreeRowData = { display: parent.display && parent.expanded, level: parent.level + 1, expanded: false, noLazyChildren: false, loading: false }; const childKey = getRowIdentity(node, rowKey.value); if (isPropAbsent(childKey)) throw new Error("For nested data item, row-key is required."); cur = { ...treeData.value[childKey] }; if (cur) { innerTreeRowData.expanded = cur.expanded; cur.level = cur.level || innerTreeRowData.level; cur.display = !!(cur.expanded && innerTreeRowData.display); if (isBoolean(cur.lazy)) { if (isBoolean(cur.loaded) && cur.loaded) innerTreeRowData.noLazyChildren = !(cur.children && cur.children.length); innerTreeRowData.loading = cur.loading; } } i++; tmp.push(rowRender(node, $index + i, innerTreeRowData)); if (cur) traverse(lazyTreeNodeMap.value[childKey] || node[childrenColumnName.value], cur); }); }; cur.display = true; traverse(lazyTreeNodeMap.value[key] || row[childrenColumnName.value], cur); } return tmp; } else return rowRender(row, $index, void 0); }; return { wrappedRowRender, tooltipContent, tooltipTrigger }; } //#endregion //#region ../../packages/components/table/src/table-body/defaults.ts const defaultProps$1 = { store: { required: true, type: Object }, stripe: Boolean, tooltipEffect: String, tooltipOptions: { type: Object }, context: { default: () => ({}), type: Object }, rowClassName: [String, Function], rowStyle: [Object, Function], fixed: { type: String, default: "" }, highlight: Boolean }; //#endregion //#region ../../packages/components/table/src/table-body/index.ts var table_body_default = defineComponent({ name: "ElTableBody", props: defaultProps$1, setup(props) { const instance = getCurrentInstance(); const parent = inject(TABLE_INJECTION_KEY); const ns = useNamespace("table"); const { wrappedRowRender, tooltipContent, tooltipTrigger } = useRender$1(props); const { onColumnsChange, onScrollableChange } = useLayoutObserver(parent); const hoveredCellList = []; watch(props.store?.states.hoverRow, (newVal, oldVal) => { const el = instance?.vnode.el; const rows = Array.from(el?.children || []).filter((e) => e?.classList.contains(`${ns.e("row")}`)); let rowNum = newVal; const childNodes = rows[rowNum]?.childNodes; if (childNodes?.length) { let control = 0; Array.from(childNodes).reduce((acc, item, index) => { if (childNodes[index]?.colSpan > 1) control = childNodes[index]?.colSpan; if (item.nodeName !== "TD" && control === 0) acc.push(index); control > 0 && control--; return acc; }, []).forEach((rowIndex) => { rowNum = newVal; while (rowNum > 0) { const preChildNodes = rows[rowNum - 1]?.childNodes; if (preChildNodes[rowIndex] && preChildNodes[rowIndex].nodeName === "TD" && preChildNodes[rowIndex].rowSpan > 1) { addClass(preChildNodes[rowIndex], "hover-cell"); hoveredCellList.push(preChildNodes[rowIndex]); break; } rowNum--; } }); } else { hoveredCellList.forEach((item) => removeClass(item, "hover-cell")); hoveredCellList.length = 0; } if (!props.store?.states.isComplex.value || !isClient) return; rAF(() => { const oldRow = rows[oldVal]; const newRow = rows[newVal]; if (oldRow && !oldRow.classList.contains("hover-fixed-row")) removeClass(oldRow, "hover-row"); if (newRow) addClass(newRow, "hover-row"); }); }); onUnmounted(() => { removePopper?.(); }); return { ns, onColumnsChange, onScrollableChange, wrappedRowRender, tooltipContent, tooltipTrigger }; }, render() { const { wrappedRowRender, store } = this; return h("tbody", { tabIndex: -1 }, [(store?.states.data.value || []).reduce((acc, row) => { return acc.concat(wrappedRowRender(row, acc.length)); }, [])]); } }); //#endregion //#region ../../packages/components/table/src/table-footer/mapState-helper.ts function useMapState() { const store = inject(TABLE_INJECTION_KEY)?.store; return { leftFixedLeafCount: computed(() => { return store?.states.fixedLeafColumnsLength.value ?? 0; }), rightFixedLeafCount: computed(() => { return store?.states.rightFixedColumns.value.length ?? 0; }), columnsCount: computed(() => { return store?.states.columns.value.length ?? 0; }), leftFixedCount: computed(() => { return store?.states.fixedColumns.value.length ?? 0; }), rightFixedCount: computed(() => { return store?.states.rightFixedColumns.value.length ?? 0; }), columns: computed(() => store?.states.columns.value ?? []) }; } //#endregion //#region ../../packages/components/table/src/table-footer/style-helper.ts function useStyle$1(props) { const { columns } = useMapState(); const ns = useNamespace("table"); const getCellClasses = (columns, cellIndex) => { const column = columns[cellIndex]; const classes = [ ns.e("cell"), column.id, column.align, column.labelClassName, ...getFixedColumnsClass(ns.b(), cellIndex, column.fixed, props.store) ]; if (column.className) classes.push(column.className); if (!column.children) classes.push(ns.is("leaf")); return classes; }; const getCellStyles = (column, cellIndex) => { const fixedStyle = getFixedColumnOffset(cellIndex, column.fixed, props.store); ensurePosition(fixedStyle, "left"); ensurePosition(fixedStyle, "right"); return fixedStyle; }; return { getCellClasses, getCellStyles, columns }; } //#endregion //#region ../../packages/components/table/src/table-footer/index.ts var table_footer_default = defineComponent({ name: "ElTableFooter", props: { fixed: { type: String, default: "" }, store: { required: true, type: Object }, summaryMethod: Function, sumText: String, border: Boolean, defaultSort: { type: Object, default: () => { return { prop: "", order: "" }; } } }, setup(props) { const parent = inject(TABLE_INJECTION_KEY); const ns = useNamespace("table"); const { getCellClasses, getCellStyles, columns } = useStyle$1(props); const { onScrollableChange, onColumnsChange } = useLayoutObserver(parent); return { ns, onScrollableChange, onColumnsChange, getCellClasses, getCellStyles, columns }; }, render() { const { columns, getCellStyles, getCellClasses, summaryMethod, sumText } = this; const data = this.store.states.data.value; let sums = []; if (summaryMethod) sums = summaryMethod({ columns, data }); else columns.forEach((column, index) => { if (index === 0) { sums[index] = sumText; return; } const values = data.map((item) => Number(item[column.property])); const precisions = []; let notNumber = true; values.forEach((value) => { if (!Number.isNaN(+value)) { notNumber = false; const decimal = `${value}`.split(".")[1]; precisions.push(decimal ? decimal.length : 0); } }); const precision = Math.max.apply(null, precisions); if (!notNumber) sums[index] = values.reduce((prev, curr) => { const value = Number(curr); if (!Number.isNaN(+value)) return Number.parseFloat((prev + curr).toFixed(Math.min(precision, 20))); else return prev; }, 0); else sums[index] = ""; }); return h(h("tfoot", [h("tr", {}, [...columns.map((column, cellIndex) => h("td", { key: cellIndex, colspan: column.colSpan, rowspan: column.rowSpan, class: getCellClasses(columns, cellIndex), style: getCellStyles(column, cellIndex) }, [h("div", { class: ["cell", column.labelClassName] }, [sums[cellIndex]])]))])])); } }); //#endregion //#region ../../packages/components/table/src/table/utils-helper.ts function useUtils(store) { const setCurrentRow = (row) => { store.commit("setCurrentRow", row); }; const getSelectionRows = () => { return store.getSelectionRows(); }; const toggleRowSelection = (row, selected, ignoreSelectable = true) => { store.toggleRowSelection(row, selected, false, ignoreSelectable); store.updateAllSelected(); }; const clearSelection = () => { store.clearSelection(); }; const clearFilter = (columnKeys) => { store.clearFilter(columnKeys); }; const toggleAllSelection = () => { store.commit("toggleAllSelection"); }; const toggleRowExpansion = (row, expanded) => { store.toggleRowExpansionAdapter(row, expanded); }; const clearSort = () => { store.clearSort(); }; const sort = (prop, order) => { store.commit("sort", { prop, order }); }; const updateKeyChildren = (key, data) => { store.updateKeyChildren(key, data); }; return { setCurrentRow, getSelectionRows, toggleRowSelection, clearSelection, clearFilter, toggleAllSelection, toggleRowExpansion, clearSort, sort, updateKeyChildren }; } //#endregion //#region ../../packages/components/table/src/table/style-helper.ts function useStyle(props, layout, store, table) { const isHidden = ref(false); const renderExpanded = ref(null); const resizeProxyVisible = ref(false); const setDragVisible = (visible) => { resizeProxyVisible.value = visible; }; const resizeState = ref({ width: null, height: null, headerHeight: null }); const isGroup = ref(false); const scrollbarViewStyle = { display: "inline-block", verticalAlign: "middle" }; const tableWidth = ref(); const tableScrollHeight = ref(0); const bodyScrollHeight = ref(0); const headerScrollHeight = ref(0); const footerScrollHeight = ref(0); const appendScrollHeight = ref(0); watch(() => props.height, (value) => { layout.setHeight(value ?? null); }, { immediate: true }); watch(() => props.maxHeight, (value) => { layout.setMaxHeight(value ?? null); }, { immediate: true }); watch(() => [props.currentRowKey, store.states.rowKey], ([currentRowKey, rowKey]) => { if (!unref(rowKey) || !unref(currentRowKey)) return; store.setCurrentRowKey(`${currentRowKey}`); }, { immediate: true }); watch(() => props.data, (data) => { table.store.commit("setData", data); }, { immediate: true, deep: true }); watchEffect(() => { if (props.expandRowKeys) store.setExpandRowKeysAdapter(props.expandRowKeys); }); const handleMouseLeave = () => { table.store.commit("setHoverRow", null); if (table.hoverState) table.hoverState = null; }; const handleHeaderFooterMousewheel = (_event, data) => { const { pixelX, pixelY } = data; if (Math.abs(pixelX) >= Math.abs(pixelY)) table.refs.bodyWrapper.scrollLeft += data.pixelX / 5; }; const shouldUpdateHeight = computed(() => { return props.height || props.maxHeight || store.states.fixedColumns.value.length > 0 || store.states.rightFixedColumns.value.length > 0; }); const tableBodyStyles = computed(() => { return { width: layout.bodyWidth.value ? `${layout.bodyWidth.value}px` : "" }; }); const doLayout = () => { if (shouldUpdateHeight.value) layout.updateElsHeight(); layout.updateColumnsWidth(); if (typeof window === "undefined") return; requestAnimationFrame(syncPosition); }; onMounted(async () => { await nextTick(); store.updateColumns(); bindEvents(); requestAnimationFrame(doLayout); const el = table.vnode.el; const tableHeader = table.refs.headerWrapper; if (props.flexible && el && el.parentElement) el.parentElement.style.minWidth = "0"; resizeState.value = { width: tableWidth.value = el.offsetWidth, height: el.offsetHeight, headerHeight: props.showHeader && tableHeader ? tableHeader.offsetHeight : null }; store.states.columns.value.forEach((column) => { if (column.filteredValue && column.filteredValue.length) table.store.commit("filterChange", { column, values: column.filteredValue, silent: true }); }); table.$ready = true; }); const setScrollClassByEl = (el, className) => { if (!el) return; const classList = Array.from(el.classList).filter((item) => !item.startsWith("is-scrolling-")); classList.push(layout.scrollX.value ? className : "is-scrolling-none"); el.className = classList.join(" "); }; const setScrollClass = (className) => { const { tableWrapper } = table.refs; setScrollClassByEl(tableWrapper, className); }; const hasScrollClass = (className) => { const { tableWrapper } = table.refs; return !!(tableWrapper && tableWrapper.classList.contains(className)); }; const syncPosition = function() { if (!table.refs.scrollBarRef) return; if (!layout.scrollX.value) { const scrollingNoneClass = "is-scrolling-none"; if (!hasScrollClass(scrollingNoneClass)) setScrollClass(scrollingNoneClass); return; } const scrollContainer = table.refs.scrollBarRef.wrapRef; if (!scrollContainer) return; const { scrollLeft, offsetWidth, scrollWidth } = scrollContainer; const { headerWrapper, footerWrapper } = table.refs; if (headerWrapper) headerWrapper.scrollLeft = scrollLeft; if (footerWrapper) footerWrapper.scrollLeft = scrollLeft; if (scrollLeft >= scrollWidth - offsetWidth - 1) setScrollClass("is-scrolling-right"); else if (scrollLeft === 0) setScrollClass("is-scrolling-left"); else setScrollClass("is-scrolling-middle"); }; const bindEvents = () => { if (!table.refs.scrollBarRef) return; if (table.refs.scrollBarRef.wrapRef) useEventListener(table.refs.scrollBarRef.wrapRef, "scroll", syncPosition, { passive: true }); if (props.fit) useResizeObserver(table.vnode.el, resizeListener); else useEventListener(window, "resize", resizeListener); useResizeObserver(table.refs.tableInnerWrapper, () => { resizeListener(); table.refs?.scrollBarRef?.update(); }); }; const resizeListener = () => { const el = table.vnode.el; if (!table.$ready || !el) return; let shouldUpdateLayout = false; const { width: oldWidth, height: oldHeight, headerHeight: oldHeaderHeight } = resizeState.value; const width = tableWidth.value = el.offsetWidth; if (oldWidth !== width) shouldUpdateLayout = true; const height = el.offsetHeight; if ((props.height || shouldUpdateHeight.value) && oldHeight !== height) shouldUpdateLayout = true; const tableHeader = props.tableLayout === "fixed" ? table.refs.headerWrapper : table.refs.tableHeaderRef?.$el; if (props.showHeader && tableHeader?.offsetHeight !== oldHeaderHeight) shouldUpdateLayout = true; tableScrollHeight.value = table.refs.tableWrapper?.scrollHeight || 0; headerScrollHeight.value = tableHeader?.scrollHeight || 0; footerScrollHeight.value = table.refs.footerWrapper?.offsetHeight || 0; appendScrollHeight.value = table.refs.appendWrapper?.offsetHeight || 0; bodyScrollHeight.value = tableScrollHeight.value - headerScrollHeight.value - footerScrollHeight.value - appendScrollHeight.value; if (shouldUpdateLayout) { resizeState.value = { width, height, headerHeight: props.showHeader && tableHeader?.offsetHeight || 0 }; doLayout(); } }; const tableSize = useFormSize(); const bodyWidth = computed(() => { const { bodyWidth: bodyWidth_, scrollY, gutterWidth } = layout; return bodyWidth_.value ? `${bodyWidth_.value - (scrollY.value ? gutterWidth : 0)}px` : ""; }); const tableLayout = computed(() => { if (props.maxHeight) return "fixed"; return props.tableLayout; }); return { isHidden, renderExpanded, setDragVisible, isGroup, handleMouseLeave, handleHeaderFooterMousewheel, tableSize, emptyBlockStyle: computed(() => { if (props.data && props.data.length) return; let height = "100%"; if (props.height && bodyScrollHeight.value) height = `${bodyScrollHeight.value}px`; const width = tableWidth.value; return { width: width ? `${width}px` : "", height }; }), resizeProxyVisible, bodyWidth, resizeState, doLayout, tableBodyStyles, tableLayout, scrollbarViewStyle, scrollbarStyle: computed(() => { if (props.height) return { height: "100%" }; if (props.maxHeight) if (!Number.isNaN(Number(props.maxHeight))) return { maxHeight: `${+props.maxHeight - headerScrollHeight.value - footerScrollHeight.value}px` }; else return { maxHeight: `calc(${props.maxHeight} - ${headerScrollHeight.value + footerScrollHeight.value}px)` }; return {}; }) }; } //#endregion //#region ../../packages/components/table/src/table/key-render-helper.ts function useKeyRender(table) { let observer; const initWatchDom = () => { const columnsWrapper = table.vnode.el.querySelector(".hidden-columns"); const config = { childList: true, subtree: true }; const updateOrderFns = table.store.states.updateOrderFns; observer = new MutationObserver(() => { updateOrderFns.forEach((fn) => fn()); }); observer.observe(columnsWrapper, config); }; onMounted(() => { initWatchDom(); }); onUnmounted(() => { observer?.disconnect(); }); } //#endregion //#region ../../packages/components/table/src/table/defaults.ts var defaults_default$2 = { /** * @description table data */ data: { type: Array, default: () => [] }, /** * @description size of Table */ size: useSizeProp, width: [String, Number], /** * @description table's height. By default it has an `auto` height. If its value is a number, the height is measured in pixels; if its value is a string, the value will be assigned to element's style.height, the height is affected by external styles */ height: [String, Number], /** * @description table's max-height. The legal value is a number or the height in px */ maxHeight: [String, Number], /** * @description whether width of column automatically fits its container */ fit: { type: Boolean, default: true }, /** * @description whether Table is striped */ stripe: Boolean, /** * @description whether Table has vertical border */ border: Boolean, /** * @description key of row data, used for optimizing rendering. Required if `reserve-selection` is on or display tree data. When its type is String, multi-level access is supported, e.g. `user.info.id`, but `user.info[0].id` is not supported, in which case `Function` should be used */ rowKey: [String, Function], /** * @description whether Table header is visible */ showHeader: { type: Boolean, default: true }, /** * @description whether to display a summary row */ showSummary: Boolean, /** * @description displayed text for the first column of summary row */ sumText: String, /** * @description custom summary method */ summaryMethod: Function, /** * @description function that returns custom class names for a row, or a string assigning class names for every row */ rowClassName: [String, Function], /** * @description function that returns custom style for a row, or an object assigning custom style for every row */ rowStyle: [Object, Function], /** * @description function that returns custom class names for a cell, or a string assigning class names for every cell */ cellClassName: [String, Function], /** * @description function that returns custom style for a cell, or an object assigning custom style for every cell */ cellStyle: [Object, Function], /** * @description function that returns custom class names for a row in table header, or a string assigning class names for every row in table header */ headerRowClassName: [String, Function], /** * @description function that returns custom style for a row in table header, or an object assigning custom style for every row in table header */ headerRowStyle: [Object, Function], /** * @description function that returns custom class names for a cell in table header, or a string assigning class names for every cell in table header */ headerCellClassName: [String, Function], /** * @description function that returns custom style for a cell in table header, or an object assigning custom style for every cell in table header */ headerCellStyle: [Object, Function], /** * @description whether current row is highlighted */ highlightCurrentRow: Boolean, /** * @description key of current row, a set only prop */ currentRowKey: [String, Number], /** * @description displayed text when data is empty. You can customize this area with `#empty` */ emptyText: String, /** * @description set expanded rows by this prop, prop's value is the keys of expand rows, you should set row-key before using this prop */ expandRowKeys: Array, /** * @description whether expand all rows by default, works when the table has a column type="expand" or contains tree structure data */ defaultExpandAll: Boolean, /** * @description enable expandable rows, works when the table has a column type="expand" */ rowExpandable: { type: Function }, /** * @description set the default sort column and order. property `prop` is used to set default sort column, property `order` is used to set default sort order */ defaultSort: Object, /** * @description the `effect` of the overflow tooltip */ tooltipEffect: String, /** * @description the options for the overflow tooltip, [see the following tooltip component](tooltip.html#attributes) */ tooltipOptions: Object, /** * @description method that returns rowspan and colspan */ spanMethod: Function, /** * @description controls the behavior of master checkbox in multi-select tables when only some rows are selected (but not all). If true, all rows will be selected, else deselected */ selectOnIndeterminate: { type: Boolean, default: true }, /** * @description horizontal indentation of tree data */ indent: { type: Number, default: 16 }, /** * @description configuration for rendering nested data */ treeProps: { type: Object, default: () => { return { hasChildren: "hasChildren", children: "children", checkStrictly: false }; } }, /** * @description whether to lazy loading data */ lazy: Boolean, /** * @description method for loading child row data, only works when `lazy` is true */ load: Function, style: { type: [ String, Object, Array, Boolean ], default: () => ({}) }, className: { type: String, default: "" }, /** * @description sets the algorithm used to lay out table cells, rows, and columns */ tableLayout: { type: String, default: "fixed" }, /** * @description always show scrollbar */ scrollbarAlwaysOn: Boolean, /** * @description ensure main axis minimum-size doesn't follow the content */ flexible: Boolean, /** * @description whether to hide extra content and show them in a tooltip when hovering on the cell.It will affect all the table columns */ showOverflowTooltip: { type: [Boolean, Object], default: void 0 }, /** * @description function that formats cell tooltip content, works when `show-overflow-tooltip` is `true` */ tooltipFormatter: Function, appendFilterPanelTo: String, scrollbarTabindex: { type: [Number, String], default: void 0 }, /** * @description whether to allow drag the last column */ allowDragLastColumn: { type: Boolean, default: true }, /** * @description whether to preserve expanded row content in DOM when collapsed */ preserveExpandedContent: Boolean, /** * @description whether to use native scrollbars */ nativeScrollbar: Boolean }; //#endregion //#region ../../packages/components/table/src/h-helper.ts function hColgroup(props) { const isAuto = props.tableLayout === "auto"; let columns = props.columns || []; if (isAuto) { if (columns.every(({ width }) => isUndefined(width))) columns = []; } const getPropsData = (column) => { const propsData = { key: `${props.tableLayout}_${column.id}`, style: {}, name: void 0 }; if (isAuto) propsData.style = { width: `${column.width}px` }; else propsData.name = column.id; return propsData; }; return h("colgroup", {}, columns.map((column) => h("col", getPropsData(column)))); } hColgroup.props = ["columns", "tableLayout"]; //#endregion //#region ../../packages/components/table/src/composables/use-scrollbar.ts const useScrollbar$1 = () => { const scrollBarRef = ref(); const scrollTo = (options, yCoord) => { const scrollbar = scrollBarRef.value; if (scrollbar) scrollbar.scrollTo(options, yCoord); }; const setScrollPosition = (position, offset) => { const scrollbar = scrollBarRef.value; if (scrollbar && isNumber(offset) && ["Top", "Left"].includes(position)) scrollbar[`setScroll${position}`](offset); }; const setScrollTop = (top) => setScrollPosition("Top", top); const setScrollLeft = (left) => setScrollPosition("Left", left); return { scrollBarRef, scrollTo, setScrollTop, setScrollLeft }; }; //#endregion //#region ../../packages/components/table/src/table.vue?vue&type=script&lang.ts let tableIdSeed = 1; var table_vue_vue_type_script_lang_default = defineComponent({ name: "ElTable", directives: { Mousewheel }, components: { TableHeader: table_header_default, TableBody: table_body_default, TableFooter: table_footer_default, ElScrollbar, hColgroup }, props: defaults_default$2, emits: [ "select", "select-all", "selection-change", "cell-mouse-enter", "cell-mouse-leave", "cell-contextmenu", "cell-click", "cell-dblclick", "row-click", "row-contextmenu", "row-dblclick", "header-click", "header-contextmenu", "sort-change", "filter-change", "current-change", "header-dragend", "expand-change", "scroll" ], setup(props) { const { t } = useLocale(); const ns = useNamespace("table"); const globalConfig = useGlobalConfig("table"); const table = getCurrentInstance(); provide(TABLE_INJECTION_KEY, table); const store = createStore(table, props); table.store = store; const layout = new TableLayout({ store: table.store, table, fit: props.fit, showHeader: props.showHeader }); table.layout = layout; const isEmpty = computed(() => (store.states.data.value || []).length === 0); /** * open functions */ const { setCurrentRow, getSelectionRows, toggleRowSelection, clearSelection, clearFilter, toggleAllSelection, toggleRowExpansion, clearSort, sort, updateKeyChildren } = useUtils(store); const { isHidden, renderExpanded, setDragVisible, isGroup, handleMouseLeave, handleHeaderFooterMousewheel, tableSize, emptyBlockStyle, resizeProxyVisible, bodyWidth, resizeState, doLayout, tableBodyStyles, tableLayout, scrollbarViewStyle, scrollbarStyle } = useStyle(props, layout, store, table); const { scrollBarRef, scrollTo, setScrollLeft, setScrollTop } = useScrollbar$1(); const debouncedUpdateLayout = debounce(doLayout, 50); const tableId = `${ns.namespace.value}-table_${tableIdSeed++}`; table.tableId = tableId; table.state = { isGroup, resizeState, doLayout, debouncedUpdateLayout }; const computedSumText = computed(() => props.sumText ?? t("el.table.sumText")); const computedEmptyText = computed(() => { return props.emptyText ?? t("el.table.emptyText"); }); const computedTooltipEffect = computed(() => props.tooltipEffect ?? globalConfig.value?.tooltipEffect); const computedTooltipOptions = computed(() => props.tooltipOptions ?? globalConfig.value?.tooltipOptions); const columns = computed(() => { return convertToRows(store.states.originColumns.value)[0]; }); useKeyRender(table); onBeforeUnmount(() => { debouncedUpdateLayout.cancel(); }); return { ns, layout, store, columns, handleHeaderFooterMousewheel, handleMouseLeave, tableId, tableSize, isHidden, isEmpty, renderExpanded, resizeProxyVisible, resizeState, isGroup, bodyWidth, tableBodyStyles, emptyBlockStyle, debouncedUpdateLayout, /** * @description used in single selection Table, set a certain row selected. If called without any parameter, it will clear selection */ setCurrentRow, /** * @description returns the currently selected rows */ getSelectionRows, /** * @description used in multiple selection Table, toggle if a certain row is selected. With the second parameter, you can directly set if this row is selected */ toggleRowSelection, /** * @description used in multiple selection Table, clear user selection */ clearSelection, /** * @description clear filters of the columns whose `columnKey` are passed in. If no params, clear all filters */ clearFilter, /** * @description used in multiple selection Table, toggle select all and deselect all */ toggleAllSelection, /** * @description used in expandable Table or tree Table, toggle if a certain row is expanded. With the second parameter, you can directly set if this row is expanded or collapsed */ toggleRowExpansion, /** * @description clear sorting, restore data to the original order */ clearSort, /** * @description refresh the layout of Table. When the visibility of Table changes, you may need to call this method to get a correct layout */ doLayout, /** * @description sort Table manually. Property `prop` is used to set sort column, property `order` is used to set sort order */ sort, /** * @description used in lazy Table, must set `rowKey`, update key children */ updateKeyChildren, t, setDragVisible, context: table, computedSumText, computedEmptyText, computedTooltipEffect, computedTooltipOptions, tableLayout, scrollbarViewStyle, scrollbarStyle, scrollBarRef, /** * @description scrolls to a particular set of coordinates */ scrollTo, /** * @description set horizontal scroll position */ setScrollLeft, /** * @description set vertical scroll position */ setScrollTop, /** * @description whether to allow drag the last column */ allowDragLastColumn: props.allowDragLastColumn }; } }); //#endregion //#region ../../packages/components/table/src/table.vue const _hoisted_1$15 = ["data-prefix"]; const _hoisted_2$9 = { ref: "hiddenColumns", class: "hidden-columns" }; function _sfc_render$3(_ctx, _cache, $props, $setup, $data, $options) { const _component_hColgroup = resolveComponent("hColgroup"); const _component_table_header = resolveComponent("table-header"); const _component_table_body = resolveComponent("table-body"); const _component_table_footer = resolveComponent("table-footer"); const _component_el_scrollbar = resolveComponent("el-scrollbar"); const _directive_mousewheel = resolveDirective("mousewheel"); return openBlock(), createElementBlock("div", { ref: "tableWrapper", class: normalizeClass([ { [_ctx.ns.m("fit")]: _ctx.fit, [_ctx.ns.m("striped")]: _ctx.stripe, [_ctx.ns.m("border")]: _ctx.border || _ctx.isGroup, [_ctx.ns.m("hidden")]: _ctx.isHidden, [_ctx.ns.m("group")]: _ctx.isGroup, [_ctx.ns.m("fluid-height")]: _ctx.maxHeight, [_ctx.ns.m("scrollable-x")]: _ctx.layout.scrollX.value, [_ctx.ns.m("scrollable-y")]: _ctx.layout.scrollY.value, [_ctx.ns.m("enable-row-hover")]: !_ctx.store.states.isComplex.value, [_ctx.ns.m("enable-row-transition")]: (_ctx.store.states.data.value || []).length !== 0 && (_ctx.store.states.data.value || []).length < 100, "has-footer": _ctx.showSummary }, _ctx.ns.m(_ctx.tableSize), _ctx.className, _ctx.ns.b(), _ctx.ns.m(`layout-${_ctx.tableLayout}`) ]), style: normalizeStyle(_ctx.style), "data-prefix": _ctx.ns.namespace.value, onMouseleave: _cache[1] || (_cache[1] = (...args) => _ctx.handleMouseLeave && _ctx.handleMouseLeave(...args)) }, [createElementVNode("div", { ref: "tableInnerWrapper", class: normalizeClass(_ctx.ns.e("inner-wrapper")) }, [ createElementVNode("div", _hoisted_2$9, [renderSlot(_ctx.$slots, "default")], 512), _ctx.showHeader && _ctx.tableLayout === "fixed" ? withDirectives((openBlock(), createElementBlock("div", { key: 0, ref: "headerWrapper", class: normalizeClass(_ctx.ns.e("header-wrapper")) }, [createElementVNode("table", { ref: "tableHeader", class: normalizeClass(_ctx.ns.e("header")), style: normalizeStyle(_ctx.tableBodyStyles), border: "0", cellpadding: "0", cellspacing: "0" }, [createVNode(_component_hColgroup, { columns: _ctx.store.states.columns.value, "table-layout": _ctx.tableLayout }, null, 8, ["columns", "table-layout"]), createVNode(_component_table_header, { ref: "tableHeaderRef", border: _ctx.border, "default-sort": _ctx.defaultSort, store: _ctx.store, "append-filter-panel-to": _ctx.appendFilterPanelTo, "allow-drag-last-column": _ctx.allowDragLastColumn, onSetDragVisible: _ctx.setDragVisible }, null, 8, [ "border", "default-sort", "store", "append-filter-panel-to", "allow-drag-last-column", "onSetDragVisible" ])], 6)], 2)), [[_directive_mousewheel, _ctx.handleHeaderFooterMousewheel]]) : createCommentVNode("v-if", true), createElementVNode("div", { ref: "bodyWrapper", class: normalizeClass(_ctx.ns.e("body-wrapper")) }, [createVNode(_component_el_scrollbar, { ref: "scrollBarRef", "view-style": _ctx.scrollbarViewStyle, "wrap-style": _ctx.scrollbarStyle, always: _ctx.scrollbarAlwaysOn, tabindex: _ctx.scrollbarTabindex, native: _ctx.nativeScrollbar, onScroll: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("scroll", $event)) }, { default: withCtx(() => [ createElementVNode("table", { ref: "tableBody", class: normalizeClass(_ctx.ns.e("body")), cellspacing: "0", cellpadding: "0", border: "0", style: normalizeStyle({ width: _ctx.bodyWidth, tableLayout: _ctx.tableLayout }) }, [ createVNode(_component_hColgroup, { columns: _ctx.store.states.columns.value, "table-layout": _ctx.tableLayout }, null, 8, ["columns", "table-layout"]), _ctx.showHeader && _ctx.tableLayout === "auto" ? (openBlock(), createBlock(_component_table_header, { key: 0, ref: "tableHeaderRef", class: normalizeClass(_ctx.ns.e("body-header")), border: _ctx.border, "default-sort": _ctx.defaultSort, store: _ctx.store, "append-filter-panel-to": _ctx.appendFilterPanelTo, onSetDragVisible: _ctx.setDragVisible }, null, 8, [ "class", "border", "default-sort", "store", "append-filter-panel-to", "onSetDragVisible" ])) : createCommentVNode("v-if", true), createVNode(_component_table_body, { context: _ctx.context, highlight: _ctx.highlightCurrentRow, "row-class-name": _ctx.rowClassName, "tooltip-effect": _ctx.computedTooltipEffect, "tooltip-options": _ctx.computedTooltipOptions, "row-style": _ctx.rowStyle, store: _ctx.store, stripe: _ctx.stripe }, null, 8, [ "context", "highlight", "row-class-name", "tooltip-effect", "tooltip-options", "row-style", "store", "stripe" ]), _ctx.showSummary && _ctx.tableLayout === "auto" ? (openBlock(), createBlock(_component_table_footer, { key: 1, class: normalizeClass(_ctx.ns.e("body-footer")), border: _ctx.border, "default-sort": _ctx.defaultSort, store: _ctx.store, "sum-text": _ctx.computedSumText, "summary-method": _ctx.summaryMethod }, null, 8, [ "class", "border", "default-sort", "store", "sum-text", "summary-method" ])) : createCommentVNode("v-if", true) ], 6), _ctx.isEmpty ? (openBlock(), createElementBlock("div", { key: 0, ref: "emptyBlock", style: normalizeStyle(_ctx.emptyBlockStyle), class: normalizeClass(_ctx.ns.e("empty-block")) }, [createElementVNode("span", { class: normalizeClass(_ctx.ns.e("empty-text")) }, [renderSlot(_ctx.$slots, "empty", {}, () => [createTextVNode(toDisplayString(_ctx.computedEmptyText), 1)])], 2)], 6)) : createCommentVNode("v-if", true), _ctx.$slots.append ? (openBlock(), createElementBlock("div", { key: 1, ref: "appendWrapper", class: normalizeClass(_ctx.ns.e("append-wrapper")) }, [renderSlot(_ctx.$slots, "append")], 2)) : createCommentVNode("v-if", true) ]), _: 3 }, 8, [ "view-style", "wrap-style", "always", "tabindex", "native" ])], 2), _ctx.showSummary && _ctx.tableLayout === "fixed" ? withDirectives((openBlock(), createElementBlock("div", { key: 1, ref: "footerWrapper", class: normalizeClass(_ctx.ns.e("footer-wrapper")) }, [createElementVNode("table", { class: normalizeClass(_ctx.ns.e("footer")), cellspacing: "0", cellpadding: "0", border: "0", style: normalizeStyle(_ctx.tableBodyStyles) }, [createVNode(_component_hColgroup, { columns: _ctx.store.states.columns.value, "table-layout": _ctx.tableLayout }, null, 8, ["columns", "table-layout"]), createVNode(_component_table_footer, { border: _ctx.border, "default-sort": _ctx.defaultSort, store: _ctx.store, "sum-text": _ctx.computedSumText, "summary-method": _ctx.summaryMethod }, null, 8, [ "border", "default-sort", "store", "sum-text", "summary-method" ])], 6)], 2)), [[vShow, !_ctx.isEmpty], [_directive_mousewheel, _ctx.handleHeaderFooterMousewheel]]) : createCommentVNode("v-if", true), _ctx.border || _ctx.isGroup ? (openBlock(), createElementBlock("div", { key: 2, class: normalizeClass(_ctx.ns.e("border-left-patch")) }, null, 2)) : createCommentVNode("v-if", true) ], 2), withDirectives(createElementVNode("div", { ref: "resizeProxy", class: normalizeClass(_ctx.ns.e("column-resize-proxy")) }, null, 2), [[vShow, _ctx.resizeProxyVisible]])], 46, _hoisted_1$15); } var table_default = /* @__PURE__ */ _plugin_vue_export_helper_default(table_vue_vue_type_script_lang_default, [["render", _sfc_render$3]]); //#endregion //#region ../../packages/components/table/src/config.ts const defaultClassNames = { selection: "table-column--selection", expand: "table__expand-column" }; const cellStarts = { default: { order: "" }, selection: { width: 48, minWidth: 48, realWidth: 48, order: "" }, expand: { width: 48, minWidth: 48, realWidth: 48, order: "" }, index: { width: 48, minWidth: 48, realWidth: 48, order: "" } }; const getDefaultClassName = (type) => { return defaultClassNames[type] || ""; }; const cellForced = { selection: { renderHeader({ store }) { function isDisabled() { return store.states.data.value && store.states.data.value.length === 0; } return h(ElCheckbox, { disabled: isDisabled(), size: store.states.tableSize.value, indeterminate: store.states.selection.value.length > 0 && !store.states.isAllSelected.value, "onUpdate:modelValue": store.toggleAllSelection ?? void 0, modelValue: store.states.isAllSelected.value, ariaLabel: store.t("el.table.selectAllLabel") }); }, renderCell({ row, column, store, $index }) { return h(ElCheckbox, { disabled: column.selectable ? !column.selectable.call(null, row, $index) : false, size: store.states.tableSize.value, onChange: () => { store.commit("rowSelectedChanged", row); }, onClick: (event) => event.stopPropagation(), modelValue: store.isSelected(row), indeterminate: store.getRowIndeterminate(row), ariaLabel: store.t("el.table.selectRowLabel") }); }, sortable: false, resizable: false }, index: { renderHeader({ column }) { return column.label || "#"; }, renderCell({ column, $index }) { let i = $index + 1; const index = column.index; if (isNumber(index)) i = $index + index; else if (isFunction$1(index)) i = index($index); return h("div", {}, [i]); }, sortable: false }, expand: { renderHeader({ column }) { return column.label || ""; }, renderCell({ column, row, store, expanded, $index }) { const { ns } = store; const classes = [ns.e("expand-icon")]; if (!column.renderExpand && expanded) classes.push(ns.em("expand-icon", "expanded")); const callback = function(e) { e.stopPropagation(); store.toggleRowExpansion(row); }; const isRowExpandable = store.states.rowExpandable.value?.(row, $index) ?? true; if (!isRowExpandable) classes.push(ns.is("disabled")); return h("button", { type: "button", disabled: !isRowExpandable, "aria-label": store.t(expanded ? "el.table.collapseRowLabel" : "el.table.expandRowLabel"), "aria-expanded": expanded, class: classes, onClick: callback }, { default: () => { if (column.renderExpand) return [column.renderExpand({ expanded, expandable: isRowExpandable })]; return [h(ElIcon, null, { default: () => { return [h(arrow_right_default)]; } })]; } }); }, sortable: false, resizable: false } }; function defaultRenderCell({ row, column, $index }) { const property = column.property; const value = property && getProp(row, property).value; if (column && column.formatter) return column.formatter(row, column, value, $index); return value?.toString?.() || ""; } function treeCellPrefix({ row, treeNode, store }, createPlaceholder = false) { const { ns } = store; if (!treeNode) { if (createPlaceholder) return [h("span", { class: ns.e("placeholder") })]; return null; } const ele = []; const callback = function(e) { e.stopPropagation(); if (treeNode.loading) return; store.loadOrToggle(row); }; if (treeNode.indent) ele.push(h("span", { class: ns.e("indent"), style: { "padding-left": `${treeNode.indent}px` } })); if (isBoolean(treeNode.expanded) && !treeNode.noLazyChildren) { const expandClasses = [ns.e("expand-icon"), treeNode.expanded ? ns.em("expand-icon", "expanded") : ""]; let icon = arrow_right_default; if (treeNode.loading) icon = loading_default; ele.push(h("button", { type: "button", "aria-label": store.t(treeNode.expanded ? "el.table.collapseRowLabel" : "el.table.expandRowLabel"), "aria-expanded": treeNode.expanded, class: expandClasses, onClick: callback }, { default: () => { return [h(ElIcon, { class: ns.is("loading", treeNode.loading) }, { default: () => [h(icon)] })]; } })); } else ele.push(h("span", { class: ns.e("placeholder") })); return ele; } //#endregion //#region ../../packages/components/table/src/table-column/watcher-helper.ts function getAllAliases(props, aliases) { return props.reduce((prev, cur) => { prev[cur] = cur; return prev; }, aliases); } function useWatcher(owner, props_) { const instance = getCurrentInstance(); const registerComplexWatchers = () => { const props = ["fixed"]; const aliases = { realWidth: "width", realMinWidth: "minWidth" }; const allAliases = getAllAliases(props, aliases); Object.keys(allAliases).forEach((key) => { const columnKey = aliases[key]; if (hasOwn(props_, columnKey)) watch(() => props_[columnKey], (newVal) => { let value = newVal; if (columnKey === "width" && key === "realWidth") value = parseWidth(newVal); if (columnKey === "minWidth" && key === "realMinWidth") value = parseMinWidth(newVal); instance.columnConfig.value[columnKey] = value; instance.columnConfig.value[key] = value; const updateColumns = columnKey === "fixed"; owner.value.store.scheduleLayout(updateColumns); }); }); }; const registerNormalWatchers = () => { const props = [ "label", "filters", "filterMultiple", "filteredValue", "sortable", "index", "formatter", "className", "labelClassName", "filterClassName", "showOverflowTooltip", "tooltipFormatter", "resizable" ]; const parentProps = ["showOverflowTooltip"]; const aliases = { property: "prop", align: "realAlign", headerAlign: "realHeaderAlign" }; const allAliases = getAllAliases(props, aliases); Object.keys(allAliases).forEach((key) => { const columnKey = aliases[key]; if (hasOwn(props_, columnKey)) watch(() => props_[columnKey], (newVal) => { instance.columnConfig.value[key] = newVal; if (key === "filters" || key === "filterMethod") instance.columnConfig.value["filterable"] = !!(instance.columnConfig.value["filters"] || instance.columnConfig.value["filterMethod"]); }); }); parentProps.forEach((key) => { if (hasOwn(owner.value.props, key)) watch(() => owner.value.props[key], (newVal) => { if (instance.columnConfig.value.type === "selection") return; if (!isUndefined(props_[key])) return; instance.columnConfig.value[key] = newVal; }); }); const globalConfig = useGlobalConfig("table"); if (globalConfig.value && hasOwn(globalConfig.value, "showOverflowTooltip")) watch(() => globalConfig.value?.showOverflowTooltip, (newVal) => { if (instance.columnConfig.value.type === "selection") return; if (!isUndefined(props_.showOverflowTooltip) || !isUndefined(owner.value.props.showOverflowTooltip)) return; instance.columnConfig.value.showOverflowTooltip = newVal; }); }; return { registerComplexWatchers, registerNormalWatchers }; } //#endregion //#region ../../packages/components/table/src/table-column/render-helper.ts function useRender(props, slots, owner) { const instance = getCurrentInstance(); const columnId = ref(""); const isSubColumn = ref(false); const realAlign = ref(); const realHeaderAlign = ref(); const ns = useNamespace("table"); watchEffect(() => { realAlign.value = props.align ? `is-${props.align}` : null; realAlign.value; }); watchEffect(() => { realHeaderAlign.value = props.headerAlign ? `is-${props.headerAlign}` : realAlign.value; realHeaderAlign.value; }); const columnOrTableParent = computed(() => { let parent = instance.vnode.vParent || instance.parent; while (parent && !parent.tableId && !parent.columnId) parent = parent.vnode.vParent || parent.parent; return parent; }); const hasTreeColumn = computed(() => { const { store } = instance.parent; if (!store) return false; const { treeData } = store.states; const treeDataValue = treeData.value; return treeDataValue && Object.keys(treeDataValue).length > 0; }); const realWidth = ref(parseWidth(props.width)); const realMinWidth = ref(parseMinWidth(props.minWidth)); const setColumnWidth = (column) => { if (realWidth.value) column.width = realWidth.value; if (realMinWidth.value) column.minWidth = realMinWidth.value; if (!realWidth.value && realMinWidth.value) column.width = void 0; if (!column.minWidth) column.minWidth = 80; column.realWidth = Number(isUndefined(column.width) ? column.minWidth : column.width); return column; }; const setColumnForcedProps = (column) => { const type = column.type; const source = cellForced[type] || {}; Object.keys(source).forEach((prop) => { const value = source[prop]; if (prop !== "className" && !isUndefined(value)) column[prop] = value; }); const className = getDefaultClassName(type); if (className) { const forceClass = `${unref(ns.namespace)}-${className}`; column.className = column.className ? `${column.className} ${forceClass}` : forceClass; } return column; }; const checkSubColumn = (children) => { if (isArray$1(children)) children.forEach((child) => check(child)); else check(children); function check(item) { if (item?.type?.name === "ElTableColumn") item.vParent = instance; } }; const setColumnRenders = (column) => { if (props.renderHeader) /* @__PURE__ */ debugWarn("TableColumn", "Comparing to render-header, scoped-slot header is easier to use. We recommend users to use scoped-slot header."); else if (column.type !== "selection") column.renderHeader = (scope) => { instance.columnConfig.value["label"]; if (slots.header) { const slotResult = slots.header(scope); if (ensureValidVNode(slotResult)) return h(Fragment, slotResult); } return createTextVNode(column.label); }; if (slots["filter-icon"]) column.renderFilterIcon = (scope) => { return renderSlot(slots, "filter-icon", scope); }; if (slots.expand) column.renderExpand = (scope) => { return renderSlot(slots, "expand", scope); }; let originRenderCell = column.renderCell; if (column.type === "expand") { column.renderCell = (data) => h("div", { class: "cell" }, [originRenderCell(data)]); owner.value.renderExpanded = (row) => { return slots.default ? slots.default(row) : slots.default; }; } else { originRenderCell = originRenderCell || defaultRenderCell; column.renderCell = (data) => { let children = null; if (slots.default) { const vnodes = slots.default(data); children = vnodes.some((v) => v.type !== Comment) ? vnodes : originRenderCell(data); } else children = originRenderCell(data); const { columns } = owner.value.store.states; const firstUserColumnIndex = columns.value.findIndex((item) => item.type === "default"); const prefix = treeCellPrefix(data, hasTreeColumn.value && data.cellIndex === firstUserColumnIndex); const props = { class: "cell", style: {} }; if (column.showOverflowTooltip) { props.class = `${props.class} ${unref(ns.namespace)}-tooltip`; props.style = { width: `${(data.column.realWidth || Number(data.column.width)) - 1}px` }; } checkSubColumn(children); return h("div", props, [prefix, children]); }; } return column; }; const getPropsData = (...propsKey) => { return propsKey.reduce((prev, cur) => { if (isArray$1(cur)) cur.forEach((key) => { prev[key] = props[key]; }); return prev; }, {}); }; const getColumnElIndex = (children, child) => { return Array.prototype.indexOf.call(children, child); }; const updateColumnOrder = () => { owner.value.store.commit("updateColumnOrder", instance.columnConfig.value); }; return { columnId, realAlign, isSubColumn, realHeaderAlign, columnOrTableParent, setColumnWidth, setColumnForcedProps, setColumnRenders, getPropsData, getColumnElIndex, updateColumnOrder }; } //#endregion //#region ../../packages/components/table/src/table-column/defaults.ts var defaults_default$1 = { /** * @description type of the column. If set to `selection`, the column will display checkbox. If set to `index`, the column will display index of the row (staring from 1). If set to `expand`, the column will display expand icon */ type: { type: String, default: "default" }, /** * @description column label */ label: String, /** * @description class name of cells in the column */ className: String, /** * @description class name of the label of this column */ labelClassName: String, /** * @description */ property: String, /** * @description field name. You can also use its alias: `property` */ prop: String, /** * @description column width */ width: { type: [String, Number], default: "" }, /** * @description column minimum width. Columns with `width` has a fixed width, while columns with `min-width` has a width that is distributed in proportion */ minWidth: { type: [String, Number], default: "" }, /** * @description render function for table header of this column */ renderHeader: Function, /** * @description whether column can be sorted. Remote sorting can be done by setting this attribute to 'custom' and listening to the `sort-change` event of Table */ sortable: { type: [Boolean, String], default: false }, /** * @description sorting method, works when `sortable` is `true`. Should return a number, just like Array.sort */ sortMethod: Function, /** * @description specify which property to sort by, works when `sortable` is `true` and `sort-method` is `undefined`. If set to an Array, the column will sequentially sort by the next property if the previous one is equal */ sortBy: [ String, Function, Array ], /** * @description whether column width can be resized, works when `border` of `el-table` is `true` */ resizable: { type: Boolean, default: true }, /** * @description column's key. If you need to use the filter-change event, you need this attribute to identify which column is being filtered */ columnKey: String, /** * @description alignment, the value should be 'left' \/ 'center' \/ 'right' */ align: String, /** * @description alignment of the table header. If omitted, the value of the above `align` attribute will be applied, the value should be 'left' \/ 'center' \/ 'right' */ headerAlign: String, /** * @description whether to hide extra content and show them in a tooltip when hovering on the cell */ showOverflowTooltip: { type: [Boolean, Object], default: void 0 }, /** * @description function that formats cell tooltip content, works when `show-overflow-tooltip` is `true` */ tooltipFormatter: Function, /** * @description whether column is fixed at left / right. Will be fixed at left if `true` */ fixed: [Boolean, String], /** * @description function that formats cell content */ formatter: Function, /** * @description function that determines if a certain row can be selected, works when `type` is 'selection' */ selectable: Function, /** * @description whether to reserve selection after data refreshing, works when `type` is 'selection'. Note that `row-key` is required for this to work */ reserveSelection: Boolean, /** * @description data filtering method. If `filter-multiple` is on, this method will be called multiple times for each row, and a row will display if one of the calls returns `true` */ filterMethod: Function, /** * @description filter value for selected data, might be useful when table header is rendered with `render-header` */ filteredValue: Array, /** * @description an array of data filtering options. For each element in this array, `text` and `value` are required */ filters: Array, /** * @description placement for the filter dropdown */ filterPlacement: String, /** * @description whether data filtering supports multiple options */ filterMultiple: { type: Boolean, default: true }, /** * @description className for the filter dropdown */ filterClassName: String, /** * @description customize indices for each row, works on columns with `type=index` */ index: [Number, Function], /** * @description the order of the sorting strategies used when sorting the data, works when `sortable` is `true`. Accepts an array, as the user clicks on the header, the column is sorted in order of the elements in the array */ sortOrders: { type: Array, default: () => { return [ "ascending", "descending", null ]; }, validator: (val) => { return val.every((order) => [ "ascending", "descending", null ].includes(order)); } } }; //#endregion //#region ../../packages/components/table/src/table-column/index.ts let columnIdSeed = 1; var table_column_default = defineComponent({ name: "ElTableColumn", components: { ElCheckbox }, props: defaults_default$1, setup(props, { slots }) { const instance = getCurrentInstance(); const globalConfig = useGlobalConfig("table"); const columnConfig = ref({}); const owner = computed(() => { let parent = instance.parent; while (parent && !parent.tableId) parent = parent.parent; return parent; }); const { registerNormalWatchers, registerComplexWatchers } = useWatcher(owner, props); const { columnId, isSubColumn, realHeaderAlign, columnOrTableParent, setColumnWidth, setColumnForcedProps, setColumnRenders, getPropsData, getColumnElIndex, realAlign, updateColumnOrder } = useRender(props, slots, owner); const parent = columnOrTableParent.value; columnId.value = `${"tableId" in parent && parent.tableId || "columnId" in parent && parent.columnId}_column_${columnIdSeed++}`; onBeforeMount(() => { isSubColumn.value = owner.value !== parent; const type = props.type || "default"; const sortable = props.sortable === "" ? true : props.sortable; const showOverflowTooltip = type === "selection" ? false : isUndefined(props.showOverflowTooltip) ? parent.props.showOverflowTooltip ?? globalConfig.value?.showOverflowTooltip : props.showOverflowTooltip; const tooltipFormatter = isUndefined(props.tooltipFormatter) ? parent.props.tooltipFormatter ?? globalConfig.value?.tooltipFormatter : props.tooltipFormatter; const defaults = { ...cellStarts[type], id: columnId.value, type, property: props.prop || props.property, align: realAlign, headerAlign: realHeaderAlign, showOverflowTooltip, tooltipFormatter, filterable: props.filters || props.filterMethod, filteredValue: [], filterPlacement: "", filterClassName: "", isColumnGroup: false, isSubColumn: false, filterOpened: false, sortable, index: props.index, rawColumnKey: instance.vnode.key }; let column = getPropsData([ "columnKey", "label", "className", "labelClassName", "type", "renderHeader", "formatter", "fixed", "resizable" ], [ "sortMethod", "sortBy", "sortOrders" ], ["selectable", "reserveSelection"], [ "filterMethod", "filters", "filterMultiple", "filterOpened", "filteredValue", "filterPlacement", "filterClassName" ]); column = mergeOptions(defaults, column); column = compose(setColumnRenders, setColumnWidth, setColumnForcedProps)(column); columnConfig.value = column; registerNormalWatchers(); registerComplexWatchers(); }); onMounted(() => { const parent = columnOrTableParent.value; const children = isSubColumn.value ? parent.vnode.el?.children : parent.refs.hiddenColumns?.children; const getColumnIndex = () => getColumnElIndex(children || [], instance.vnode.el); columnConfig.value.getColumnIndex = getColumnIndex; getColumnIndex() > -1 && owner.value.store.commit("insertColumn", columnConfig.value, isSubColumn.value ? "columnConfig" in parent && parent.columnConfig.value : null, updateColumnOrder); }); onBeforeUnmount(() => { const getColumnIndex = columnConfig.value.getColumnIndex; (getColumnIndex ? getColumnIndex() : -1) > -1 && owner.value.store.commit("removeColumn", columnConfig.value, isSubColumn.value ? "columnConfig" in parent && parent.columnConfig.value : null, updateColumnOrder); }); instance.columnId = columnId.value; instance.columnConfig = columnConfig; }, render() { try { const renderDefault = this.$slots.default?.({ row: {}, column: {}, $index: -1 }); const children = []; if (isArray$1(renderDefault)) { for (const childNode of renderDefault) if (childNode.type?.name === "ElTableColumn" || childNode.shapeFlag & 2) children.push(childNode); else if (childNode.type === Fragment && isArray$1(childNode.children)) childNode.children.forEach((vnode) => { if (vnode?.patchFlag !== 1024 && !isString(vnode?.children)) children.push(vnode); }); } return h("div", children); } catch { return h("div", []); } } }); //#endregion //#region ../../packages/components/table/src/tableColumn.ts var tableColumn_default = table_column_default; //#endregion //#region ../../packages/components/table/index.ts const ElTable = withInstall(table_default, { TableColumn: tableColumn_default }); const ElTableColumn = withNoopInstall(tableColumn_default); //#endregion //#region ../../packages/components/table-v2/src/constants.ts let SortOrder = /* @__PURE__ */ function(SortOrder) { SortOrder["ASC"] = "asc"; SortOrder["DESC"] = "desc"; return SortOrder; }({}); let Alignment = /* @__PURE__ */ function(Alignment) { Alignment["LEFT"] = "left"; Alignment["CENTER"] = "center"; Alignment["RIGHT"] = "right"; return Alignment; }({}); let FixedDir = /* @__PURE__ */ function(FixedDir) { FixedDir["LEFT"] = "left"; FixedDir["RIGHT"] = "right"; return FixedDir; }({}); const oppositeOrderMap = { ["asc"]: "desc", ["desc"]: "asc" }; //#endregion //#region ../../packages/components/table-v2/src/private.ts const placeholderSign = Symbol("placeholder"); //#endregion //#region ../../packages/components/table-v2/src/composables/utils.ts const calcColumnStyle = (column, fixedColumn, fixed) => { const flex = { flexGrow: 0, flexShrink: 0, ...fixed ? {} : { flexGrow: column.flexGrow ?? 0, flexShrink: column.flexShrink ?? 1 } }; const style = { ...column.style ?? {}, ...flex, flexBasis: "auto", width: column.width }; if (!fixedColumn) { if (column.maxWidth) style.maxWidth = column.maxWidth; if (column.minWidth) style.minWidth = column.minWidth; } return style; }; //#endregion //#region ../../packages/components/table-v2/src/composables/use-columns.ts function useColumns(props, columns, fixed) { const _columns = computed(() => unref(columns).map((column, index) => ({ ...column, key: column.key ?? column.dataKey ?? index }))); const visibleColumns = computed(() => { return unref(_columns).filter((column) => !column.hidden); }); const fixedColumnsOnLeft = computed(() => unref(visibleColumns).filter((column) => column.fixed === "left" || column.fixed === true)); const fixedColumnsOnRight = computed(() => unref(visibleColumns).filter((column) => column.fixed === "right")); const normalColumns = computed(() => unref(visibleColumns).filter((column) => !column.fixed)); const mainColumns = computed(() => { const ret = []; unref(fixedColumnsOnLeft).forEach((column) => { ret.push({ ...column, placeholderSign }); }); unref(normalColumns).forEach((column) => { ret.push(column); }); unref(fixedColumnsOnRight).forEach((column) => { ret.push({ ...column, placeholderSign }); }); return ret; }); const hasFixedColumns = computed(() => { return unref(fixedColumnsOnLeft).length || unref(fixedColumnsOnRight).length; }); const columnsStyles = computed(() => { return unref(_columns).reduce((style, column) => { style[column.key] = calcColumnStyle(column, unref(fixed), props.fixed); return style; }, {}); }); const columnsTotalWidth = computed(() => { return unref(visibleColumns).reduce((width, column) => width + column.width, 0); }); const getColumn = (key) => { return unref(_columns).find((column) => column.key === key); }; const getColumnStyle = (key) => { return unref(columnsStyles)[key]; }; const updateColumnWidth = (column, width) => { column.width = width; }; function onColumnSorted(e) { const { key } = e.currentTarget.dataset; if (!key) return; const { sortState, sortBy } = props; let order = "asc"; if (isObject$1(sortState)) order = oppositeOrderMap[sortState[key]]; else order = oppositeOrderMap[sortBy.order]; props.onColumnSort?.({ column: getColumn(key), key, order }); } return { columns: _columns, columnsStyles, columnsTotalWidth, fixedColumnsOnLeft, fixedColumnsOnRight, hasFixedColumns, mainColumns, normalColumns, visibleColumns, getColumn, getColumnStyle, updateColumnWidth, onColumnSorted }; } //#endregion //#region ../../packages/components/table-v2/src/composables/use-scrollbar.ts const useScrollbar = (props, { mainTableRef, leftTableRef, rightTableRef, onMaybeEndReached }) => { const scrollPos = ref({ scrollLeft: 0, scrollTop: 0 }); function doScroll(params) { const { scrollTop } = params; mainTableRef.value?.scrollTo(params); leftTableRef.value?.scrollToTop(scrollTop); rightTableRef.value?.scrollToTop(scrollTop); } function scrollTo(params) { scrollPos.value = params; doScroll(params); } function scrollToTop(scrollTop) { scrollPos.value.scrollTop = scrollTop; doScroll(unref(scrollPos)); } function scrollToLeft(scrollLeft) { scrollPos.value.scrollLeft = scrollLeft; mainTableRef.value?.scrollTo?.(unref(scrollPos)); } function onScroll(params) { scrollTo(params); props.onScroll?.(params); } function onVerticalScroll({ scrollTop }) { const { scrollTop: currentScrollTop } = unref(scrollPos); if (scrollTop !== currentScrollTop) scrollToTop(scrollTop); } function scrollToRow(row, strategy = "auto") { mainTableRef.value?.scrollToRow(row, strategy); } watch(() => unref(scrollPos).scrollTop, (cur, prev) => { if (cur > prev) onMaybeEndReached(); }); return { scrollPos, scrollTo, scrollToLeft, scrollToTop, scrollToRow, onScroll, onVerticalScroll }; }; //#endregion //#region ../../packages/components/table-v2/src/composables/use-row.ts const useRow = (props, { mainTableRef, leftTableRef, rightTableRef, tableInstance, ns, isScrolling }) => { const vm = getCurrentInstance(); const { emit } = vm; const isResetting = shallowRef(false); const expandedRowKeys = ref(props.defaultExpandedRowKeys || []); const lastRenderedRowIndex = ref(-1); const resetIndex = shallowRef(null); const rowHeights = ref({}); const pendingRowHeights = ref({}); const leftTableHeights = shallowRef({}); const mainTableHeights = shallowRef({}); const rightTableHeights = shallowRef({}); const isDynamic = computed(() => isNumber(props.estimatedRowHeight)); function onRowsRendered(params) { props.onRowsRendered?.(params); if (params.rowCacheEnd > unref(lastRenderedRowIndex)) lastRenderedRowIndex.value = params.rowCacheEnd; } function onRowHovered({ hovered, rowKey }) { if (isScrolling.value) return; tableInstance.vnode.el.querySelectorAll(`[rowkey="${String(rowKey)}"]`).forEach((row) => { if (hovered) row.classList.add(ns.is("hovered")); else row.classList.remove(ns.is("hovered")); }); } function onRowExpanded({ expanded, rowData, rowIndex, rowKey }) { const _expandedRowKeys = [...unref(expandedRowKeys)]; const currentKeyIndex = _expandedRowKeys.indexOf(rowKey); if (expanded) { if (currentKeyIndex === -1) _expandedRowKeys.push(rowKey); } else if (currentKeyIndex > -1) _expandedRowKeys.splice(currentKeyIndex, 1); expandedRowKeys.value = _expandedRowKeys; emit("update:expandedRowKeys", _expandedRowKeys); props.onRowExpand?.({ expanded, rowData, rowIndex, rowKey }); props.onExpandedRowsChange?.(_expandedRowKeys); if (tableInstance.vnode.el.querySelector(`.${ns.is("hovered")}[rowkey="${String(rowKey)}"]`)) nextTick(() => onRowHovered({ hovered: true, rowKey })); } const flushingRowHeights = debounce(() => { isResetting.value = true; rowHeights.value = { ...unref(rowHeights), ...unref(pendingRowHeights) }; resetAfterIndex(unref(resetIndex), false); pendingRowHeights.value = {}; resetIndex.value = null; mainTableRef.value?.forceUpdate(); leftTableRef.value?.forceUpdate(); rightTableRef.value?.forceUpdate(); vm.proxy?.$forceUpdate(); isResetting.value = false; }, 0); function resetAfterIndex(index, forceUpdate = false) { if (!unref(isDynamic)) return; [ mainTableRef, leftTableRef, rightTableRef ].forEach((tableRef) => { const table = unref(tableRef); if (table) table.resetAfterRowIndex(index, forceUpdate); }); } function resetHeights(rowKey, height, rowIdx) { const resetIdx = unref(resetIndex); if (resetIdx === null) resetIndex.value = rowIdx; else if (resetIdx > rowIdx) resetIndex.value = rowIdx; pendingRowHeights.value[rowKey] = height; } function onRowHeightChange({ rowKey, height, rowIndex }, fixedDir) { if (!fixedDir) mainTableHeights.value[rowKey] = height; else if (fixedDir === "right") rightTableHeights.value[rowKey] = height; else leftTableHeights.value[rowKey] = height; const maximumHeight = Math.max(...[ leftTableHeights, rightTableHeights, mainTableHeights ].map((records) => records.value[rowKey] || 0)); if (unref(rowHeights)[rowKey] !== maximumHeight) { resetHeights(rowKey, maximumHeight, rowIndex); flushingRowHeights(); } } return { expandedRowKeys, lastRenderedRowIndex, isDynamic, isResetting, rowHeights, resetAfterIndex, onRowExpanded, onRowHovered, onRowsRendered, onRowHeightChange }; }; //#endregion //#region ../../packages/components/table-v2/src/composables/use-data.ts const useData = (props, { expandedRowKeys, lastRenderedRowIndex, resetAfterIndex }) => { const depthMap = ref({}); const flattenedData = computed(() => { const depths = {}; const { data, rowKey } = props; const _expandedRowKeys = unref(expandedRowKeys); if (!_expandedRowKeys || !_expandedRowKeys.length) return data; const array = []; const keysSet = /* @__PURE__ */ new Set(); _expandedRowKeys.forEach((x) => keysSet.add(x)); let copy = data.slice(); copy.forEach((x) => depths[x[rowKey]] = 0); while (copy.length > 0) { const item = copy.shift(); array.push(item); if (keysSet.has(item[rowKey]) && isArray$1(item.children) && item.children.length > 0) { copy = [...item.children, ...copy]; item.children.forEach((child) => depths[child[rowKey]] = depths[item[rowKey]] + 1); } } depthMap.value = depths; return array; }); const data = computed(() => { const { data, expandColumnKey } = props; return expandColumnKey ? unref(flattenedData) : data; }); watch(data, (val, prev) => { if (val !== prev) { lastRenderedRowIndex.value = -1; resetAfterIndex(0, true); } }); return { data, depthMap }; }; //#endregion //#region ../../packages/components/table-v2/src/utils.ts const sumReducer = (sum, num) => sum + num; const sum = (listLike) => { return isArray$1(listLike) ? listLike.reduce(sumReducer, 0) : listLike; }; const tryCall = (fLike, params, defaultRet = {}) => { return isFunction$1(fLike) ? fLike(params) : fLike ?? defaultRet; }; const enforceUnit = (style) => { [ "width", "maxWidth", "minWidth", "height" ].forEach((key) => { style[key] = addUnit(style[key]); }); return style; }; const componentToSlot = (ComponentLike) => isVNode(ComponentLike) ? (props) => h(ComponentLike, props) : ComponentLike; //#endregion //#region ../../packages/components/table-v2/src/composables/use-styles.ts const useStyles = (props, { columnsTotalWidth, rowsHeight, fixedColumnsOnLeft, fixedColumnsOnRight }) => { const bodyWidth = computed(() => { const { fixed, width, vScrollbarSize } = props; const ret = width - vScrollbarSize; return fixed ? Math.max(Math.round(unref(columnsTotalWidth)), ret) : ret; }); const mainTableHeight = computed(() => { const { height = 0, maxHeight = 0, footerHeight, hScrollbarSize } = props; if (maxHeight > 0) { const _fixedRowsHeight = unref(fixedRowsHeight); const _rowsHeight = unref(rowsHeight); const total = unref(headerHeight) + _fixedRowsHeight + _rowsHeight + hScrollbarSize; return Math.min(total, maxHeight - footerHeight); } return height - footerHeight; }); const fixedTableHeight = computed(() => { const { maxHeight } = props; const tableHeight = unref(mainTableHeight); if (isNumber(maxHeight) && maxHeight > 0) return tableHeight; const totalHeight = unref(rowsHeight) + unref(headerHeight) + unref(fixedRowsHeight); return Math.min(tableHeight, totalHeight); }); const mapColumn = (column) => column.width; const leftTableWidth = computed(() => sum(unref(fixedColumnsOnLeft).map(mapColumn))); const rightTableWidth = computed(() => sum(unref(fixedColumnsOnRight).map(mapColumn))); const headerHeight = computed(() => sum(props.headerHeight)); const fixedRowsHeight = computed(() => { return (props.fixedData?.length || 0) * props.rowHeight; }); const windowHeight = computed(() => { return unref(mainTableHeight) - unref(headerHeight) - unref(fixedRowsHeight); }); const rootStyle = computed(() => { const { style = {}, height, width } = props; return enforceUnit({ ...style, height, width }); }); return { bodyWidth, fixedTableHeight, mainTableHeight, leftTableWidth, rightTableWidth, windowHeight, footerHeight: computed(() => enforceUnit({ height: props.footerHeight })), emptyStyle: computed(() => ({ top: addUnit(unref(headerHeight)), bottom: addUnit(props.footerHeight), width: addUnit(props.width) })), rootStyle, headerHeight }; }; //#endregion //#region ../../packages/components/table-v2/src/composables/use-auto-resize.ts const useAutoResize = (props) => { const sizer = ref(); const width$ = ref(0); const height$ = ref(0); let resizerStopper; onMounted(() => { resizerStopper = useResizeObserver(sizer, ([entry]) => { const { width, height } = entry.contentRect; const { paddingLeft, paddingRight, paddingTop, paddingBottom } = getComputedStyle(entry.target); const left = Number.parseInt(paddingLeft) || 0; const right = Number.parseInt(paddingRight) || 0; const top = Number.parseInt(paddingTop) || 0; const bottom = Number.parseInt(paddingBottom) || 0; width$.value = width - left - right; height$.value = height - top - bottom; }).stop; }); onBeforeUnmount(() => { resizerStopper?.(); }); watch([width$, height$], ([width, height]) => { props.onResize?.({ width, height }); }); return { sizer, width: width$, height: height$ }; }; //#endregion //#region ../../packages/components/table-v2/src/use-table.ts function useTable(props) { const mainTableRef = ref(); const leftTableRef = ref(); const rightTableRef = ref(); const { columns, columnsStyles, columnsTotalWidth, fixedColumnsOnLeft, fixedColumnsOnRight, hasFixedColumns, mainColumns, onColumnSorted } = useColumns(props, toRef(props, "columns"), toRef(props, "fixed")); const { scrollTo, scrollToLeft, scrollToTop, scrollToRow, onScroll, onVerticalScroll, scrollPos } = useScrollbar(props, { mainTableRef, leftTableRef, rightTableRef, onMaybeEndReached }); const ns = useNamespace("table-v2"); const instance = getCurrentInstance(); const isScrolling = shallowRef(false); const { expandedRowKeys, lastRenderedRowIndex, isDynamic, isResetting, rowHeights, resetAfterIndex, onRowExpanded, onRowHeightChange, onRowHovered, onRowsRendered } = useRow(props, { mainTableRef, leftTableRef, rightTableRef, tableInstance: instance, ns, isScrolling }); const { data, depthMap } = useData(props, { expandedRowKeys, lastRenderedRowIndex, resetAfterIndex }); const rowsHeight = computed(() => { const { estimatedRowHeight, rowHeight } = props; const _data = unref(data); if (isNumber(estimatedRowHeight)) return Object.values(unref(rowHeights)).reduce((acc, curr) => acc + curr, 0); return _data.length * rowHeight; }); const { bodyWidth, fixedTableHeight, mainTableHeight, leftTableWidth, rightTableWidth, windowHeight, footerHeight, emptyStyle, rootStyle, headerHeight } = useStyles(props, { columnsTotalWidth, fixedColumnsOnLeft, fixedColumnsOnRight, rowsHeight }); const containerRef = ref(); const showEmpty = computed(() => { const noData = unref(data).length === 0; return isArray$1(props.fixedData) ? props.fixedData.length === 0 && noData : noData; }); function getRowHeight(rowIndex) { const { estimatedRowHeight, rowHeight, rowKey } = props; if (!estimatedRowHeight) return rowHeight; return unref(rowHeights)[unref(data)[rowIndex][rowKey]] || estimatedRowHeight; } const isEndReached = ref(false); function onMaybeEndReached() { const { onEndReached } = props; if (!onEndReached) return; const { scrollTop } = unref(scrollPos); const _totalHeight = unref(rowsHeight); const remainDistance = _totalHeight - (scrollTop + unref(windowHeight)) + props.hScrollbarSize; if (!isEndReached.value && unref(lastRenderedRowIndex) >= 0 && _totalHeight <= scrollTop + unref(mainTableHeight) - unref(headerHeight)) { isEndReached.value = true; onEndReached(remainDistance); } else isEndReached.value = false; } watch(() => unref(rowsHeight), () => isEndReached.value = false); watch(() => props.expandedRowKeys, (val) => expandedRowKeys.value = val, { deep: true }); return { columns, containerRef, mainTableRef, leftTableRef, rightTableRef, isDynamic, isResetting, isScrolling, hasFixedColumns, columnsStyles, columnsTotalWidth, data, expandedRowKeys, depthMap, fixedColumnsOnLeft, fixedColumnsOnRight, mainColumns, bodyWidth, emptyStyle, rootStyle, footerHeight, mainTableHeight, fixedTableHeight, leftTableWidth, rightTableWidth, showEmpty, getRowHeight, onColumnSorted, onRowHovered, onRowExpanded, onRowsRendered, onRowHeightChange, scrollTo, scrollToLeft, scrollToTop, scrollToRow, onScroll, onVerticalScroll }; } //#endregion //#region ../../packages/components/table-v2/src/tokens.ts const TableV2InjectionKey = Symbol("tableV2"); const TABLE_V2_GRID_INJECTION_KEY = "tableV2GridScrollLeft"; //#endregion //#region ../../packages/components/table-v2/src/common.ts /** * @Note even though we can use `string[] | string` as the type but for * convenience here we only use `string` as the acceptable value here. */ const classType = String; const columns = { type: definePropType(Array), required: true }; const column = { type: definePropType(Object) }; const fixedDataType = { type: definePropType(Array) }; const dataType = { ...fixedDataType, required: true }; const expandColumnKey = String; const expandKeys = { type: definePropType(Array), default: () => mutable([]) }; const requiredNumber = { type: Number, required: true }; const rowKey = { type: definePropType([ String, Number, Symbol ]), default: "id" }; /** * @note even though we can use `StyleValue` but that would be difficult for us to mapping them, * so we only use `CSSProperties` as the acceptable value here. */ const styleType = { type: definePropType(Object) }; //#endregion //#region ../../packages/components/table-v2/src/row.ts const tableV2RowProps = buildProps({ class: String, columns, columnsStyles: { type: definePropType(Object), required: true }, depth: Number, expandColumnKey, estimatedRowHeight: { ...virtualizedGridProps.estimatedRowHeight, default: void 0 }, isScrolling: Boolean, onRowExpand: { type: definePropType(Function) }, onRowHover: { type: definePropType(Function) }, onRowHeightChange: { type: definePropType(Function) }, rowData: { type: definePropType(Object), required: true }, rowEventHandlers: { type: definePropType(Object) }, rowIndex: { type: Number, required: true }, /** * Unique item key */ rowKey, style: { type: definePropType(Object) } }); //#endregion //#region ../../packages/components/table-v2/src/header.ts const requiredNumberType = { type: Number, required: true }; const tableV2HeaderProps = buildProps({ class: String, columns, fixedHeaderData: { type: definePropType(Array) }, headerData: { type: definePropType(Array), required: true }, headerHeight: { type: definePropType([Number, Array]), default: 50 }, rowWidth: requiredNumberType, rowHeight: { type: Number, default: 50 }, height: requiredNumberType, width: requiredNumberType }); //#endregion //#region ../../packages/components/table-v2/src/grid.ts const tableV2GridProps = buildProps({ columns, data: dataType, fixedData: fixedDataType, estimatedRowHeight: tableV2RowProps.estimatedRowHeight, /** * Size related attributes */ width: requiredNumber, height: requiredNumber, headerWidth: requiredNumber, headerHeight: tableV2HeaderProps.headerHeight, bodyWidth: requiredNumber, rowHeight: requiredNumber, /** * Special attributes */ cache: virtualizedListProps.cache, useIsScrolling: Boolean, scrollbarAlwaysOn: virtualizedGridProps.scrollbarAlwaysOn, scrollbarStartGap: virtualizedGridProps.scrollbarStartGap, scrollbarEndGap: virtualizedGridProps.scrollbarEndGap, /** * CSS attributes */ class: classType, style: styleType, containerStyle: styleType, getRowHeight: { type: definePropType(Function), required: true }, rowKey: tableV2RowProps.rowKey, /** * Event handlers */ onRowsRendered: { type: definePropType(Function) }, onScroll: { type: definePropType(Function) } }); //#endregion //#region ../../packages/components/table-v2/src/table.ts const tableV2Props = buildProps({ cache: tableV2GridProps.cache, estimatedRowHeight: tableV2RowProps.estimatedRowHeight, rowKey, headerClass: { type: definePropType([String, Function]) }, headerProps: { type: definePropType([Object, Function]) }, headerCellProps: { type: definePropType([Object, Function]) }, headerHeight: tableV2HeaderProps.headerHeight, /** * Footer attributes */ footerHeight: { type: Number, default: 0 }, /** * Row attributes */ rowClass: { type: definePropType([String, Function]) }, rowProps: { type: definePropType([Object, Function]) }, rowHeight: { type: Number, default: 50 }, /** * Cell attributes */ cellProps: { type: definePropType([Object, Function]) }, /** * Data models */ columns, data: dataType, dataGetter: { type: definePropType(Function) }, fixedData: fixedDataType, /** * Expanded keys */ expandColumnKey: tableV2RowProps.expandColumnKey, expandedRowKeys: expandKeys, defaultExpandedRowKeys: expandKeys, /** * Attributes */ class: classType, fixed: Boolean, style: { type: definePropType(Object) }, width: requiredNumber, height: requiredNumber, maxHeight: Number, useIsScrolling: Boolean, indentSize: { type: Number, default: 12 }, iconSize: { type: Number, default: 12 }, hScrollbarSize: virtualizedGridProps.hScrollbarSize, vScrollbarSize: virtualizedGridProps.vScrollbarSize, scrollbarAlwaysOn: virtualizedScrollbarProps.alwaysOn, /** * Sorting */ sortBy: { type: definePropType(Object), default: () => ({}) }, sortState: { type: definePropType(Object), default: void 0 }, /** * Handlers */ onColumnSort: { type: definePropType(Function) }, onExpandedRowsChange: { type: definePropType(Function) }, onEndReached: { type: definePropType(Function) }, onRowExpand: tableV2RowProps.onRowExpand, onScroll: tableV2GridProps.onScroll, onRowsRendered: tableV2GridProps.onRowsRendered, rowEventHandlers: tableV2RowProps.rowEventHandlers }); //#endregion //#region ../../packages/components/table-v2/src/components/cell.tsx const TableV2Cell = (props, { slots }) => { const { cellData, style } = props; const displayText = cellData?.toString?.() || ""; const defaultSlot = renderSlot(slots, "default", props, () => [displayText]); return createVNode("div", { "class": props.class, "title": displayText, "style": style }, [defaultSlot]); }; TableV2Cell.displayName = "ElTableV2Cell"; TableV2Cell.inheritAttrs = false; //#endregion //#region ../../packages/components/table-v2/src/components/header-cell.tsx const HeaderCell = (props, { slots }) => renderSlot(slots, "default", props, () => [createVNode("div", { "class": props.class, "title": props.column?.title }, [props.column?.title])]); HeaderCell.displayName = "ElTableV2HeaderCell"; HeaderCell.inheritAttrs = false; //#endregion //#region ../../packages/components/table-v2/src/header-row.ts const tableV2HeaderRowProps = buildProps({ class: String, columns, columnsStyles: { type: definePropType(Object), required: true }, headerIndex: Number, style: { type: definePropType(Object) } }); //#endregion //#region ../../packages/components/table-v2/src/components/header-row.tsx const TableV2HeaderRow = /* @__PURE__ */ defineComponent({ name: "ElTableV2HeaderRow", props: tableV2HeaderRowProps, setup(props, { slots }) { return () => { const { columns, columnsStyles, headerIndex, style } = props; let Cells = columns.map((column, columnIndex) => { return slots.cell({ columns, column, columnIndex, headerIndex, style: columnsStyles[column.key] }); }); if (slots.header) Cells = slots.header({ cells: Cells.map((node) => { if (isArray$1(node) && node.length === 1) return node[0]; return node; }), columns, headerIndex }); return createVNode("div", { "class": props.class, "style": style, "role": "row" }, [Cells]); }; } }); //#endregion //#region ../../packages/components/table-v2/src/components/header.tsx const TableV2Header = /* @__PURE__ */ defineComponent({ name: "ElTableV2Header", props: tableV2HeaderProps, setup(props, { slots, expose }) { const ns = useNamespace("table-v2"); const scrollLeftInfo = inject(TABLE_V2_GRID_INJECTION_KEY); const headerRef = ref(); const headerStyle = computed(() => enforceUnit({ width: props.width, height: props.height })); const rowStyle = computed(() => enforceUnit({ width: props.rowWidth, height: props.height })); const headerHeights = computed(() => castArray$1(unref(props.headerHeight))); const scrollToLeft = (left) => { const headerEl = unref(headerRef); nextTick(() => { headerEl?.scroll && headerEl.scroll({ left }); }); }; const renderFixedRows = () => { const fixedRowClassName = ns.e("fixed-header-row"); const { columns, fixedHeaderData, rowHeight } = props; return fixedHeaderData?.map((fixedRowData, fixedRowIndex) => { const style = enforceUnit({ height: rowHeight, width: "100%" }); return slots.fixed?.({ class: fixedRowClassName, columns, rowData: fixedRowData, rowIndex: -(fixedRowIndex + 1), style }); }); }; const renderDynamicRows = () => { const dynamicRowClassName = ns.e("dynamic-header-row"); const { columns } = props; return unref(headerHeights).map((rowHeight, rowIndex) => { const style = enforceUnit({ width: "100%", height: rowHeight }); return slots.dynamic?.({ class: dynamicRowClassName, columns, headerIndex: rowIndex, style }); }); }; onUpdated(() => { if (scrollLeftInfo?.value) scrollToLeft(scrollLeftInfo.value); }); expose({ /** * @description scroll to position based on the provided value */ scrollToLeft }); return () => { if (props.height <= 0) return; return createVNode("div", { "ref": headerRef, "class": props.class, "style": unref(headerStyle), "role": "rowgroup" }, [createVNode("div", { "style": unref(rowStyle), "class": ns.e("header") }, [renderDynamicRows(), renderFixedRows()])]); }; } }); //#endregion //#region ../../packages/components/table-v2/src/components/row.tsx const useTableRow = (props) => { const { isScrolling } = inject(TableV2InjectionKey); const measured = ref(false); const rowRef = ref(); const measurable = computed(() => { return isNumber(props.estimatedRowHeight) && props.rowIndex >= 0; }); const doMeasure = (isInit = false) => { const $rowRef = unref(rowRef); if (!$rowRef) return; const { columns, onRowHeightChange, rowKey, rowIndex, style } = props; const { height } = $rowRef.getBoundingClientRect(); measured.value = true; nextTick(() => { if (isInit || height !== Number.parseInt(style.height)) { const firstColumn = columns[0]; const isPlaceholder = firstColumn?.placeholderSign === placeholderSign; onRowHeightChange?.({ rowKey, height, rowIndex }, firstColumn && !isPlaceholder && firstColumn.fixed); } }); }; const eventHandlers = computed(() => { const { rowData, rowIndex, rowKey, onRowHover } = props; const handlers = props.rowEventHandlers || {}; const eventHandlers = {}; Object.entries(handlers).forEach(([eventName, handler]) => { if (isFunction$1(handler)) eventHandlers[eventName] = (event) => { handler({ event, rowData, rowIndex, rowKey }); }; }); if (onRowHover) [{ name: "onMouseleave", hovered: false }, { name: "onMouseenter", hovered: true }].forEach(({ name, hovered }) => { const existedHandler = eventHandlers[name]; eventHandlers[name] = (event) => { onRowHover({ event, hovered, rowData, rowIndex, rowKey }); existedHandler?.(event); }; }); return eventHandlers; }); const onExpand = (expanded) => { const { onRowExpand, rowData, rowIndex, rowKey } = props; onRowExpand?.({ expanded, rowData, rowIndex, rowKey }); }; onMounted(() => { if (unref(measurable)) doMeasure(true); }); return { isScrolling, measurable, measured, rowRef, eventHandlers, onExpand }; }; const TableV2Row = /* @__PURE__ */ defineComponent({ name: "ElTableV2TableRow", props: tableV2RowProps, setup(props, { expose, slots, attrs }) { const { eventHandlers, isScrolling, measurable, measured, rowRef, onExpand } = useTableRow(props); expose({ /** * @description manually dispatching expand action on row. */ onExpand }); return () => { const { columns, columnsStyles, expandColumnKey, depth, rowData, rowIndex, style } = props; let ColumnCells = columns.map((column, columnIndex) => { const expandable = isArray$1(rowData.children) && rowData.children.length > 0 && column.key === expandColumnKey; return slots.cell({ column, columns, columnIndex, depth, style: columnsStyles[column.key], rowData, rowIndex, isScrolling: unref(isScrolling), expandIconProps: expandable ? { rowData, rowIndex, onExpand } : void 0 }); }); if (slots.row) ColumnCells = slots.row({ cells: ColumnCells.map((node) => { if (isArray$1(node) && node.length === 1) return node[0]; return node; }), style, columns, depth, rowData, rowIndex, isScrolling: unref(isScrolling) }); if (unref(measurable)) { const { height, ...exceptHeightStyle } = style || {}; const _measured = unref(measured); return createVNode("div", mergeProps({ "ref": rowRef, "class": props.class, "style": _measured ? style : exceptHeightStyle, "role": "row" }, attrs, unref(eventHandlers)), [ColumnCells]); } return createVNode("div", mergeProps(attrs, { "ref": rowRef, "class": props.class, "style": style, "role": "row" }, unref(eventHandlers)), [ColumnCells]); }; } }); //#endregion //#region ../../packages/components/table-v2/src/components/sort-icon.tsx const SortIcon = (props) => { const { sortOrder } = props; return createVNode("button", { "type": "button", "aria-label": props.ariaLabel, "class": props.class }, [createVNode(ElIcon, { "size": 14 }, { default: () => [sortOrder === "asc" ? createVNode(sort_up_default, null, null) : createVNode(sort_down_default, null, null)] })]); }; //#endregion //#region ../../packages/components/table-v2/src/components/expand-icon.tsx const ExpandIcon = (props) => { const { expanded, expandable, onExpand, style, size, ariaLabel } = props; return createVNode("button", mergeProps({ onClick: expandable ? () => onExpand(!expanded) : void 0, ariaLabel, ariaExpanded: expanded, class: props.class }, { "type": "button" }), [createVNode(ElIcon, { "size": size, "style": style }, { default: () => [createVNode(arrow_right_default, null, null)] })]); }; ExpandIcon.inheritAttrs = false; //#endregion //#region ../../packages/components/table-v2/src/table-grid.tsx const COMPONENT_NAME$5 = "ElTableV2Grid"; const useTableGrid = (props) => { const headerRef = ref(); const bodyRef = ref(); const scrollLeft = ref(0); const totalHeight = computed(() => { const { data, rowHeight, estimatedRowHeight } = props; if (estimatedRowHeight) return; return data.length * rowHeight; }); const fixedRowHeight = computed(() => { const { fixedData, rowHeight } = props; return (fixedData?.length || 0) * rowHeight; }); const headerHeight = computed(() => sum(props.headerHeight)); const gridHeight = computed(() => { const { height } = props; return Math.max(0, height - unref(headerHeight) - unref(fixedRowHeight)); }); const hasHeader = computed(() => { return unref(headerHeight) + unref(fixedRowHeight) > 0; }); const itemKey = ({ data, rowIndex }) => data[rowIndex][props.rowKey]; function onItemRendered({ rowCacheStart, rowCacheEnd, rowVisibleStart, rowVisibleEnd }) { props.onRowsRendered?.({ rowCacheStart, rowCacheEnd, rowVisibleStart, rowVisibleEnd }); } function resetAfterRowIndex(index, forceUpdate) { bodyRef.value?.resetAfterRowIndex(index, forceUpdate); } function scrollTo(leftOrOptions, top) { const header$ = unref(headerRef); const body$ = unref(bodyRef); if (isObject$1(leftOrOptions)) { header$?.scrollToLeft(leftOrOptions.scrollLeft); scrollLeft.value = leftOrOptions.scrollLeft; body$?.scrollTo(leftOrOptions); } else { header$?.scrollToLeft(leftOrOptions); scrollLeft.value = leftOrOptions; body$?.scrollTo({ scrollLeft: leftOrOptions, scrollTop: top }); } } function scrollToTop(scrollTop) { unref(bodyRef)?.scrollTo({ scrollTop }); } function scrollToRow(row, strategy) { const body = unref(bodyRef); if (!body) return; const prevScrollLeft = scrollLeft.value; body.scrollToItem(row, 0, strategy); if (prevScrollLeft) scrollTo({ scrollLeft: prevScrollLeft }); } function forceUpdate() { unref(bodyRef)?.$forceUpdate(); unref(headerRef)?.$forceUpdate(); } watch(() => props.bodyWidth, () => { if (isNumber(props.estimatedRowHeight)) bodyRef.value?.resetAfter({ columnIndex: 0 }, false); }); return { bodyRef, forceUpdate, fixedRowHeight, gridHeight, hasHeader, headerHeight, headerRef, totalHeight, itemKey, onItemRendered, resetAfterRowIndex, scrollTo, scrollToTop, scrollToRow, scrollLeft }; }; const TableGrid = /* @__PURE__ */ defineComponent({ name: COMPONENT_NAME$5, props: tableV2GridProps, setup(props, { slots, expose }) { const { ns } = inject(TableV2InjectionKey); const { bodyRef, fixedRowHeight, gridHeight, hasHeader, headerRef, headerHeight, totalHeight, forceUpdate, itemKey, onItemRendered, resetAfterRowIndex, scrollTo, scrollToTop, scrollToRow, scrollLeft } = useTableGrid(props); provide(TABLE_V2_GRID_INJECTION_KEY, scrollLeft); onActivated(async () => { await nextTick(); const scrollTop = bodyRef.value?.states.scrollTop; scrollTop && scrollToTop(Math.round(scrollTop) + 1); }); expose({ forceUpdate, /** * @description fetch total height */ totalHeight, /** * @description scroll to a position */ scrollTo, /** * @description scroll vertically to position y */ scrollToTop, /** * @description scroll to a given row * @params row {Number} which row to scroll to * @params strategy {ScrollStrategy} use what strategy to scroll to */ scrollToRow, /** * @description reset rendered state after row index */ resetAfterRowIndex }); const getColumnWidth = () => props.bodyWidth; return () => { const { cache, columns, data, fixedData, useIsScrolling, scrollbarAlwaysOn, scrollbarEndGap, scrollbarStartGap, style, rowHeight, bodyWidth, estimatedRowHeight, headerWidth, height, width, getRowHeight, onScroll } = props; const isDynamicRowEnabled = isNumber(estimatedRowHeight); const Grid = isDynamicRowEnabled ? DynamicSizeGrid : FixedSizeGrid; const _headerHeight = unref(headerHeight); return createVNode("div", { "role": "table", "class": [ns.e("table"), props.class], "style": style }, [createVNode(Grid, { "ref": bodyRef, "data": data, "useIsScrolling": useIsScrolling, "itemKey": itemKey, "columnCache": 0, "columnWidth": isDynamicRowEnabled ? getColumnWidth : bodyWidth, "totalColumn": 1, "totalRow": data.length, "rowCache": cache, "rowHeight": isDynamicRowEnabled ? getRowHeight : rowHeight, "width": width, "height": unref(gridHeight), "class": ns.e("body"), "role": "rowgroup", "scrollbarStartGap": scrollbarStartGap, "scrollbarEndGap": scrollbarEndGap, "scrollbarAlwaysOn": scrollbarAlwaysOn, "onScroll": onScroll, "onItemRendered": onItemRendered, "perfMode": false }, { default: (params) => { const rowData = data[params.rowIndex]; return slots.row?.({ ...params, columns, rowData }); } }), unref(hasHeader) && createVNode(TableV2Header, { "ref": headerRef, "class": ns.e("header-wrapper"), "columns": columns, "headerData": data, "headerHeight": props.headerHeight, "fixedHeaderData": fixedData, "rowWidth": headerWidth, "rowHeight": rowHeight, "width": width, "height": Math.min(_headerHeight + unref(fixedRowHeight), height) }, { dynamic: slots.header, fixed: slots.row })]); }; } }); //#endregion //#region ../../packages/components/table-v2/src/renderers/main-table.tsx function _isSlot$5(s) { return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !isVNode(s); } const MainTable = (props, { slots }) => { const { mainTableRef, ...rest } = props; return createVNode(TableGrid, mergeProps({ "ref": mainTableRef }, rest), _isSlot$5(slots) ? slots : { default: () => [slots] }); }; //#endregion //#region ../../packages/components/table-v2/src/renderers/left-table.tsx function _isSlot$4(s) { return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !isVNode(s); } const LeftTable = (props, { slots }) => { if (!props.columns.length) return; const { leftTableRef, ...rest } = props; return createVNode(TableGrid, mergeProps({ "ref": leftTableRef }, rest), _isSlot$4(slots) ? slots : { default: () => [slots] }); }; //#endregion //#region ../../packages/components/table-v2/src/renderers/right-table.tsx function _isSlot$3(s) { return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !isVNode(s); } const RightTable = (props, { slots }) => { if (!props.columns.length) return; const { rightTableRef, ...rest } = props; return createVNode(TableGrid, mergeProps({ "ref": rightTableRef }, rest), _isSlot$3(slots) ? slots : { default: () => [slots] }); }; //#endregion //#region ../../packages/components/table-v2/src/renderers/row.tsx function _isSlot$2(s) { return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !isVNode(s); } const RowRenderer = (props, { slots }) => { const { columns, columnsStyles, depthMap, expandColumnKey, expandedRowKeys, estimatedRowHeight, hasFixedColumns, rowData, rowIndex, style, isScrolling, rowProps, rowClass, rowKey, rowEventHandlers, ns, onRowHovered, onRowExpanded } = props; const rowKls = tryCall(rowClass, { columns, rowData, rowIndex }, ""); const additionalProps = tryCall(rowProps, { columns, rowData, rowIndex }); const _rowKey = rowData[rowKey]; const depth = depthMap[_rowKey] || 0; const canExpand = Boolean(expandColumnKey); const isFixedRow = rowIndex < 0; const kls = [ ns.e("row"), rowKls, ns.is("expanded", canExpand && expandedRowKeys.includes(_rowKey)), ns.is("fixed", !depth && isFixedRow), ns.is("customized", Boolean(slots.row)), { [ns.e(`row-depth-${depth}`)]: canExpand && rowIndex >= 0 } ]; const onRowHover = hasFixedColumns ? onRowHovered : void 0; const _rowProps = { ...additionalProps, columns, columnsStyles, class: kls, depth, expandColumnKey, estimatedRowHeight: isFixedRow ? void 0 : estimatedRowHeight, isScrolling, rowIndex, rowData, rowKey: _rowKey, rowEventHandlers, style }; const handlerMouseEnter = (e) => { onRowHover?.({ hovered: true, rowKey: _rowKey, event: e, rowData, rowIndex }); }; const handlerMouseLeave = (e) => { onRowHover?.({ hovered: false, rowKey: _rowKey, event: e, rowData, rowIndex }); }; return createVNode(TableV2Row, mergeProps(_rowProps, { "onRowExpand": onRowExpanded, "onMouseenter": handlerMouseEnter, "onMouseleave": handlerMouseLeave, "rowkey": _rowKey }), _isSlot$2(slots) ? slots : { default: () => [slots] }); }; //#endregion //#region ../../packages/components/table-v2/src/renderers/cell.tsx const CellRenderer = ({ columns, column, columnIndex, depth, expandIconProps, isScrolling, rowData, rowIndex, style, expandedRowKeys, ns, t, cellProps: _cellProps, expandColumnKey, indentSize, iconSize, rowKey }, { slots }) => { const cellStyle = enforceUnit(style); if (column.placeholderSign === placeholderSign) return createVNode("div", { "class": ns.em("row-cell", "placeholder"), "style": cellStyle }, null); const { cellRenderer, dataKey, dataGetter } = column; const cellData = isFunction$1(dataGetter) ? dataGetter({ columns, column, columnIndex, rowData, rowIndex }) : get(rowData, dataKey ?? ""); const extraCellProps = tryCall(_cellProps, { cellData, columns, column, columnIndex, rowIndex, rowData }); const cellProps = { class: ns.e("cell-text"), columns, column, columnIndex, cellData, isScrolling, rowData, rowIndex }; const columnCellRenderer = componentToSlot(cellRenderer); const Cell = columnCellRenderer ? columnCellRenderer(cellProps) : renderSlot(slots, "default", cellProps, () => [createVNode(TableV2Cell, cellProps, null)]); const kls = [ ns.e("row-cell"), column.class, column.align === "center" && ns.is("align-center"), column.align === "right" && ns.is("align-right") ]; const expandable = rowIndex >= 0 && expandColumnKey && column.key === expandColumnKey; const expanded = rowIndex >= 0 && expandedRowKeys.includes(rowData[rowKey]); let IconOrPlaceholder; const iconStyle = `margin-inline-start: ${depth * indentSize}px;`; if (expandable) if (isObject$1(expandIconProps)) IconOrPlaceholder = createVNode(ExpandIcon, mergeProps(expandIconProps, { "class": [ns.e("expand-icon"), ns.is("expanded", expanded)], "size": iconSize, "expanded": expanded, "ariaLabel": t(expanded ? "el.table.collapseRowLabel" : "el.table.expandRowLabel"), "style": iconStyle, "expandable": true }), null); else IconOrPlaceholder = createVNode("div", { "style": [iconStyle, `width: ${iconSize}px; height: ${iconSize}px;`].join(" ") }, null); return createVNode("div", mergeProps({ "class": kls, "style": cellStyle }, extraCellProps, { "role": "cell" }), [IconOrPlaceholder, Cell]); }; CellRenderer.inheritAttrs = false; //#endregion //#region ../../packages/components/table-v2/src/renderers/header.tsx function _isSlot$1(s) { return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !isVNode(s); } const HeaderRenderer = ({ columns, columnsStyles, headerIndex, style, headerClass, headerProps, ns }, { slots }) => { const param = { columns, headerIndex }; const kls = [ ns.e("header-row"), tryCall(headerClass, param, ""), ns.is("customized", Boolean(slots.header)) ]; return createVNode(TableV2HeaderRow, { ...tryCall(headerProps, param), columnsStyles, class: kls, columns, headerIndex, style }, _isSlot$1(slots) ? slots : { default: () => [slots] }); }; //#endregion //#region ../../packages/components/table-v2/src/renderers/header-cell.tsx const HeaderCellRenderer = (props, { slots }) => { const { column, ns, t, style, onColumnSorted } = props; const cellStyle = enforceUnit(style); if (column.placeholderSign === placeholderSign) return createVNode("div", { "class": ns.em("header-row-cell", "placeholder"), "style": cellStyle }, null); const { headerCellRenderer, headerClass, sortable } = column; /** * render Cell children */ const cellProps = { ...props, class: ns.e("header-cell-text") }; const columnCellRenderer = componentToSlot(headerCellRenderer); const Cell = columnCellRenderer ? columnCellRenderer(cellProps) : renderSlot(slots, "default", cellProps, () => [createVNode(HeaderCell, cellProps, null)]); /** * Render cell container and sort indicator */ const { sortBy, sortState, headerCellProps } = props; let sorting, sortOrder, ariaSort; if (sortState) { const order = sortState[column.key]; sorting = Boolean(oppositeOrderMap[order]); sortOrder = sorting ? order : "asc"; } else { sorting = column.key === sortBy.key; sortOrder = sorting ? sortBy.order : "asc"; } if (sortOrder === "asc") ariaSort = "ascending"; else if (sortOrder === "desc") ariaSort = "descending"; else ariaSort = void 0; const cellKls = [ ns.e("header-cell"), tryCall(headerClass, props, ""), column.align === "center" && ns.is("align-center"), column.align === "right" && ns.is("align-right"), sortable && ns.is("sortable") ]; return createVNode("div", mergeProps({ ...tryCall(headerCellProps, props), onClick: column.sortable ? onColumnSorted : void 0, ariaSort: sortable ? ariaSort : void 0, class: cellKls, style: cellStyle, ["data-key"]: column.key }, { "role": "columnheader" }), [Cell, sortable && createVNode(SortIcon, { "class": [ns.e("sort-icon"), sorting && ns.is("sorting")], "sortOrder": sortOrder, "ariaLabel": t("el.table.sortLabel", { column: column.title || "" }) }, null)]); }; //#endregion //#region ../../packages/components/table-v2/src/renderers/footer.tsx const Footer$1 = (props, { slots }) => { return createVNode("div", { "class": props.class, "style": props.style }, [slots.default?.()]); }; Footer$1.displayName = "ElTableV2Footer"; //#endregion //#region ../../packages/components/table-v2/src/renderers/empty.tsx const Footer = (props, { slots }) => { const defaultSlot = renderSlot(slots, "default", {}, () => [createVNode(ElEmpty, null, null)]); return createVNode("div", { "class": props.class, "style": props.style }, [defaultSlot]); }; Footer.displayName = "ElTableV2Empty"; //#endregion //#region ../../packages/components/table-v2/src/renderers/overlay.tsx const Overlay = (props, { slots }) => { return createVNode("div", { "class": props.class, "style": props.style }, [slots.default?.()]); }; Overlay.displayName = "ElTableV2Overlay"; //#endregion //#region ../../packages/components/table-v2/src/table-v2.tsx function _isSlot(s) { return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !isVNode(s); } const TableV2 = /* @__PURE__ */ defineComponent({ name: "ElTableV2", props: tableV2Props, slots: Object, setup(props, { slots, expose }) { const ns = useNamespace("table-v2"); const { t } = useLocale(); const { columnsStyles, fixedColumnsOnLeft, fixedColumnsOnRight, mainColumns, mainTableHeight, fixedTableHeight, leftTableWidth, rightTableWidth, data, depthMap, expandedRowKeys, hasFixedColumns, mainTableRef, leftTableRef, rightTableRef, isDynamic, isResetting, isScrolling, bodyWidth, emptyStyle, rootStyle, footerHeight, showEmpty, scrollTo, scrollToLeft, scrollToTop, scrollToRow, getRowHeight, onColumnSorted, onRowHeightChange, onRowHovered, onRowExpanded, onRowsRendered, onScroll, onVerticalScroll } = useTable(props); expose({ /** * @description scroll to a given position * @params params {{ scrollLeft?: number, scrollTop?: number }} where to scroll to. */ scrollTo, /** * @description scroll to a given position horizontally * @params scrollLeft {Number} where to scroll to. */ scrollToLeft, /** * @description scroll to a given position vertically * @params scrollTop { Number } where to scroll to. */ scrollToTop, /** * @description scroll to a given row * @params row {Number} which row to scroll to * @params @optional strategy {ScrollStrategy} use what strategy to scroll to */ scrollToRow }); provide(TableV2InjectionKey, { ns, isResetting, isScrolling }); return () => { const { cache, cellProps, estimatedRowHeight, expandColumnKey, fixedData, headerHeight, headerClass, headerProps, headerCellProps, sortBy, sortState, rowHeight, rowClass, rowEventHandlers, rowKey, rowProps, scrollbarAlwaysOn, indentSize, iconSize, useIsScrolling, vScrollbarSize, width } = props; const _data = unref(data); const mainTableProps = { cache, class: ns.e("main"), columns: unref(mainColumns), data: _data, fixedData, estimatedRowHeight, bodyWidth: unref(bodyWidth), headerHeight, headerWidth: unref(bodyWidth), height: unref(mainTableHeight), mainTableRef, rowKey, rowHeight, scrollbarAlwaysOn, scrollbarStartGap: 2, scrollbarEndGap: vScrollbarSize, useIsScrolling, width, getRowHeight, onRowsRendered, onScroll }; const leftColumnsWidth = unref(leftTableWidth); const _fixedTableHeight = unref(fixedTableHeight); const leftTableProps = { cache, class: ns.e("left"), columns: unref(fixedColumnsOnLeft), data: _data, fixedData, estimatedRowHeight, leftTableRef, rowHeight, bodyWidth: leftColumnsWidth, headerWidth: leftColumnsWidth, headerHeight, height: _fixedTableHeight, rowKey, scrollbarAlwaysOn, scrollbarStartGap: 2, scrollbarEndGap: vScrollbarSize, useIsScrolling, width: leftColumnsWidth, getRowHeight, onScroll: onVerticalScroll }; const rightColumnsWidth = unref(rightTableWidth); const rightTableProps = { cache, class: ns.e("right"), columns: unref(fixedColumnsOnRight), data: _data, fixedData, estimatedRowHeight, rightTableRef, rowHeight, bodyWidth: rightColumnsWidth, headerWidth: rightColumnsWidth, headerHeight, height: _fixedTableHeight, rowKey, scrollbarAlwaysOn, scrollbarStartGap: 2, scrollbarEndGap: vScrollbarSize, width: rightColumnsWidth, style: `${ns.cssVarName("table-scrollbar-size")}: ${vScrollbarSize}px`, useIsScrolling, getRowHeight, onScroll: onVerticalScroll }; const _columnsStyles = unref(columnsStyles); const tableRowProps = { ns, depthMap: unref(depthMap), columnsStyles: _columnsStyles, expandColumnKey, expandedRowKeys: unref(expandedRowKeys), estimatedRowHeight, hasFixedColumns: unref(hasFixedColumns), rowProps, rowClass, rowKey, rowEventHandlers, onRowHovered, onRowExpanded, onRowHeightChange }; const tableCellProps = { cellProps, expandColumnKey, indentSize, iconSize, rowKey, expandedRowKeys: unref(expandedRowKeys), ns, t }; const tableHeaderProps = { ns, headerClass, headerProps, columnsStyles: _columnsStyles }; const tableHeaderCellProps = { ns, t, sortBy, sortState, headerCellProps, onColumnSorted }; const tableSlots = { row: (props) => createVNode(RowRenderer, mergeProps(props, tableRowProps), { row: slots.row, cell: (props) => { let _slot; return slots.cell ? createVNode(CellRenderer, mergeProps(props, tableCellProps, { "style": _columnsStyles[props.column.key] }), _isSlot(_slot = slots.cell(props)) ? _slot : { default: () => [_slot] }) : createVNode(CellRenderer, mergeProps(props, tableCellProps, { "style": _columnsStyles[props.column.key] }), null); } }), header: (props) => createVNode(HeaderRenderer, mergeProps(props, tableHeaderProps), { header: slots.header, cell: (props) => { let _slot2; return slots["header-cell"] ? createVNode(HeaderCellRenderer, mergeProps(props, tableHeaderCellProps, { "style": _columnsStyles[props.column.key] }), _isSlot(_slot2 = slots["header-cell"](props)) ? _slot2 : { default: () => [_slot2] }) : createVNode(HeaderCellRenderer, mergeProps(props, tableHeaderCellProps, { "style": _columnsStyles[props.column.key] }), null); } }) }; const rootKls = [ props.class, ns.b(), ns.e("root"), ns.is("dynamic", unref(isDynamic)) ]; const footerProps = { class: ns.e("footer"), style: unref(footerHeight) }; return createVNode("div", { "class": rootKls, "style": unref(rootStyle) }, [ createVNode(MainTable, mainTableProps, _isSlot(tableSlots) ? tableSlots : { default: () => [tableSlots] }), createVNode(LeftTable, leftTableProps, _isSlot(tableSlots) ? tableSlots : { default: () => [tableSlots] }), createVNode(RightTable, rightTableProps, _isSlot(tableSlots) ? tableSlots : { default: () => [tableSlots] }), slots.footer && createVNode(Footer$1, footerProps, { default: slots.footer }), unref(showEmpty) && createVNode(Footer, { "class": ns.e("empty"), "style": unref(emptyStyle) }, { default: slots.empty }), slots.overlay && createVNode(Overlay, { "class": ns.e("overlay") }, { default: slots.overlay }) ]); }; } }); //#endregion //#region ../../packages/components/table-v2/src/auto-resizer.ts const autoResizerProps = buildProps({ disableWidth: Boolean, disableHeight: Boolean, onResize: { type: definePropType(Function) } }); //#endregion //#region ../../packages/components/table-v2/src/components/auto-resizer.tsx const AutoResizer = /* @__PURE__ */ defineComponent({ name: "ElAutoResizer", props: autoResizerProps, setup(props, { slots }) { const ns = useNamespace("auto-resizer"); const { height, width, sizer } = useAutoResize(props); const style = { width: "100%", height: "100%" }; return () => { return createVNode("div", { "ref": sizer, "class": ns.b(), "style": style }, [slots.default?.({ height: height.value, width: width.value })]); }; } }); //#endregion //#region ../../packages/components/table-v2/index.ts const ElTableV2 = withInstall(TableV2); const ElAutoResizer = withInstall(AutoResizer); //#endregion //#region ../../packages/components/tabs/src/constants.ts const tabsRootContextKey = Symbol("tabsRootContextKey"); //#endregion //#region ../../packages/components/tabs/src/tab-bar.ts /** * @deprecated Removed after 3.0.0, Use `TabBarProps` instead. */ const tabBarProps = buildProps({ tabs: { type: definePropType(Array), default: () => mutable([]) }, tabRefs: { type: definePropType(Object), default: () => mutable({}) } }); //#endregion //#region ../../packages/components/tabs/src/tab-bar.vue?vue&type=script&setup=true&lang.ts const COMPONENT_NAME$4 = "ElTabBar"; var tab_bar_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: COMPONENT_NAME$4, __name: "tab-bar", props: tabBarProps, setup(__props, { expose: __expose }) { const props = __props; const rootTabs = inject(tabsRootContextKey); if (!rootTabs) throwError(COMPONENT_NAME$4, ""); const ns = useNamespace("tabs"); const barRef = ref(); const barStyle = ref(); /** * when defaultValue is not set, the bar is always shown. * * when defaultValue is set, the bar will be hidden until style is calculated * to avoid the bar showing in the wrong position on initial render. */ const renderActiveBar = computed(() => isUndefined(rootTabs.props.defaultValue) || Boolean(barStyle.value?.transform)); const getBarStyle = () => { let offset = 0; let tabSize = 0; const sizeName = ["top", "bottom"].includes(rootTabs.props.tabPosition) ? "width" : "height"; const sizeDir = sizeName === "width" ? "x" : "y"; const position = sizeDir === "x" ? "left" : "top"; props.tabs.every((tab) => { if (isUndefined(tab.paneName)) return false; const $el = props.tabRefs[tab.paneName]; if (!$el) return false; if (!tab.active) return true; offset = $el[`offset${capitalize(position)}`]; tabSize = $el[`client${capitalize(sizeName)}`]; const tabStyles = window.getComputedStyle($el); if (sizeName === "width") { tabSize -= Number.parseFloat(tabStyles.paddingLeft) + Number.parseFloat(tabStyles.paddingRight); offset += Number.parseFloat(tabStyles.paddingLeft); } return false; }); return { [sizeName]: `${tabSize}px`, transform: `translate${capitalize(sizeDir)}(${offset}px)` }; }; const update = () => barStyle.value = getBarStyle(); const tabObservers = []; const observerTabs = () => { tabObservers.forEach((observer) => observer.stop()); tabObservers.length = 0; Object.values(props.tabRefs).forEach((tab) => { tabObservers.push(useResizeObserver(tab, update)); }); }; watch(() => props.tabs, async () => { await nextTick(); update(); observerTabs(); }, { immediate: true }); const barObserver = useResizeObserver(barRef, () => update()); onBeforeUnmount(() => { tabObservers.forEach((observer) => observer.stop()); tabObservers.length = 0; barObserver.stop(); }); __expose({ /** @description tab root html element */ ref: barRef, /** @description method to manually update tab bar style, return the updated style */ update }); return (_ctx, _cache) => { return renderActiveBar.value ? (openBlock(), createElementBlock("div", { key: 0, ref_key: "barRef", ref: barRef, class: normalizeClass([unref(ns).e("active-bar"), unref(ns).is(unref(rootTabs).props.tabPosition)]), style: normalizeStyle(barStyle.value) }, null, 6)) : createCommentVNode("v-if", true); }; } }); //#endregion //#region ../../packages/components/tabs/src/tab-bar.vue var tab_bar_default = tab_bar_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/tabs/src/tab-nav.tsx const tabNavProps = buildProps({ panes: { type: definePropType(Array), default: () => mutable([]) }, currentName: { type: [String, Number], default: "" }, editable: Boolean, type: { type: String, values: [ "card", "border-card", "" ], default: "" }, stretch: Boolean, /** * @description tab-nav tabindex */ tabindex: { type: [String, Number], default: void 0 } }); const tabNavEmits = { tabClick: (tab, tabName, ev) => ev instanceof Event, tabRemove: (tab, ev) => ev instanceof Event }; const COMPONENT_NAME$3 = "ElTabNav"; const TabNav = /* @__PURE__ */ defineComponent({ name: COMPONENT_NAME$3, props: tabNavProps, emits: tabNavEmits, setup(props, { expose, emit }) { const rootTabs = inject(tabsRootContextKey); if (!rootTabs) throwError(COMPONENT_NAME$3, ``); const ns = useNamespace("tabs"); const visibility = useDocumentVisibility(); const focused = useWindowFocus(); const navScroll$ = ref(); const nav$ = ref(); const el$ = ref(); const tabRefsMap = ref({}); const tabBarRef = ref(); const scrollable = ref(false); const navOffset = ref(0); const isFocus = ref(false); const focusable = ref(true); const isWheelScrolling = ref(false); const tracker = shallowRef(); const isHorizontal = computed(() => ["top", "bottom"].includes(rootTabs.props.tabPosition)); const sizeName = computed(() => isHorizontal.value ? "width" : "height"); const navStyle = computed(() => { const dir = sizeName.value === "width" ? "X" : "Y"; return { transition: isWheelScrolling.value ? "none" : void 0, transform: `translate${dir}(-${navOffset.value}px)` }; }); const { width: navContainerWidth, height: navContainerHeight } = useElementSize(navScroll$); const { width: navWidth, height: navHeight } = useElementSize(nav$, { width: 0, height: 0 }, { box: "border-box" }); const navContainerSize = computed(() => isHorizontal.value ? navContainerWidth.value : navContainerHeight.value); const navSize = computed(() => isHorizontal.value ? navWidth.value : navHeight.value); const { onWheel } = useWheel({ atStartEdge: computed(() => navOffset.value <= 0), atEndEdge: computed(() => navSize.value - navOffset.value <= navContainerSize.value), layout: computed(() => isHorizontal.value ? "horizontal" : "vertical") }, (offset) => { navOffset.value = clamp$1(navOffset.value + offset, 0, navSize.value - navContainerSize.value); }); const handleWheel = (event) => { isWheelScrolling.value = true; onWheel(event); rAF(() => { isWheelScrolling.value = false; }); }; const scrollPrev = () => { if (!navScroll$.value) return; const containerSize = navScroll$.value.getBoundingClientRect()[sizeName.value]; const currentOffset = navOffset.value; if (!currentOffset) return; navOffset.value = currentOffset > containerSize ? currentOffset - containerSize : 0; }; const scrollNext = () => { if (!navScroll$.value || !nav$.value) return; const navSize = nav$.value.getBoundingClientRect()[sizeName.value]; const containerSize = navScroll$.value.getBoundingClientRect()[sizeName.value]; const currentOffset = navOffset.value; if (!isGreaterThan(navSize - currentOffset, containerSize)) return; navOffset.value = navSize - currentOffset > containerSize * 2 ? currentOffset + containerSize : navSize - containerSize; }; const scrollToActiveTab = async () => { const nav = nav$.value; if (!scrollable.value || !el$.value || !navScroll$.value || !nav) return; await nextTick(); const activeTab = tabRefsMap.value[props.currentName]; if (!activeTab) return; const navScroll = navScroll$.value; const activeTabBounding = activeTab.getBoundingClientRect(); const navScrollBounding = navScroll.getBoundingClientRect(); const navScrollLeft = navScrollBounding.left + 1; const navScrollRight = navScrollBounding.right - 1; const navBounding = nav.getBoundingClientRect(); const maxOffset = isHorizontal.value ? navBounding.width - navScrollBounding.width : navBounding.height - navScrollBounding.height; const currentOffset = navOffset.value; let newOffset = currentOffset; if (isHorizontal.value) { if (activeTabBounding.left < navScrollLeft) newOffset = currentOffset - (navScrollLeft - activeTabBounding.left); if (activeTabBounding.right > navScrollRight) newOffset = currentOffset + activeTabBounding.right - navScrollRight; } else { if (activeTabBounding.top < navScrollBounding.top) newOffset = currentOffset - (navScrollBounding.top - activeTabBounding.top); if (activeTabBounding.bottom > navScrollBounding.bottom) newOffset = currentOffset + (activeTabBounding.bottom - navScrollBounding.bottom); } newOffset = Math.max(newOffset, 0); navOffset.value = Math.min(newOffset, maxOffset); }; const update = () => { if (!nav$.value || !navScroll$.value) return; props.stretch && tabBarRef.value?.update(); const navSize = nav$.value.getBoundingClientRect()[sizeName.value]; const containerSize = navScroll$.value.getBoundingClientRect()[sizeName.value]; const currentOffset = navOffset.value; if (containerSize < navSize) { scrollable.value = scrollable.value || {}; scrollable.value.prev = currentOffset; scrollable.value.next = isGreaterThan(navSize, currentOffset + containerSize); if (isGreaterThan(containerSize, navSize - currentOffset)) navOffset.value = navSize - containerSize; } else { scrollable.value = false; if (currentOffset > 0) navOffset.value = 0; } }; const changeTab = (event) => { const code = getEventCode(event); let step = 0; switch (code) { case EVENT_CODE.left: case EVENT_CODE.up: step = -1; break; case EVENT_CODE.right: case EVENT_CODE.down: step = 1; break; default: return; } const tabList = Array.from(event.currentTarget.querySelectorAll("[role=tab]:not(.is-disabled)")); let nextIndex = tabList.indexOf(event.target) + step; if (nextIndex < 0) nextIndex = tabList.length - 1; else if (nextIndex >= tabList.length) nextIndex = 0; tabList[nextIndex].focus({ preventScroll: true }); tabList[nextIndex].click(); setFocus(); }; const setFocus = () => { if (focusable.value) isFocus.value = true; }; const removeFocus = () => isFocus.value = false; const setRefs = (el, key) => { tabRefsMap.value[key] = el; }; const focusActiveTab = async () => { await nextTick(); tabRefsMap.value[props.currentName]?.focus({ preventScroll: true }); }; watch(visibility, (visibility) => { if (visibility === "hidden") focusable.value = false; else if (visibility === "visible") setTimeout(() => focusable.value = true, 50); }); watch(focused, (focused) => { if (focused) setTimeout(() => focusable.value = true, 50); else focusable.value = false; }); useResizeObserver(el$, () => { rAF(update); }); onMounted(() => setTimeout(() => scrollToActiveTab(), 0)); onUpdated(() => update()); expose({ scrollToActiveTab, removeFocus, focusActiveTab, tabListRef: nav$, tabBarRef, scheduleRender: () => triggerRef(tracker) }); return () => { const scrollBtn = scrollable.value ? [createVNode("span", { "class": [ns.e("nav-prev"), ns.is("disabled", !scrollable.value.prev)], "onClick": scrollPrev }, [createVNode(ElIcon, null, { default: () => [createVNode(arrow_left_default, null, null)] })]), createVNode("span", { "class": [ns.e("nav-next"), ns.is("disabled", !scrollable.value.next)], "onClick": scrollNext }, [createVNode(ElIcon, null, { default: () => [createVNode(arrow_right_default, null, null)] })])] : null; const tabs = props.panes.map((pane, index) => { const uid = pane.uid; const disabled = pane.props.disabled; const tabName = pane.props.name ?? pane.index ?? `${index}`; const closable = !disabled && (pane.isClosable || pane.props.closable !== false && props.editable); pane.index = `${index}`; const btnClose = closable ? createVNode(ElIcon, { "class": "is-icon-close", "onClick": (ev) => emit("tabRemove", pane, ev) }, { default: () => [createVNode(close_default, null, null)] }) : null; const tabLabelContent = pane.slots.label?.() || pane.props.label; const tabindex = !disabled && pane.active ? props.tabindex ?? rootTabs.props.tabindex : -1; return createVNode("div", { "ref": (el) => setRefs(el, tabName), "class": [ ns.e("item"), ns.is(rootTabs.props.tabPosition), ns.is("active", pane.active), ns.is("disabled", disabled), ns.is("closable", closable), ns.is("focus", isFocus.value) ], "id": `tab-${tabName}`, "key": `tab-${uid}`, "aria-controls": `pane-${tabName}`, "role": "tab", "aria-selected": pane.active, "tabindex": tabindex, "onFocus": () => setFocus(), "onBlur": () => removeFocus(), "onClick": (ev) => { removeFocus(); emit("tabClick", pane, tabName, ev); }, "onKeydown": (ev) => { const code = getEventCode(ev); if (closable && (code === EVENT_CODE.delete || code === EVENT_CODE.backspace)) emit("tabRemove", pane, ev); } }, [...[tabLabelContent, btnClose]]); }); tracker.value; return createVNode("div", { "ref": el$, "class": [ ns.e("nav-wrap"), ns.is("scrollable", !!scrollable.value), ns.is(rootTabs.props.tabPosition) ] }, [scrollBtn, createVNode("div", { "class": ns.e("nav-scroll"), "ref": navScroll$ }, [props.panes.length > 0 ? createVNode("div", { "class": [ ns.e("nav"), ns.is(rootTabs.props.tabPosition), ns.is("stretch", props.stretch && ["top", "bottom"].includes(rootTabs.props.tabPosition)) ], "ref": nav$, "style": navStyle.value, "role": "tablist", "onKeydown": changeTab, "onWheel": handleWheel }, [...[!props.type ? createVNode(tab_bar_default, { "ref": tabBarRef, "tabs": [...props.panes], "tabRefs": tabRefsMap.value }, null) : null, tabs]]) : null])]); }; } }); //#endregion //#region ../../packages/components/tabs/src/tabs.tsx const tabsProps = buildProps({ /** * @description type of Tab */ type: { type: String, values: [ "card", "border-card", "" ], default: "" }, /** * @description whether Tab is closable */ closable: Boolean, /** * @description whether Tab is addable */ addable: Boolean, /** * @description binding value, name of the selected tab */ modelValue: { type: [String, Number] }, /** * @description initial value when `model-value` is not set */ defaultValue: { type: [String, Number] }, /** * @description whether Tab is addable and closable */ editable: Boolean, /** * @description position of tabs */ tabPosition: { type: String, values: [ "top", "right", "bottom", "left" ], default: "top" }, /** * @description hook function before switching tab. If `false` is returned or a `Promise` is returned and then is rejected, switching will be prevented */ beforeLeave: { type: definePropType(Function), default: () => true }, /** * @description whether width of tab automatically fits its container */ stretch: Boolean, /** * @description tabs tabindex */ tabindex: { type: [String, Number], default: 0 } }); const isPaneName = (value) => isString(value) || isNumber(value); const tabsEmits = { [UPDATE_MODEL_EVENT]: (name) => isPaneName(name), tabClick: (pane, ev) => ev instanceof Event, tabChange: (name) => isPaneName(name), edit: (paneName, action) => ["remove", "add"].includes(action), tabRemove: (name) => isPaneName(name), tabAdd: () => true }; const Tabs = /* @__PURE__ */ defineComponent({ name: "ElTabs", props: tabsProps, emits: tabsEmits, setup(props, { emit, slots, expose }) { const ns = useNamespace("tabs"); const isVertical = computed(() => ["left", "right"].includes(props.tabPosition)); const { children: panes, addChild: registerPane, removeChild: unregisterPane, ChildrenSorter: PanesSorter } = useOrderedChildren(getCurrentInstance(), "ElTabPane"); const nav$ = ref(); const currentName = ref((isUndefined(props.modelValue) ? props.defaultValue : props.modelValue) ?? "0"); const setCurrentName = async (value, trigger = false) => { if (currentName.value === value || isUndefined(value)) return; try { let canLeave; if (props.beforeLeave) { const result = props.beforeLeave(value, currentName.value); canLeave = result instanceof Promise ? await result : result; } else canLeave = true; if (canLeave !== false) { const isFocusInsidePane = panes.value.find((item) => item.paneName === currentName.value)?.isFocusInsidePane(); currentName.value = value; if (trigger) { emit(UPDATE_MODEL_EVENT, value); emit("tabChange", value); } nav$.value?.removeFocus?.(); if (isFocusInsidePane) nav$.value?.focusActiveTab(); } } catch {} }; const handleTabClick = (tab, tabName, event) => { if (tab.props.disabled) return; emit("tabClick", tab, event); setCurrentName(tabName, true); }; const handleTabRemove = (pane, ev) => { if (pane.props.disabled || isUndefined(pane.props.name)) return; ev.stopPropagation(); emit("edit", pane.props.name, "remove"); emit("tabRemove", pane.props.name); }; const handleTabAdd = () => { emit("edit", void 0, "add"); emit("tabAdd"); }; const handleKeydown = (event) => { const code = getEventCode(event); if ([EVENT_CODE.enter, EVENT_CODE.numpadEnter].includes(code)) handleTabAdd(); }; const swapChildren = (vnode) => { const actualFirstChild = vnode.el.firstChild; const firstChild = ["bottom", "right"].includes(props.tabPosition) ? vnode.children[0].el : vnode.children[1].el; if (actualFirstChild !== firstChild) actualFirstChild.before(firstChild); }; watch(() => props.modelValue, (modelValue) => setCurrentName(modelValue)); watch(currentName, async () => { await nextTick(); nav$.value?.scrollToActiveTab(); }); provide(tabsRootContextKey, { props, currentName, registerPane, unregisterPane, nav$ }); expose({ currentName, get tabNavRef() { return omit(nav$.value, ["scheduleRender"]); } }); return () => { const addSlot = slots["add-icon"]; const newButton = props.editable || props.addable ? createVNode("div", { "class": [ns.e("new-tab"), isVertical.value && ns.e("new-tab-vertical")], "tabindex": props.tabindex, "onClick": handleTabAdd, "onKeydown": handleKeydown }, [addSlot ? renderSlot(slots, "add-icon") : createVNode(ElIcon, { "class": ns.is("icon-plus") }, { default: () => [createVNode(plus_default, null, null)] })]) : null; const tabNav = () => createVNode(TabNav, { "ref": nav$, "currentName": currentName.value, "editable": props.editable, "type": props.type, "panes": panes.value, "stretch": props.stretch, "onTabClick": handleTabClick, "onTabRemove": handleTabRemove }, null); const header = createVNode("div", { "class": [ ns.e("header"), isVertical.value && ns.e("header-vertical"), ns.is(props.tabPosition) ] }, [createVNode(PanesSorter, null, { default: tabNav, $stable: true }), newButton]); const panels = createVNode("div", { "class": ns.e("content") }, [renderSlot(slots, "default")]); return createVNode("div", { "class": [ ns.b(), ns.m(props.tabPosition), { [ns.m("card")]: props.type === "card", [ns.m("border-card")]: props.type === "border-card" } ], "onVnodeMounted": swapChildren, "onVnodeUpdated": swapChildren }, [panels, header]); }; } }); //#endregion //#region ../../packages/components/tabs/src/tab-pane.ts /** * @deprecated Removed after 3.0.0, Use `TabPaneProps` instead. */ const tabPaneProps = buildProps({ /** * @description title of the tab */ label: { type: String, default: "" }, /** * @description identifier corresponding to the name of Tabs, representing the alias of the tab-pane, the default is ordinal number of the tab-pane in the sequence, e.g. the first tab-pane is '0' */ name: { type: [String, Number] }, /** * @description whether Tab is closable */ closable: { type: Boolean, default: void 0 }, /** * @description whether Tab is disabled */ disabled: Boolean, /** * @description whether Tab is lazily rendered */ lazy: Boolean }); //#endregion //#region ../../packages/components/tabs/src/tab-pane.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$14 = [ "id", "aria-hidden", "aria-labelledby" ]; const COMPONENT_NAME$2 = "ElTabPane"; var tab_pane_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: COMPONENT_NAME$2, __name: "tab-pane", props: tabPaneProps, setup(__props) { const props = __props; const instance = getCurrentInstance(); const slots = useSlots(); const tabsRoot = inject(tabsRootContextKey); if (!tabsRoot) throwError(COMPONENT_NAME$2, "usage: "); const ns = useNamespace("tab-pane"); const paneRef = ref(); const index = ref(); const isClosable = computed(() => props.closable ?? tabsRoot.props.closable); const active = computed(() => tabsRoot.currentName.value === (props.name ?? index.value)); const loaded = ref(active.value); const paneName = computed(() => props.name ?? index.value); const shouldBeRender = computed(() => !props.lazy || loaded.value || active.value); const isFocusInsidePane = () => { return paneRef.value?.contains(document.activeElement); }; watch(active, (val) => { if (val) loaded.value = true; }); const pane = reactive({ uid: instance.uid, getVnode: () => instance.vnode, slots, props, paneName, active, index, isClosable, isFocusInsidePane }); tabsRoot.registerPane(pane); onBeforeUnmount(() => { tabsRoot.unregisterPane(pane); }); onBeforeUpdate(() => { if (slots.label) tabsRoot.nav$.value?.scheduleRender(); }); return (_ctx, _cache) => { return shouldBeRender.value ? withDirectives((openBlock(), createElementBlock("div", { key: 0, id: `pane-${paneName.value}`, ref_key: "paneRef", ref: paneRef, class: normalizeClass(unref(ns).b()), role: "tabpanel", "aria-hidden": !active.value, "aria-labelledby": `tab-${paneName.value}` }, [renderSlot(_ctx.$slots, "default")], 10, _hoisted_1$14)), [[vShow, active.value]]) : createCommentVNode("v-if", true); }; } }); //#endregion //#region ../../packages/components/tabs/src/tab-pane.vue var tab_pane_default = tab_pane_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/tabs/index.ts const ElTabs = withInstall(Tabs, { TabPane: tab_pane_default }); const ElTabPane = withNoopInstall(tab_pane_default); //#endregion //#region ../../packages/components/text/src/text.ts /** * @deprecated Removed after 3.0.0, Use `TextProps` instead. */ const textProps = buildProps({ /** * @description text type */ type: { type: String, values: [ "primary", "success", "info", "warning", "danger", "" ], default: "" }, /** * @description text size */ size: { type: String, values: componentSizes, default: "" }, /** * @description render ellipsis */ truncated: Boolean, /** * @description maximum lines */ lineClamp: { type: [String, Number] }, /** * @description custom element tag */ tag: { type: String, default: "span" } }); //#endregion //#region ../../packages/components/text/src/text.vue?vue&type=script&setup=true&lang.ts var text_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElText", __name: "text", props: textProps, setup(__props) { const props = __props; const textRef = ref(); const textSize = useFormSize(); const ns = useNamespace("text"); const textKls = computed(() => [ ns.b(), ns.m(props.type), ns.m(textSize.value), ns.is("truncated", props.truncated), ns.is("line-clamp", !isUndefined(props.lineClamp)) ]); const bindTitle = () => { if (useAttrs$1().title) return; let shouldAddTitle = false; const text = textRef.value?.textContent || ""; if (props.truncated) { const width = textRef.value?.offsetWidth; const scrollWidth = textRef.value?.scrollWidth; if (width && scrollWidth && scrollWidth > width) shouldAddTitle = true; } else if (!isUndefined(props.lineClamp)) { const height = textRef.value?.offsetHeight; const scrollHeight = textRef.value?.scrollHeight; if (height && scrollHeight && scrollHeight > height) shouldAddTitle = true; } if (shouldAddTitle) textRef.value?.setAttribute("title", text); else textRef.value?.removeAttribute("title"); }; onMounted(bindTitle); onUpdated(bindTitle); return (_ctx, _cache) => { return openBlock(), createBlock(resolveDynamicComponent(__props.tag), { ref_key: "textRef", ref: textRef, class: normalizeClass(textKls.value), style: normalizeStyle({ "-webkit-line-clamp": __props.lineClamp }) }, { default: withCtx(() => [renderSlot(_ctx.$slots, "default")]), _: 3 }, 8, ["class", "style"]); }; } }); //#endregion //#region ../../packages/components/text/src/text.vue var text_default = text_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/text/index.ts const ElText = withInstall(text_default); //#endregion //#region ../../packages/components/time-select/src/time-select.ts const DEFAULT_STEP = "00:30"; /** * @deprecated Removed after 3.0.0, Use `TimeSelectProps` instead. */ const timeSelectProps = buildProps({ /** * @description set format of time */ format: { type: String, default: "HH:mm" }, /** * @description binding value */ modelValue: { type: definePropType(String) }, /** * @description whether TimeSelect is disabled */ disabled: { type: Boolean, default: void 0 }, /** * @description whether the input is editable */ editable: { type: Boolean, default: true }, /** * @description Tooltip theme, built-in theme: `dark` / `light` */ effect: { type: definePropType(String), default: "light" }, /** * @description whether to show clear button */ clearable: { type: Boolean, default: true }, /** * @description size of Input */ size: useSizeProp, /** * @description placeholder in non-range mode */ placeholder: String, /** * @description start time */ start: { type: String, default: "09:00" }, /** * @description end time */ end: { type: String, default: "18:00" }, /** * @description time step */ step: { type: String, default: DEFAULT_STEP }, /** * @description minimum time, any time before this time will be disabled */ minTime: { type: definePropType(String) }, /** * @description maximum time, any time after this time will be disabled */ maxTime: { type: definePropType(String) }, /** * @description whether `end` is included in options */ includeEndTime: Boolean, /** * @description same as `name` in native input */ name: String, /** * @description custom prefix icon component */ prefixIcon: { type: definePropType([String, Object]), default: () => clock_default }, /** * @description custom clear icon component */ clearIcon: { type: definePropType([String, Object]), default: () => circle_close_default }, /** * @description custom class name for TimeSelect's dropdown */ popperClass: { type: String, default: "" }, /** * @description custom style for TimeSelect's dropdown */ popperStyle: { type: definePropType([String, Object]) }, ...useEmptyValuesProps }); //#endregion //#region ../../packages/components/time-select/src/utils.ts const parseTime = (time) => { const values = (time || "").split(":"); if (values.length >= 2) { let hours = Number.parseInt(values[0], 10); const minutes = Number.parseInt(values[1], 10); const timeUpper = time.toUpperCase(); if (timeUpper.includes("AM") && hours === 12) hours = 0; else if (timeUpper.includes("PM") && hours !== 12) hours += 12; return { hours, minutes }; } return null; }; const compareTime = (time1, time2) => { const value1 = parseTime(time1); if (!value1) return -1; const value2 = parseTime(time2); if (!value2) return -1; const minutes1 = value1.minutes + value1.hours * 60; const minutes2 = value2.minutes + value2.hours * 60; if (minutes1 === minutes2) return 0; return minutes1 > minutes2 ? 1 : -1; }; const padTime = (time) => { return `${time}`.padStart(2, "0"); }; const formatTime = (time) => { return `${padTime(time.hours)}:${padTime(time.minutes)}`; }; const nextTime = (time, step) => { const timeValue = parseTime(time); if (!timeValue) return ""; const stepValue = parseTime(step); if (!stepValue) return ""; const next = { hours: timeValue.hours, minutes: timeValue.minutes }; next.minutes += stepValue.minutes; next.hours += stepValue.hours; next.hours += Math.floor(next.minutes / 60); next.minutes = next.minutes % 60; return formatTime(next); }; //#endregion //#region ../../packages/components/time-select/src/time-select.vue?vue&type=script&setup=true&lang.ts var time_select_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElTimeSelect", __name: "time-select", props: timeSelectProps, emits: [ CHANGE_EVENT, "blur", "focus", "clear", UPDATE_MODEL_EVENT ], setup(__props, { expose: __expose }) { import_dayjs_min.default.extend(import_customParseFormat.default); const { Option: ElOption } = ElSelect; const props = __props; const nsInput = useNamespace("input"); const select = ref(); const _disabled = useFormDisabled(); const { lang } = useLocale(); const value = computed(() => props.modelValue); const start = computed(() => { const time = parseTime(props.start); return time ? formatTime(time) : null; }); const end = computed(() => { const time = parseTime(props.end); return time ? formatTime(time) : null; }); const minTime = computed(() => { const time = parseTime(props.minTime || ""); return time ? formatTime(time) : null; }); const maxTime = computed(() => { const time = parseTime(props.maxTime || ""); return time ? formatTime(time) : null; }); const step = computed(() => { const time = parseTime(props.step); const isInvalidStep = !time || time.hours < 0 || time.minutes < 0 || Number.isNaN(time.hours) || Number.isNaN(time.minutes) || time.hours === 0 && time.minutes === 0; if (isInvalidStep) /* @__PURE__ */ debugWarn("ElTimeSelect", `invalid step, fallback to default step (${DEFAULT_STEP}).`); return !isInvalidStep ? formatTime(time) : DEFAULT_STEP; }); const items = computed(() => { const result = []; const push = (formattedValue, rawValue) => { result.push({ value: formattedValue, rawValue, disabled: compareTime(rawValue, minTime.value || "-1:-1") <= 0 || compareTime(rawValue, maxTime.value || "100:100") >= 0 }); }; if (props.start && props.end && props.step) { let current = start.value; let currentTime; while (current && end.value && compareTime(current, end.value) <= 0) { currentTime = (0, import_dayjs_min.default)(current, "HH:mm").locale(lang.value).format(props.format); push(currentTime, current); current = nextTime(current, step.value); } if (props.includeEndTime && end.value && result[result.length - 1]?.rawValue !== end.value) push((0, import_dayjs_min.default)(end.value, "HH:mm").locale(lang.value).format(props.format), end.value); } return result; }); const blur = () => { select.value?.blur?.(); }; const focus = () => { select.value?.focus?.(); }; __expose({ /** * @description blur the Input component */ blur, /** * @description focus the Input component */ focus }); return (_ctx, _cache) => { return openBlock(), createBlock(unref(ElSelect), { ref_key: "select", ref: select, name: __props.name, "model-value": value.value, disabled: unref(_disabled), clearable: __props.clearable, "clear-icon": __props.clearIcon, size: __props.size, effect: __props.effect, placeholder: __props.placeholder, "default-first-option": "", filterable: __props.editable, "empty-values": __props.emptyValues, "value-on-clear": __props.valueOnClear, "popper-class": __props.popperClass, "popper-style": __props.popperStyle, "onUpdate:modelValue": _cache[0] || (_cache[0] = (event) => _ctx.$emit(unref("update:modelValue"), event)), onChange: _cache[1] || (_cache[1] = (event) => _ctx.$emit(unref("change"), event)), onBlur: _cache[2] || (_cache[2] = (event) => _ctx.$emit("blur", event)), onFocus: _cache[3] || (_cache[3] = (event) => _ctx.$emit("focus", event)), onClear: _cache[4] || (_cache[4] = () => _ctx.$emit("clear")) }, { prefix: withCtx(() => [__props.prefixIcon ? (openBlock(), createBlock(unref(ElIcon), { key: 0, class: normalizeClass(unref(nsInput).e("prefix-icon")) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(__props.prefixIcon)))]), _: 1 }, 8, ["class"])) : createCommentVNode("v-if", true)]), default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(items.value, (item) => { return openBlock(), createBlock(unref(ElOption), { key: item.value, label: item.value, value: item.value, disabled: item.disabled }, null, 8, [ "label", "value", "disabled" ]); }), 128))]), _: 1 }, 8, [ "name", "model-value", "disabled", "clearable", "clear-icon", "size", "effect", "placeholder", "filterable", "empty-values", "value-on-clear", "popper-class", "popper-style" ]); }; } }); //#endregion //#region ../../packages/components/time-select/src/time-select.vue var time_select_default = time_select_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/time-select/index.ts const ElTimeSelect = withInstall(time_select_default); //#endregion //#region ../../packages/components/timeline/src/tokens.ts const TIMELINE_INJECTION_KEY = "timeline"; //#endregion //#region ../../packages/components/timeline/src/timeline.ts const timelineProps = buildProps({ /** * @description relative position of timeline and content */ mode: { type: String, values: [ "start", "alternate", "alternate-reverse", "end" ], default: "start" }, /** * @description whether reverse order */ reverse: Boolean }); const Timeline = defineComponent({ name: "ElTimeline", props: timelineProps, setup(props, { slots }) { const ns = useNamespace("timeline"); provide(TIMELINE_INJECTION_KEY, { props, slots }); const timelineKls = computed(() => [ns.b(), ns.is(props.mode)]); return () => { const children = flattedChildren(slots.default?.() ?? []); return h("ul", { class: timelineKls.value }, props.reverse ? children.reverse() : children); }; } }); //#endregion //#region ../../packages/components/timeline/src/timeline-item.ts /** * @deprecated Removed after 3.0.0, Use `TimelineItemProps` instead. */ const timelineItemProps = buildProps({ /** * @description timestamp content */ timestamp: { type: String, default: "" }, /** * @description whether to show timestamp */ hideTimestamp: Boolean, /** * @description whether vertically centered */ center: Boolean, /** * @description position of timestamp */ placement: { type: String, values: ["top", "bottom"], default: "bottom" }, /** * @description node type */ type: { type: String, values: [ "primary", "success", "warning", "danger", "info" ], default: "" }, /** * @description background color of node */ color: { type: String, default: "" }, /** * @description node size */ size: { type: String, values: ["normal", "large"], default: "normal" }, /** * @description icon component */ icon: { type: iconPropType }, /** * @description icon is hollow */ hollow: Boolean }); //#endregion //#region ../../packages/components/timeline/src/timeline-item.vue?vue&type=script&setup=true&lang.ts var timeline_item_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElTimelineItem", __name: "timeline-item", props: timelineItemProps, setup(__props) { const props = __props; const { props: timelineProps } = inject(TIMELINE_INJECTION_KEY); const ns = useNamespace("timeline-item"); const defaultNodeKls = computed(() => [ ns.e("node"), ns.em("node", props.size || ""), ns.em("node", props.type || ""), ns.is("hollow", props.hollow) ]); const timelineItemKls = computed(() => [ ns.b(), { [ns.e("center")]: props.center }, ns.is(timelineProps.mode) ]); return (_ctx, _cache) => { return openBlock(), createElementBlock("li", { class: normalizeClass(timelineItemKls.value) }, [ createElementVNode("div", { class: normalizeClass(unref(ns).e("tail")) }, null, 2), !_ctx.$slots.dot ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(defaultNodeKls.value), style: normalizeStyle({ backgroundColor: __props.color }) }, [__props.icon ? (openBlock(), createBlock(unref(ElIcon), { key: 0, class: normalizeClass(unref(ns).e("icon")) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(__props.icon)))]), _: 1 }, 8, ["class"])) : createCommentVNode("v-if", true)], 6)) : createCommentVNode("v-if", true), _ctx.$slots.dot ? (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass(unref(ns).e("dot")) }, [renderSlot(_ctx.$slots, "dot")], 2)) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass(unref(ns).e("wrapper")) }, [ !__props.hideTimestamp && __props.placement === "top" ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass([unref(ns).e("timestamp"), unref(ns).is("top")]) }, toDisplayString(__props.timestamp), 3)) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass(unref(ns).e("content")) }, [renderSlot(_ctx.$slots, "default")], 2), !__props.hideTimestamp && __props.placement === "bottom" ? (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass([unref(ns).e("timestamp"), unref(ns).is("bottom")]) }, toDisplayString(__props.timestamp), 3)) : createCommentVNode("v-if", true) ], 2) ], 2); }; } }); //#endregion //#region ../../packages/components/timeline/src/timeline-item.vue var timeline_item_default = timeline_item_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/timeline/index.ts const ElTimeline = withInstall(Timeline, { TimelineItem: timeline_item_default }); const ElTimelineItem = withNoopInstall(timeline_item_default); //#endregion //#region ../../packages/components/transfer/src/transfer.ts const LEFT_CHECK_CHANGE_EVENT = "left-check-change"; const RIGHT_CHECK_CHANGE_EVENT = "right-check-change"; /** * @deprecated Removed after 3.0.0, Use `TransferProps` instead. */ const transferProps = buildProps({ /** * @description data source */ data: { type: definePropType(Array), default: () => [] }, /** * @description custom list titles */ titles: { type: definePropType(Array), default: () => [] }, /** * @description custom button texts */ buttonTexts: { type: definePropType(Array), default: () => [] }, /** * @description placeholder for the filter input */ filterPlaceholder: String, /** * @description custom filter method */ filterMethod: { type: definePropType(Function) }, /** * @description key array of initially checked data items of the left list */ leftDefaultChecked: { type: definePropType(Array), default: () => [] }, /** * @description key array of initially checked data items of the right list */ rightDefaultChecked: { type: definePropType(Array), default: () => [] }, /** * @description custom render function for data items */ renderContent: { type: definePropType(Function) }, /** * @description binding value */ modelValue: { type: definePropType(Array), default: () => [] }, /** * @description texts for checking status in list header */ format: { type: definePropType(Object), default: () => ({}) }, /** * @description whether Transfer is filterable */ filterable: Boolean, /** * @description prop aliases for data source */ props: { type: definePropType(Object), default: () => mutable({ label: "label", key: "key", disabled: "disabled" }) }, /** * @description order strategy for elements in the target list. If set to `original`, the elements will keep the same order as the data source. If set to `push`, the newly added elements will be pushed to the bottom. If set to `unshift`, the newly added elements will be inserted on the top */ targetOrder: { type: String, values: [ "original", "push", "unshift" ], default: "original" }, /** * @description whether to trigger form validation */ validateEvent: { type: Boolean, default: true } }); const transferCheckedChangeFn = (value, movedKeys) => [value, movedKeys].every(isArray$1) || isArray$1(value) && isNil(movedKeys); const transferEmits = { [CHANGE_EVENT]: (value, direction, movedKeys) => [value, movedKeys].every(isArray$1) && ["left", "right"].includes(direction), [UPDATE_MODEL_EVENT]: (value) => isArray$1(value), [LEFT_CHECK_CHANGE_EVENT]: transferCheckedChangeFn, [RIGHT_CHECK_CHANGE_EVENT]: transferCheckedChangeFn }; //#endregion //#region ../../packages/components/transfer/src/transfer-panel.ts const CHECKED_CHANGE_EVENT = "checked-change"; /** * @deprecated Removed after 3.0.0, Use `TransferPanelProps` instead. */ const transferPanelProps = buildProps({ data: transferProps.data, optionRender: { type: definePropType(Function) }, placeholder: String, title: String, filterable: Boolean, format: transferProps.format, filterMethod: transferProps.filterMethod, defaultChecked: transferProps.leftDefaultChecked, props: transferProps.props }); const transferPanelEmits = { [CHECKED_CHANGE_EVENT]: transferCheckedChangeFn }; //#endregion //#region ../../packages/components/transfer/src/composables/use-props-alias.ts const usePropsAlias = (props) => { const initProps = { label: "label", key: "key", disabled: "disabled" }; return computed(() => ({ ...initProps, ...props.props })); }; //#endregion //#region ../../packages/components/transfer/src/composables/use-check.ts const useCheck$1 = (props, panelState, emit) => { const propsAlias = usePropsAlias(props); const filteredData = computed(() => { return props.data.filter((item) => { if (isFunction$1(props.filterMethod)) return props.filterMethod(panelState.query, item); else return String(item[propsAlias.value.label] || item[propsAlias.value.key]).toLowerCase().includes(panelState.query.toLowerCase()); }); }); const checkableData = computed(() => filteredData.value.filter((item) => !item[propsAlias.value.disabled])); const checkedSummary = computed(() => { const checkedLength = panelState.checked.length; const dataLength = props.data.length; const { noChecked, hasChecked } = props.format; if (noChecked && hasChecked) return checkedLength > 0 ? hasChecked.replace(/\${checked}/g, checkedLength.toString()).replace(/\${total}/g, dataLength.toString()) : noChecked.replace(/\${total}/g, dataLength.toString()); else return `${checkedLength}/${dataLength}`; }); const isIndeterminate = computed(() => { const checkedLength = panelState.checked.length; return checkedLength > 0 && checkedLength < checkableData.value.length; }); const updateAllChecked = () => { const checkableDataKeys = checkableData.value.map((item) => item[propsAlias.value.key]); panelState.allChecked = checkableDataKeys.length > 0 && checkableDataKeys.every((item) => panelState.checked.includes(item)); }; const handleAllCheckedChange = (value) => { panelState.checked = value ? checkableData.value.map((item) => item[propsAlias.value.key]) : []; }; watch(() => panelState.checked, (val, oldVal) => { updateAllChecked(); if (panelState.checkChangeByUser) emit(CHECKED_CHANGE_EVENT, val, val.concat(oldVal).filter((v) => !val.includes(v) || !oldVal.includes(v))); else { emit(CHECKED_CHANGE_EVENT, val); panelState.checkChangeByUser = true; } }); watch(checkableData, () => { updateAllChecked(); }); watch(() => props.data, () => { const checked = []; const filteredDataKeys = filteredData.value.map((item) => item[propsAlias.value.key]); panelState.checked.forEach((item) => { if (filteredDataKeys.includes(item)) checked.push(item); }); panelState.checkChangeByUser = false; panelState.checked = checked; }); watch(() => props.defaultChecked, (val, oldVal) => { if (oldVal && val.length === oldVal.length && val.every((item) => oldVal.includes(item))) return; const checked = []; const checkableDataKeys = checkableData.value.map((item) => item[propsAlias.value.key]); val.forEach((item) => { if (checkableDataKeys.includes(item)) checked.push(item); }); panelState.checkChangeByUser = false; panelState.checked = checked; }, { immediate: true }); return { filteredData, checkableData, checkedSummary, isIndeterminate, updateAllChecked, handleAllCheckedChange }; }; //#endregion //#region ../../packages/components/transfer/src/composables/use-checked-change.ts const useCheckedChange = (checkedState, emit) => { const onSourceCheckedChange = (val, movedKeys) => { checkedState.leftChecked = val; if (!movedKeys) return; emit(LEFT_CHECK_CHANGE_EVENT, val, movedKeys); }; const onTargetCheckedChange = (val, movedKeys) => { checkedState.rightChecked = val; if (!movedKeys) return; emit(RIGHT_CHECK_CHANGE_EVENT, val, movedKeys); }; return { onSourceCheckedChange, onTargetCheckedChange }; }; //#endregion //#region ../../packages/components/transfer/src/composables/use-computed-data.ts const useComputedData = (props) => { const propsAlias = usePropsAlias(props); const dataObj = computed(() => props.data.reduce((o, cur) => (o[cur[propsAlias.value.key]] = cur, o), {})); return { sourceData: computed(() => props.data.filter((item) => !props.modelValue.includes(item[propsAlias.value.key]))), targetData: computed(() => { if (props.targetOrder === "original") return props.data.filter((item) => props.modelValue.includes(item[propsAlias.value.key])); else return props.modelValue.reduce((arr, cur) => { const val = dataObj.value[cur]; if (val) arr.push(val); return arr; }, []); }) }; }; //#endregion //#region ../../packages/components/transfer/src/composables/use-move.ts const useMove = (props, checkedState, emit) => { const propsAlias = usePropsAlias(props); const _emit = (value, direction, movedKeys) => { emit(UPDATE_MODEL_EVENT, value); emit(CHANGE_EVENT, value, direction, movedKeys); }; const addToLeft = () => { const currentValue = props.modelValue.slice(); checkedState.rightChecked.forEach((item) => { const index = currentValue.indexOf(item); if (index > -1) currentValue.splice(index, 1); }); _emit(currentValue, "left", checkedState.rightChecked); }; const addToRight = () => { let currentValue = props.modelValue.slice(); const itemsToBeMoved = props.data.filter((item) => { const itemKey = item[propsAlias.value.key]; return checkedState.leftChecked.includes(itemKey) && !props.modelValue.includes(itemKey); }).map((item) => item[propsAlias.value.key]); currentValue = props.targetOrder === "unshift" ? itemsToBeMoved.concat(currentValue) : currentValue.concat(itemsToBeMoved); if (props.targetOrder === "original") currentValue = props.data.filter((item) => currentValue.includes(item[propsAlias.value.key])).map((item) => item[propsAlias.value.key]); _emit(currentValue, "right", checkedState.leftChecked); }; return { addToLeft, addToRight }; }; //#endregion //#region ../../packages/components/transfer/src/transfer-panel.vue?vue&type=script&setup=true&lang.ts var transfer_panel_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElTransferPanel", __name: "transfer-panel", props: transferPanelProps, emits: transferPanelEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const slots = useSlots(); const OptionContent = ({ option }) => option; const { t } = useLocale(); const ns = useNamespace("transfer"); const panelState = reactive({ checked: [], allChecked: false, query: "", checkChangeByUser: true }); const propsAlias = usePropsAlias(props); const { filteredData, checkedSummary, isIndeterminate, handleAllCheckedChange } = useCheck$1(props, panelState, emit); const hasNoMatch = computed(() => !isEmpty(panelState.query) && isEmpty(filteredData.value)); const hasFooter = computed(() => !isEmpty(slots.default()[0].children)); const { checked, allChecked, query } = toRefs(panelState); __expose({ /** @description filter keyword */ query }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass(unref(ns).b("panel")) }, [ createElementVNode("p", { class: normalizeClass(unref(ns).be("panel", "header")) }, [createVNode(unref(ElCheckbox), { modelValue: unref(allChecked), "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => isRef(allChecked) ? allChecked.value = $event : null), indeterminate: unref(isIndeterminate), "validate-event": false, onChange: unref(handleAllCheckedChange) }, { default: withCtx(() => [createElementVNode("span", { class: normalizeClass(unref(ns).be("panel", "header-title")) }, toDisplayString(__props.title), 3), createElementVNode("span", { class: normalizeClass(unref(ns).be("panel", "header-count")) }, toDisplayString(unref(checkedSummary)), 3)]), _: 1 }, 8, [ "modelValue", "indeterminate", "onChange" ])], 2), createElementVNode("div", { class: normalizeClass([unref(ns).be("panel", "body"), unref(ns).is("with-footer", hasFooter.value)]) }, [ __props.filterable ? (openBlock(), createBlock(unref(ElInput), { key: 0, modelValue: unref(query), "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => isRef(query) ? query.value = $event : null), class: normalizeClass(unref(ns).be("panel", "filter")), size: "default", placeholder: __props.placeholder, "prefix-icon": unref(search_default), clearable: "", "validate-event": false }, null, 8, [ "modelValue", "class", "placeholder", "prefix-icon" ])) : createCommentVNode("v-if", true), withDirectives(createVNode(unref(ElCheckboxGroup), { modelValue: unref(checked), "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => isRef(checked) ? checked.value = $event : null), "validate-event": false, class: normalizeClass([unref(ns).is("filterable", __props.filterable), unref(ns).be("panel", "list")]) }, { default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(filteredData), (item) => { return openBlock(), createBlock(unref(ElCheckbox), { key: item[unref(propsAlias).key], class: normalizeClass(unref(ns).be("panel", "item")), value: item[unref(propsAlias).key], disabled: item[unref(propsAlias).disabled], "validate-event": false }, { default: withCtx(() => [createVNode(OptionContent, { option: __props.optionRender?.(item) }, null, 8, ["option"])]), _: 2 }, 1032, [ "class", "value", "disabled" ]); }), 128))]), _: 1 }, 8, ["modelValue", "class"]), [[vShow, !hasNoMatch.value && !unref(isEmpty)(__props.data)]]), withDirectives(createElementVNode("div", { class: normalizeClass(unref(ns).be("panel", "empty")) }, [renderSlot(_ctx.$slots, "empty", {}, () => [createTextVNode(toDisplayString(hasNoMatch.value ? unref(t)("el.transfer.noMatch") : unref(t)("el.transfer.noData")), 1)])], 2), [[vShow, hasNoMatch.value || unref(isEmpty)(__props.data)]]) ], 2), hasFooter.value ? (openBlock(), createElementBlock("p", { key: 0, class: normalizeClass(unref(ns).be("panel", "footer")) }, [renderSlot(_ctx.$slots, "default")], 2)) : createCommentVNode("v-if", true) ], 2); }; } }); //#endregion //#region ../../packages/components/transfer/src/transfer-panel.vue var transfer_panel_default = transfer_panel_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/transfer/src/transfer.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$13 = { key: 0 }; const _hoisted_2$8 = { key: 0 }; var transfer_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElTransfer", __name: "transfer", props: transferProps, emits: transferEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const slots = useSlots(); const { t } = useLocale(); const ns = useNamespace("transfer"); const { formItem } = useFormItem(); const checkedState = reactive({ leftChecked: [], rightChecked: [] }); const propsAlias = usePropsAlias(props); const { sourceData, targetData } = useComputedData(props); const { onSourceCheckedChange, onTargetCheckedChange } = useCheckedChange(checkedState, emit); const { addToLeft, addToRight } = useMove(props, checkedState, emit); const leftPanel = ref(); const rightPanel = ref(); const clearQuery = (which) => { switch (which) { case "left": leftPanel.value.query = ""; break; case "right": rightPanel.value.query = ""; break; } }; const hasButtonTexts = computed(() => props.buttonTexts.length === 2); const leftPanelTitle = computed(() => props.titles[0] || t("el.transfer.titles.0")); const rightPanelTitle = computed(() => props.titles[1] || t("el.transfer.titles.1")); const panelFilterPlaceholder = computed(() => props.filterPlaceholder || t("el.transfer.filterPlaceholder")); watch(() => props.modelValue, () => { if (props.validateEvent) formItem?.validate?.("change").catch(NOOP); }); const optionRender = computed(() => (option) => { if (props.renderContent) return props.renderContent(h, option); const defaultSlotVNodes = (slots.default?.({ option }) || []).filter((node) => node.type !== Comment); if (defaultSlotVNodes.length) return defaultSlotVNodes; return h("span", option[propsAlias.value.label] || option[propsAlias.value.key]); }); __expose({ /** @description clear the filter keyword of a certain panel */ clearQuery, /** @description left panel ref */ leftPanel, /** @description right panel ref */ rightPanel }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass(unref(ns).b()) }, [ createVNode(transfer_panel_default, { ref_key: "leftPanel", ref: leftPanel, data: unref(sourceData), "option-render": optionRender.value, placeholder: panelFilterPlaceholder.value, title: leftPanelTitle.value, filterable: __props.filterable, format: __props.format, "filter-method": __props.filterMethod, "default-checked": __props.leftDefaultChecked, props: props.props, onCheckedChange: unref(onSourceCheckedChange) }, { empty: withCtx(() => [renderSlot(_ctx.$slots, "left-empty")]), default: withCtx(() => [renderSlot(_ctx.$slots, "left-footer")]), _: 3 }, 8, [ "data", "option-render", "placeholder", "title", "filterable", "format", "filter-method", "default-checked", "props", "onCheckedChange" ]), createElementVNode("div", { class: normalizeClass(unref(ns).e("buttons")) }, [createVNode(unref(ElButton), { type: "primary", class: normalizeClass([unref(ns).e("button"), unref(ns).is("with-texts", hasButtonTexts.value)]), disabled: unref(isEmpty)(checkedState.rightChecked), onClick: unref(addToLeft) }, { default: withCtx(() => [createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(arrow_left_default))]), _: 1 }), !unref(isUndefined)(__props.buttonTexts[0]) ? (openBlock(), createElementBlock("span", _hoisted_1$13, toDisplayString(__props.buttonTexts[0]), 1)) : createCommentVNode("v-if", true)]), _: 1 }, 8, [ "class", "disabled", "onClick" ]), createVNode(unref(ElButton), { type: "primary", class: normalizeClass([unref(ns).e("button"), unref(ns).is("with-texts", hasButtonTexts.value)]), disabled: unref(isEmpty)(checkedState.leftChecked), onClick: unref(addToRight) }, { default: withCtx(() => [!unref(isUndefined)(__props.buttonTexts[1]) ? (openBlock(), createElementBlock("span", _hoisted_2$8, toDisplayString(__props.buttonTexts[1]), 1)) : createCommentVNode("v-if", true), createVNode(unref(ElIcon), null, { default: withCtx(() => [createVNode(unref(arrow_right_default))]), _: 1 })]), _: 1 }, 8, [ "class", "disabled", "onClick" ])], 2), createVNode(transfer_panel_default, { ref_key: "rightPanel", ref: rightPanel, data: unref(targetData), "option-render": optionRender.value, placeholder: panelFilterPlaceholder.value, filterable: __props.filterable, format: __props.format, "filter-method": __props.filterMethod, title: rightPanelTitle.value, "default-checked": __props.rightDefaultChecked, props: props.props, onCheckedChange: unref(onTargetCheckedChange) }, { empty: withCtx(() => [renderSlot(_ctx.$slots, "right-empty")]), default: withCtx(() => [renderSlot(_ctx.$slots, "right-footer")]), _: 3 }, 8, [ "data", "option-render", "placeholder", "filterable", "format", "filter-method", "title", "default-checked", "props", "onCheckedChange" ]) ], 2); }; } }); //#endregion //#region ../../packages/components/transfer/src/transfer.vue var transfer_default = transfer_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/transfer/index.ts const ElTransfer = withInstall(transfer_default); //#endregion //#region ../../packages/components/tree/src/model/util.ts const NODE_KEY = "$treeNodeId"; const markNodeData = function(node, data) { if (!data || data["$treeNodeId"]) return; Object.defineProperty(data, NODE_KEY, { value: node.id, enumerable: false, configurable: false, writable: false }); }; const getNodeKey = (key, data) => data?.[key || "$treeNodeId"]; const handleCurrentChange = (store, emit, setCurrent) => { const preCurrentNode = store.value.currentNode; setCurrent(); const currentNode = store.value.currentNode; if (preCurrentNode === currentNode) return; emit("current-change", currentNode ? currentNode.data : null, currentNode); }; //#endregion //#region ../../packages/components/tree/src/model/node.ts const getChildState = (node) => { let all = true; let none = true; let allWithoutDisable = true; let isEffectivelyChecked = true; for (let i = 0, j = node.length; i < j; i++) { const n = node[i]; if (n.checked !== true || n.indeterminate) { all = false; if (!n.disabled) allWithoutDisable = false; } if (n.checked !== false || n.indeterminate) none = false; if (!n.isEffectivelyChecked) isEffectivelyChecked = false; } return { all, none, allWithoutDisable, half: !all && !none, isEffectivelyChecked }; }; const reInitChecked = function(node) { if (node.childNodes.length === 0 || node.loading) { node.isEffectivelyChecked = node.disabled || node.checked; return; } const { all, none, half, isEffectivelyChecked } = getChildState(node.childNodes); node.isEffectivelyChecked = isEffectivelyChecked; if (all) { node.checked = true; node.indeterminate = false; } else if (half) { node.checked = false; node.indeterminate = true; } else if (none) { node.checked = false; node.indeterminate = false; } const parent = node.parent; if (!parent || parent.level === 0) return; if (!node.store.checkStrictly) reInitChecked(parent); }; const getPropertyFromData = function(node, prop) { const props = node.store.props; const data = node.data || {}; const config = props[prop]; if (isFunction$1(config)) return config(data, node); else if (isString(config)) return data[config]; else if (isUndefined(config)) { const dataProp = data[prop]; return isUndefined(dataProp) ? "" : dataProp; } }; const setCanFocus = function(childNodes, focus) { childNodes.forEach((item) => { item.canFocus = focus; setCanFocus(item.childNodes, focus); }); }; let nodeIdSeed = 0; var Node$1 = class Node$1 { constructor(options) { this.isLeafByUser = void 0; this.isLeaf = void 0; this.isEffectivelyChecked = false; this.id = nodeIdSeed++; this.text = null; this.checked = false; this.indeterminate = false; this.data = null; this.expanded = false; this.parent = null; this.visible = true; this.isCurrent = false; this.canFocus = false; for (const name in options) if (hasOwn(options, name)) this[name] = options[name]; this.level = 0; this.loaded = false; this.childNodes = []; this.loading = false; if (this.parent) this.level = this.parent.level + 1; } initialize() { const store = this.store; if (!store) throw new Error("[Node]store is required!"); store.registerNode(this); const props = store.props; if (props && typeof props.isLeaf !== "undefined") { const isLeaf = getPropertyFromData(this, "isLeaf"); if (isBoolean(isLeaf)) this.isLeafByUser = isLeaf; } if (store.lazy !== true && this.data) { this.setData(this.data); if (store.defaultExpandAll) { this.expanded = true; this.canFocus = true; } } else if (this.level > 0 && store.lazy && store.defaultExpandAll && !this.isLeafByUser) this.expand(); if (!isArray$1(this.data)) markNodeData(this, this.data); if (!this.data) return; const defaultExpandedKeys = store.defaultExpandedKeys; const key = store.key; if (key && !isNil(this.key) && defaultExpandedKeys && defaultExpandedKeys.includes(this.key)) this.expand(null, store.autoExpandParent); if (key && store.currentNodeKey !== void 0 && this.key === store.currentNodeKey) { store.currentNode && (store.currentNode.isCurrent = false); store.currentNode = this; store.currentNode.isCurrent = true; } if (store.lazy) store._initDefaultCheckedNode(this); this.updateLeafState(); if (this.level === 1 || this.parent?.expanded === true) this.canFocus = true; } setData(data) { if (!isArray$1(data)) markNodeData(this, data); this.data = data; this.childNodes = []; let children; if (this.level === 0 && isArray$1(this.data)) children = this.data; else children = getPropertyFromData(this, "children") || []; for (let i = 0, j = children.length; i < j; i++) this.insertChild({ data: children[i] }); } get label() { return getPropertyFromData(this, "label"); } get key() { const nodeKey = this.store.key; if (this.data) return this.data[nodeKey]; return null; } get disabled() { return getPropertyFromData(this, "disabled"); } get nextSibling() { const parent = this.parent; if (parent) { const index = parent.childNodes.indexOf(this); if (index > -1) return parent.childNodes[index + 1]; } return null; } get previousSibling() { const parent = this.parent; if (parent) { const index = parent.childNodes.indexOf(this); if (index > -1) return index > 0 ? parent.childNodes[index - 1] : null; } return null; } contains(target, deep = true) { return (this.childNodes || []).some((child) => child === target || deep && child.contains(target)); } remove() { const parent = this.parent; if (parent) parent.removeChild(this); } insertChild(child, index, batch) { if (!child) throw new Error("InsertChild error: child is required."); if (!(child instanceof Node$1)) { if (!batch) { const children = this.getChildren(true); if (!children?.includes(child.data)) if (isUndefined(index) || index < 0) children?.push(child.data); else children?.splice(index, 0, child.data); } Object.assign(child, { parent: this, store: this.store }); child = reactive(new Node$1(child)); if (child instanceof Node$1) child.initialize(); } child.level = this.level + 1; if (isUndefined(index) || index < 0) this.childNodes.push(child); else this.childNodes.splice(index, 0, child); this.updateLeafState(); } insertBefore(child, ref) { let index; if (ref) index = this.childNodes.indexOf(ref); this.insertChild(child, index); } insertAfter(child, ref) { let index; if (ref) { index = this.childNodes.indexOf(ref); if (index !== -1) index += 1; } this.insertChild(child, index); } removeChild(child) { const children = this.getChildren() || []; const dataIndex = children.indexOf(child.data); if (dataIndex > -1) children.splice(dataIndex, 1); const index = this.childNodes.indexOf(child); if (index > -1) { this.store && this.store.deregisterNode(child); child.parent = null; this.childNodes.splice(index, 1); } this.updateLeafState(); } removeChildByData(data) { const targetNode = this.childNodes.find((child) => child.data === data); if (targetNode) this.removeChild(targetNode); } expand(callback, expandParent) { const done = () => { if (expandParent) { let parent = this.parent; while (parent && parent.level > 0) { parent.expanded = true; parent = parent.parent; } } this.expanded = true; if (callback) callback(); setCanFocus(this.childNodes, true); }; if (this.shouldLoadData()) this.loadData((data) => { if (isArray$1(data)) { if (this.checked) this.setChecked(true, true); else if (!this.store.checkStrictly) reInitChecked(this); done(); } }); else done(); } doCreateChildren(array, defaultProps = {}) { array.forEach((item) => { this.insertChild(Object.assign({ data: item }, defaultProps), void 0, true); }); } collapse() { this.expanded = false; setCanFocus(this.childNodes, false); } shouldLoadData() { return Boolean(this.store.lazy === true && this.store.load && !this.loaded); } updateLeafState() { if (this.store.lazy === true && this.loaded !== true && typeof this.isLeafByUser !== "undefined") { this.isLeaf = this.isLeafByUser; this.isEffectivelyChecked = this.isLeaf && this.disabled; return; } const childNodes = this.childNodes; if (!this.store.lazy || this.store.lazy === true && this.loaded === true) { this.isLeaf = !childNodes || childNodes.length === 0; this.isEffectivelyChecked = this.isLeaf && this.disabled; return; } this.isLeaf = false; } setChecked(value, deep, recursion, passValue) { this.indeterminate = value === "half"; this.checked = value === true; this.isEffectivelyChecked = !this.childNodes.length && (this.disabled || this.checked); if (this.store.checkStrictly && !deep) return; if (!(this.shouldLoadData() && !this.store.checkDescendants)) { const handleDescendants = () => { if (deep) { const childNodes = this.childNodes; for (let i = 0, j = childNodes.length; i < j; i++) { const child = childNodes[i]; passValue = passValue || value !== false; const isCheck = child.disabled && child.isLeaf ? child.checked : passValue; child.setChecked(isCheck, deep, true, passValue); } const { half, all, isEffectivelyChecked } = getChildState(childNodes); if (!all) { this.checked = all; this.indeterminate = half; } this.isEffectivelyChecked = !this.childNodes.length ? this.disabled || this.checked : isEffectivelyChecked; } }; if (this.shouldLoadData()) { this.loadData(() => { handleDescendants(); reInitChecked(this); }, { checked: value !== false }); return; } else handleDescendants(); } const parent = this.parent; if (!parent || parent.level === 0) return; if (!recursion && !this.store.checkStrictly) reInitChecked(parent); } getChildren(forceInit = false) { if (this.level === 0) return this.data; const data = this.data; if (!data) return null; const props = this.store.props; let children = "children"; if (props) children = props.children || "children"; if (isUndefined(data[children])) data[children] = null; if (forceInit && !data[children]) data[children] = []; return data[children]; } updateChildren() { const newData = this.getChildren() || []; const oldData = this.childNodes.map((node) => node.data); const newDataMap = {}; const newNodes = []; newData.forEach((item, index) => { const key = item[NODE_KEY]; if (!!key && oldData.some((data) => data?.["$treeNodeId"] === key)) newDataMap[key] = { index, data: item }; else newNodes.push({ index, data: item }); }); if (!this.store.lazy) oldData.forEach((item) => { if (!newDataMap[item?.["$treeNodeId"]]) this.removeChildByData(item); }); newNodes.forEach(({ index, data }) => { this.insertChild({ data }, index); }); this.updateLeafState(); } loadData(callback, defaultProps = {}) { if (this.store.lazy === true && this.store.load && !this.loaded && (!this.loading || Object.keys(defaultProps).length)) { this.loading = true; const resolve = (children) => { this.childNodes = []; this.doCreateChildren(children, defaultProps); this.loaded = true; this.loading = false; this.updateLeafState(); if (callback) callback.call(this, children); }; const reject = () => { this.loading = false; }; this.store.load(this, resolve, reject); } else if (callback) callback.call(this); } eachNode(callback) { const arr = [this]; while (arr.length) { const node = arr.shift(); arr.unshift(...node.childNodes); callback(node); } } reInitChecked() { if (this.store.checkStrictly) return; reInitChecked(this); } }; //#endregion //#region ../../packages/components/tree/src/model/tree-store.ts var TreeStore = class { constructor(options) { this.lazy = false; this.checkStrictly = false; this.autoExpandParent = false; this.defaultExpandAll = false; this.checkDescendants = false; this.currentNode = null; this.currentNodeKey = null; for (const option in options) if (hasOwn(options, option)) this[option] = options[option]; this.nodesMap = {}; } initialize() { this.root = new Node$1({ data: this.data, store: this }); this.root.initialize(); if (this.lazy && this.load) { const loadFn = this.load; loadFn(this.root, (data) => { this.root.doCreateChildren(data); this._initDefaultCheckedNodes(); }, NOOP); } else this._initDefaultCheckedNodes(); } filter(value) { const filterNodeMethod = this.filterNodeMethod; const lazy = this.lazy; const traverse = async function(node) { const childNodes = node.root ? node.root.childNodes : node.childNodes; for (const [index, child] of childNodes.entries()) { child.visible = !!filterNodeMethod?.call(child, value, child.data, child); if (index % 80 === 0 && index > 0) await nextTick(); await traverse(child); } if (!node.visible && childNodes.length) { let allHidden = true; allHidden = !childNodes.some((child) => child.visible); if (node.root) node.root.visible = allHidden === false; else node.visible = allHidden === false; } if (!value) return; if (node.visible && !node.isLeaf) { if (!lazy || node.loaded) node.expand(); } }; traverse(this); } setData(newVal) { if (newVal !== this.root.data) { this.nodesMap = {}; this.root.setData(newVal); this._initDefaultCheckedNodes(); this.setCurrentNodeKey(this.currentNodeKey); } else this.root.updateChildren(); } getNode(data) { if (data instanceof Node$1) return data; const key = isObject$1(data) ? getNodeKey(this.key, data) : data; return this.nodesMap[key] || null; } insertBefore(data, refData) { const refNode = this.getNode(refData); refNode.parent?.insertBefore({ data }, refNode); } insertAfter(data, refData) { const refNode = this.getNode(refData); refNode.parent?.insertAfter({ data }, refNode); } remove(data) { const node = this.getNode(data); if (node && node.parent) { if (node === this.currentNode) this.currentNode = null; node.parent.removeChild(node); } } append(data, parentData) { const parentNode = !isPropAbsent(parentData) ? this.getNode(parentData) : this.root; if (parentNode) parentNode.insertChild({ data }); } _initDefaultCheckedNodes() { const defaultCheckedKeys = this.defaultCheckedKeys || []; const nodesMap = this.nodesMap; defaultCheckedKeys.forEach((checkedKey) => { const node = nodesMap[checkedKey]; if (node) node.setChecked(true, !this.checkStrictly); }); } _initDefaultCheckedNode(node) { const defaultCheckedKeys = this.defaultCheckedKeys || []; if (!isNil(node.key) && defaultCheckedKeys.includes(node.key)) node.setChecked(true, !this.checkStrictly); } setDefaultCheckedKey(newVal) { if (newVal !== this.defaultCheckedKeys) { this.defaultCheckedKeys = newVal; this._initDefaultCheckedNodes(); } } registerNode(node) { const key = this.key; if (!node || !node.data) return; if (!key) this.nodesMap[node.id] = node; else { const nodeKey = node.key; if (!isNil(nodeKey)) this.nodesMap[nodeKey] = node; } } deregisterNode(node) { if (!this.key || !node || !node.data) return; node.childNodes.forEach((child) => { this.deregisterNode(child); }); delete this.nodesMap[node.key]; } getCheckedNodes(leafOnly = false, includeHalfChecked = false) { const checkedNodes = []; const traverse = function(node) { (node.root ? node.root.childNodes : node.childNodes).forEach((child) => { if ((child.checked || includeHalfChecked && child.indeterminate) && (!leafOnly || leafOnly && child.isLeaf)) checkedNodes.push(child.data); traverse(child); }); }; traverse(this); return checkedNodes; } getCheckedKeys(leafOnly = false) { return this.getCheckedNodes(leafOnly).map((data) => (data || {})[this.key]); } getHalfCheckedNodes() { const nodes = []; const traverse = function(node) { (node.root ? node.root.childNodes : node.childNodes).forEach((child) => { if (child.indeterminate) nodes.push(child.data); traverse(child); }); }; traverse(this); return nodes; } getHalfCheckedKeys() { return this.getHalfCheckedNodes().map((data) => (data || {})[this.key]); } _getAllNodes() { const allNodes = []; const nodesMap = this.nodesMap; for (const nodeKey in nodesMap) if (hasOwn(nodesMap, nodeKey)) allNodes.push(nodesMap[nodeKey]); return allNodes; } updateChildren(key, data) { const node = this.nodesMap[key]; if (!node) return; const childNodes = node.childNodes; for (let i = childNodes.length - 1; i >= 0; i--) { const child = childNodes[i]; this.remove(child.data); } for (let i = 0, j = data.length; i < j; i++) { const child = data[i]; this.append(child, node.data); } } _setCheckedKeys(key, leafOnly = false, checkedKeys) { const allNodes = this._getAllNodes().sort((a, b) => a.level - b.level); const cache = Object.create(null); const keys = Object.keys(checkedKeys); allNodes.forEach((node) => node.setChecked(false, false)); const cacheCheckedChild = (node) => { node.childNodes.forEach((child) => { cache[child.data[key]] = true; if (child.childNodes?.length) cacheCheckedChild(child); }); }; for (let i = 0, j = allNodes.length; i < j; i++) { const node = allNodes[i]; const nodeKey = node.data[key].toString(); if (!keys.includes(nodeKey)) { if (node.checked && !cache[nodeKey]) node.setChecked(false, false); continue; } if (node.childNodes.length) cacheCheckedChild(node); if (node.isLeaf || this.checkStrictly) { node.setChecked(true, false); continue; } node.setChecked(true, true); if (leafOnly) { node.setChecked(false, false, true); const traverse = function(node) { node.childNodes.forEach((child) => { if (!child.isLeaf) child.setChecked(false, false, true); traverse(child); }); node.reInitChecked(); }; traverse(node); } } } setCheckedNodes(array, leafOnly = false) { const key = this.key; const checkedKeys = {}; array.forEach((item) => { checkedKeys[(item || {})[key]] = true; }); this._setCheckedKeys(key, leafOnly, checkedKeys); } setCheckedKeys(keys, leafOnly = false) { this.defaultCheckedKeys = keys; const key = this.key; const checkedKeys = {}; keys.forEach((key) => { checkedKeys[key] = true; }); this._setCheckedKeys(key, leafOnly, checkedKeys); } setDefaultExpandedKeys(keys) { keys = keys || []; this.defaultExpandedKeys = keys; keys.forEach((key) => { const node = this.getNode(key); if (node) node.expand(null, this.autoExpandParent); }); } setChecked(data, checked, deep) { const node = this.getNode(data); if (node) node.setChecked(!!checked, deep); } getCurrentNode() { return this.currentNode; } setCurrentNode(currentNode) { const prevCurrentNode = this.currentNode; if (prevCurrentNode) prevCurrentNode.isCurrent = false; this.currentNode = currentNode; this.currentNode.isCurrent = true; } setUserCurrentNode(node, shouldAutoExpandParent = true) { const key = node[this.key]; const currNode = this.nodesMap[key]; this.setCurrentNode(currNode); if (shouldAutoExpandParent && this.currentNode && this.currentNode.level > 1) this.currentNode.parent?.expand(null, true); } setCurrentNodeKey(key, shouldAutoExpandParent = true) { this.currentNodeKey = key; if (isPropAbsent(key)) { this.currentNode && (this.currentNode.isCurrent = false); this.currentNode = null; return; } const node = this.getNode(key); if (node) { this.setCurrentNode(node); if (shouldAutoExpandParent && this.currentNode && this.currentNode.level > 1) this.currentNode.parent?.expand(null, true); } } }; //#endregion //#region ../../packages/components/tree/src/tokens.ts const ROOT_TREE_INJECTION_KEY = "RootTree"; const NODE_INSTANCE_INJECTION_KEY = "NodeInstance"; const TREE_NODE_MAP_INJECTION_KEY = "TreeNodeMap"; //#endregion //#region ../../packages/components/tree/src/tree-node-content.vue?vue&type=script&lang.ts var tree_node_content_vue_vue_type_script_lang_default = defineComponent({ name: "ElTreeNodeContent", props: { node: { type: Object, required: true }, renderContent: Function }, setup(props) { const ns = useNamespace("tree"); const nodeInstance = inject(NODE_INSTANCE_INJECTION_KEY); const tree = inject(ROOT_TREE_INJECTION_KEY); return () => { const node = props.node; const { data, store } = node; return props.renderContent ? props.renderContent(h, { _self: nodeInstance, node, data, store }) : renderSlot(tree.ctx.slots, "default", { node, data }, () => [h(ElText, { tag: "span", truncated: true, class: ns.be("node", "label") }, () => [node.label])]); }; } }); //#endregion //#region ../../packages/components/tree/src/tree-node-content.vue var tree_node_content_default$1 = tree_node_content_vue_vue_type_script_lang_default; //#endregion //#region ../../packages/components/tree/src/model/useNodeExpandEventBroadcast.ts function useNodeExpandEventBroadcast(props) { const parentNodeMap = inject(TREE_NODE_MAP_INJECTION_KEY, null); let currentNodeMap = { treeNodeExpand: (node) => { if (props.node !== node) props.node?.collapse(); }, children: /* @__PURE__ */ new Set() }; if (parentNodeMap) parentNodeMap.children.add(currentNodeMap); onBeforeUnmount(() => { if (parentNodeMap) parentNodeMap.children.delete(currentNodeMap); currentNodeMap = null; }); provide(TREE_NODE_MAP_INJECTION_KEY, currentNodeMap); return { broadcastExpanded: (node) => { if (!props.accordion) return; for (const childNode of currentNodeMap.children) childNode.treeNodeExpand(node); } }; } //#endregion //#region ../../packages/components/tree/src/model/useDragNode.ts const dragEventsKey = Symbol("dragEvents"); function useDragNodeHandler({ props, ctx, el$, dropIndicator$, store }) { const ns = useNamespace("tree"); const dragState = ref({ showDropIndicator: false, draggingNode: null, dropNode: null, allowDrop: true, dropType: null }); const treeNodeDragStart = ({ event, treeNode }) => { if (!event.dataTransfer) return; if (isFunction$1(props.allowDrag) && !props.allowDrag(treeNode.node)) { event.preventDefault(); return false; } event.dataTransfer.effectAllowed = "move"; try { event.dataTransfer.setData("text/plain", ""); } catch {} dragState.value.draggingNode = treeNode; ctx.emit("node-drag-start", treeNode.node, event); }; const treeNodeDragOver = ({ event, treeNode }) => { if (!event.dataTransfer) return; const dropNode = treeNode; const oldDropNode = dragState.value.dropNode; if (oldDropNode && oldDropNode.node.id !== dropNode.node.id) removeClass(oldDropNode.$el, ns.is("drop-inner")); const draggingNode = dragState.value.draggingNode; if (!draggingNode || !dropNode) return; let dropPrev = true; let dropInner = true; let dropNext = true; let userAllowDropInner = true; if (isFunction$1(props.allowDrop)) { dropPrev = props.allowDrop(draggingNode.node, dropNode.node, "prev"); userAllowDropInner = dropInner = props.allowDrop(draggingNode.node, dropNode.node, "inner"); dropNext = props.allowDrop(draggingNode.node, dropNode.node, "next"); } event.dataTransfer.dropEffect = dropInner || dropPrev || dropNext ? "move" : "none"; if ((dropPrev || dropInner || dropNext) && oldDropNode?.node.id !== dropNode.node.id) { if (oldDropNode) ctx.emit("node-drag-leave", draggingNode.node, oldDropNode.node, event); ctx.emit("node-drag-enter", draggingNode.node, dropNode.node, event); } if (dropPrev || dropInner || dropNext) dragState.value.dropNode = dropNode; else dragState.value.dropNode = null; if (dropNode.node.nextSibling === draggingNode.node) dropNext = false; if (dropNode.node.previousSibling === draggingNode.node) dropPrev = false; if (dropNode.node.contains(draggingNode.node, false)) dropInner = false; if (draggingNode.node === dropNode.node || draggingNode.node.contains(dropNode.node)) { dropPrev = false; dropInner = false; dropNext = false; } const dropEl = dropNode.$el; const targetPosition = dropEl.querySelector(`.${ns.be("node", "content")}`).getBoundingClientRect(); const treePosition = el$.value.getBoundingClientRect(); const treeScrollTop = el$.value.scrollTop; let dropType; const prevPercent = dropPrev ? dropInner ? .25 : dropNext ? .45 : 1 : Number.NEGATIVE_INFINITY; const nextPercent = dropNext ? dropInner ? .75 : dropPrev ? .55 : 0 : Number.POSITIVE_INFINITY; let indicatorTop = -9999; const distance = event.clientY - targetPosition.top; if (distance < targetPosition.height * prevPercent) dropType = "before"; else if (distance > targetPosition.height * nextPercent) dropType = "after"; else if (dropInner) dropType = "inner"; else dropType = "none"; const iconPosition = dropEl.querySelector(`.${ns.be("node", "expand-icon")}`).getBoundingClientRect(); const dropIndicator = dropIndicator$.value; if (dropType === "before") indicatorTop = iconPosition.top - treePosition.top + treeScrollTop; else if (dropType === "after") indicatorTop = iconPosition.bottom - treePosition.top + treeScrollTop; dropIndicator.style.top = `${indicatorTop}px`; dropIndicator.style.left = `${iconPosition.right - treePosition.left}px`; if (dropType === "inner") addClass(dropEl, ns.is("drop-inner")); else removeClass(dropEl, ns.is("drop-inner")); dragState.value.showDropIndicator = dropType === "before" || dropType === "after"; dragState.value.allowDrop = dragState.value.showDropIndicator || userAllowDropInner; dragState.value.dropType = dropType; ctx.emit("node-drag-over", draggingNode.node, dropNode.node, event); }; const treeNodeDragEnd = (event) => { const { draggingNode, dropType, dropNode } = dragState.value; event.preventDefault(); if (event.dataTransfer) event.dataTransfer.dropEffect = "move"; if (draggingNode?.node.data && dropNode) { const draggingNodeCopy = { data: draggingNode.node.data }; if (dropType !== "none") draggingNode.node.remove(); if (dropType === "before") dropNode.node.parent?.insertBefore(draggingNodeCopy, dropNode.node); else if (dropType === "after") dropNode.node.parent?.insertAfter(draggingNodeCopy, dropNode.node); else if (dropType === "inner") dropNode.node.insertChild(draggingNodeCopy); if (dropType !== "none") { store.value.registerNode(draggingNodeCopy); if (store.value.key) draggingNode.node.eachNode((node) => { store.value.nodesMap[node.data[store.value.key]]?.setChecked(node.checked, !store.value.checkStrictly); }); } removeClass(dropNode.$el, ns.is("drop-inner")); ctx.emit("node-drag-end", draggingNode.node, dropNode.node, dropType, event); if (dropType !== "none") ctx.emit("node-drop", draggingNode.node, dropNode.node, dropType, event); } if (draggingNode && !dropNode) ctx.emit("node-drag-end", draggingNode.node, null, dropType, event); dragState.value.showDropIndicator = false; dragState.value.draggingNode = null; dragState.value.dropNode = null; dragState.value.allowDrop = true; }; provide(dragEventsKey, { treeNodeDragStart, treeNodeDragOver, treeNodeDragEnd }); return { dragState }; } //#endregion //#region ../../packages/components/tree/src/tree-node.vue?vue&type=script&lang.ts var tree_node_vue_vue_type_script_lang_default = defineComponent({ name: "ElTreeNode", components: { ElCollapseTransition, ElCheckbox, NodeContent: tree_node_content_default$1, ElIcon, Loading: loading_default }, props: { node: { type: Node$1, default: () => ({}) }, props: { type: Object, default: () => ({}) }, accordion: Boolean, renderContent: Function, renderAfterExpand: Boolean, showCheckbox: Boolean }, emits: ["node-expand"], setup(props, ctx) { const ns = useNamespace("tree"); const { broadcastExpanded } = useNodeExpandEventBroadcast(props); const tree = inject(ROOT_TREE_INJECTION_KEY); const expanded = ref(false); const childNodeRendered = ref(false); const oldChecked = ref(); const oldIndeterminate = ref(); const node$ = ref(); const dragEvents = inject(dragEventsKey); const instance = getCurrentInstance(); provide(NODE_INSTANCE_INJECTION_KEY, instance); if (!tree) /* @__PURE__ */ debugWarn("Tree", "Can not find node's tree."); if (props.node.expanded) { expanded.value = true; childNodeRendered.value = true; } const childrenKey = tree.props.props["children"] || "children"; watch(() => { const children = props.node.data?.[childrenKey]; return children && [...children]; }, () => { props.node.updateChildren(); }); watch(() => props.node.indeterminate, (val) => { handleSelectChange(props.node.checked, val); }); watch(() => props.node.checked, (val) => { handleSelectChange(val, props.node.indeterminate); }); watch(() => props.node.childNodes.length, () => props.node.reInitChecked()); watch(() => props.node.expanded, (val) => { nextTick(() => expanded.value = val); if (val) childNodeRendered.value = true; }); const getNodeKey$2 = (node) => { return tree.props.nodeKey ? getNodeKey(tree.props.nodeKey, node.data) : node.id; }; const getNodeClass = (node) => { const nodeClassFunc = props.props.class; if (!nodeClassFunc) return {}; let className; if (isFunction$1(nodeClassFunc)) { const { data } = node; className = nodeClassFunc(data, node); } else className = nodeClassFunc; if (isString(className)) return { [className]: true }; else return className; }; const handleSelectChange = (checked, indeterminate) => { if (oldChecked.value !== checked || oldIndeterminate.value !== indeterminate) tree.ctx.emit("check-change", props.node.data, checked, indeterminate); oldChecked.value = checked; oldIndeterminate.value = indeterminate; }; const handleClick = (e) => { handleCurrentChange(tree.store, tree.ctx.emit, () => { if (tree?.props?.nodeKey) { const curNodeKey = getNodeKey$2(props.node); tree.store.value.setCurrentNodeKey(curNodeKey); } else tree.store.value.setCurrentNode(props.node); }); tree.currentNode.value = props.node; if (tree.props.expandOnClickNode) handleExpandIconClick(); if ((tree.props.checkOnClickNode || props.node.isLeaf && tree.props.checkOnClickLeaf && props.showCheckbox) && !props.node.disabled) handleCheckChange(!props.node.checked); tree.ctx.emit("node-click", props.node.data, props.node, instance, e); }; const handleContextMenu = (event) => { if (tree.instance.vnode.props?.["onNodeContextmenu"]) { event.stopPropagation(); event.preventDefault(); } tree.ctx.emit("node-contextmenu", event, props.node.data, props.node, instance); }; const handleExpandIconClick = () => { if (props.node.isLeaf) return; if (expanded.value) { tree.ctx.emit("node-collapse", props.node.data, props.node, instance); props.node.collapse(); } else props.node.expand(() => { ctx.emit("node-expand", props.node.data, props.node, instance); }); }; const handleCheckChange = (value) => { const checkStrictly = tree?.props.checkStrictly; const childNodes = props.node.childNodes; if (!checkStrictly && childNodes.length) value = childNodes.some((node) => !node.isEffectivelyChecked); props.node.setChecked(value, !checkStrictly); nextTick(() => { const store = tree.store.value; tree.ctx.emit("check", props.node.data, { checkedNodes: store.getCheckedNodes(), checkedKeys: store.getCheckedKeys(), halfCheckedNodes: store.getHalfCheckedNodes(), halfCheckedKeys: store.getHalfCheckedKeys() }); }); }; const handleChildNodeExpand = (nodeData, node, instance) => { broadcastExpanded(node); tree.ctx.emit("node-expand", nodeData, node, instance); }; const handleDragStart = (event) => { if (!tree.props.draggable) return; dragEvents.treeNodeDragStart({ event, treeNode: props }); }; const handleDragOver = (event) => { event.preventDefault(); if (!tree.props.draggable) return; dragEvents.treeNodeDragOver({ event, treeNode: { $el: node$.value, node: props.node } }); }; const handleDrop = (event) => { event.preventDefault(); }; const handleDragEnd = (event) => { if (!tree.props.draggable) return; dragEvents.treeNodeDragEnd(event); }; return { ns, node$, tree, expanded, childNodeRendered, oldChecked, oldIndeterminate, getNodeKey: getNodeKey$2, getNodeClass, handleSelectChange, handleClick, handleContextMenu, handleExpandIconClick, handleCheckChange, handleChildNodeExpand, handleDragStart, handleDragOver, handleDrop, handleDragEnd, CaretRight: caret_right_default }; } }); //#endregion //#region ../../packages/components/tree/src/tree-node.vue const _hoisted_1$12 = [ "aria-expanded", "aria-disabled", "aria-checked", "draggable", "data-key" ]; const _hoisted_2$7 = ["aria-expanded"]; function _sfc_render$2(_ctx, _cache, $props, $setup, $data, $options) { const _component_el_icon = resolveComponent("el-icon"); const _component_el_checkbox = resolveComponent("el-checkbox"); const _component_loading = resolveComponent("loading"); const _component_node_content = resolveComponent("node-content"); const _component_el_tree_node = resolveComponent("el-tree-node"); const _component_el_collapse_transition = resolveComponent("el-collapse-transition"); return withDirectives((openBlock(), createElementBlock("div", { ref: "node$", class: normalizeClass([ _ctx.ns.b("node"), _ctx.ns.is("expanded", _ctx.expanded), _ctx.ns.is("current", _ctx.node.isCurrent), _ctx.ns.is("hidden", !_ctx.node.visible), _ctx.ns.is("focusable", !_ctx.node.disabled), _ctx.ns.is("checked", !_ctx.node.disabled && _ctx.node.checked), _ctx.getNodeClass(_ctx.node) ]), role: "treeitem", tabindex: "-1", "aria-expanded": _ctx.expanded, "aria-disabled": _ctx.node.disabled, "aria-checked": _ctx.node.checked, draggable: _ctx.tree.props.draggable, "data-key": _ctx.getNodeKey(_ctx.node), onClick: _cache[2] || (_cache[2] = withModifiers((...args) => _ctx.handleClick && _ctx.handleClick(...args), ["stop"])), onContextmenu: _cache[3] || (_cache[3] = (...args) => _ctx.handleContextMenu && _ctx.handleContextMenu(...args)), onDragstart: _cache[4] || (_cache[4] = withModifiers((...args) => _ctx.handleDragStart && _ctx.handleDragStart(...args), ["stop"])), onDragover: _cache[5] || (_cache[5] = withModifiers((...args) => _ctx.handleDragOver && _ctx.handleDragOver(...args), ["stop"])), onDragend: _cache[6] || (_cache[6] = withModifiers((...args) => _ctx.handleDragEnd && _ctx.handleDragEnd(...args), ["stop"])), onDrop: _cache[7] || (_cache[7] = withModifiers((...args) => _ctx.handleDrop && _ctx.handleDrop(...args), ["stop"])) }, [createElementVNode("div", { class: normalizeClass(_ctx.ns.be("node", "content")), style: normalizeStyle({ paddingLeft: (_ctx.node.level - 1) * _ctx.tree.props.indent + "px" }) }, [ _ctx.tree.props.icon || _ctx.CaretRight ? (openBlock(), createBlock(_component_el_icon, { key: 0, class: normalizeClass([ _ctx.ns.be("node", "expand-icon"), _ctx.ns.is("leaf", _ctx.node.isLeaf), { expanded: !_ctx.node.isLeaf && _ctx.expanded } ]), onClick: withModifiers(_ctx.handleExpandIconClick, ["stop"]) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(_ctx.tree.props.icon || _ctx.CaretRight)))]), _: 1 }, 8, ["class", "onClick"])) : createCommentVNode("v-if", true), _ctx.showCheckbox ? (openBlock(), createBlock(_component_el_checkbox, { key: 1, "model-value": _ctx.node.checked, indeterminate: _ctx.node.indeterminate, disabled: !!_ctx.node.disabled, onClick: _cache[0] || (_cache[0] = withModifiers(() => {}, ["stop"])), onChange: _ctx.handleCheckChange }, null, 8, [ "model-value", "indeterminate", "disabled", "onChange" ])) : createCommentVNode("v-if", true), _ctx.node.loading ? (openBlock(), createBlock(_component_el_icon, { key: 2, class: normalizeClass([_ctx.ns.be("node", "loading-icon"), _ctx.ns.is("loading")]) }, { default: withCtx(() => [createVNode(_component_loading)]), _: 1 }, 8, ["class"])) : createCommentVNode("v-if", true), createVNode(_component_node_content, { node: _ctx.node, "render-content": _ctx.renderContent }, null, 8, ["node", "render-content"]) ], 6), createVNode(_component_el_collapse_transition, null, { default: withCtx(() => [!_ctx.renderAfterExpand || _ctx.childNodeRendered ? withDirectives((openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(_ctx.ns.be("node", "children")), role: "group", "aria-expanded": _ctx.expanded, onClick: _cache[1] || (_cache[1] = withModifiers(() => {}, ["stop"])) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.node.childNodes, (child) => { return openBlock(), createBlock(_component_el_tree_node, { key: _ctx.getNodeKey(child), "render-content": _ctx.renderContent, "render-after-expand": _ctx.renderAfterExpand, "show-checkbox": _ctx.showCheckbox, node: child, accordion: _ctx.accordion, props: _ctx.props, onNodeExpand: _ctx.handleChildNodeExpand }, null, 8, [ "render-content", "render-after-expand", "show-checkbox", "node", "accordion", "props", "onNodeExpand" ]); }), 128))], 10, _hoisted_2$7)), [[vShow, _ctx.expanded]]) : createCommentVNode("v-if", true)]), _: 1 })], 42, _hoisted_1$12)), [[vShow, _ctx.node.visible]]); } var tree_node_default$1 = /* @__PURE__ */ _plugin_vue_export_helper_default(tree_node_vue_vue_type_script_lang_default, [["render", _sfc_render$2]]); //#endregion //#region ../../packages/components/tree/src/model/useKeydown.ts function useKeydown({ el$ }, store) { const ns = useNamespace("tree"); onMounted(() => { initTabIndex(); }); onUpdated(() => { el$.value?.querySelectorAll("input[type=checkbox]").forEach((checkbox) => { checkbox.setAttribute("tabindex", "-1"); }); }); function canNodeFocus(treeItems, nextIndex) { const currentNode = store.value.getNode(treeItems[nextIndex].dataset.key); return currentNode.canFocus && currentNode.visible && (currentNode.parent?.expanded || currentNode.parent?.level === 0); } const handleKeydown = (ev) => { const currentItem = ev.target; if (!currentItem.className.includes(ns.b("node"))) return; const code = getEventCode(ev); const treeItems = Array.from(el$.value.querySelectorAll(`.${ns.is("focusable")}[role=treeitem]`)); const currentIndex = treeItems.indexOf(currentItem); let nextIndex; if ([EVENT_CODE.up, EVENT_CODE.down].includes(code)) { ev.preventDefault(); if (code === EVENT_CODE.up) { nextIndex = currentIndex === -1 ? 0 : currentIndex !== 0 ? currentIndex - 1 : treeItems.length - 1; const startIndex = nextIndex; while (true) { if (canNodeFocus(treeItems, nextIndex)) break; nextIndex--; if (nextIndex === startIndex) { nextIndex = -1; break; } if (nextIndex < 0) nextIndex = treeItems.length - 1; } } else { nextIndex = currentIndex === -1 ? 0 : currentIndex < treeItems.length - 1 ? currentIndex + 1 : 0; const startIndex = nextIndex; while (true) { if (canNodeFocus(treeItems, nextIndex)) break; nextIndex++; if (nextIndex === startIndex) { nextIndex = -1; break; } if (nextIndex >= treeItems.length) nextIndex = 0; } } nextIndex !== -1 && treeItems[nextIndex].focus(); } if ([EVENT_CODE.left, EVENT_CODE.right].includes(code)) { ev.preventDefault(); currentItem.click(); } const hasInput = currentItem.querySelector("[type=\"checkbox\"]"); if ([ EVENT_CODE.enter, EVENT_CODE.numpadEnter, EVENT_CODE.space ].includes(code) && hasInput) { ev.preventDefault(); hasInput.click(); } }; useEventListener(el$, "keydown", handleKeydown); const initTabIndex = () => { if (!el$.value) return; const treeItems = Array.from(el$.value.querySelectorAll(`.${ns.is("focusable")}[role=treeitem]`)); Array.from(el$.value.querySelectorAll("input[type=checkbox]")).forEach((checkbox) => { checkbox.setAttribute("tabindex", "-1"); }); const checkedItem = el$.value.querySelectorAll(`.${ns.is("checked")}[role=treeitem]`); if (checkedItem.length) { checkedItem[0].setAttribute("tabindex", "0"); return; } treeItems[0]?.setAttribute("tabindex", "0"); }; } //#endregion //#region ../../packages/components/tree/src/tree.ts const treeProps = buildProps({ data: { type: definePropType(Array), default: () => [] }, emptyText: { type: String }, renderAfterExpand: { type: Boolean, default: true }, nodeKey: String, checkStrictly: Boolean, defaultExpandAll: Boolean, expandOnClickNode: { type: Boolean, default: true }, checkOnClickNode: Boolean, checkOnClickLeaf: { type: Boolean, default: true }, checkDescendants: Boolean, autoExpandParent: { type: Boolean, default: true }, defaultCheckedKeys: { type: Array }, defaultExpandedKeys: { type: Array }, currentNodeKey: { type: [String, Number] }, renderContent: { type: definePropType(Function) }, showCheckbox: Boolean, draggable: Boolean, allowDrag: { type: definePropType(Function) }, allowDrop: { type: definePropType(Function) }, props: { type: Object, default: () => ({ children: "children", label: "label", disabled: "disabled" }) }, lazy: Boolean, highlightCurrent: Boolean, load: { type: Function }, filterNodeMethod: { type: Function }, accordion: Boolean, indent: { type: Number, default: 18 }, icon: { type: iconPropType } }); const treeEmits = { "check-change": (data, checked, indeterminate) => data && isBoolean(checked) && isBoolean(indeterminate), "current-change": (data, node) => true, "node-click": (data, node, nodeInstance, evt) => data && node && evt instanceof Event, "node-contextmenu": (evt, data, node, nodeInstance) => evt instanceof Event && data && node, "node-collapse": (data, node, nodeInstance) => data && node, "node-expand": (data, node, nodeInstance) => data && node, check: (data, checkedInfo) => data && checkedInfo, "node-drag-start": (node, evt) => node && evt, "node-drag-end": (draggingNode, dropNode, dropType, evt) => draggingNode && evt, "node-drop": (draggingNode, dropNode, dropType, evt) => draggingNode && dropNode && evt, "node-drag-leave": (draggingNode, oldDropNode, evt) => draggingNode && oldDropNode && evt, "node-drag-enter": (draggingNode, dropNode, evt) => draggingNode && dropNode && evt, "node-drag-over": (draggingNode, dropNode, evt) => draggingNode && dropNode && evt }; //#endregion //#region ../../packages/components/tree/src/tree.vue?vue&type=script&lang.ts var tree_vue_vue_type_script_lang_default = defineComponent({ name: "ElTree", components: { ElTreeNode: tree_node_default$1 }, props: treeProps, emits: treeEmits, setup(props, ctx) { const { t } = useLocale(); const ns = useNamespace("tree"); const store = ref(new TreeStore({ key: props.nodeKey, data: props.data, lazy: props.lazy, props: props.props, load: props.load, currentNodeKey: props.currentNodeKey, checkStrictly: props.checkStrictly, checkDescendants: props.checkDescendants, defaultCheckedKeys: props.defaultCheckedKeys, defaultExpandedKeys: props.defaultExpandedKeys, autoExpandParent: props.autoExpandParent, defaultExpandAll: props.defaultExpandAll, filterNodeMethod: props.filterNodeMethod })); store.value.initialize(); const root = ref(store.value.root); const currentNode = ref(null); const el$ = ref(null); const dropIndicator$ = ref(null); const { broadcastExpanded } = useNodeExpandEventBroadcast(props); const { dragState } = useDragNodeHandler({ props, ctx, el$, dropIndicator$, store }); useKeydown({ el$ }, store); const instance = getCurrentInstance(); const isSelectTree = computed(() => { let parent = instance?.parent; while (parent) { if (parent.type.name === "ElTreeSelect") return true; parent = parent.parent; } return false; }); const isEmpty = computed(() => { const { childNodes } = root.value; return (!childNodes || childNodes.length === 0 || childNodes.every(({ visible }) => !visible)) && !isSelectTree.value; }); watch(() => props.currentNodeKey, (newVal) => { store.value.setCurrentNodeKey(newVal ?? null); }); watch(() => props.defaultCheckedKeys, (newVal, oldVal) => { if (isEqual$1(newVal, oldVal)) return; store.value.setDefaultCheckedKey(newVal ?? []); }); watch(() => props.defaultExpandedKeys, (newVal) => { store.value.setDefaultExpandedKeys(newVal ?? []); }); watch(() => props.data, (newVal) => { store.value.setData(newVal); }, { deep: true }); watch(() => props.checkStrictly, (newVal) => { store.value.checkStrictly = newVal; }); const filter = (value) => { if (!props.filterNodeMethod) throw new Error("[Tree] filterNodeMethod is required when filter"); store.value.filter(value); }; const getNodeKey$1 = (node) => { return props.nodeKey ? getNodeKey(props.nodeKey, node.data) : node.id; }; const requireNodeKey = (methodName) => { if (!props.nodeKey) throw new Error(`[Tree] nodeKey is required in ${methodName}`); }; const getNodePath = (data) => { requireNodeKey("getNodePath"); const node = store.value.getNode(data); if (!node) return []; const path = [node.data]; let parent = node.parent; while (parent && parent !== root.value) { path.push(parent.data); parent = parent.parent; } return path.reverse(); }; const getCheckedNodes = (leafOnly, includeHalfChecked) => { return store.value.getCheckedNodes(leafOnly, includeHalfChecked); }; const getCheckedKeys = (leafOnly) => { return store.value.getCheckedKeys(leafOnly); }; const getCurrentNode = () => { const currentNode = store.value.getCurrentNode(); return currentNode ? currentNode.data : null; }; const getCurrentKey = () => { requireNodeKey("getCurrentKey"); const currentNode = getCurrentNode(); return currentNode ? currentNode[props.nodeKey] : null; }; const setCheckedNodes = (nodes, leafOnly) => { requireNodeKey("setCheckedNodes"); store.value.setCheckedNodes(nodes, leafOnly); }; const setCheckedKeys = (keys, leafOnly) => { requireNodeKey("setCheckedKeys"); store.value.setCheckedKeys(keys, leafOnly); }; const setChecked = (data, checked, deep = false) => { store.value.setChecked(data, checked, deep); }; const getHalfCheckedNodes = () => { return store.value.getHalfCheckedNodes(); }; const getHalfCheckedKeys = () => { return store.value.getHalfCheckedKeys(); }; const setCurrentNode = (node, shouldAutoExpandParent = true) => { requireNodeKey("setCurrentNode"); handleCurrentChange(store, ctx.emit, () => { broadcastExpanded(node); store.value.setUserCurrentNode(node, shouldAutoExpandParent); }); }; const setCurrentKey = (key = null, shouldAutoExpandParent = true) => { requireNodeKey("setCurrentKey"); handleCurrentChange(store, ctx.emit, () => { broadcastExpanded(); store.value.setCurrentNodeKey(key, shouldAutoExpandParent); }); }; const getNode = (data) => { return store.value.getNode(data); }; const remove = (data) => { store.value.remove(data); }; const append = (data, parentNode) => { store.value.append(data, parentNode); }; const insertBefore = (data, refNode) => { store.value.insertBefore(data, refNode); }; const insertAfter = (data, refNode) => { store.value.insertAfter(data, refNode); }; const handleNodeExpand = (nodeData, node, instance) => { broadcastExpanded(node); ctx.emit("node-expand", nodeData, node, instance); }; const updateKeyChildren = (key, data) => { requireNodeKey("updateKeyChildren"); store.value.updateChildren(key, data); }; provide(ROOT_TREE_INJECTION_KEY, { ctx, props, store, root, currentNode, instance }); provide(formItemContextKey, void 0); return { ns, store, root, currentNode, dragState, el$, dropIndicator$, isEmpty, filter, getNodeKey: getNodeKey$1, getNodePath, getCheckedNodes, getCheckedKeys, getCurrentNode, getCurrentKey, setCheckedNodes, setCheckedKeys, setChecked, getHalfCheckedNodes, getHalfCheckedKeys, setCurrentNode, setCurrentKey, t, getNode, remove, append, insertBefore, insertAfter, handleNodeExpand, updateKeyChildren }; } }); //#endregion //#region ../../packages/components/tree/src/tree.vue function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) { const _component_el_tree_node = resolveComponent("el-tree-node"); return openBlock(), createElementBlock("div", { ref: "el$", class: normalizeClass([ _ctx.ns.b(), _ctx.ns.is("dragging", !!_ctx.dragState.draggingNode), _ctx.ns.is("drop-not-allow", !_ctx.dragState.allowDrop), _ctx.ns.is("drop-inner", _ctx.dragState.dropType === "inner"), { [_ctx.ns.m("highlight-current")]: _ctx.highlightCurrent } ]), role: "tree" }, [ (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.root.childNodes, (child) => { return openBlock(), createBlock(_component_el_tree_node, { key: _ctx.getNodeKey(child), node: child, props: _ctx.props, accordion: _ctx.accordion, "render-after-expand": _ctx.renderAfterExpand, "show-checkbox": _ctx.showCheckbox, "render-content": _ctx.renderContent, onNodeExpand: _ctx.handleNodeExpand }, null, 8, [ "node", "props", "accordion", "render-after-expand", "show-checkbox", "render-content", "onNodeExpand" ]); }), 128)), _ctx.isEmpty ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(_ctx.ns.e("empty-block")) }, [renderSlot(_ctx.$slots, "empty", {}, () => [createElementVNode("span", { class: normalizeClass(_ctx.ns.e("empty-text")) }, toDisplayString(_ctx.emptyText ?? _ctx.t("el.tree.emptyText")), 3)])], 2)) : createCommentVNode("v-if", true), withDirectives(createElementVNode("div", { ref: "dropIndicator$", class: normalizeClass(_ctx.ns.e("drop-indicator")) }, null, 2), [[vShow, _ctx.dragState.showDropIndicator]]) ], 2); } var tree_default$1 = /* @__PURE__ */ _plugin_vue_export_helper_default(tree_vue_vue_type_script_lang_default, [["render", _sfc_render$1]]); //#endregion //#region ../../packages/components/tree/index.ts const ElTree = withInstall(tree_default$1); //#endregion //#region ../../packages/components/tree-select/src/select.ts const useSelect = (props, { attrs, emit }, { select, tree, key }) => { const ns = useNamespace("tree-select"); watch(() => props.data, () => { if (props.filterable) nextTick(() => { tree.value?.filter(select.value?.states.inputValue); }); }, { flush: "post" }); const focusLastNode = (listNode) => { const lastNode = listNode.at(-1); if (lastNode.expanded && lastNode.childNodes.at(-1)) focusLastNode([lastNode.childNodes.at(-1)]); else { (tree.value.el$?.querySelector(`[data-key="${listNode.at(-1).key}"]`))?.focus({ preventScroll: true }); return; } }; onMounted(() => { useEventListener(() => select.value?.$el, "keydown", async (evt) => { const code = getEventCode(evt); const { dropdownMenuVisible } = select.value; if ([EVENT_CODE.down, EVENT_CODE.up].includes(code) && dropdownMenuVisible) { await nextTick(); setTimeout(() => { if (EVENT_CODE.up === code) { const listNode = tree.value.store.root.childNodes; focusLastNode(listNode); return; } select.value.optionsArray[select.value.states.hoveringIndex].$el?.parentNode?.parentNode?.focus({ preventScroll: true }); }); } }, { capture: true }); }); return { ...pick(toRefs(props), Object.keys(ElSelect.props)), ...attrs, class: computed(() => attrs.class), style: computed(() => attrs.style), "onUpdate:modelValue": (value) => emit(UPDATE_MODEL_EVENT, value), valueKey: key, popperClass: computed(() => { const classes = [ns.e("popper")]; if (props.popperClass) classes.push(props.popperClass); return classes.join(" "); }), filterMethod: (keyword = "") => { if (props.filterMethod) props.filterMethod(keyword); else if (props.remoteMethod) props.remoteMethod(keyword); else tree.value?.filter(keyword); } }; }; //#endregion //#region ../../packages/components/tree-select/src/tree-select-option.ts const component = defineComponent({ extends: ElOption, setup(props, ctx) { const result = ElOption.setup(props, ctx); delete result.selectOptionClick; const vm = getCurrentInstance().proxy; nextTick(() => { if (!result.select.states.cachedOptions.get(vm.value)) result.select.onOptionCreate(vm); }); watch(() => ctx.attrs.visible, (val) => { nextTick(() => { result.states.visible = val; }); }, { immediate: true }); return result; }, methods: { selectOptionClick() { this.$el.parentElement.click(); } } }); //#endregion //#region ../../packages/components/tree-select/src/utils.ts function isValidValue(val) { return val || val === 0; } function isValidArray(val) { return isArray$1(val) && val.length; } function toValidArray(val) { return isArray$1(val) ? val : isValidValue(val) ? [val] : []; } function treeFind(treeData, findCallback, getChildren, resultCallback, parent) { for (let i = 0; i < treeData.length; i++) { const data = treeData[i]; if (findCallback(data, i, treeData, parent)) return resultCallback ? resultCallback(data, i, treeData, parent) : data; else { const children = getChildren(data); if (isValidArray(children)) { const find = treeFind(children, findCallback, getChildren, resultCallback, data); if (find) return find; } } } } function treeEach(treeData, callback, getChildren, parent) { for (let i = 0; i < treeData.length; i++) { const data = treeData[i]; callback(data, i, treeData, parent); const children = getChildren(data); if (isValidArray(children)) treeEach(children, callback, getChildren, data); } } //#endregion //#region ../../packages/components/tree-select/src/tree.ts const useTree$1 = (props, { attrs, slots, emit }, { select, tree, key }) => { watch([() => props.modelValue, tree], () => { if (props.showCheckbox) nextTick(() => { const treeInstance = tree.value; if (treeInstance && !isEqual$1(treeInstance.getCheckedKeys(), toValidArray(props.modelValue))) treeInstance.setCheckedKeys(toValidArray(props.modelValue)); }); }, { immediate: true, deep: true }); const propsMap = computed(() => ({ value: key.value, label: "label", children: "children", disabled: "disabled", isLeaf: "isLeaf", ...props.props })); const getNodeValByProp = (prop, data) => { const propVal = propsMap.value[prop]; if (isFunction$1(propVal)) return propVal(data, tree.value?.getNode(getNodeValByProp("value", data))); else return data[propVal]; }; const defaultExpandedParentKeys = toValidArray(props.modelValue).map((value) => { return treeFind(props.data || [], (data) => getNodeValByProp("value", data) === value, (data) => getNodeValByProp("children", data), (data, index, array, parent) => parent && getNodeValByProp("value", parent)); }).filter((item) => isValidValue(item)); const cacheOptions = computed(() => { if (!props.renderAfterExpand && !props.lazy) return []; const options = []; treeEach(props.data.concat(props.cacheData), (node) => { const value = getNodeValByProp("value", node); options.push({ value, currentLabel: getNodeValByProp("label", node), isDisabled: getNodeValByProp("disabled", node) }); }, (data) => getNodeValByProp("children", data)); return options; }); const getChildCheckedKeys = () => { return tree.value?.getCheckedKeys().filter((checkedKey) => { const node = tree.value?.getNode(checkedKey); return !isNil(node) && isEmpty(node.childNodes); }); }; const emitChange = (val) => { if (!isEqual$1(props.modelValue, val)) emit(CHANGE_EVENT, val); }; function update(val) { emit(UPDATE_MODEL_EVENT, val); emitChange(val); } return { ...pick(toRefs(props), Object.keys(ElTree.props)), ...attrs, nodeKey: key, expandOnClickNode: computed(() => { return !props.checkStrictly && props.expandOnClickNode; }), defaultExpandedKeys: computed(() => { return props.defaultExpandedKeys ? props.defaultExpandedKeys.concat(defaultExpandedParentKeys) : defaultExpandedParentKeys; }), renderContent: (h, { node, data, store }) => { return h(component, { value: getNodeValByProp("value", data), label: getNodeValByProp("label", data), disabled: getNodeValByProp("disabled", data), visible: node.visible }, props.renderContent ? () => props.renderContent(h, { node, data, store }) : slots.default ? () => slots.default({ node, data, store }) : void 0); }, filterNodeMethod: (value, data, node) => { if (props.filterNodeMethod) return props.filterNodeMethod(value, data, node); if (!value) return true; return new RegExp(escapeStringRegexp(value), "i").test(getNodeValByProp("label", data) || ""); }, onNodeClick: (data, node, e) => { attrs.onNodeClick?.(data, node, e); if (props.showCheckbox && props.checkOnClickNode) return; if (!props.showCheckbox && (props.checkStrictly || node.isLeaf)) { if (!getNodeValByProp("disabled", data)) { const option = select.value?.states.options.get(getNodeValByProp("value", data)); select.value?.handleOptionSelect(option); } } else if (props.expandOnClickNode) e.proxy.handleExpandIconClick(); }, onCheck: (data, params) => { if (!props.showCheckbox) return; const dataValue = getNodeValByProp("value", data); const dataMap = {}; treeEach([tree.value.store.root], (node) => dataMap[node.key] = node, (node) => node.childNodes); const uncachedCheckedKeys = params.checkedKeys; const cachedKeys = props.multiple ? toValidArray(props.modelValue).filter((item) => !(item in dataMap) && !uncachedCheckedKeys.includes(item)) : []; const checkedKeys = cachedKeys.concat(uncachedCheckedKeys); if (props.checkStrictly) update(props.multiple ? checkedKeys : checkedKeys.includes(dataValue) ? dataValue : void 0); else if (props.multiple) { const childKeys = getChildCheckedKeys(); update(cachedKeys.concat(childKeys)); } else { const firstLeaf = treeFind([data], (data) => !isValidArray(getNodeValByProp("children", data)) && !getNodeValByProp("disabled", data), (data) => getNodeValByProp("children", data)); const firstLeafKey = firstLeaf ? getNodeValByProp("value", firstLeaf) : void 0; const hasCheckedChild = isValidValue(props.modelValue) && !!treeFind([data], (data) => getNodeValByProp("value", data) === props.modelValue, (data) => getNodeValByProp("children", data)); update(firstLeafKey === props.modelValue || hasCheckedChild ? void 0 : firstLeafKey); } nextTick(() => { const checkedKeys = toValidArray(props.modelValue); tree.value.setCheckedKeys(checkedKeys); attrs.onCheck?.(data, { checkedKeys: tree.value.getCheckedKeys(), checkedNodes: tree.value.getCheckedNodes(), halfCheckedKeys: tree.value.getHalfCheckedKeys(), halfCheckedNodes: tree.value.getHalfCheckedNodes() }); }); select.value?.focus(); }, onNodeExpand: (data, node, e) => { attrs.onNodeExpand?.(data, node, e); nextTick(() => { if (!props.checkStrictly && props.lazy && props.multiple && node.checked) { const dataMap = {}; const uncachedCheckedKeys = tree.value.getCheckedKeys(); treeEach([tree.value.store.root], (node) => dataMap[node.key] = node, (node) => node.childNodes); const cachedKeys = toValidArray(props.modelValue).filter((item) => !(item in dataMap) && !uncachedCheckedKeys.includes(item)); const childKeys = getChildCheckedKeys(); update(cachedKeys.concat(childKeys)); } }); }, cacheOptions }; }; //#endregion //#region ../../packages/components/tree-select/src/cache-options.ts var cache_options_default = defineComponent({ props: { data: { type: Array, default: () => [] } }, setup(props) { const select = inject(selectKey); watch(() => props.data, () => { props.data.forEach((item) => { if (!select.states.cachedOptions.has(item.value)) select.states.cachedOptions.set(item.value, item); }); const inputs = select.selectRef?.querySelectorAll("input") || []; if (isClient && !Array.from(inputs).includes(document.activeElement)) select.setSelected(); }, { flush: "post", immediate: true }); return () => void 0; } }); //#endregion //#region ../../packages/components/tree-select/src/tree-select.vue?vue&type=script&lang.ts var tree_select_vue_vue_type_script_lang_default = defineComponent({ name: "ElTreeSelect", inheritAttrs: false, props: { ...selectProps, ...treeProps, /** * @description The cached data of the lazy node, the structure is the same as the data, used to get the label of the unloaded data */ cacheData: { type: Array, default: () => [] } }, setup(props, context) { const { slots, expose, emit, attrs } = context; const childAttrs = { ...attrs, onChange: void 0 }; const select = ref(); const tree = ref(); const key = computed(() => props.nodeKey || props.valueKey || "value"); const selectProps = useSelect(props, { attrs, emit }, { select, tree, key }); const { cacheOptions, ...treeProps } = useTree$1(props, { attrs: childAttrs, slots, emit }, { select, tree, key }); const methods = reactive({}); expose(methods); onMounted(() => { Object.assign(methods, { ...pick(tree.value, [ "filter", "updateKeyChildren", "getCheckedNodes", "setCheckedNodes", "getCheckedKeys", "setCheckedKeys", "setChecked", "getHalfCheckedNodes", "getHalfCheckedKeys", "getCurrentKey", "getCurrentNode", "setCurrentKey", "setCurrentNode", "getNode", "remove", "append", "insertBefore", "insertAfter" ]), ...pick(select.value, [ "focus", "blur", "selectedLabel" ]), treeRef: tree.value, selectRef: select.value }); }); return () => h( ElSelect, /** * 1. The `props` is processed into `Refs`, but `v-bind` and * render function props cannot read `Refs`, so use `reactive` * unwrap the `Refs` and keep reactive. * 2. The keyword `ref` requires `Ref`, but `reactive` broke it, * so use function. */ reactive({ ...selectProps, ref: (ref) => select.value = ref }), { ...slots, default: () => [h(cache_options_default, { data: cacheOptions.value }), h(ElTree, reactive({ ...treeProps, ref: (ref) => tree.value = ref }))] } ); } }); //#endregion //#region ../../packages/components/tree-select/src/tree-select.vue var tree_select_default = tree_select_vue_vue_type_script_lang_default; //#endregion //#region ../../packages/components/tree-select/index.ts const ElTreeSelect = withInstall(tree_select_default); //#endregion //#region ../../packages/components/tree-v2/src/virtual-tree.ts const ROOT_TREE_INJECTION_KEY$1 = Symbol(); const EMPTY_NODE = { key: -1, level: -1, data: {} }; const itemSize = { type: Number, default: 26 }; /** * @deprecated Removed after 3.0.0, Use `TreeProps` instead. */ const treeProps$1 = buildProps({ data: { type: definePropType(Array), default: () => mutable([]) }, emptyText: { type: String }, height: { type: Number, default: 200 }, props: { type: definePropType(Object), default: () => mutable({ children: "children", label: "label", disabled: "disabled", value: "id", class: "" }) }, highlightCurrent: Boolean, showCheckbox: Boolean, defaultCheckedKeys: { type: definePropType(Array), default: () => mutable([]) }, checkStrictly: Boolean, defaultExpandedKeys: { type: definePropType(Array), default: () => mutable([]) }, indent: { type: Number, default: 16 }, itemSize, icon: { type: iconPropType }, expandOnClickNode: { type: Boolean, default: true }, checkOnClickNode: Boolean, checkOnClickLeaf: { type: Boolean, default: true }, currentNodeKey: { type: definePropType([String, Number]) }, accordion: Boolean, filterMethod: { type: definePropType(Function) }, perfMode: { type: Boolean, default: true }, /** * @description always show scrollbar */ scrollbarAlwaysOn: Boolean }); /** * @deprecated Removed after 3.0.0, Use `TreeNodeProps` instead. */ const treeNodeProps = buildProps({ node: { type: definePropType(Object), default: () => mutable(EMPTY_NODE) }, expanded: Boolean, checked: Boolean, indeterminate: Boolean, showCheckbox: Boolean, disabled: Boolean, current: Boolean, hiddenExpandIcon: Boolean, itemSize }); const treeNodeContentProps = buildProps({ node: { type: definePropType(Object), required: true } }); const NODE_CLICK = "node-click"; const NODE_DROP = "node-drop"; const NODE_EXPAND = "node-expand"; const NODE_COLLAPSE = "node-collapse"; const CURRENT_CHANGE = "current-change"; const NODE_CHECK = "check"; const NODE_CHECK_CHANGE = "check-change"; const NODE_CONTEXTMENU = "node-contextmenu"; const treeEmits$1 = { [NODE_CLICK]: (data, node, e) => data && node && e, [NODE_DROP]: (data, node, e) => data && node && e, [NODE_EXPAND]: (data, node) => data && node, [NODE_COLLAPSE]: (data, node) => data && node, [CURRENT_CHANGE]: (data, node) => data && node, [NODE_CHECK]: (data, checkedInfo) => data && checkedInfo, [NODE_CHECK_CHANGE]: (data, checked) => data && isBoolean(checked), [NODE_CONTEXTMENU]: (evt, data, node) => evt && data && node }; const treeNodeEmits = { click: (node, e) => !!(node && e), drop: (node, e) => !!(node && e), toggle: (node) => !!node, check: (node, checked) => node && isBoolean(checked) }; //#endregion //#region ../../packages/components/tree-v2/src/composables/useCheck.ts function useCheck(props, tree) { const checkedKeys = ref(/* @__PURE__ */ new Set()); const indeterminateKeys = ref(/* @__PURE__ */ new Set()); const { emit } = getCurrentInstance(); watch([() => tree.value, () => props.defaultCheckedKeys], () => { return nextTick(() => { _setCheckedKeys(props.defaultCheckedKeys); }); }, { immediate: true }); const updateCheckedKeys = (deep = false) => { if (!tree.value || !props.showCheckbox || props.checkStrictly && !deep) return; const { levelTreeNodeMap, maxLevel } = tree.value; const checkedKeySet = checkedKeys.value; const indeterminateKeySet = /* @__PURE__ */ new Set(); for (let level = maxLevel; level >= 1; --level) { const nodes = levelTreeNodeMap.get(level); if (!nodes) continue; nodes.forEach((node) => { const children = node.children; let isEffectivelyChecked = !node.isLeaf || node.disabled || checkedKeySet.has(node.key); if (children) { let allChecked = true; let hasChecked = false; for (const childNode of children) { const key = childNode.key; if (!childNode.isEffectivelyChecked) isEffectivelyChecked = false; if (checkedKeySet.has(key)) hasChecked = true; else if (indeterminateKeySet.has(key)) { allChecked = false; hasChecked = true; break; } else allChecked = false; } if (allChecked) checkedKeySet.add(node.key); else if (hasChecked) { indeterminateKeySet.add(node.key); checkedKeySet.delete(node.key); } else { checkedKeySet.delete(node.key); indeterminateKeySet.delete(node.key); } } node.isEffectivelyChecked = isEffectivelyChecked; }); } indeterminateKeys.value = indeterminateKeySet; }; const isChecked = (node) => checkedKeys.value.has(node.key); const isIndeterminate = (node) => indeterminateKeys.value.has(node.key); const toggleCheckbox = (node, isChecked, nodeClick = true, immediateUpdate = true, deep = false) => { const checkedKeySet = checkedKeys.value; const children = node.children; if ((!props.checkStrictly || deep) && nodeClick && children?.length) isChecked = children.some((node) => !node.isEffectivelyChecked); const toggle = (node, checked) => { checkedKeySet[checked ? "add" : "delete"](node.key); const children = node.children; if ((!props.checkStrictly || deep) && children) children.forEach((childNode) => { if (!childNode.disabled || childNode.children) toggle(childNode, checked); }); }; toggle(node, isChecked); if (immediateUpdate) updateCheckedKeys(); if (nodeClick) afterNodeCheck(node, isChecked); }; const afterNodeCheck = (node, checked) => { const { checkedNodes, checkedKeys } = getChecked(); const { halfCheckedNodes, halfCheckedKeys } = getHalfChecked(); emit(NODE_CHECK, node.data, { checkedKeys, checkedNodes, halfCheckedKeys, halfCheckedNodes }); emit(NODE_CHECK_CHANGE, node.data, checked); }; function getCheckedKeys(leafOnly = false) { return getChecked(leafOnly).checkedKeys; } function getCheckedNodes(leafOnly = false) { return getChecked(leafOnly).checkedNodes; } function getHalfCheckedKeys() { return getHalfChecked().halfCheckedKeys; } function getHalfCheckedNodes() { return getHalfChecked().halfCheckedNodes; } function getChecked(leafOnly = false) { const checkedNodes = []; const keys = []; if (tree?.value && props.showCheckbox) { const { treeNodeMap } = tree.value; checkedKeys.value.forEach((key) => { const node = treeNodeMap.get(key); if (node && (!leafOnly || leafOnly && node.isLeaf)) { keys.push(key); checkedNodes.push(node.data); } }); } return { checkedKeys: keys, checkedNodes }; } function getHalfChecked() { const halfCheckedNodes = []; const halfCheckedKeys = []; if (tree?.value && props.showCheckbox) { const { treeNodeMap } = tree.value; indeterminateKeys.value.forEach((key) => { const node = treeNodeMap.get(key); if (node) { halfCheckedKeys.push(key); halfCheckedNodes.push(node.data); } }); } return { halfCheckedNodes, halfCheckedKeys }; } function setCheckedKeys(keys) { checkedKeys.value.clear(); indeterminateKeys.value.clear(); nextTick(() => { _setCheckedKeys(keys); }); } function setChecked(key, isChecked, deep) { if (tree?.value && props.showCheckbox) { const node = tree.value.treeNodeMap.get(key); if (node) toggleCheckbox(node, isChecked, false, void 0, deep); } } function _setCheckedKeys(keys) { if (tree?.value) { const { treeNodeMap } = tree.value; if (props.showCheckbox && treeNodeMap && keys?.length > 0) { for (const key of keys) { const node = treeNodeMap.get(key); if (node && !isChecked(node)) toggleCheckbox(node, true, false, false); } updateCheckedKeys(); } } } return { updateCheckedKeys, toggleCheckbox, isChecked, isIndeterminate, getCheckedKeys, getCheckedNodes, getHalfCheckedKeys, getHalfCheckedNodes, setChecked, setCheckedKeys }; } //#endregion //#region ../../packages/components/tree-v2/src/composables/useFilter.ts function useFilter(props, tree) { const hiddenNodeKeySet = ref(/* @__PURE__ */ new Set([])); const hiddenExpandIconKeySet = ref(/* @__PURE__ */ new Set([])); const filterable = computed(() => { return isFunction$1(props.filterMethod); }); function doFilter(query) { if (!filterable.value) return; const expandKeySet = /* @__PURE__ */ new Set(); const hiddenExpandIconKeys = hiddenExpandIconKeySet.value; const hiddenKeys = hiddenNodeKeySet.value; const family = []; const nodes = tree.value?.treeNodes || []; const filter = props.filterMethod; hiddenKeys.clear(); function traverse(nodes) { nodes.forEach((node) => { family.push(node); if (filter?.(query, node.data, node)) family.forEach((member) => { expandKeySet.add(member.key); member.expanded = true; }); else { node.expanded = false; if (node.isLeaf) hiddenKeys.add(node.key); } const children = node.children; if (children) traverse(children); if (!node.isLeaf) { if (!expandKeySet.has(node.key)) hiddenKeys.add(node.key); else if (children) { let allHidden = true; for (const childNode of children) if (!hiddenKeys.has(childNode.key)) { allHidden = false; break; } if (allHidden) hiddenExpandIconKeys.add(node.key); else hiddenExpandIconKeys.delete(node.key); } } family.pop(); }); } traverse(nodes); return expandKeySet; } function isForceHiddenExpandIcon(node) { return hiddenExpandIconKeySet.value.has(node.key); } return { hiddenExpandIconKeySet, hiddenNodeKeySet, doFilter, isForceHiddenExpandIcon }; } //#endregion //#region ../../packages/components/tree-v2/src/composables/useTree.ts function useTree(props, emit) { const expandedKeySet = ref(/* @__PURE__ */ new Set()); const currentKey = ref(); const tree = shallowRef(); const listRef = ref(); const { isIndeterminate, isChecked, toggleCheckbox, getCheckedKeys, getCheckedNodes, getHalfCheckedKeys, getHalfCheckedNodes, setChecked, setCheckedKeys } = useCheck(props, tree); const { doFilter, hiddenNodeKeySet, isForceHiddenExpandIcon } = useFilter(props, tree); const valueKey = computed(() => { return props.props?.value || "id"; }); const childrenKey = computed(() => { return props.props?.children || "children"; }); const disabledKey = computed(() => { return props.props?.disabled || "disabled"; }); const labelKey = computed(() => { return props.props?.label || "label"; }); const flattenTree = computed(() => { const expandedKeys = expandedKeySet.value; const hiddenKeys = hiddenNodeKeySet.value; const flattenNodes = []; const nodes = tree.value?.treeNodes || []; const stack = []; for (let i = nodes.length - 1; i >= 0; --i) stack.push(nodes[i]); while (stack.length) { const node = stack.pop(); if (hiddenKeys.has(node.key)) continue; flattenNodes.push(node); if (node.children && expandedKeys.has(node.key)) for (let i = node.children.length - 1; i >= 0; --i) stack.push(node.children[i]); } return flattenNodes; }); const isNotEmpty = computed(() => { return flattenTree.value.length > 0; }); function createTree(data) { const treeNodeMap = /* @__PURE__ */ new Map(); const levelTreeNodeMap = /* @__PURE__ */ new Map(); let maxLevel = 1; function traverse(nodes, level = 1, parent = void 0) { const siblings = []; for (const rawNode of nodes) { const value = getKey(rawNode); const node = { level, key: value, data: rawNode }; node.label = getLabel(rawNode); node.parent = parent; const children = getChildren(rawNode); node.disabled = getDisabled(rawNode); node.isLeaf = !children || children.length === 0; node.expanded = expandedKeySet.value.has(value); if (children && children.length) node.children = traverse(children, level + 1, node); siblings.push(node); treeNodeMap.set(value, node); if (!levelTreeNodeMap.has(level)) levelTreeNodeMap.set(level, []); levelTreeNodeMap.get(level)?.push(node); } if (level > maxLevel) maxLevel = level; return siblings; } const treeNodes = traverse(data); return { treeNodeMap, levelTreeNodeMap, maxLevel, treeNodes }; } function filter(query) { const keys = doFilter(query); if (keys) expandedKeySet.value = keys; } function getChildren(node) { return node[childrenKey.value]; } function getKey(node) { if (!node) return ""; return node[valueKey.value]; } function getDisabled(node) { return node[disabledKey.value]; } function getLabel(node) { return node[labelKey.value]; } function toggleExpand(node) { if (expandedKeySet.value.has(node.key)) collapseNode(node); else expandNode(node); } function setExpandedKeys(keys) { const expandedKeys = /* @__PURE__ */ new Set(); const nodeMap = tree.value.treeNodeMap; expandedKeySet.value.forEach((key) => { const node = nodeMap.get(key); if (node) node.expanded = false; }); keys.forEach((k) => { let node = nodeMap.get(k); while (node && !expandedKeys.has(node.key)) { expandedKeys.add(node.key); node.expanded = true; node = node.parent; } }); expandedKeySet.value = expandedKeys; } function handleNodeClick(node, e) { emit(NODE_CLICK, node.data, node, e); handleCurrentChange(node); if (props.expandOnClickNode) toggleExpand(node); if (props.showCheckbox && (props.checkOnClickNode || node.isLeaf && props.checkOnClickLeaf) && !node.disabled) toggleCheckbox(node, !isChecked(node), true); } function handleNodeDrop(node, e) { emit(NODE_DROP, node.data, node, e); } function handleCurrentChange(node) { if (!isCurrent(node)) { currentKey.value = node.key; emit(CURRENT_CHANGE, node.data, node); } } function handleNodeCheck(node, checked) { toggleCheckbox(node, checked); } function expandNode(node) { const keySet = expandedKeySet.value; if (tree.value && props.accordion) { const { treeNodeMap } = tree.value; keySet.forEach((key) => { const treeNode = treeNodeMap.get(key); if (node && node.level === treeNode?.level) { keySet.delete(key); treeNode.expanded = false; } }); } keySet.add(node.key); const _node = getNode(node.key); if (_node) { _node.expanded = true; emit(NODE_EXPAND, _node.data, _node); } } function collapseNode(node) { expandedKeySet.value.delete(node.key); const _node = getNode(node.key); if (_node) { _node.expanded = false; emit(NODE_COLLAPSE, _node.data, _node); } } function isDisabled(node) { return !!node.disabled; } function isCurrent(node) { const current = currentKey.value; return current !== void 0 && current === node.key; } function getCurrentNode() { if (!currentKey.value) return void 0; return tree.value?.treeNodeMap.get(currentKey.value)?.data; } function getCurrentKey() { return currentKey.value; } function setCurrentKey(key) { currentKey.value = key; } function setData(data) { tree.value = createTree(data); } function getNode(data) { const key = isObject$1(data) ? getKey(data) : data; return tree.value?.treeNodeMap.get(key); } function scrollToNode(key, strategy = "auto") { const node = getNode(key); if (node && listRef.value) listRef.value.scrollToItem(flattenTree.value.indexOf(node), strategy); } function scrollTo(offset) { listRef.value?.scrollTo(offset); } watch(() => props.currentNodeKey, (key) => { currentKey.value = key; }, { immediate: true }); watch(() => props.defaultExpandedKeys, (keys) => { setExpandedKeys(keys || []); }); watch(() => props.data, (data) => { setData(data); setExpandedKeys(props.defaultExpandedKeys || []); }, { immediate: true }); return { tree, flattenTree, isNotEmpty, listRef, getKey, getChildren, toggleExpand, toggleCheckbox, isChecked, isIndeterminate, isDisabled, isCurrent, isForceHiddenExpandIcon, handleNodeClick, handleNodeDrop, handleNodeCheck, getCurrentNode, getCurrentKey, setCurrentKey, getCheckedKeys, getCheckedNodes, getHalfCheckedKeys, getHalfCheckedNodes, setChecked, setCheckedKeys, filter, setData, getNode, expandNode, collapseNode, setExpandedKeys, scrollToNode, scrollTo }; } //#endregion //#region ../../packages/components/tree-v2/src/tree-node-content.ts var tree_node_content_default = defineComponent({ name: "ElTreeNodeContent", props: treeNodeContentProps, setup(props) { const tree = inject(ROOT_TREE_INJECTION_KEY$1); const ns = useNamespace("tree"); return () => { const node = props.node; const { data } = node; return tree?.ctx.slots.default ? tree.ctx.slots.default({ node, data }) : h(ElText, { tag: "span", truncated: true, class: ns.be("node", "label") }, () => [node?.label]); }; } }); //#endregion //#region ../../packages/components/tree-v2/src/tree-node.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$11 = [ "aria-expanded", "aria-disabled", "aria-checked", "data-key" ]; var tree_node_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElTreeNode", __name: "tree-node", props: treeNodeProps, emits: treeNodeEmits, setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const tree = inject(ROOT_TREE_INJECTION_KEY$1); const ns = useNamespace("tree"); const indent = computed(() => tree?.props.indent ?? 16); const icon = computed(() => tree?.props.icon ?? caret_right_default); const getNodeClass = (node) => { const nodeClassFunc = tree?.props.props?.class; if (!nodeClassFunc) return {}; let className; if (isFunction$1(nodeClassFunc)) { const { data } = node; className = nodeClassFunc(data, node); } else className = nodeClassFunc; return isString(className) ? { [className]: true } : className; }; const handleClick = (e) => { emit("click", props.node, e); }; const handleDrop = (e) => { emit("drop", props.node, e); }; const handleExpandIconClick = () => { emit("toggle", props.node); }; const handleCheckChange = (value) => { emit("check", props.node, value); }; const handleContextMenu = (event) => { if (tree?.instance?.vnode?.props?.["onNodeContextmenu"]) { event.stopPropagation(); event.preventDefault(); } tree?.ctx.emit(NODE_CONTEXTMENU, event, props.node?.data, props.node); }; return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { ref: "node$", class: normalizeClass([ unref(ns).b("node"), unref(ns).is("expanded", __props.expanded), unref(ns).is("current", __props.current), unref(ns).is("focusable", !__props.disabled), unref(ns).is("checked", !__props.disabled && __props.checked), getNodeClass(__props.node) ]), role: "treeitem", tabindex: "-1", "aria-expanded": __props.expanded, "aria-disabled": __props.disabled, "aria-checked": __props.checked, "data-key": __props.node?.key, onClick: withModifiers(handleClick, ["stop"]), onContextmenu: handleContextMenu, onDragover: _cache[1] || (_cache[1] = withModifiers(() => {}, ["prevent"])), onDragenter: _cache[2] || (_cache[2] = withModifiers(() => {}, ["prevent"])), onDrop: withModifiers(handleDrop, ["stop"]) }, [createElementVNode("div", { class: normalizeClass(unref(ns).be("node", "content")), style: normalizeStyle({ paddingLeft: `${(__props.node.level - 1) * indent.value}px`, height: __props.itemSize + "px" }) }, [ icon.value ? (openBlock(), createBlock(unref(ElIcon), { key: 0, class: normalizeClass([ unref(ns).is("leaf", !!__props.node?.isLeaf), unref(ns).is("hidden", __props.hiddenExpandIcon), { expanded: !__props.node?.isLeaf && __props.expanded }, unref(ns).be("node", "expand-icon") ]), onClick: withModifiers(handleExpandIconClick, ["stop"]) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(icon.value)))]), _: 1 }, 8, ["class"])) : createCommentVNode("v-if", true), __props.showCheckbox ? (openBlock(), createBlock(unref(ElCheckbox), { key: 1, "model-value": __props.checked, indeterminate: __props.indeterminate, disabled: __props.disabled, onChange: handleCheckChange, onClick: _cache[0] || (_cache[0] = withModifiers(() => {}, ["stop"])) }, null, 8, [ "model-value", "indeterminate", "disabled" ])) : createCommentVNode("v-if", true), createVNode(unref(tree_node_content_default), { node: { ...__props.node, expanded: __props.expanded } }, null, 8, ["node"]) ], 6)], 42, _hoisted_1$11); }; } }); //#endregion //#region ../../packages/components/tree-v2/src/tree-node.vue var tree_node_default = tree_node_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/tree-v2/src/tree.vue?vue&type=script&setup=true&lang.ts var tree_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElTreeV2", __name: "tree", props: treeProps$1, emits: treeEmits$1, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const slots = useSlots(); const treeNodeSize = computed(() => props.itemSize); provide(ROOT_TREE_INJECTION_KEY$1, { ctx: { emit, slots }, props, instance: getCurrentInstance() }); provide(formItemContextKey, void 0); const { t } = useLocale(); const ns = useNamespace("tree"); const { flattenTree, isNotEmpty, listRef, toggleExpand, isIndeterminate, isChecked, isDisabled, isCurrent, isForceHiddenExpandIcon, handleNodeClick, handleNodeDrop, handleNodeCheck, toggleCheckbox, getCurrentNode, getCurrentKey, setCurrentKey, getCheckedKeys, getCheckedNodes, getHalfCheckedKeys, getHalfCheckedNodes, setChecked, setCheckedKeys, filter, setData, getNode, expandNode, collapseNode, setExpandedKeys, scrollToNode, scrollTo } = useTree(props, emit); __expose({ toggleCheckbox, getCurrentNode, getCurrentKey, setCurrentKey, getCheckedKeys, getCheckedNodes, getHalfCheckedKeys, getHalfCheckedNodes, setChecked, setCheckedKeys, filter, setData, getNode, expandNode, collapseNode, setExpandedKeys, scrollToNode, scrollTo }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass([unref(ns).b(), { [unref(ns).m("highlight-current")]: __props.highlightCurrent }]), role: "tree" }, [unref(isNotEmpty) ? (openBlock(), createBlock(unref(FixedSizeList), { key: 0, ref_key: "listRef", ref: listRef, "class-name": unref(ns).b("virtual-list"), data: unref(flattenTree), total: unref(flattenTree).length, height: __props.height, "item-size": treeNodeSize.value, "perf-mode": __props.perfMode, "scrollbar-always-on": __props.scrollbarAlwaysOn }, { default: withCtx(({ data, index, style }) => [(openBlock(), createBlock(tree_node_default, { key: data[index].key, style: normalizeStyle(style), node: data[index], expanded: data[index].expanded, "show-checkbox": __props.showCheckbox, checked: unref(isChecked)(data[index]), indeterminate: unref(isIndeterminate)(data[index]), "item-size": treeNodeSize.value, disabled: unref(isDisabled)(data[index]), current: unref(isCurrent)(data[index]), "hidden-expand-icon": unref(isForceHiddenExpandIcon)(data[index]), onClick: unref(handleNodeClick), onToggle: unref(toggleExpand), onCheck: unref(handleNodeCheck), onDrop: unref(handleNodeDrop) }, null, 8, [ "style", "node", "expanded", "show-checkbox", "checked", "indeterminate", "item-size", "disabled", "current", "hidden-expand-icon", "onClick", "onToggle", "onCheck", "onDrop" ]))]), _: 1 }, 8, [ "class-name", "data", "total", "height", "item-size", "perf-mode", "scrollbar-always-on" ])) : (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass(unref(ns).e("empty-block")) }, [renderSlot(_ctx.$slots, "empty", {}, () => [createElementVNode("span", { class: normalizeClass(unref(ns).e("empty-text")) }, toDisplayString(__props.emptyText ?? unref(t)("el.tree.emptyText")), 3)])], 2))], 2); }; } }); //#endregion //#region ../../packages/components/tree-v2/src/tree.vue var tree_default = tree_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/tree-v2/index.ts const ElTreeV2 = withInstall(tree_default); //#endregion //#region ../../packages/components/upload/src/ajax.ts const SCOPE$3 = "ElUpload"; var UploadAjaxError = class extends Error { constructor(message, status, method, url) { super(message); this.name = "UploadAjaxError"; this.status = status; this.method = method; this.url = url; } }; function getError(action, option, xhr) { let msg; if (xhr.response) msg = `${xhr.response.error || xhr.response}`; else if (xhr.responseText) msg = `${xhr.responseText}`; else msg = `fail to ${option.method} ${action} ${xhr.status}`; return new UploadAjaxError(msg, xhr.status, option.method, action); } function getBody(xhr) { const text = xhr.responseText || xhr.response; if (!text) return text; try { return JSON.parse(text); } catch { return text; } } const ajaxUpload = (option) => { if (typeof XMLHttpRequest === "undefined") throwError(SCOPE$3, "XMLHttpRequest is undefined"); const xhr = new XMLHttpRequest(); const action = option.action; if (xhr.upload) xhr.upload.addEventListener("progress", (evt) => { const progressEvt = evt; progressEvt.percent = evt.total > 0 ? evt.loaded / evt.total * 100 : 0; option.onProgress(progressEvt); }); const formData = new FormData(); if (option.data) for (const [key, value] of Object.entries(option.data)) if (isArray$1(value)) if (value.length === 2 && value[0] instanceof Blob && isString(value[1])) formData.append(key, value[0], value[1]); else value.forEach((item) => { formData.append(key, item); }); else formData.append(key, value); formData.append(option.filename, option.file, option.file.name); xhr.addEventListener("error", () => { option.onError(getError(action, option, xhr)); }); xhr.addEventListener("load", () => { if (xhr.status < 200 || xhr.status >= 300) return option.onError(getError(action, option, xhr)); option.onSuccess(getBody(xhr)); }); xhr.open(option.method, action, true); if (option.withCredentials && "withCredentials" in xhr) xhr.withCredentials = true; const headers = option.headers || {}; if (headers instanceof Headers) headers.forEach((value, key) => xhr.setRequestHeader(key, value)); else for (const [key, value] of Object.entries(headers)) { if (isNil(value)) continue; xhr.setRequestHeader(key, String(value)); } xhr.send(formData); return xhr; }; //#endregion //#region ../../packages/components/upload/src/upload.ts /** * @deprecated Removed after 3.0.0, Use `UploadProps` instead. */ const uploadListTypes = [ "text", "picture", "picture-card" ]; let fileId = 1; const genFileId = () => Date.now() + fileId++; /** * @deprecated Removed after 3.0.0, Use `UploadBaseProps` instead. */ const uploadBaseProps = buildProps({ /** * @description request URL */ action: { type: String, default: "#" }, /** * @description request headers */ headers: { type: definePropType(Object) }, /** * @description set upload request method */ method: { type: String, default: "post" }, /** * @description additions options of request */ data: { type: definePropType([ Object, Function, Promise ]), default: () => mutable({}) }, /** * @description whether uploading multiple files is permitted */ multiple: Boolean, /** * @description key name for uploaded file */ name: { type: String, default: "file" }, /** * @description whether to activate drag and drop mode */ drag: Boolean, /** * @description whether cookies are sent */ withCredentials: Boolean, /** * @description whether to show the uploaded file list */ showFileList: { type: Boolean, default: true }, /** * @description accepted [file types](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-accept), will not work when `thumbnail-mode === true` */ accept: { type: String, default: "" }, /** * @description default uploaded files */ fileList: { type: definePropType(Array), default: () => mutable([]) }, /** * @description whether to auto upload file */ autoUpload: { type: Boolean, default: true }, /** * @description type of file list */ listType: { type: String, values: uploadListTypes, default: "text" }, /** * @description override default xhr behavior, allowing you to implement your own upload-file's request */ httpRequest: { type: definePropType(Function), default: ajaxUpload }, /** * @description whether to disable upload */ disabled: { type: Boolean, default: void 0 }, /** * @description maximum number of uploads allowed */ limit: Number, /** * @description whether to support uploading directory */ directory: Boolean }); /** * @deprecated Removed after 3.0.0, Use `UploadProps` instead. */ const uploadProps = buildProps({ ...uploadBaseProps, /** * @description hook function before uploading with the file to be uploaded as its parameter. If `false` is returned or a `Promise` is returned and then is rejected, uploading will be aborted */ beforeUpload: { type: definePropType(Function), default: NOOP }, /** * @description hook function before removing a file with the file and file list as its parameters. If `false` is returned or a `Promise` is returned and then is rejected, removing will be aborted */ beforeRemove: { type: definePropType(Function) }, /** * @description hook function when files are removed */ onRemove: { type: definePropType(Function), default: NOOP }, /** * @description hook function when select file or upload file success or upload file fail */ onChange: { type: definePropType(Function), default: NOOP }, /** * @description hook function when clicking the uploaded files */ onPreview: { type: definePropType(Function), default: NOOP }, /** * @description hook function when uploaded successfully */ onSuccess: { type: definePropType(Function), default: NOOP }, /** * @description hook function when some progress occurs */ onProgress: { type: definePropType(Function), default: NOOP }, /** * @description hook function when some errors occurs */ onError: { type: definePropType(Function), default: NOOP }, /** * @description hook function when limit is exceeded */ onExceed: { type: definePropType(Function), default: NOOP }, /** * @description set HTML attribute: crossorigin. */ crossorigin: { type: definePropType(String) } }); const uploadBasePropsDefaults = { action: "#", method: "post", data: () => mutable({}), name: "file", showFileList: true, accept: "", fileList: () => mutable([]), autoUpload: true, listType: "text", httpRequest: ajaxUpload, disabled: void 0 }; const uploadPropsDefaults = { ...uploadBasePropsDefaults, beforeUpload: NOOP, onRemove: NOOP, onChange: NOOP, onPreview: NOOP, onSuccess: NOOP, onProgress: NOOP, onError: NOOP, onExceed: NOOP }; //#endregion //#region ../../packages/components/upload/src/constants.ts const uploadContextKey = Symbol("uploadContextKey"); //#endregion //#region ../../packages/components/upload/src/upload-list.ts /** * @deprecated Removed after 3.0.0, Use `UploadListProps` instead. */ const uploadListProps = buildProps({ files: { type: definePropType(Array), default: () => mutable([]) }, disabled: { type: Boolean, default: void 0 }, handlePreview: { type: definePropType(Function), default: NOOP }, listType: { type: String, values: uploadListTypes, default: "text" }, /** * @description set HTML attribute: crossorigin. */ crossorigin: { type: definePropType(String) } }); const uploadListEmits = { remove: (file) => !!file }; //#endregion //#region ../../packages/components/upload/src/upload-list.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$10 = [ "tabindex", "aria-disabled", "onKeydown" ]; const _hoisted_2$6 = ["src", "crossorigin"]; const _hoisted_3$2 = ["onClick"]; const _hoisted_4$1 = ["title"]; const _hoisted_5 = ["onClick"]; const _hoisted_6 = ["onClick"]; var upload_list_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElUploadList", __name: "upload-list", props: uploadListProps, emits: uploadListEmits, setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const { t } = useLocale(); const nsUpload = useNamespace("upload"); const nsIcon = useNamespace("icon"); const nsList = useNamespace("list"); const disabled = useFormDisabled(); const focusing = ref(false); const containerKls = computed(() => [ nsUpload.b("list"), nsUpload.bm("list", props.listType), nsUpload.is("disabled", disabled.value) ]); const handleRemove = (file) => { emit("remove", file); }; return (_ctx, _cache) => { return openBlock(), createBlock(TransitionGroup, { tag: "ul", class: normalizeClass(containerKls.value), name: unref(nsList).b() }, { default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.files, (file, index) => { return openBlock(), createElementBlock("li", { key: file.uid || file.name, class: normalizeClass([ unref(nsUpload).be("list", "item"), unref(nsUpload).is(file.status), { focusing: focusing.value } ]), tabindex: unref(disabled) ? void 0 : 0, "aria-disabled": unref(disabled), role: "button", onKeydown: withKeys(($event) => !unref(disabled) && handleRemove(file), ["delete"]), onFocus: _cache[0] || (_cache[0] = ($event) => focusing.value = true), onBlur: _cache[1] || (_cache[1] = ($event) => focusing.value = false), onClick: _cache[2] || (_cache[2] = ($event) => focusing.value = false) }, [renderSlot(_ctx.$slots, "default", { file, index }, () => [ __props.listType === "picture" || file.status !== "uploading" && __props.listType === "picture-card" ? (openBlock(), createElementBlock("img", { key: 0, class: normalizeClass(unref(nsUpload).be("list", "item-thumbnail")), src: file.url, crossorigin: __props.crossorigin, alt: "" }, null, 10, _hoisted_2$6)) : createCommentVNode("v-if", true), file.status === "uploading" || __props.listType !== "picture-card" ? (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass(unref(nsUpload).be("list", "item-info")) }, [createElementVNode("a", { class: normalizeClass(unref(nsUpload).be("list", "item-name")), onClick: withModifiers(($event) => __props.handlePreview(file), ["prevent"]) }, [createVNode(unref(ElIcon), { class: normalizeClass(unref(nsIcon).m("document")) }, { default: withCtx(() => [createVNode(unref(document_default))]), _: 1 }, 8, ["class"]), createElementVNode("span", { class: normalizeClass(unref(nsUpload).be("list", "item-file-name")), title: file.name }, toDisplayString(file.name), 11, _hoisted_4$1)], 10, _hoisted_3$2), file.status === "uploading" ? (openBlock(), createBlock(unref(ElProgress), { key: 0, type: __props.listType === "picture-card" ? "circle" : "line", "stroke-width": __props.listType === "picture-card" ? 6 : 2, percentage: Number(file.percentage), style: normalizeStyle(__props.listType === "picture-card" ? "" : "margin-top: 0.5rem") }, null, 8, [ "type", "stroke-width", "percentage", "style" ])) : createCommentVNode("v-if", true)], 2)) : createCommentVNode("v-if", true), createElementVNode("label", { class: normalizeClass(unref(nsUpload).be("list", "item-status-label")) }, [__props.listType === "text" ? (openBlock(), createBlock(unref(ElIcon), { key: 0, class: normalizeClass([unref(nsIcon).m("upload-success"), unref(nsIcon).m("circle-check")]) }, { default: withCtx(() => [createVNode(unref(circle_check_default))]), _: 1 }, 8, ["class"])) : ["picture-card", "picture"].includes(__props.listType) ? (openBlock(), createBlock(unref(ElIcon), { key: 1, class: normalizeClass([unref(nsIcon).m("upload-success"), unref(nsIcon).m("check")]) }, { default: withCtx(() => [createVNode(unref(check_default))]), _: 1 }, 8, ["class"])) : createCommentVNode("v-if", true)], 2), !unref(disabled) ? (openBlock(), createBlock(unref(ElIcon), { key: 2, class: normalizeClass(unref(nsIcon).m("close")), "aria-label": unref(t)("el.upload.delete"), role: "button", tabindex: "0", onClick: ($event) => handleRemove(file), onKeydown: withKeys(withModifiers(($event) => handleRemove(file), ["prevent"]), ["enter", "space"]) }, { default: withCtx(() => [createVNode(unref(close_default))]), _: 1 }, 8, [ "class", "aria-label", "onClick", "onKeydown" ])) : createCommentVNode("v-if", true), !unref(disabled) ? (openBlock(), createElementBlock("i", { key: 3, class: normalizeClass(unref(nsIcon).m("close-tip")) }, toDisplayString(unref(t)("el.upload.deleteTip")), 3)) : createCommentVNode("v-if", true), __props.listType === "picture-card" ? (openBlock(), createElementBlock("span", { key: 4, class: normalizeClass(unref(nsUpload).be("list", "item-actions")) }, [createElementVNode("span", { class: normalizeClass(unref(nsUpload).be("list", "item-preview")), onClick: ($event) => __props.handlePreview(file) }, [createVNode(unref(ElIcon), { class: normalizeClass(unref(nsIcon).m("zoom-in")) }, { default: withCtx(() => [createVNode(unref(zoom_in_default))]), _: 1 }, 8, ["class"])], 10, _hoisted_5), !unref(disabled) ? (openBlock(), createElementBlock("span", { key: 0, class: normalizeClass(unref(nsUpload).be("list", "item-delete")), onClick: ($event) => handleRemove(file) }, [createVNode(unref(ElIcon), { class: normalizeClass(unref(nsIcon).m("delete")) }, { default: withCtx(() => [createVNode(unref(delete_default))]), _: 1 }, 8, ["class"])], 10, _hoisted_6)) : createCommentVNode("v-if", true)], 2)) : createCommentVNode("v-if", true) ])], 42, _hoisted_1$10); }), 128)), renderSlot(_ctx.$slots, "append")]), _: 3 }, 8, ["class", "name"]); }; } }); //#endregion //#region ../../packages/components/upload/src/upload-list.vue var upload_list_default = upload_list_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/upload/src/upload-content.ts /** * @deprecated Removed after 3.0.0, Use `UploadContentProps` instead. */ const uploadContentProps = buildProps({ ...uploadBaseProps, beforeUpload: { type: definePropType(Function), default: NOOP }, onRemove: { type: definePropType(Function), default: NOOP }, onStart: { type: definePropType(Function), default: NOOP }, onSuccess: { type: definePropType(Function), default: NOOP }, onProgress: { type: definePropType(Function), default: NOOP }, onError: { type: definePropType(Function), default: NOOP }, onExceed: { type: definePropType(Function), default: NOOP } }); const uploadContentPropsDefaults = { ...uploadBasePropsDefaults, beforeUpload: NOOP, onRemove: NOOP, onStart: NOOP, onSuccess: NOOP, onProgress: NOOP, onError: NOOP, onExceed: NOOP }; //#endregion //#region ../../packages/components/upload/src/upload-dragger.ts /** * @deprecated Removed after 3.0.0, Use `UploadDraggerProps` instead. */ const uploadDraggerProps = buildProps({ disabled: { type: Boolean, default: void 0 }, directory: Boolean }); const uploadDraggerEmits = { file: (file) => isArray$1(file) }; //#endregion //#region ../../packages/components/upload/src/upload-dragger.vue?vue&type=script&setup=true&lang.ts const COMPONENT_NAME$1 = "ElUploadDrag"; var upload_dragger_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: COMPONENT_NAME$1, __name: "upload-dragger", props: uploadDraggerProps, emits: uploadDraggerEmits, setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; if (!inject(uploadContextKey)) throwError(COMPONENT_NAME$1, "usage: "); const ns = useNamespace("upload"); const dragover = ref(false); const disabled = useFormDisabled(); const getFile = (entry) => { return new Promise((resolve, reject) => entry.file(resolve, reject)); }; const getAllFiles = async (entry) => { try { if (entry.isFile) { const file = await getFile(entry); file.isDirectory = false; return [file]; } if (entry.isDirectory) { const dirReader = entry.createReader(); const getEntries = () => { return new Promise((resolve, reject) => dirReader.readEntries(resolve, reject)); }; const entries = []; let readEntries = await getEntries(); /** * In Chromium-based browsers, readEntries() will only return the first 100 FileSystemEntry instances. * https://developer.mozilla.org/en-US/docs/Web/API/FileSystemDirectoryReader/readEntries#:~:text=In%20Chromium%2Dbased%20browsers%2C%20readEntries()%20will%20only%20return%20the%20first%20100%20FileSystemEntry%20instances.%20In%20order%20to%20obtain%20all%20of%20the%20instances%2C%20readEntries()%20must%20be%20called%20multiple%20times. */ while (readEntries.length > 0) { entries.push(...readEntries); readEntries = await getEntries(); } const filePromises = entries.map((entry) => getAllFiles(entry).catch(() => [])); return flatten(await Promise.all(filePromises)); } } catch { return []; } return []; }; const onDrop = async (e) => { if (disabled.value) return; dragover.value = false; e.stopPropagation(); const files = Array.from(e.dataTransfer.files); const items = e.dataTransfer.items || []; if (props.directory) { const entries = Array.from(items).map((item) => item?.webkitGetAsEntry?.()).filter((entry) => entry); emit("file", flatten(await Promise.all(entries.map(getAllFiles)))); return; } files.forEach((file, index) => { const entry = items[index]?.webkitGetAsEntry?.(); if (entry) file.isDirectory = entry.isDirectory; }); emit("file", files); }; const onDragover = () => { if (!disabled.value) dragover.value = true; }; const onDragleave = (e) => { if (!e.currentTarget.contains(e.relatedTarget)) dragover.value = false; }; return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass([unref(ns).b("dragger"), unref(ns).is("dragover", dragover.value)]), onDrop: withModifiers(onDrop, ["prevent"]), onDragover: withModifiers(onDragover, ["prevent"]), onDragleave: withModifiers(onDragleave, ["prevent"]) }, [renderSlot(_ctx.$slots, "default")], 34); }; } }); //#endregion //#region ../../packages/components/upload/src/upload-dragger.vue var upload_dragger_default = upload_dragger_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/upload/src/upload-content.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$9 = [ "tabindex", "aria-disabled", "onKeydown" ]; const _hoisted_2$5 = [ "name", "disabled", "multiple", "accept", "webkitdirectory" ]; var upload_content_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElUploadContent", inheritAttrs: false, __name: "upload-content", props: uploadContentProps, setup(__props, { expose: __expose }) { const props = __props; const ns = useNamespace("upload"); const disabled = useFormDisabled(); const requests = shallowRef({}); const inputRef = shallowRef(); const uploadFiles = (files) => { if (files.length === 0) return; const { autoUpload, limit, fileList, multiple, onStart, onExceed } = props; if (limit && fileList.length + files.length > limit) { onExceed(files, fileList); return; } if (!multiple) files = files.slice(0, 1); for (const file of files) { const rawFile = file; rawFile.uid = genFileId(); onStart(rawFile); if (autoUpload) upload(rawFile); } }; const upload = async (rawFile) => { inputRef.value.value = ""; if (!props.beforeUpload) return doUpload(rawFile); let hookResult; let beforeData = {}; try { const originData = props.data; const beforeUploadPromise = props.beforeUpload(rawFile); beforeData = isPlainObject$1(props.data) ? cloneDeep(props.data) : props.data; hookResult = await beforeUploadPromise; if (isPlainObject$1(props.data) && isEqual$1(originData, beforeData)) beforeData = cloneDeep(props.data); } catch { hookResult = false; } if (hookResult === false) { props.onRemove(rawFile); return; } let file = rawFile; if (hookResult instanceof Blob) if (hookResult instanceof File) file = hookResult; else file = new File([hookResult], rawFile.name, { type: rawFile.type }); doUpload(Object.assign(file, { uid: rawFile.uid }), beforeData); }; const resolveData = async (data, rawFile) => { if (isFunction$1(data)) return data(rawFile); return data; }; const doUpload = async (rawFile, beforeData) => { const { headers, data, method, withCredentials, name: filename, action, onProgress, onSuccess, onError, httpRequest } = props; try { beforeData = await resolveData(beforeData ?? data, rawFile); } catch { props.onRemove(rawFile); return; } const { uid } = rawFile; const options = { headers: headers || {}, withCredentials, file: rawFile, data: beforeData, method, filename, action, onProgress: (evt) => { onProgress(evt, rawFile); }, onSuccess: (res) => { onSuccess(res, rawFile); delete requests.value[uid]; }, onError: (err) => { onError(err, rawFile); delete requests.value[uid]; } }; const request = httpRequest(options); requests.value[uid] = request; if (request instanceof Promise) request.then(options.onSuccess, options.onError); }; const handleChange = (e) => { const files = e.target.files; if (!files) return; uploadFiles(Array.from(files)); }; const handleClick = () => { if (!disabled.value) { inputRef.value.value = ""; inputRef.value.click(); } }; const handleKeydown = () => { handleClick(); }; const abort = (file) => { entriesOf(requests.value).filter(file ? ([uid]) => String(file.uid) === uid : () => true).forEach(([uid, req]) => { if (req instanceof XMLHttpRequest) req.abort(); delete requests.value[uid]; }); }; __expose({ abort, upload }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass([ unref(ns).b(), unref(ns).m(__props.listType), unref(ns).is("drag", __props.drag), unref(ns).is("disabled", unref(disabled)) ]), tabindex: unref(disabled) ? void 0 : 0, "aria-disabled": unref(disabled), role: "button", onClick: handleClick, onKeydown: withKeys(withModifiers(handleKeydown, ["self"]), ["enter", "space"]) }, [__props.drag ? (openBlock(), createBlock(upload_dragger_default, { key: 0, disabled: unref(disabled), directory: __props.directory, onFile: uploadFiles }, { default: withCtx(() => [renderSlot(_ctx.$slots, "default")]), _: 3 }, 8, ["disabled", "directory"])) : renderSlot(_ctx.$slots, "default", { key: 1 }), createElementVNode("input", { ref_key: "inputRef", ref: inputRef, class: normalizeClass(unref(ns).e("input")), name: __props.name, disabled: unref(disabled), multiple: __props.multiple, accept: __props.accept, webkitdirectory: __props.directory || void 0, type: "file", onChange: handleChange, onClick: _cache[0] || (_cache[0] = withModifiers(() => {}, ["stop"])) }, null, 42, _hoisted_2$5)], 42, _hoisted_1$9); }; } }); //#endregion //#region ../../packages/components/upload/src/upload-content.vue var upload_content_default = upload_content_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/upload/src/use-handlers.ts const SCOPE$2 = "ElUpload"; const revokeFileObjectURL = (file) => { if (file.url?.startsWith("blob:")) URL.revokeObjectURL(file.url); }; const useHandlers = (props, uploadRef) => { const uploadFiles = useVModel(props, "fileList", void 0, { passive: true }); const getFile = (rawFile) => uploadFiles.value.find((file) => file.uid === rawFile.uid); function abort(file) { uploadRef.value?.abort(file); } function clearFiles(states = [ "ready", "uploading", "success", "fail" ]) { uploadFiles.value = uploadFiles.value.filter((row) => !states.includes(row.status)); } function removeFile(file) { uploadFiles.value = uploadFiles.value.filter((uploadFile) => uploadFile.uid !== file.uid); } const emitChange = (file) => { nextTick(() => props.onChange(file, uploadFiles.value)); }; const handleError = (err, rawFile) => { const file = getFile(rawFile); if (!file) return; console.error(err); file.status = "fail"; removeFile(file); props.onError(err, file, uploadFiles.value); emitChange(file); }; const handleProgress = (evt, rawFile) => { const file = getFile(rawFile); if (!file) return; props.onProgress(evt, file, uploadFiles.value); file.status = "uploading"; file.percentage = Math.round(evt.percent); }; const handleSuccess = (response, rawFile) => { const file = getFile(rawFile); if (!file) return; file.status = "success"; file.response = response; props.onSuccess(response, file, uploadFiles.value); emitChange(file); }; const handleStart = (file) => { if (isNil(file.uid)) file.uid = genFileId(); const uploadFile = { name: file.name, percentage: 0, status: "ready", size: file.size, raw: file, uid: file.uid }; if (props.listType === "picture-card" || props.listType === "picture") try { uploadFile.url = URL.createObjectURL(file); } catch (err) { /* @__PURE__ */ debugWarn(SCOPE$2, err.message); props.onError(err, uploadFile, uploadFiles.value); } uploadFiles.value = [...uploadFiles.value, uploadFile]; emitChange(uploadFile); }; const handleRemove = async (file) => { const uploadFile = file instanceof File ? getFile(file) : file; if (!uploadFile) throwError(SCOPE$2, "file to be removed not found"); const doRemove = (file) => { abort(file); removeFile(file); props.onRemove(file, uploadFiles.value); revokeFileObjectURL(file); }; if (props.beforeRemove) { if (await props.beforeRemove(uploadFile, uploadFiles.value) !== false) doRemove(uploadFile); } else doRemove(uploadFile); }; function submit() { uploadFiles.value.filter(({ status }) => status === "ready").forEach(({ raw }) => raw && uploadRef.value?.upload(raw)); } watch(() => props.listType, (val) => { if (val !== "picture-card" && val !== "picture") return; uploadFiles.value = uploadFiles.value.map((file) => { const { raw, url } = file; if (!url && raw) try { file.url = URL.createObjectURL(raw); } catch (err) { props.onError(err, file, uploadFiles.value); } return file; }); }); watch(uploadFiles, (files) => { for (const file of files) { file.uid ||= genFileId(); file.status ||= "success"; } }, { immediate: true, deep: true }); return { /** @description two-way binding ref from props `fileList` */ uploadFiles, abort, clearFiles, handleError, handleProgress, handleStart, handleSuccess, handleRemove, submit, revokeFileObjectURL }; }; //#endregion //#region ../../packages/components/upload/src/upload.vue?vue&type=script&setup=true&lang.ts var upload_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElUpload", __name: "upload", props: uploadProps, setup(__props, { expose: __expose }) { const props = __props; const disabled = useFormDisabled(); const uploadRef = shallowRef(); const { abort, submit, clearFiles, uploadFiles, handleStart, handleError, handleRemove, handleSuccess, handleProgress, revokeFileObjectURL } = useHandlers(props, uploadRef); const isPictureCard = computed(() => props.listType === "picture-card"); const uploadContentProps = computed(() => ({ ...props, fileList: uploadFiles.value, onStart: handleStart, onProgress: handleProgress, onSuccess: handleSuccess, onError: handleError, onRemove: handleRemove })); onBeforeUnmount(() => { uploadFiles.value.forEach(revokeFileObjectURL); }); provide(uploadContextKey, { accept: toRef(props, "accept") }); __expose({ /** @description cancel upload request */ abort, /** @description upload the file list manually */ submit, /** @description clear the file list */ clearFiles, /** @description select the file manually */ handleStart, /** @description remove the file manually */ handleRemove }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", null, [ isPictureCard.value && __props.showFileList ? (openBlock(), createBlock(upload_list_default, { key: 0, disabled: unref(disabled), "list-type": __props.listType, files: unref(uploadFiles), crossorigin: __props.crossorigin, "handle-preview": __props.onPreview, onRemove: unref(handleRemove) }, createSlots({ append: withCtx(() => [createVNode(upload_content_default, mergeProps({ ref_key: "uploadRef", ref: uploadRef }, uploadContentProps.value), { default: withCtx(() => [_ctx.$slots.trigger ? renderSlot(_ctx.$slots, "trigger", { key: 0 }) : createCommentVNode("v-if", true), !_ctx.$slots.trigger && _ctx.$slots.default ? renderSlot(_ctx.$slots, "default", { key: 1 }) : createCommentVNode("v-if", true)]), _: 3 }, 16)]), _: 2 }, [_ctx.$slots.file ? { name: "default", fn: withCtx(({ file, index }) => [renderSlot(_ctx.$slots, "file", { file, index })]), key: "0" } : void 0]), 1032, [ "disabled", "list-type", "files", "crossorigin", "handle-preview", "onRemove" ])) : createCommentVNode("v-if", true), !isPictureCard.value || isPictureCard.value && !__props.showFileList ? (openBlock(), createBlock(upload_content_default, mergeProps({ key: 1, ref_key: "uploadRef", ref: uploadRef }, uploadContentProps.value), { default: withCtx(() => [_ctx.$slots.trigger ? renderSlot(_ctx.$slots, "trigger", { key: 0 }) : createCommentVNode("v-if", true), !_ctx.$slots.trigger && _ctx.$slots.default ? renderSlot(_ctx.$slots, "default", { key: 1 }) : createCommentVNode("v-if", true)]), _: 3 }, 16)) : createCommentVNode("v-if", true), _ctx.$slots.trigger ? renderSlot(_ctx.$slots, "default", { key: 2 }) : createCommentVNode("v-if", true), renderSlot(_ctx.$slots, "tip"), !isPictureCard.value && __props.showFileList ? (openBlock(), createBlock(upload_list_default, { key: 3, disabled: unref(disabled), "list-type": __props.listType, files: unref(uploadFiles), crossorigin: __props.crossorigin, "handle-preview": __props.onPreview, onRemove: unref(handleRemove) }, createSlots({ _: 2 }, [_ctx.$slots.file ? { name: "default", fn: withCtx(({ file, index }) => [renderSlot(_ctx.$slots, "file", { file, index })]), key: "0" } : void 0]), 1032, [ "disabled", "list-type", "files", "crossorigin", "handle-preview", "onRemove" ])) : createCommentVNode("v-if", true) ]); }; } }); //#endregion //#region ../../packages/components/upload/src/upload.vue var upload_default = upload_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/upload/index.ts const ElUpload = withInstall(upload_default); //#endregion //#region ../../packages/components/watermark/src/watermark.ts /** * @deprecated Removed after 3.0.0, Use `WatermarkProps` instead. */ const watermarkProps = buildProps({ /** * @description The z-index of the appended watermark element */ zIndex: { type: Number, default: 9 }, /** * @description The rotation angle of the watermark */ rotate: { type: Number, default: -22 }, /** * @description The width of the watermark */ width: Number, /** * @description The height of the watermark */ height: Number, /** * @description Image source, it is recommended to export 2x or 3x image, high priority (support base64 format) */ image: String, /** * @description Watermark text content */ content: { type: definePropType([String, Array]), default: "Element Plus" }, /** * @description Text style */ font: { type: definePropType(Object) }, /** * @description The spacing between watermarks */ gap: { type: definePropType(Array), default: () => [100, 100] }, /** * @description The offset of the watermark from the upper left corner of the container. The default is gap/2 */ offset: { type: definePropType(Array) } }); //#endregion //#region ../../packages/components/watermark/src/utils.ts /** converting camel-cased strings to be lowercase and link it with Separator */ function toLowercaseSeparator(key) { return key.replace(/([A-Z])/g, "-$1").toLowerCase(); } function getStyleStr(style) { return Object.keys(style).map((key) => `${toLowercaseSeparator(key)}: ${style[key]};`).join(" "); } /** Returns the ratio of the device's physical pixel resolution to the css pixel resolution */ function getPixelRatio() { return window.devicePixelRatio || 1; } /** Whether to re-render the watermark */ const reRendering = (mutation, watermarkElement) => { let flag = false; if (mutation.removedNodes.length && watermarkElement) flag = Array.from(mutation.removedNodes).includes(watermarkElement); if (mutation.type === "attributes" && mutation.target === watermarkElement) flag = true; return flag; }; //#endregion //#region ../../packages/components/watermark/src/useClips.ts const TEXT_ALIGN_RATIO_MAP = { left: [0, .5], start: [0, .5], center: [.5, 0], right: [1, -.5], end: [1, -.5] }; function prepareCanvas(width, height, ratio = 1) { const canvas = document.createElement("canvas"); const ctx = canvas.getContext("2d"); const realWidth = width * ratio; const realHeight = height * ratio; canvas.setAttribute("width", `${realWidth}px`); canvas.setAttribute("height", `${realHeight}px`); ctx.save(); return [ ctx, canvas, realWidth, realHeight ]; } /** * Get the clips of text content. * This is a lazy hook function since SSR no need this */ function useClips() { function getClips(content, rotate, ratio, width, height, font, gapX, gapY, space) { const [ctx, canvas, contentWidth, contentHeight] = prepareCanvas(width, height, ratio); let baselineOffset = 0; if (content instanceof HTMLImageElement) ctx.drawImage(content, 0, 0, contentWidth, contentHeight); else { const { color, fontSize, fontStyle, fontWeight, fontFamily, textAlign, textBaseline } = font; const mergedFontSize = Number(fontSize) * ratio; ctx.font = `${fontStyle} normal ${fontWeight} ${mergedFontSize}px/${height}px ${fontFamily}`; ctx.fillStyle = color; ctx.textAlign = textAlign; ctx.textBaseline = textBaseline; const contents = isArray$1(content) ? content : [content]; if (textBaseline !== "top" && contents[0]) { const argumentMetrics = ctx.measureText(contents[0]); ctx.textBaseline = "top"; const topMetrics = ctx.measureText(contents[0]); baselineOffset = argumentMetrics.actualBoundingBoxAscent - topMetrics.actualBoundingBoxAscent; } contents?.forEach((item, index) => { const [alignRatio, spaceRatio] = TEXT_ALIGN_RATIO_MAP[textAlign]; ctx.fillText(item ?? "", contentWidth * alignRatio + space * spaceRatio, index * (mergedFontSize + font.fontGap * ratio)); }); } const angle = Math.PI / 180 * Number(rotate); const maxSize = Math.max(width, height); const [rCtx, rCanvas, realMaxSize] = prepareCanvas(maxSize, maxSize, ratio); rCtx.translate(realMaxSize / 2, realMaxSize / 2); rCtx.rotate(angle); if (contentWidth > 0 && contentHeight > 0) rCtx.drawImage(canvas, -contentWidth / 2, -contentHeight / 2); function getRotatePos(x, y) { return [x * Math.cos(angle) - y * Math.sin(angle), x * Math.sin(angle) + y * Math.cos(angle)]; } let left = 0; let right = 0; let top = 0; let bottom = 0; const halfWidth = contentWidth / 2; const halfHeight = contentHeight / 2; [ [0 - halfWidth, 0 - halfHeight], [0 + halfWidth, 0 - halfHeight], [0 + halfWidth, 0 + halfHeight], [0 - halfWidth, 0 + halfHeight] ].forEach(([x, y]) => { const [targetX, targetY] = getRotatePos(x, y); left = Math.min(left, targetX); right = Math.max(right, targetX); top = Math.min(top, targetY); bottom = Math.max(bottom, targetY); }); const cutLeft = left + realMaxSize / 2; const cutTop = top + realMaxSize / 2; const cutWidth = right - left; const cutHeight = bottom - top; const realGapX = gapX * ratio; const realGapY = gapY * ratio; const filledWidth = (cutWidth + realGapX) * 2; const filledHeight = cutHeight + realGapY; const [fCtx, fCanvas] = prepareCanvas(filledWidth, filledHeight); function drawImg(targetX = 0, targetY = 0) { fCtx.drawImage(rCanvas, cutLeft, cutTop, cutWidth, cutHeight, targetX, targetY + baselineOffset, cutWidth, cutHeight); } drawImg(); drawImg(cutWidth + realGapX, -cutHeight / 2 - realGapY / 2); drawImg(cutWidth + realGapX, +cutHeight / 2 + realGapY / 2); return [ fCanvas.toDataURL(), filledWidth / ratio, filledHeight / ratio ]; } return getClips; } //#endregion //#region ../../packages/components/watermark/src/watermark.vue?vue&type=script&setup=true&lang.ts var watermark_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElWatermark", __name: "watermark", props: watermarkProps, setup(__props) { const style = { position: "relative" }; const props = __props; const fontGap = computed(() => props.font?.fontGap ?? 3); const color = computed(() => props.font?.color ?? "rgba(0,0,0,.15)"); const fontSize = computed(() => props.font?.fontSize ?? 16); const fontWeight = computed(() => props.font?.fontWeight ?? "normal"); const fontStyle = computed(() => props.font?.fontStyle ?? "normal"); const fontFamily = computed(() => props.font?.fontFamily ?? "sans-serif"); const textAlign = computed(() => props.font?.textAlign ?? "center"); const textBaseline = computed(() => props.font?.textBaseline ?? "hanging"); const gapX = computed(() => props.gap[0]); const gapY = computed(() => props.gap[1]); const gapXCenter = computed(() => gapX.value / 2); const gapYCenter = computed(() => gapY.value / 2); const offsetLeft = computed(() => props.offset?.[0] ?? gapXCenter.value); const offsetTop = computed(() => props.offset?.[1] ?? gapYCenter.value); const getMarkStyle = () => { const markStyle = { zIndex: props.zIndex, position: "absolute", left: 0, top: 0, width: "100%", height: "100%", pointerEvents: "none", backgroundRepeat: "repeat" }; /** Calculate the style of the offset */ let positionLeft = offsetLeft.value - gapXCenter.value; let positionTop = offsetTop.value - gapYCenter.value; if (positionLeft > 0) { markStyle.left = `${positionLeft}px`; markStyle.width = `calc(100% - ${positionLeft}px)`; positionLeft = 0; } if (positionTop > 0) { markStyle.top = `${positionTop}px`; markStyle.height = `calc(100% - ${positionTop}px)`; positionTop = 0; } markStyle.backgroundPosition = `${positionLeft}px ${positionTop}px`; return markStyle; }; const containerRef = shallowRef(null); const watermarkRef = shallowRef(); const stopObservation = ref(false); const destroyWatermark = () => { if (watermarkRef.value) { watermarkRef.value.remove(); watermarkRef.value = void 0; } }; const appendWatermark = (base64Url, markWidth) => { if (containerRef.value && watermarkRef.value) { stopObservation.value = true; watermarkRef.value.setAttribute("style", getStyleStr({ ...getMarkStyle(), backgroundImage: `url('${base64Url}')`, backgroundSize: `${Math.floor(markWidth)}px` })); containerRef.value?.append(watermarkRef.value); setTimeout(() => { stopObservation.value = false; }); } }; /** * Get the width and height of the watermark. The default values are as follows * Image: [120, 64]; Content: It's calculated by content; */ const getMarkSize = (ctx) => { let defaultWidth = 120; let defaultHeight = 64; let space = 0; const { image, content, width, height, rotate } = props; if (!image && ctx.measureText) { ctx.font = `${Number(fontSize.value)}px ${fontFamily.value}`; const contents = isArray$1(content) ? content : [content]; let maxWidth = 0; let maxHeight = 0; contents.forEach((item) => { const { width, fontBoundingBoxAscent, fontBoundingBoxDescent, actualBoundingBoxAscent, actualBoundingBoxDescent } = ctx.measureText(item); const height = isUndefined(fontBoundingBoxAscent) ? actualBoundingBoxAscent + actualBoundingBoxDescent : fontBoundingBoxAscent + fontBoundingBoxDescent; if (width > maxWidth) maxWidth = Math.ceil(width); if (height > maxHeight) maxHeight = Math.ceil(height); }); defaultWidth = maxWidth; defaultHeight = maxHeight * contents.length + (contents.length - 1) * fontGap.value; const angle = Math.PI / 180 * Number(rotate); space = Math.ceil(Math.abs(Math.sin(angle) * defaultHeight) / 2); defaultWidth += space; } return [ width ?? defaultWidth, height ?? defaultHeight, space ]; }; const getClips = useClips(); const renderWatermark = () => { const ctx = document.createElement("canvas").getContext("2d"); const image = props.image; const content = props.content; const rotate = props.rotate; if (ctx) { if (!watermarkRef.value) watermarkRef.value = document.createElement("div"); const ratio = getPixelRatio(); const [markWidth, markHeight, space] = getMarkSize(ctx); const drawCanvas = (drawContent) => { const [textClips, clipWidth] = getClips(drawContent || "", rotate, ratio, markWidth, markHeight, { color: color.value, fontSize: fontSize.value, fontStyle: fontStyle.value, fontWeight: fontWeight.value, fontFamily: fontFamily.value, fontGap: fontGap.value, textAlign: textAlign.value, textBaseline: textBaseline.value }, gapX.value, gapY.value, space); appendWatermark(textClips, clipWidth); }; if (image) { const img = new Image(); img.onload = () => { drawCanvas(img); }; img.onerror = () => { drawCanvas(content); }; img.crossOrigin = "anonymous"; img.referrerPolicy = "no-referrer"; img.src = image; } else drawCanvas(content); } }; onMounted(() => { renderWatermark(); }); watch(() => props, () => { renderWatermark(); }, { deep: true, flush: "post" }); onBeforeUnmount(() => { destroyWatermark(); }); const onMutate = (mutations) => { if (stopObservation.value) return; mutations.forEach((mutation) => { if (reRendering(mutation, watermarkRef.value)) { destroyWatermark(); renderWatermark(); } }); }; useMutationObserver(containerRef, onMutate, { attributes: true, subtree: true, childList: true }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { ref_key: "containerRef", ref: containerRef, style: normalizeStyle([style]) }, [renderSlot(_ctx.$slots, "default")], 4); }; } }); //#endregion //#region ../../packages/components/watermark/src/watermark.vue var watermark_default = watermark_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/watermark/index.ts const ElWatermark = withInstall(watermark_default); //#endregion //#region ../../packages/components/tour/src/content.ts const tourStrategies = ["absolute", "fixed"]; const tourPlacements = [ "top-start", "top-end", "top", "bottom-start", "bottom-end", "bottom", "left-start", "left-end", "left", "right-start", "right-end", "right" ]; /** * @deprecated Removed after 3.0.0, Use `TourContentProps` instead. */ const tourContentProps = buildProps({ /** * @description position of the guide card relative to the target element */ placement: { type: definePropType(String), values: tourPlacements, default: "bottom" }, /** * @description the reference dom */ reference: { type: definePropType(Object), default: null }, /** * @description position strategy of the content */ strategy: { type: definePropType(String), values: tourStrategies, default: "absolute" }, /** * @description offset of the arrow */ offset: { type: Number, default: 10 }, /** * @description whether to show the arrow */ showArrow: Boolean, /** * @description content's zIndex */ zIndex: { type: Number, default: 2001 } }); const tourContentEmits = { close: () => true }; //#endregion //#region ../../packages/components/tour/src/tour.ts /** * @deprecated Removed after 3.0.0, Use `TourProps` instead. */ const tourProps = buildProps({ /** * @description open tour */ modelValue: Boolean, /** * @description what is the current step */ current: { type: Number, default: 0 }, /** * @description whether to show the arrow */ showArrow: { type: Boolean, default: true }, /** * @description whether to show a close button */ showClose: { type: Boolean, default: true }, /** * @description custom close icon */ closeIcon: { type: iconPropType }, /** * @description position of the guide card relative to the target element */ placement: tourContentProps.placement, /** * @description custom style for content */ contentStyle: { type: definePropType([Object]) }, /** * @description whether to enable masking, change mask style and fill color by pass custom props */ mask: { type: definePropType([Boolean, Object]), default: true }, /** * @description transparent gap between mask and target */ gap: { type: definePropType(Object), default: () => ({ offset: 6, radius: 2 }) }, /** * @description tour's zIndex */ zIndex: { type: Number }, /** * @description support pass custom scrollIntoView options */ scrollIntoViewOptions: { type: definePropType([Boolean, Object]), default: () => ({ block: "center" }) }, /** * @description type, affects the background color and text color */ type: { type: definePropType(String) }, /** * @description which element the TourContent appends to */ appendTo: { type: definePropType([String, Object]), default: "body" }, /** * @description whether the Tour can be closed by pressing ESC */ closeOnPressEscape: { type: Boolean, default: true }, /** * @description whether the target element can be clickable, when using mask */ targetAreaClickable: { type: Boolean, default: true } }); const tourEmits = { [UPDATE_MODEL_EVENT]: (value) => isBoolean(value), ["update:current"]: (current) => isNumber(current), close: (current) => isNumber(current), finish: () => true, change: (current) => isNumber(current) }; //#endregion //#region ../../packages/components/tour/src/mask.ts /** * @deprecated Removed after 3.0.0, Use `MaskProps` instead. */ const maskProps = buildProps({ /** * @description mask's zIndex */ zIndex: { type: Number, default: 1001 }, /** * @description whether to show the mask */ visible: Boolean, /** * @description mask's fill */ fill: { type: String, default: "rgba(0,0,0,0.5)" }, /*** * @description mask's transparent space position */ pos: { type: definePropType(Object) }, /** * @description whether the target element can be clickable, when using mask */ targetAreaClickable: { type: Boolean, default: true } }); //#endregion //#region ../../packages/components/tour/src/helper.ts const useTarget = (target, open, gap, mergedMask, scrollIntoViewOptions) => { const posInfo = ref(null); const getTargetEl = () => { let targetEl; if (isString(target.value)) targetEl = document.querySelector(target.value); else if (isFunction$1(target.value)) targetEl = target.value(); else targetEl = target.value; return targetEl; }; const updatePosInfo = () => { const targetEl = getTargetEl(); if (!targetEl || !open.value) { posInfo.value = null; return; } if (!isInViewPort(targetEl)) targetEl.scrollIntoView(scrollIntoViewOptions.value); const { left, top, width, height } = targetEl.getBoundingClientRect(); posInfo.value = { left, top, width, height, radius: 0 }; }; onMounted(() => { watch([open, target], () => { updatePosInfo(); }, { immediate: true }); window.addEventListener("resize", updatePosInfo); }); onBeforeUnmount(() => { window.removeEventListener("resize", updatePosInfo); }); const getGapOffset = (index) => (isArray$1(gap.value.offset) ? gap.value.offset[index] : gap.value.offset) ?? 6; const mergedPosInfo = computed(() => { if (!posInfo.value) return posInfo.value; const gapOffsetX = getGapOffset(0); const gapOffsetY = getGapOffset(1); const gapRadius = gap.value?.radius || 2; return { left: posInfo.value.left - gapOffsetX, top: posInfo.value.top - gapOffsetY, width: posInfo.value.width + gapOffsetX * 2, height: posInfo.value.height + gapOffsetY * 2, radius: gapRadius }; }); return { mergedPosInfo, triggerTarget: computed(() => { const targetEl = getTargetEl(); if (!mergedMask.value || !targetEl || !window.DOMRect) return targetEl || void 0; return { getBoundingClientRect() { return window.DOMRect.fromRect({ width: mergedPosInfo.value?.width || 0, height: mergedPosInfo.value?.height || 0, x: mergedPosInfo.value?.left || 0, y: mergedPosInfo.value?.top || 0 }); } }; }) }; }; const tourKey = Symbol("ElTour"); function isInViewPort(element) { const viewWidth = window.innerWidth || document.documentElement.clientWidth; const viewHeight = window.innerHeight || document.documentElement.clientHeight; const { top, right, bottom, left } = element.getBoundingClientRect(); return top >= 0 && left >= 0 && right <= viewWidth && bottom <= viewHeight; } const useFloating$1 = (referenceRef, contentRef, arrowRef, placement, strategy, offset$2, zIndex, showArrow) => { const x = ref(); const y = ref(); const middlewareData = ref({}); const states = { x, y, placement, strategy, middlewareData }; const middleware = computed(() => { const _middleware = [ offset(unref(offset$2)), flip(), shift(), overflowMiddleware() ]; if (unref(showArrow) && unref(arrowRef)) _middleware.push(arrow({ element: unref(arrowRef) })); return _middleware; }); const update = async () => { if (!isClient) return; const referenceEl = unref(referenceRef); const contentEl = unref(contentRef); if (!referenceEl || !contentEl) return; const data = await computePosition(referenceEl, contentEl, { placement: unref(placement), strategy: unref(strategy), middleware: unref(middleware) }); keysOf(states).forEach((key) => { states[key].value = data[key]; }); }; const contentStyle = computed(() => { if (!unref(referenceRef)) return { position: "fixed", top: "50%", left: "50%", transform: "translate3d(-50%, -50%, 0)", maxWidth: "100vw", zIndex: unref(zIndex) }; const { overflow } = unref(middlewareData); return { position: unref(strategy), zIndex: unref(zIndex), top: unref(y) != null ? `${unref(y)}px` : "", left: unref(x) != null ? `${unref(x)}px` : "", maxWidth: overflow?.maxWidth ? `${overflow?.maxWidth}px` : "" }; }); const arrowStyle = computed(() => { if (!unref(showArrow)) return {}; const { arrow } = unref(middlewareData); return { left: arrow?.x != null ? `${arrow?.x}px` : "", top: arrow?.y != null ? `${arrow?.y}px` : "" }; }); let cleanup; onMounted(() => { const referenceEl = unref(referenceRef); const contentEl = unref(contentRef); if (referenceEl && contentEl) cleanup = autoUpdate(referenceEl, contentEl, update); watchEffect(() => { update(); }); }); onBeforeUnmount(() => { cleanup && cleanup(); }); return { update, contentStyle, arrowStyle }; }; const overflowMiddleware = () => { return { name: "overflow", async fn(state) { const overflow = await detectOverflow(state); let overWidth = 0; if (overflow.left > 0) overWidth = overflow.left; if (overflow.right > 0) overWidth = overflow.right; return { data: { maxWidth: state.rects.floating.width - overWidth } }; } }; }; //#endregion //#region ../../packages/components/tour/src/mask.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$8 = { style: { width: "100%", height: "100%" } }; const _hoisted_2$4 = ["d"]; var mask_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElTourMask", inheritAttrs: false, __name: "mask", props: maskProps, setup(__props) { const props = __props; const { ns } = inject(tourKey); const radius = computed(() => props.pos?.radius ?? 2); const roundInfo = computed(() => { const v = radius.value; const baseInfo = `a${v},${v} 0 0 1`; return { topRight: `${baseInfo} ${v},${v}`, bottomRight: `${baseInfo} ${-v},${v}`, bottomLeft: `${baseInfo} ${-v},${-v}`, topLeft: `${baseInfo} ${v},${-v}` }; }); const { width: windowWidth, height: windowHeight } = useWindowSize(); const path = computed(() => { const width = windowWidth.value; const height = windowHeight.value; const info = roundInfo.value; const _path = `M${width},0 L0,0 L0,${height} L${width},${height} L${width},0 Z`; const _radius = radius.value; return props.pos ? `${_path} M${props.pos.left + _radius},${props.pos.top} h${props.pos.width - _radius * 2} ${info.topRight} v${props.pos.height - _radius * 2} ${info.bottomRight} h${-props.pos.width + _radius * 2} ${info.bottomLeft} v${-props.pos.height + _radius * 2} ${info.topLeft} z` : _path; }); const maskStyle = computed(() => ({ position: "fixed", left: 0, right: 0, top: 0, bottom: 0, zIndex: props.zIndex, pointerEvents: props.pos && props.targetAreaClickable ? "none" : "auto" })); const pathStyle = computed(() => ({ fill: props.fill, pointerEvents: "auto", cursor: "auto" })); useLockscreen(toRef(props, "visible"), { ns }); return (_ctx, _cache) => { return __props.visible ? (openBlock(), createElementBlock("div", mergeProps({ key: 0, class: unref(ns).e("mask"), style: maskStyle.value }, _ctx.$attrs), [(openBlock(), createElementBlock("svg", _hoisted_1$8, [createElementVNode("path", { class: normalizeClass(unref(ns).e("hollow")), style: normalizeStyle(pathStyle.value), d: path.value }, null, 14, _hoisted_2$4)]))], 16)) : createCommentVNode("v-if", true); }; } }); //#endregion //#region ../../packages/components/tour/src/mask.vue var mask_default = mask_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/tour/src/content.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$7 = ["data-side"]; var content_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElTourContent", __name: "content", props: tourContentProps, emits: tourContentEmits, setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const placement = ref(props.placement); const strategy = ref(props.strategy); const contentRef = ref(null); const arrowRef = ref(null); watch(() => props.placement, () => { placement.value = props.placement; }); const { contentStyle, arrowStyle } = useFloating$1(toRef(props, "reference"), contentRef, arrowRef, placement, strategy, toRef(props, "offset"), toRef(props, "zIndex"), toRef(props, "showArrow")); const side = computed(() => { return placement.value.split("-")[0]; }); const { ns } = inject(tourKey); const onCloseRequested = () => { emit("close"); }; const onFocusoutPrevented = (event) => { if (event.detail.focusReason === "pointer") event.preventDefault(); }; return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { ref_key: "contentRef", ref: contentRef, style: normalizeStyle(unref(contentStyle)), class: normalizeClass(unref(ns).e("content")), "data-side": side.value, tabindex: "-1" }, [createVNode(unref(focus_trap_default), { loop: "", trapped: "", "focus-start-el": "container", "focus-trap-el": contentRef.value || void 0, onReleaseRequested: onCloseRequested, onFocusoutPrevented }, { default: withCtx(() => [renderSlot(_ctx.$slots, "default")]), _: 3 }, 8, ["focus-trap-el"]), __props.showArrow ? (openBlock(), createElementBlock("span", { key: 0, ref_key: "arrowRef", ref: arrowRef, style: normalizeStyle(unref(arrowStyle)), class: normalizeClass(unref(ns).e("arrow")) }, null, 6)) : createCommentVNode("v-if", true)], 14, _hoisted_1$7); }; } }); //#endregion //#region ../../packages/components/tour/src/content.vue var content_default$1 = content_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/tour/src/steps.ts var steps_default = defineComponent({ name: "ElTourSteps", props: { current: { type: Number, default: 0 } }, emits: ["update-total"], setup(props, { slots, emit }) { let cacheTotal = 0; return () => { const children = slots.default?.(); const result = []; let total = 0; function filterSteps(children) { if (!isArray$1(children)) return; children.forEach((item) => { if ((item?.type || {})?.name === "ElTourStep") { result.push(item); total += 1; } }); } if (children.length) filterSteps(flattedChildren(children[0]?.children)); if (cacheTotal !== total) { cacheTotal = total; emit("update-total", total); } if (result.length) return result[props.current]; return null; }; } }); //#endregion //#region ../../packages/components/tour/src/tour.vue?vue&type=script&setup=true&lang.ts var tour_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElTour", inheritAttrs: false, __name: "tour", props: tourProps, emits: tourEmits, setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const ns = useNamespace("tour"); const total = ref(0); const currentStep = ref(); const current = useVModel(props, "current", emit, { passive: true }); const currentTarget = computed(() => currentStep.value?.target); const kls = computed(() => [ns.b(), mergedType.value === "primary" ? ns.m("primary") : ""]); const mergedPlacement = computed(() => currentStep.value?.placement || props.placement); const mergedContentStyle = computed(() => currentStep.value?.contentStyle ?? props.contentStyle); const mergedMask = computed(() => currentStep.value?.mask ?? props.mask); const mergedShowMask = computed(() => !!mergedMask.value && props.modelValue); const mergedMaskStyle = computed(() => isBoolean(mergedMask.value) ? void 0 : mergedMask.value); const mergedShowArrow = computed(() => !!currentTarget.value && (currentStep.value?.showArrow ?? props.showArrow)); const mergedScrollIntoViewOptions = computed(() => currentStep.value?.scrollIntoViewOptions ?? props.scrollIntoViewOptions); const mergedType = computed(() => currentStep.value?.type ?? props.type); const { nextZIndex } = useZIndex(); const nowZIndex = nextZIndex(); const mergedZIndex = computed(() => props.zIndex ?? nowZIndex); const { mergedPosInfo: pos, triggerTarget } = useTarget(currentTarget, toRef(props, "modelValue"), toRef(props, "gap"), mergedMask, mergedScrollIntoViewOptions); watch(() => props.modelValue, (val) => { if (!val) current.value = 0; }); const onEscClose = () => { if (props.closeOnPressEscape) { emit(UPDATE_MODEL_EVENT, false); emit("close", current.value); } }; const onUpdateTotal = (val) => { total.value = val; }; const slots = useSlots(); provide(tourKey, { currentStep, current, total, showClose: toRef(props, "showClose"), closeIcon: toRef(props, "closeIcon"), mergedType, ns, slots, updateModelValue(modelValue) { emit(UPDATE_MODEL_EVENT, modelValue); }, onClose() { emit("close", current.value); }, onFinish() { emit("finish"); }, onChange() { emit(CHANGE_EVENT, current.value); } }); return (_ctx, _cache) => { return openBlock(), createElementBlock(Fragment, null, [ (openBlock(), createBlock(Teleport, { to: __props.appendTo }, [createElementVNode("div", mergeProps({ class: kls.value }, _ctx.$attrs), [createVNode(mask_default, { visible: mergedShowMask.value, fill: mergedMaskStyle.value?.color, style: normalizeStyle(mergedMaskStyle.value?.style), pos: unref(pos), "z-index": mergedZIndex.value, "target-area-clickable": __props.targetAreaClickable }, null, 8, [ "visible", "fill", "style", "pos", "z-index", "target-area-clickable" ]), __props.modelValue ? (openBlock(), createBlock(content_default$1, { key: unref(current), reference: unref(triggerTarget), placement: mergedPlacement.value, "show-arrow": mergedShowArrow.value, "z-index": mergedZIndex.value, style: normalizeStyle(mergedContentStyle.value), onClose: onEscClose }, { default: withCtx(() => [createVNode(unref(steps_default), { current: unref(current), onUpdateTotal }, { default: withCtx(() => [renderSlot(_ctx.$slots, "default")]), _: 3 }, 8, ["current"])]), _: 3 }, 8, [ "reference", "placement", "show-arrow", "z-index", "style" ])) : createCommentVNode("v-if", true)], 16)], 8, ["to"])), createCommentVNode(" just for IDE "), createCommentVNode("v-if", true) ], 64); }; } }); //#endregion //#region ../../packages/components/tour/src/tour.vue var tour_default = tour_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/tour/src/step.ts /** * @deprecated Removed after 3.0.0, Use `TourStepProps` instead. */ const tourStepProps = buildProps({ /** * @description get the element the guide card points to. empty makes it show in center of screen */ target: { type: definePropType([ String, Object, Function ]) }, /** * @description the title of the tour content */ title: String, /** * @description description */ description: String, /** * @description whether to show a close button */ showClose: { type: Boolean, default: void 0 }, /** * @description custom close icon, default is Close */ closeIcon: { type: iconPropType }, /** * @description whether to show the arrow */ showArrow: { type: Boolean, default: void 0 }, /** * @description position of the guide card relative to the target element */ placement: tourContentProps.placement, /** * @description whether to enable masking, change mask style and fill color by pass custom props */ mask: { type: definePropType([Boolean, Object]), default: void 0 }, /** * @description custom style for content */ contentStyle: { type: definePropType([Object]) }, /** * @description properties of the previous button */ prevButtonProps: { type: definePropType(Object) }, /** * @description properties of the Next button */ nextButtonProps: { type: definePropType(Object) }, /** * @description support pass custom scrollIntoView options */ scrollIntoViewOptions: { type: definePropType([Boolean, Object]), default: void 0 }, /** * @description type, affects the background color and text color */ type: { type: definePropType(String) } }); const tourStepEmits = { close: () => true }; //#endregion //#region ../../packages/components/tour/src/step.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$6 = ["aria-label"]; var step_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElTourStep", __name: "step", props: tourStepProps, emits: tourStepEmits, setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const { Close } = CloseComponents; const { t } = useLocale(); const { currentStep, current, total, showClose, closeIcon, mergedType, ns, slots: tourSlots, updateModelValue, onClose: tourOnClose, onFinish: tourOnFinish, onChange } = inject(tourKey); watch(props, (val) => { currentStep.value = val; }, { immediate: true }); const mergedShowClose = computed(() => props.showClose ?? showClose.value); const mergedCloseIcon = computed(() => props.closeIcon ?? closeIcon.value ?? Close); const filterButtonProps = (btnProps) => { if (!btnProps) return; return omit(btnProps, ["children", "onClick"]); }; const onPrev = () => { current.value -= 1; if (props.prevButtonProps?.onClick) props.prevButtonProps?.onClick(); onChange(); }; const onNext = () => { if (current.value >= total.value - 1) onFinish(); else current.value += 1; if (props.nextButtonProps?.onClick) props.nextButtonProps.onClick(); onChange(); }; const onFinish = () => { onClose(); tourOnFinish(); }; const onClose = () => { updateModelValue(false); tourOnClose(); emit("close"); }; const handleKeydown = (e) => { if (e.target?.isContentEditable) return; switch (getEventCode(e)) { case EVENT_CODE.left: e.preventDefault(); current.value > 0 && onPrev(); break; case EVENT_CODE.right: e.preventDefault(); onNext(); break; } }; onMounted(() => { window.addEventListener("keydown", handleKeydown); }); onBeforeUnmount(() => { window.removeEventListener("keydown", handleKeydown); }); return (_ctx, _cache) => { return openBlock(), createElementBlock(Fragment, null, [ mergedShowClose.value ? (openBlock(), createElementBlock("button", { key: 0, "aria-label": unref(t)("el.tour.close"), class: normalizeClass(unref(ns).e("closebtn")), type: "button", onClick: onClose }, [createVNode(unref(ElIcon), { class: normalizeClass(unref(ns).e("close")) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(mergedCloseIcon.value)))]), _: 1 }, 8, ["class"])], 10, _hoisted_1$6)) : createCommentVNode("v-if", true), createElementVNode("header", { class: normalizeClass([unref(ns).e("header"), { "show-close": unref(showClose) }]) }, [renderSlot(_ctx.$slots, "header", {}, () => [createElementVNode("span", { role: "heading", class: normalizeClass(unref(ns).e("title")) }, toDisplayString(__props.title), 3)])], 2), createElementVNode("div", { class: normalizeClass(unref(ns).e("body")) }, [renderSlot(_ctx.$slots, "default", {}, () => [createElementVNode("span", null, toDisplayString(__props.description), 1)])], 2), createElementVNode("footer", { class: normalizeClass(unref(ns).e("footer")) }, [createElementVNode("div", { class: normalizeClass(unref(ns).b("indicators")) }, [unref(tourSlots).indicators ? (openBlock(), createBlock(resolveDynamicComponent(unref(tourSlots).indicators), { key: 0, current: unref(current), total: unref(total) }, null, 8, ["current", "total"])) : (openBlock(true), createElementBlock(Fragment, { key: 1 }, renderList(unref(total), (item, index) => { return openBlock(), createElementBlock("span", { key: item, class: normalizeClass([unref(ns).b("indicator"), unref(ns).is("active", index === unref(current))]) }, null, 2); }), 128))], 2), createElementVNode("div", { class: normalizeClass(unref(ns).b("buttons")) }, [unref(current) > 0 ? (openBlock(), createBlock(unref(ElButton), mergeProps({ key: 0, size: "small", type: unref(mergedType) }, filterButtonProps(__props.prevButtonProps), { onClick: onPrev }), { default: withCtx(() => [createTextVNode(toDisplayString(__props.prevButtonProps?.children ?? unref(t)("el.tour.previous")), 1)]), _: 1 }, 16, ["type"])) : createCommentVNode("v-if", true), unref(current) <= unref(total) - 1 ? (openBlock(), createBlock(unref(ElButton), mergeProps({ key: 1, size: "small", type: unref(mergedType) === "primary" ? "default" : "primary" }, filterButtonProps(__props.nextButtonProps), { onClick: onNext }), { default: withCtx(() => [createTextVNode(toDisplayString(__props.nextButtonProps?.children ?? (unref(current) === unref(total) - 1 ? unref(t)("el.tour.finish") : unref(t)("el.tour.next"))), 1)]), _: 1 }, 16, ["type"])) : createCommentVNode("v-if", true)], 2)], 2) ], 64); }; } }); //#endregion //#region ../../packages/components/tour/src/step.vue var step_default = step_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/tour/index.ts const ElTour = withInstall(tour_default, { TourStep: step_default }); const ElTourStep = withNoopInstall(step_default); //#endregion //#region ../../packages/components/anchor/src/anchor.ts /** * @deprecated Removed after 3.0.0, Use `AnchorProps` instead. */ const anchorProps = buildProps({ /** * @description scroll container */ container: { type: definePropType([String, Object]) }, /** * @description Set the offset of the anchor scroll */ offset: { type: Number, default: 0 }, /** * @description The offset of the element starting to trigger the anchor */ bound: { type: Number, default: 15 }, /** * @description Set the scroll duration of the container when the anchor is clicked, in milliseconds */ duration: { type: Number, default: 300 }, /** * @description Whether to show the marker */ marker: { type: Boolean, default: true }, /** * @description Set Anchor type */ type: { type: definePropType(String), default: "default" }, /** * @description Set Anchor direction */ direction: { type: definePropType(String), default: "vertical" }, /** * @description Scroll whether link is selected at the top */ selectScrollTop: Boolean }); const anchorEmits = { change: (href) => isString(href), click: (e, href) => e instanceof MouseEvent && (isString(href) || isUndefined(href)) }; //#endregion //#region ../../packages/components/anchor/src/constants.ts const anchorKey = Symbol("anchor"); //#endregion //#region ../../packages/components/anchor/src/anchor.vue?vue&type=script&setup=true&lang.ts var anchor_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElAnchor", __name: "anchor", props: anchorProps, emits: anchorEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const slots = useSlots(); const currentAnchor = ref(""); const markerStyle = ref({}); const anchorRef = ref(null); const markerRef = ref(null); const containerEl = ref(); const links = {}; let isScrolling = false; let currentScrollTop = 0; const ns = useNamespace("anchor"); const cls = computed(() => [ ns.b(), props.type === "underline" ? ns.m("underline") : "", ns.m(props.direction) ]); const addLink = (state) => { links[state.href] = state.el; }; const removeLink = (href) => { delete links[href]; }; const setCurrentAnchor = (href) => { if (currentAnchor.value !== href) { currentAnchor.value = href; emit(CHANGE_EVENT, href); } }; let clearAnimate = null; let currentTargetHref = ""; const scrollToAnchor = (href) => { if (!containerEl.value) return; const target = getElement(href); if (!target) return; if (clearAnimate) { if (currentTargetHref === href) return; clearAnimate(); } currentTargetHref = href; isScrolling = true; const scrollEle = getScrollElement(target, containerEl.value); const distance = getOffsetTopDistance(target, scrollEle); const max = scrollEle.scrollHeight - scrollEle.clientHeight; const to = Math.min(distance - props.offset, max); clearAnimate = animateScrollTo(containerEl.value, currentScrollTop, to, props.duration, () => { setTimeout(() => { isScrolling = false; currentTargetHref = ""; }, 20); }); }; const scrollTo = (href) => { if (href) { setCurrentAnchor(href); scrollToAnchor(href); } }; const handleClick = (e, href) => { emit("click", e, href); scrollTo(href); }; const handleScroll = throttleByRaf(() => { if (containerEl.value) currentScrollTop = getScrollTop(containerEl.value); const currentHref = getCurrentHref(); if (isScrolling || isUndefined(currentHref)) return; setCurrentAnchor(currentHref); }); const getCurrentHref = () => { if (!containerEl.value) return; const scrollTop = getScrollTop(containerEl.value); const anchorTopList = []; for (const href of Object.keys(links)) { const target = getElement(href); if (!target) continue; const distance = getOffsetTopDistance(target, getScrollElement(target, containerEl.value)); anchorTopList.push({ top: distance - props.offset - props.bound, href }); } anchorTopList.sort((prev, next) => prev.top - next.top); for (let i = 0; i < anchorTopList.length; i++) { const item = anchorTopList[i]; const next = anchorTopList[i + 1]; if (i === 0 && scrollTop === 0) return props.selectScrollTop ? item.href : ""; if (item.top <= scrollTop && (!next || next.top > scrollTop)) return item.href; } }; const getContainer = () => { const el = getElement(props.container); if (!el || isWindow(el)) containerEl.value = window; else containerEl.value = el; }; useEventListener(containerEl, "scroll", handleScroll); const updateMarkerStyle = () => { nextTick(() => { if (!anchorRef.value || !markerRef.value || !currentAnchor.value) { markerStyle.value = {}; return; } const currentLinkEl = links[currentAnchor.value]; if (!currentLinkEl) { markerStyle.value = {}; return; } const anchorRect = anchorRef.value.getBoundingClientRect(); const markerRect = markerRef.value.getBoundingClientRect(); const linkRect = currentLinkEl.getBoundingClientRect(); if (props.direction === "horizontal") markerStyle.value = { left: `${linkRect.left - anchorRect.left}px`, width: `${linkRect.width}px`, opacity: 1 }; else markerStyle.value = { top: `${linkRect.top - anchorRect.top + (linkRect.height - markerRect.height) / 2}px`, opacity: 1 }; }); }; watch(currentAnchor, updateMarkerStyle); watch(() => slots.default?.(), updateMarkerStyle); onMounted(() => { getContainer(); const hash = decodeURIComponent(window.location.hash); if (getElement(hash)) scrollTo(hash); else handleScroll(); }); watch(() => props.container, () => { getContainer(); }); provide(anchorKey, { ns, direction: props.direction, currentAnchor, addLink, removeLink, handleClick }); __expose({ scrollTo }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { ref_key: "anchorRef", ref: anchorRef, class: normalizeClass(cls.value) }, [__props.marker ? (openBlock(), createElementBlock("div", { key: 0, ref_key: "markerRef", ref: markerRef, class: normalizeClass(unref(ns).e("marker")), style: normalizeStyle(markerStyle.value) }, null, 6)) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass(unref(ns).e("list")) }, [renderSlot(_ctx.$slots, "default")], 2)], 2); }; } }); //#endregion //#region ../../packages/components/anchor/src/anchor.vue var anchor_default = anchor_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/anchor/src/anchor-link.ts /** * @deprecated Removed after 3.0.0, Use `AnchorLinkProps` instead. */ const anchorLinkProps = buildProps({ /** * @description the text content of the anchor link */ title: String, /** * @description The address of the anchor link */ href: String }); //#endregion //#region ../../packages/components/anchor/src/anchor-link.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$5 = ["href"]; var anchor_link_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElAnchorLink", __name: "anchor-link", props: anchorLinkProps, setup(__props) { const props = __props; const linkRef = ref(null); const { ns, direction, currentAnchor, addLink, removeLink, handleClick: contextHandleClick } = inject(anchorKey); const cls = computed(() => [ns.e("link"), ns.is("active", currentAnchor.value === props.href)]); const handleClick = (e) => { contextHandleClick(e, props.href); }; watch(() => props.href, (val, oldVal) => { nextTick(() => { if (oldVal) removeLink(oldVal); if (val) addLink({ href: val, el: linkRef.value }); }); }); onMounted(() => { const { href } = props; if (href) addLink({ href, el: linkRef.value }); }); onBeforeUnmount(() => { const { href } = props; if (href) removeLink(href); }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass(unref(ns).e("item")) }, [createElementVNode("a", { ref_key: "linkRef", ref: linkRef, class: normalizeClass(cls.value), href: __props.href, onClick: handleClick }, [renderSlot(_ctx.$slots, "default", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])], 10, _hoisted_1$5), _ctx.$slots["sub-link"] && unref(direction) === "vertical" ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ns).e("list")) }, [renderSlot(_ctx.$slots, "sub-link")], 2)) : createCommentVNode("v-if", true)], 2); }; } }); //#endregion //#region ../../packages/components/anchor/src/anchor-link.vue var anchor_link_default = anchor_link_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/anchor/index.ts const ElAnchor = withInstall(anchor_default, { AnchorLink: anchor_link_default }); const ElAnchorLink = withNoopInstall(anchor_link_default); //#endregion //#region ../../packages/components/segmented/src/segmented.ts const defaultProps = { label: "label", value: "value", disabled: "disabled" }; /** * @deprecated Removed after 3.0.0, Use `SegmentedProps` instead. */ const segmentedProps = buildProps({ direction: { type: definePropType(String), default: "horizontal" }, /** * @description options of segmented */ options: { type: definePropType(Array), default: () => [] }, /** * @description binding value */ modelValue: { type: [ String, Number, Boolean ], default: void 0 }, /** * @description configuration options, see the following table */ props: { type: definePropType(Object), default: () => defaultProps }, /** * @description fit width of parent content */ block: Boolean, /** * @description size of component */ size: useSizeProp, /** * @description whether segmented is disabled */ disabled: { type: Boolean, default: void 0 }, /** * @description whether to trigger form validation */ validateEvent: { type: Boolean, default: true }, /** * @description native input id */ id: String, /** * @description native `name` attribute */ name: String, ...useAriaProps(["ariaLabel"]) }); const segmentedEmits = { [UPDATE_MODEL_EVENT]: (val) => isString(val) || isNumber(val) || isBoolean(val), [CHANGE_EVENT]: (val) => isString(val) || isNumber(val) || isBoolean(val) }; //#endregion //#region ../../packages/components/segmented/src/segmented.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$4 = [ "id", "aria-label", "aria-labelledby" ]; const _hoisted_2$3 = [ "name", "disabled", "checked", "onChange" ]; var segmented_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElSegmented", __name: "segmented", props: segmentedProps, emits: segmentedEmits, setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const ns = useNamespace("segmented"); const segmentedId = useId(); const segmentedSize = useFormSize(); const _disabled = useFormDisabled(); const { formItem } = useFormItem(); const { inputId, isLabeledByFormItem } = useFormItemInputId(props, { formItemContext: formItem }); const segmentedRef = ref(null); const activeElement = useActiveElement(); const state = reactive({ isInit: false, width: 0, height: 0, translateX: 0, translateY: 0, focusVisible: false }); const handleChange = (evt, item) => { const value = getValue(item); emit(UPDATE_MODEL_EVENT, value); emit(CHANGE_EVENT, value); evt.target.checked = value === props.modelValue; }; const aliasProps = computed(() => ({ ...defaultProps, ...props.props })); const getValue = (item) => { return isObject$1(item) ? item[aliasProps.value.value] : item; }; const getLabel = (item) => { return isObject$1(item) ? item[aliasProps.value.label] : item; }; const getDisabled = (item) => { return !!(_disabled.value || (isObject$1(item) ? item[aliasProps.value.disabled] : false)); }; const getSelected = (item) => { return props.modelValue === getValue(item); }; const getOption = (value) => { return props.options.find((item) => getValue(item) === value); }; const getItemCls = (item) => { return [ ns.e("item"), ns.is("selected", getSelected(item)), ns.is("disabled", getDisabled(item)) ]; }; const updateSelect = () => { if (!segmentedRef.value) return; const selectedItem = segmentedRef.value.querySelector(".is-selected"); const selectedItemInput = segmentedRef.value.querySelector(".is-selected input"); if (!selectedItem || !selectedItemInput) { state.width = 0; state.height = 0; state.translateX = 0; state.translateY = 0; state.focusVisible = false; return; } state.isInit = true; if (props.direction === "vertical") { state.height = selectedItem.offsetHeight; state.translateY = selectedItem.offsetTop; } else { state.width = selectedItem.offsetWidth; state.translateX = selectedItem.offsetLeft; } try { state.focusVisible = selectedItemInput.matches(":focus-visible"); } catch {} }; const segmentedCls = computed(() => [ ns.b(), ns.m(segmentedSize.value), ns.is("block", props.block) ]); const selectedStyle = computed(() => ({ width: props.direction === "vertical" ? "100%" : `${state.width}px`, height: props.direction === "vertical" ? `${state.height}px` : "100%", transform: props.direction === "vertical" ? `translateY(${state.translateY}px)` : `translateX(${state.translateX}px)`, display: state.isInit ? "block" : "none" })); const selectedCls = computed(() => [ ns.e("item-selected"), ns.is("disabled", getDisabled(getOption(props.modelValue))), ns.is("focus-visible", state.focusVisible) ]); const name = computed(() => { return props.name || segmentedId.value; }); useResizeObserver(segmentedRef, updateSelect); watch(activeElement, updateSelect); watch(() => props.options, updateSelect, { deep: true, flush: "post" }); watch(() => props.modelValue, () => { updateSelect(); if (props.validateEvent) formItem?.validate?.("change").catch(NOOP); }, { flush: "post" }); return (_ctx, _cache) => { return __props.options.length ? (openBlock(), createElementBlock("div", { key: 0, id: unref(inputId), ref_key: "segmentedRef", ref: segmentedRef, class: normalizeClass(segmentedCls.value), role: "radiogroup", "aria-label": !unref(isLabeledByFormItem) ? __props.ariaLabel || "segmented" : void 0, "aria-labelledby": unref(isLabeledByFormItem) ? unref(formItem).labelId : void 0 }, [createElementVNode("div", { class: normalizeClass([unref(ns).e("group"), unref(ns).m(__props.direction)]) }, [createElementVNode("div", { style: normalizeStyle(selectedStyle.value), class: normalizeClass(selectedCls.value) }, null, 6), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.options, (item, index) => { return openBlock(), createElementBlock("label", { key: index, class: normalizeClass(getItemCls(item)) }, [createElementVNode("input", { class: normalizeClass(unref(ns).e("item-input")), type: "radio", name: name.value, disabled: getDisabled(item), checked: getSelected(item), onChange: ($event) => handleChange($event, item) }, null, 42, _hoisted_2$3), createElementVNode("div", { class: normalizeClass(unref(ns).e("item-label")) }, [renderSlot(_ctx.$slots, "default", { item }, () => [createTextVNode(toDisplayString(getLabel(item)), 1)])], 2)], 2); }), 128))], 2)], 10, _hoisted_1$4)) : createCommentVNode("v-if", true); }; } }); //#endregion //#region ../../packages/components/segmented/src/segmented.vue var segmented_default = segmented_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/segmented/index.ts const ElSegmented = withInstall(segmented_default); //#endregion //#region ../../packages/components/mention/src/helper.ts const filterOption = (pattern, option) => { const lowerCase = pattern.toLowerCase(); return (option.label || option.value || "").toLowerCase().includes(lowerCase); }; const getMentionCtx = (inputEl, prefix, split) => { const { selectionEnd } = inputEl; if (selectionEnd === null) return; const inputValue = inputEl.value; const prefixArray = castArray$1(prefix); let splitIndex = -1; let mentionCtx; for (let i = selectionEnd - 1; i >= 0; --i) { const char = inputValue[i]; if (splitIndex === -1 && (char === split || char === "\n" || char === "\r")) { splitIndex = i; continue; } if (prefixArray.includes(char)) { const end = splitIndex === -1 ? selectionEnd : splitIndex; mentionCtx = { pattern: inputValue.slice(i + 1, end), start: i + 1, end, prefix: char, prefixIndex: i, splitIndex, selectionEnd }; break; } } return mentionCtx; }; /** * fork from textarea-caret-position * https://github.com/component/textarea-caret-position * The MIT License (MIT) * Copyright (c) 2015 Jonathan Ong me@jongleberry.com * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ const getCursorPosition = (element, options = { debug: false, useSelectionEnd: false }) => { const selectionStart = element.selectionStart !== null ? element.selectionStart : 0; const selectionEnd = element.selectionEnd !== null ? element.selectionEnd : 0; const position = options.useSelectionEnd ? selectionEnd : selectionStart; const properties = [ "direction", "boxSizing", "width", "height", "overflowX", "overflowY", "borderTopWidth", "borderRightWidth", "borderBottomWidth", "borderLeftWidth", "borderStyle", "paddingTop", "paddingRight", "paddingBottom", "paddingLeft", "fontStyle", "fontVariant", "fontWeight", "fontStretch", "fontSize", "fontSizeAdjust", "lineHeight", "fontFamily", "textAlign", "textTransform", "textIndent", "textDecoration", "letterSpacing", "wordSpacing", "tabSize", "MozTabSize" ]; if (options.debug) { const el = document.querySelector("#input-textarea-caret-position-mirror-div"); if (el?.parentNode) el.parentNode.removeChild(el); } const div = document.createElement("div"); div.id = "input-textarea-caret-position-mirror-div"; document.body.appendChild(div); const style = div.style; const computed = window.getComputedStyle(element); const isInput = element.nodeName === "INPUT"; style.whiteSpace = isInput ? "nowrap" : "pre-wrap"; if (!isInput) style.wordWrap = "break-word"; style.position = "absolute"; if (!options.debug) style.visibility = "hidden"; properties.forEach((prop) => { if (isInput && prop === "lineHeight") if (computed.boxSizing === "border-box") { const height = Number.parseInt(computed.height); const outerHeight = Number.parseInt(computed.paddingTop) + Number.parseInt(computed.paddingBottom) + Number.parseInt(computed.borderTopWidth) + Number.parseInt(computed.borderBottomWidth); const targetHeight = outerHeight + Number.parseInt(computed.lineHeight); if (height > targetHeight) style.lineHeight = `${height - outerHeight}px`; else if (height === targetHeight) style.lineHeight = computed.lineHeight; else style.lineHeight = "0"; } else style.lineHeight = computed.height; else style[prop] = computed[prop]; }); if (isFirefox()) { if (element.scrollHeight > Number.parseInt(computed.height)) style.overflowY = "scroll"; } else style.overflow = "hidden"; div.textContent = element.value.slice(0, Math.max(0, position)); if (isInput && div.textContent) div.textContent = div.textContent.replace(/\s/g, "\xA0"); const span = document.createElement("span"); span.textContent = element.value.slice(Math.max(0, position)) || "."; span.style.position = "relative"; span.style.left = `${-element.scrollLeft}px`; span.style.top = `${-element.scrollTop}px`; div.appendChild(span); const relativePosition = { top: span.offsetTop + Number.parseInt(computed.borderTopWidth), left: span.offsetLeft + Number.parseInt(computed.borderLeftWidth), height: Number.parseInt(computed.fontSize) * 1.5 }; if (options.debug) span.style.backgroundColor = "#aaa"; else document.body.removeChild(div); if (relativePosition.left >= element.clientWidth) relativePosition.left = element.clientWidth; return relativePosition; }; //#endregion //#region ../../packages/components/mention/src/mention.ts /** * @deprecated Removed after 3.0.0, Use `MentionProps` instead. */ const mentionProps = buildProps({ ...inputProps, /** * @description mention options list */ options: { type: definePropType(Array), default: () => [] }, /** * @description prefix character to trigger mentions. The string length must be exactly 1. */ prefix: { type: definePropType([String, Array]), default: "@", validator: (val) => { if (isString(val)) return val.length === 1; return val.every((v) => isString(v) && v.length === 1); } }, /** * @description character to split mentions. The string length must be exactly 1. */ split: { type: String, default: " ", validator: (val) => val.length === 1 }, /** * @description customize filter option logic. */ filterOption: { type: definePropType([Boolean, Function]), default: () => filterOption, validator: (val) => { if (val === false) return true; return isFunction$1(val); } }, /** * @description set popup placement */ placement: { type: definePropType(String), default: "bottom" }, /** * @description whether the dropdown panel has an arrow */ showArrow: Boolean, /** * @description offset of the dropdown panel */ offset: { type: Number, default: 0 }, /** * @description when backspace is pressed to delete, whether the mention content is deleted as a whole */ whole: Boolean, /** * @description when backspace is pressed to delete, check if the mention is a whole */ checkIsWhole: { type: definePropType(Function) }, /** * @description input value */ modelValue: String, /** * @description whether the dropdown panel of mentions is in a loading state. */ loading: Boolean, /** * @description custom class name for dropdown panel */ popperClass: useTooltipContentProps.popperClass, /** * @description custom style for dropdown panel */ popperStyle: useTooltipContentProps.popperStyle, /** * @description [popper.js](https://popper.js.org/docs/v2/) parameters */ popperOptions: { type: definePropType(Object), default: () => ({}) }, /** * @description configuration options */ props: { type: definePropType(Object), default: () => mentionDefaultProps } }); const mentionEmits = { [UPDATE_MODEL_EVENT]: (value) => isString(value), "whole-remove": (pattern, prefix) => isString(pattern) && isString(prefix), input: (value) => isString(value), search: (pattern, prefix) => isString(pattern) && isString(prefix), select: (option, prefix) => isObject$1(option) && isString(prefix), focus: (evt) => evt instanceof FocusEvent, blur: (evt) => evt instanceof FocusEvent }; const mentionDefaultProps = { value: "value", label: "label", disabled: "disabled" }; //#endregion //#region ../../packages/components/mention/src/mention-dropdown.ts /** * @deprecated Removed after 3.0.0, Use `MentionDropdownProps` instead. */ const mentionDropdownProps = buildProps({ options: { type: definePropType(Array), default: () => [] }, loading: Boolean, disabled: Boolean, contentId: String, ariaLabel: String }); const mentionDropdownEmits = { select: (option) => isString(option.value) }; //#endregion //#region ../../packages/components/mention/src/mention-dropdown.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$3 = [ "id", "aria-disabled", "aria-selected", "onMousemove", "onClick" ]; var mention_dropdown_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElMentionDropdown", __name: "mention-dropdown", props: mentionDropdownProps, emits: mentionDropdownEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const ns = useNamespace("mention"); const { t } = useLocale(); const hoveringIndex = ref(-1); const scrollbarRef = ref(); const optionRefs = ref(); const dropdownRef = ref(); const optionkls = (item, index) => [ ns.be("dropdown", "item"), ns.is("hovering", hoveringIndex.value === index), ns.is("disabled", item.disabled || props.disabled) ]; const handleSelect = (item) => { if (item.disabled || props.disabled) return; emit("select", item); }; const handleMouseEnter = (index) => { hoveringIndex.value = index; }; const filteredAllDisabled = computed(() => props.disabled || props.options.every((item) => item.disabled)); const hoverOption = computed(() => props.options[hoveringIndex.value]); const selectHoverOption = () => { if (!hoverOption.value || hoverOption.value.disabled || props.disabled) return; emit("select", hoverOption.value); }; const navigateOptions = (direction) => { const { options } = props; if (options.length === 0 || filteredAllDisabled.value) return; if (direction === "next") { hoveringIndex.value++; if (hoveringIndex.value === options.length) hoveringIndex.value = 0; } else if (direction === "prev") { hoveringIndex.value--; if (hoveringIndex.value < 0) hoveringIndex.value = options.length - 1; } const option = options[hoveringIndex.value]; if (option.disabled) { navigateOptions(direction); return; } nextTick(() => scrollToOption(option)); }; const scrollToOption = (option) => { const { options } = props; const index = options.findIndex((item) => item.value === option.value); const target = optionRefs.value?.[index]; if (target) { const menu = dropdownRef.value?.querySelector?.(`.${ns.be("dropdown", "wrap")}`); if (menu) scrollIntoView(menu, target); } scrollbarRef.value?.handleScroll(); }; const resetHoveringIndex = () => { if (filteredAllDisabled.value || props.options.length === 0) hoveringIndex.value = -1; else hoveringIndex.value = props.options.findIndex((item) => !item.disabled); }; watch(() => props.options, resetHoveringIndex, { immediate: true }); __expose({ hoveringIndex, navigateOptions, selectHoverOption, hoverOption }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { ref_key: "dropdownRef", ref: dropdownRef, class: normalizeClass(unref(ns).b("dropdown")) }, [ _ctx.$slots.header ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(unref(ns).be("dropdown", "header")) }, [renderSlot(_ctx.$slots, "header")], 2)) : createCommentVNode("v-if", true), withDirectives(createVNode(unref(ElScrollbar), { id: __props.contentId, ref_key: "scrollbarRef", ref: scrollbarRef, tag: "ul", "wrap-class": unref(ns).be("dropdown", "wrap"), "view-class": unref(ns).be("dropdown", "list"), role: "listbox", "aria-label": __props.ariaLabel, "aria-orientation": "vertical" }, { default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.options, (item, index) => { return openBlock(), createElementBlock("li", { id: `${__props.contentId}-${index}`, ref_for: true, ref_key: "optionRefs", ref: optionRefs, key: index, class: normalizeClass(optionkls(item, index)), role: "option", "aria-disabled": item.disabled || __props.disabled || void 0, "aria-selected": hoveringIndex.value === index, onMousemove: ($event) => handleMouseEnter(index), onClick: withModifiers(($event) => handleSelect(item), ["stop"]) }, [renderSlot(_ctx.$slots, "label", { item, index }, () => [createElementVNode("span", null, toDisplayString(item.label ?? item.value), 1)])], 42, _hoisted_1$3); }), 128))]), _: 3 }, 8, [ "id", "wrap-class", "view-class", "aria-label" ]), [[vShow, __props.options.length > 0 && !__props.loading]]), __props.loading ? (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass(unref(ns).be("dropdown", "loading")) }, [renderSlot(_ctx.$slots, "loading", {}, () => [createTextVNode(toDisplayString(unref(t)("el.mention.loading")), 1)])], 2)) : createCommentVNode("v-if", true), _ctx.$slots.footer ? (openBlock(), createElementBlock("div", { key: 2, class: normalizeClass(unref(ns).be("dropdown", "footer")) }, [renderSlot(_ctx.$slots, "footer")], 2)) : createCommentVNode("v-if", true) ], 2); }; } }); //#endregion //#region ../../packages/components/mention/src/mention-dropdown.vue var mention_dropdown_default = mention_dropdown_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/mention/src/mention.vue?vue&type=script&setup=true&lang.ts var mention_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElMention", inheritAttrs: false, __name: "mention", props: mentionProps, emits: mentionEmits, setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const passInputProps = computed(() => { const inputProps = ElInput.props ?? []; return pick(props, isArray$1(inputProps) ? inputProps : Object.keys(inputProps)); }); const ns = useNamespace("mention"); const disabled = useFormDisabled(); const contentId = useId(); const elInputRef = ref(); const tooltipRef = ref(); const dropdownRef = ref(); const visible = ref(false); const cursorStyle = ref(); const mentionCtx = ref(); const computedPlacement = computed(() => props.showArrow ? props.placement : `${props.placement}-start`); const computedFallbackPlacements = computed(() => props.showArrow ? ["bottom", "top"] : ["bottom-start", "top-start"]); const aliasProps = computed(() => ({ ...mentionDefaultProps, ...props.props })); const mapOption = (option) => { const base = { label: option[aliasProps.value.label], value: option[aliasProps.value.value], disabled: option[aliasProps.value.disabled] }; return { ...option, ...base }; }; const options = computed(() => props.options.map(mapOption)); const filteredOptions = computed(() => { const { filterOption } = props; if (!mentionCtx.value || !filterOption) return options.value; return options.value.filter((option) => filterOption(mentionCtx.value.pattern, option)); }); const dropdownVisible = computed(() => { return visible.value && (!!filteredOptions.value.length || props.loading); }); const hoveringId = computed(() => { return `${contentId.value}-${dropdownRef.value?.hoveringIndex}`; }); const handleInputChange = (value) => { emit(UPDATE_MODEL_EVENT, value); emit(INPUT_EVENT, value); syncAfterCursorMove(); }; const handleInputKeyDown = (event) => { if (elInputRef.value?.isComposing) return; const code = getEventCode(event); switch (code) { case EVENT_CODE.left: case EVENT_CODE.right: syncAfterCursorMove(); break; case EVENT_CODE.up: case EVENT_CODE.down: if (!visible.value) return; event.preventDefault(); dropdownRef.value?.navigateOptions(code === EVENT_CODE.up ? "prev" : "next"); break; case EVENT_CODE.enter: case EVENT_CODE.numpadEnter: if (!visible.value) { props.type !== "textarea" && syncAfterCursorMove(); return; } event.preventDefault(); if (dropdownRef.value?.hoverOption) dropdownRef.value?.selectHoverOption(); else visible.value = false; break; case EVENT_CODE.esc: if (!visible.value) return; event.preventDefault(); visible.value = false; break; case EVENT_CODE.backspace: if (props.whole && mentionCtx.value) { const { splitIndex, selectionEnd, pattern, prefixIndex, prefix } = mentionCtx.value; const inputEl = getInputEl(); if (!inputEl) return; const inputValue = inputEl.value; const matchOption = options.value.find((item) => item.value === pattern); if ((isFunction$1(props.checkIsWhole) ? props.checkIsWhole(pattern, prefix) : matchOption) && splitIndex !== -1 && splitIndex + 1 === selectionEnd) { event.preventDefault(); const newValue = inputValue.slice(0, prefixIndex) + inputValue.slice(splitIndex + 1); emit(UPDATE_MODEL_EVENT, newValue); emit(INPUT_EVENT, newValue); emit("whole-remove", pattern, prefix); const newSelectionEnd = prefixIndex; nextTick(() => { inputEl.selectionStart = newSelectionEnd; inputEl.selectionEnd = newSelectionEnd; syncDropdownVisible(); }); } } } }; const { wrapperRef } = useFocusController(elInputRef, { disabled, afterFocus() { syncAfterCursorMove(); }, beforeBlur(event) { return tooltipRef.value?.isFocusInsideContent(event); }, afterBlur() { visible.value = false; } }); const handleInputMouseDown = () => { syncAfterCursorMove(); }; const getOriginalOption = (mentionOption) => { return props.options.find((option) => { return mentionOption.value === option[aliasProps.value.value]; }); }; const handleSelect = (item) => { if (!mentionCtx.value) return; const inputEl = getInputEl(); if (!inputEl) return; const inputValue = inputEl.value; const { split } = props; const newEndPart = inputValue.slice(mentionCtx.value.end); const alreadySeparated = newEndPart.startsWith(split); const newMiddlePart = `${item.value}${alreadySeparated ? "" : split}`; const newValue = inputValue.slice(0, mentionCtx.value.start) + newMiddlePart + newEndPart; emit(UPDATE_MODEL_EVENT, newValue); emit(INPUT_EVENT, newValue); emit("select", getOriginalOption(item), mentionCtx.value.prefix); const newSelectionEnd = mentionCtx.value.start + newMiddlePart.length + (alreadySeparated ? 1 : 0); nextTick(() => { inputEl.selectionStart = newSelectionEnd; inputEl.selectionEnd = newSelectionEnd; inputEl.focus(); syncDropdownVisible(); }); }; const getInputEl = () => props.type === "textarea" ? elInputRef.value?.textarea : elInputRef.value?.input; const syncAfterCursorMove = () => { setTimeout(() => { syncCursor(); syncDropdownVisible(); nextTick(() => tooltipRef.value?.updatePopper()); }, 0); }; const syncCursor = () => { const inputEl = getInputEl(); if (!inputEl) return; const caretPosition = getCursorPosition(inputEl); const inputRect = inputEl.getBoundingClientRect(); const wrapperRect = wrapperRef.value.getBoundingClientRect(); cursorStyle.value = { position: "absolute", width: 0, height: `${caretPosition.height}px`, left: `${caretPosition.left + inputRect.left - wrapperRect.left}px`, top: `${caretPosition.top + inputRect.top - wrapperRect.top}px` }; }; const syncDropdownVisible = () => { const inputEl = getInputEl(); if (document.activeElement !== inputEl) { visible.value = false; return; } const { prefix, split } = props; mentionCtx.value = getMentionCtx(inputEl, prefix, split); if (mentionCtx.value && mentionCtx.value.splitIndex === -1) { visible.value = true; emit("search", mentionCtx.value.pattern, mentionCtx.value.prefix); return; } visible.value = false; }; __expose({ input: elInputRef, tooltip: tooltipRef, dropdownVisible }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { ref_key: "wrapperRef", ref: wrapperRef, class: normalizeClass(unref(ns).b()) }, [createVNode(unref(ElInput), mergeProps(mergeProps(passInputProps.value, _ctx.$attrs), { ref_key: "elInputRef", ref: elInputRef, "model-value": __props.modelValue, disabled: unref(disabled), role: dropdownVisible.value ? "combobox" : void 0, "aria-activedescendant": dropdownVisible.value ? hoveringId.value || "" : void 0, "aria-controls": dropdownVisible.value ? unref(contentId) : void 0, "aria-expanded": dropdownVisible.value || void 0, "aria-label": __props.ariaLabel, "aria-autocomplete": dropdownVisible.value ? "none" : void 0, "aria-haspopup": dropdownVisible.value ? "listbox" : void 0, onInput: handleInputChange, onKeydown: handleInputKeyDown, onMousedown: handleInputMouseDown }), createSlots({ _: 2 }, [renderList(_ctx.$slots, (_, name) => { return { name, fn: withCtx((slotProps) => [renderSlot(_ctx.$slots, name, normalizeProps(guardReactiveProps(slotProps)))]) }; })]), 1040, [ "model-value", "disabled", "role", "aria-activedescendant", "aria-controls", "aria-expanded", "aria-label", "aria-autocomplete", "aria-haspopup" ]), createVNode(unref(ElTooltip), { ref_key: "tooltipRef", ref: tooltipRef, visible: dropdownVisible.value, "popper-class": [unref(ns).e("popper"), __props.popperClass], "popper-style": __props.popperStyle, "popper-options": __props.popperOptions, placement: computedPlacement.value, "fallback-placements": computedFallbackPlacements.value, effect: "light", pure: "", offset: __props.offset, "show-arrow": __props.showArrow }, { default: withCtx(() => [createElementVNode("div", { style: normalizeStyle(cursorStyle.value) }, null, 4)]), content: withCtx(() => [createVNode(mention_dropdown_default, { ref_key: "dropdownRef", ref: dropdownRef, options: filteredOptions.value, disabled: unref(disabled), loading: __props.loading, "content-id": unref(contentId), "aria-label": __props.ariaLabel, onSelect: handleSelect, onClick: _cache[0] || (_cache[0] = withModifiers(($event) => elInputRef.value?.focus(), ["stop"])) }, createSlots({ _: 2 }, [renderList(_ctx.$slots, (_, name) => { return { name, fn: withCtx((slotProps) => [renderSlot(_ctx.$slots, name, normalizeProps(guardReactiveProps(slotProps)))]) }; })]), 1032, [ "options", "disabled", "loading", "content-id", "aria-label" ])]), _: 3 }, 8, [ "visible", "popper-class", "popper-style", "popper-options", "placement", "fallback-placements", "offset", "show-arrow" ])], 2); }; } }); //#endregion //#region ../../packages/components/mention/src/mention.vue var mention_default = mention_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/mention/index.ts const ElMention = withInstall(mention_default); //#endregion //#region ../../packages/components/splitter/src/splitter.ts /** * @deprecated Removed after 3.0.0, Use `SplitterProps` instead. */ const splitterProps = buildProps({ layout: { type: String, default: "horizontal", values: ["horizontal", "vertical"] }, lazy: Boolean }); const splitterEmits = { resizeStart: (index, sizes) => true, resize: (index, sizes) => true, resizeEnd: (index, sizes) => true, collapse: (index, type, sizes) => true }; //#endregion //#region ../../packages/components/splitter/src/hooks/useContainer.ts function useContainer(layout) { const containerEl = ref(); const { width, height } = useElementSize(containerEl); return { containerEl, containerSize: computed(() => { return layout.value === "horizontal" ? width.value : height.value; }) }; } //#endregion //#region ../../packages/components/splitter/src/hooks/useSize.ts function getPct(str) { return Number(str.slice(0, -1)) / 100; } function getPx(str) { return Number(str.slice(0, -2)); } function isPct(itemSize) { return isString(itemSize) && itemSize.endsWith("%"); } function isPx(itemSize) { return isString(itemSize) && itemSize.endsWith("px"); } function useSize$1(panels, containerSize) { const propSizes = computed(() => panels.value.map((i) => i.size)); const panelCounts = computed(() => panels.value.length); const percentSizes = ref([]); watch([ propSizes, panelCounts, containerSize ], () => { let ptgList = []; let emptyCount = 0; for (let i = 0; i < panelCounts.value; i += 1) { const itemSize = panels.value[i]?.size; if (isPct(itemSize)) ptgList[i] = getPct(itemSize); else if (isPx(itemSize)) ptgList[i] = getPx(itemSize) / containerSize.value; else if (itemSize || itemSize === 0) { const num = Number(itemSize); if (!Number.isNaN(num)) ptgList[i] = num / containerSize.value; } else { emptyCount += 1; ptgList[i] = void 0; } } const totalPtg = ptgList.reduce((acc, ptg) => acc + (ptg || 0), 0); if (totalPtg > 1 || !emptyCount) { const scale = 1 / totalPtg; ptgList = ptgList.map((ptg) => ptg === void 0 ? 0 : ptg * scale); } else { const avgRest = (1 - totalPtg) / emptyCount; ptgList = ptgList.map((ptg) => ptg === void 0 ? avgRest : ptg); } percentSizes.value = ptgList; }); const ptg2px = (ptg) => ptg * containerSize.value; return { percentSizes, pxSizes: computed(() => percentSizes.value.map(ptg2px)) }; } //#endregion //#region ../../packages/components/splitter/src/hooks/useResize.ts function useResize(panels, containerSize, pxSizes, lazy) { const ptg2px = (ptg) => ptg * containerSize.value || 0; function getLimitSize(str, defaultLimit) { if (isPct(str)) return ptg2px(getPct(str)); else if (isPx(str)) return getPx(str); return str ?? defaultLimit; } const lazyOffset = ref(0); const movingIndex = ref(null); let cachePxSizes = []; let updatePanelSizes = NOOP; const limitSizes = computed(() => panels.value.map((item) => [item.min, item.max])); watch(lazy, () => { if (lazyOffset.value) { const mouseup = new MouseEvent("mouseup", { bubbles: true }); window.dispatchEvent(mouseup); } }); const onMoveStart = (index) => { lazyOffset.value = 0; movingIndex.value = { index, confirmed: false }; cachePxSizes = pxSizes.value; }; const onMoving = (index, offset) => { let confirmedIndex = null; if ((!movingIndex.value || !movingIndex.value.confirmed) && offset !== 0) { if (offset > 0) { confirmedIndex = index; movingIndex.value = { index, confirmed: true }; } else for (let i = index; i >= 0; i -= 1) if (cachePxSizes[i] > 0) { confirmedIndex = i; movingIndex.value = { index: i, confirmed: true }; break; } } const mergedIndex = confirmedIndex ?? movingIndex.value?.index ?? index; const numSizes = [...cachePxSizes]; const nextIndex = mergedIndex + 1; const startMinSize = getLimitSize(limitSizes.value[mergedIndex][0], 0); const endMinSize = getLimitSize(limitSizes.value[nextIndex][0], 0); const startMaxSize = getLimitSize(limitSizes.value[mergedIndex][1], containerSize.value || 0); const endMaxSize = getLimitSize(limitSizes.value[nextIndex][1], containerSize.value || 0); let mergedOffset = offset; if (numSizes[mergedIndex] + mergedOffset < startMinSize) mergedOffset = startMinSize - numSizes[mergedIndex]; if (numSizes[nextIndex] - mergedOffset < endMinSize) mergedOffset = numSizes[nextIndex] - endMinSize; if (numSizes[mergedIndex] + mergedOffset > startMaxSize) mergedOffset = startMaxSize - numSizes[mergedIndex]; if (numSizes[nextIndex] - mergedOffset > endMaxSize) mergedOffset = numSizes[nextIndex] - endMaxSize; numSizes[mergedIndex] += mergedOffset; numSizes[nextIndex] -= mergedOffset; lazyOffset.value = mergedOffset; updatePanelSizes = () => { panels.value.forEach((panel, index) => { panel.size = numSizes[index]; }); updatePanelSizes = NOOP; }; if (!lazy.value) updatePanelSizes(); }; const onMoveEnd = () => { if (lazy.value) updatePanelSizes(); lazyOffset.value = 0; movingIndex.value = null; cachePxSizes = []; }; const cacheCollapsedSize = []; const onCollapse = (index, type) => { if (!cacheCollapsedSize.length) cacheCollapsedSize.push(...pxSizes.value.map((size, i) => size <= 0 ? getLimitSize(limitSizes.value[i]?.[0], 0) : size)); const currentSizes = pxSizes.value; const currentIndex = type === "start" ? index : index + 1; const targetIndex = type === "start" ? index + 1 : index; const currentSize = currentSizes[currentIndex]; const targetSize = currentSizes[targetIndex]; if (currentSize !== 0 && targetSize !== 0) { currentSizes[currentIndex] = 0; currentSizes[targetIndex] += currentSize; cacheCollapsedSize[index] = currentSize; } else { const totalSize = currentSize + targetSize; const targetCacheCollapsedSize = clamp$1(cacheCollapsedSize[index], 0, totalSize); const currentCacheCollapsedSize = totalSize - targetCacheCollapsedSize; currentSizes[targetIndex] = targetCacheCollapsedSize; currentSizes[currentIndex] = currentCacheCollapsedSize; } panels.value.forEach((panel, index) => { panel.size = currentSizes[index]; }); }; return { lazyOffset, onMoveStart, onMoving, onMoveEnd, movingIndex, onCollapse }; } //#endregion //#region ../../packages/components/splitter/src/type.ts const splitterRootContextKey = Symbol("splitterRootContextKey"); //#endregion //#region ../../packages/components/splitter/src/splitter.vue?vue&type=script&setup=true&lang.ts var splitter_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElSplitter", __name: "splitter", props: splitterProps, emits: splitterEmits, setup(__props, { emit: __emit }) { const ns = useNamespace("splitter"); const emits = __emit; const props = __props; const layout = toRef(props, "layout"); const lazy = toRef(props, "lazy"); const { containerEl, containerSize } = useContainer(layout); const { removeChild: unregisterPanel, children: panels, addChild: registerPanel, ChildrenSorter: PanelsSorter } = useOrderedChildren(getCurrentInstance(), "ElSplitterPanel"); watch(panels, () => { movingIndex.value = null; panels.value.forEach((instance, index) => { instance.setIndex(index); }); }); const { percentSizes, pxSizes } = useSize$1(panels, containerSize); const { lazyOffset, movingIndex, onMoveStart, onMoving, onMoveEnd, onCollapse } = useResize(panels, containerSize, pxSizes, lazy); const splitterStyles = computed(() => { return { [ns.cssVarBlockName("bar-offset")]: lazy.value ? `${lazyOffset.value}px` : void 0 }; }); const onResizeStart = (index) => { onMoveStart(index); emits("resizeStart", index, pxSizes.value); }; const onResize = (index, offset) => { onMoving(index, offset); if (!lazy.value) emits("resize", index, pxSizes.value); }; const onResizeEnd = async (index) => { onMoveEnd(); await nextTick(); emits("resizeEnd", index, pxSizes.value); }; const onCollapsible = (index, type) => { onCollapse(index, type); emits("collapse", index, type, pxSizes.value); }; provide(splitterRootContextKey, reactive({ panels, percentSizes, pxSizes, layout, lazy, movingIndex, containerSize, onMoveStart: onResizeStart, onMoving: onResize, onMoveEnd: onResizeEnd, onCollapse: onCollapsible, registerPanel, unregisterPanel })); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { ref_key: "containerEl", ref: containerEl, class: normalizeClass([unref(ns).b(), unref(ns).e(layout.value)]), style: normalizeStyle(splitterStyles.value) }, [ renderSlot(_ctx.$slots, "default"), createVNode(unref(PanelsSorter)), createCommentVNode(" Prevent iframe touch events from breaking "), unref(movingIndex) ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass([unref(ns).e("mask"), unref(ns).e(`mask-${layout.value}`)]) }, null, 2)) : createCommentVNode("v-if", true) ], 6); }; } }); //#endregion //#region ../../packages/components/splitter/src/splitter.vue var splitter_default = splitter_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/splitter/src/split-panel.ts /** * @deprecated Removed after 3.0.0, Use `SplitterPanelProps` instead. */ const splitterPanelProps = buildProps({ min: { type: [String, Number] }, max: { type: [String, Number] }, size: { type: [String, Number] }, resizable: { type: Boolean, default: true }, collapsible: Boolean }); const splitterPanelEmits = { "update:size": (value) => typeof value === "number" || typeof value === "string" }; //#endregion //#region ../../packages/components/splitter/src/hooks/usePanel.ts function getCollapsible(collapsible) { if (collapsible && isObject$1(collapsible)) return collapsible; return { start: !!collapsible, end: !!collapsible }; } function isCollapsible(panel, size, nextPanel, nextSize) { if (panel?.collapsible.end && size > 0) return true; if (nextPanel?.collapsible.start && nextSize === 0 && size > 0) return true; return false; } //#endregion //#region ../../packages/components/splitter/src/split-bar.vue?vue&type=script&setup=true&lang.ts var split_bar_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElSplitterBar", __name: "split-bar", props: { index: { type: Number, required: true }, layout: { type: String, values: ["horizontal", "vertical"], default: "horizontal" }, resizable: { type: Boolean, default: true }, lazy: Boolean, startCollapsible: Boolean, endCollapsible: Boolean }, emits: [ "moveStart", "moving", "moveEnd", "collapse" ], setup(__props, { emit: __emit }) { const ns = useNamespace("splitter-bar"); const props = __props; const emit = __emit; const isHorizontal = computed(() => props.layout === "horizontal"); const barWrapStyles = computed(() => { if (isHorizontal.value) return { width: 0 }; return { height: 0 }; }); const draggerStyles = computed(() => { return { width: isHorizontal.value ? "16px" : "100%", height: isHorizontal.value ? "100%" : "16px", cursor: !props.resizable ? "auto" : isHorizontal.value ? "ew-resize" : "ns-resize", touchAction: "none" }; }); const draggerPseudoClass = computed(() => { const prefix = ns.e("dragger"); return { [`${prefix}-horizontal`]: isHorizontal.value, [`${prefix}-vertical`]: !isHorizontal.value, [`${prefix}-active`]: !!startPos.value }; }); const startPos = ref(null); const onMousedown = (e) => { if (!props.resizable) return; startPos.value = [e.pageX, e.pageY]; emit("moveStart", props.index); window.addEventListener("mouseup", onMouseUp); window.addEventListener("mousemove", onMouseMove); }; const onTouchStart = (e) => { if (props.resizable && e.touches.length === 1) { e.preventDefault(); const touch = e.touches[0]; startPos.value = [touch.pageX, touch.pageY]; emit("moveStart", props.index); window.addEventListener("touchend", onTouchEnd); window.addEventListener("touchmove", onTouchMove); } }; const onMouseMove = (e) => { const { pageX, pageY } = e; const offsetX = pageX - startPos.value[0]; const offsetY = pageY - startPos.value[1]; const offset = isHorizontal.value ? offsetX : offsetY; emit("moving", props.index, offset); }; const onTouchMove = (e) => { if (e.touches.length === 1) { e.preventDefault(); const touch = e.touches[0]; const offsetX = touch.pageX - startPos.value[0]; const offsetY = touch.pageY - startPos.value[1]; const offset = isHorizontal.value ? offsetX : offsetY; emit("moving", props.index, offset); } }; const onMouseUp = () => { startPos.value = null; window.removeEventListener("mouseup", onMouseUp); window.removeEventListener("mousemove", onMouseMove); emit("moveEnd", props.index); }; const onTouchEnd = () => { startPos.value = null; window.removeEventListener("touchend", onTouchEnd); window.removeEventListener("touchmove", onTouchMove); emit("moveEnd", props.index); }; const StartIcon = computed(() => isHorizontal.value ? arrow_left_default : arrow_up_default); const EndIcon = computed(() => isHorizontal.value ? arrow_right_default : arrow_down_default); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass([unref(ns).b()]), style: normalizeStyle(barWrapStyles.value) }, [ __props.startCollapsible ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass([unref(ns).e("collapse-icon"), unref(ns).e(`${__props.layout}-collapse-icon-start`)]), onClick: _cache[0] || (_cache[0] = ($event) => emit("collapse", __props.index, "start")) }, [renderSlot(_ctx.$slots, "start-collapsible", {}, () => [(openBlock(), createBlock(resolveDynamicComponent(StartIcon.value), { style: { "width": "12px", "height": "12px" } }))])], 2)) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass([ unref(ns).e("dragger"), draggerPseudoClass.value, unref(ns).is("disabled", !__props.resizable), unref(ns).is("lazy", __props.resizable && __props.lazy) ]), style: normalizeStyle(draggerStyles.value), onMousedown, onTouchstart: onTouchStart }, null, 38), __props.endCollapsible ? (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass([unref(ns).e("collapse-icon"), unref(ns).e(`${__props.layout}-collapse-icon-end`)]), onClick: _cache[1] || (_cache[1] = ($event) => emit("collapse", __props.index, "end")) }, [renderSlot(_ctx.$slots, "end-collapsible", {}, () => [(openBlock(), createBlock(resolveDynamicComponent(EndIcon.value), { style: { "width": "12px", "height": "12px" } }))])], 2)) : createCommentVNode("v-if", true) ], 6); }; } }); //#endregion //#region ../../packages/components/splitter/src/split-bar.vue var split_bar_default = split_bar_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/splitter/src/split-panel.vue?vue&type=script&setup=true&lang.ts const COMPONENT_NAME = "ElSplitterPanel"; var split_panel_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: COMPONENT_NAME, __name: "split-panel", props: splitterPanelProps, emits: splitterPanelEmits, setup(__props, { expose: __expose, emit: __emit }) { const ns = useNamespace("splitter-panel"); const props = __props; const emits = __emit; const splitterContext = inject(splitterRootContextKey); if (!splitterContext) throwError(COMPONENT_NAME, "usage: "); const { panels, layout, lazy, containerSize, pxSizes } = toRefs(splitterContext); const { registerPanel, unregisterPanel, onCollapse, onMoveEnd, onMoveStart, onMoving } = splitterContext; const panelEl = ref(); const instance = getCurrentInstance(); const uid = instance.uid; const index = ref(0); const panel = computed(() => panels.value[index.value]); const setIndex = (val) => { index.value = val; }; const panelSize = computed(() => { if (!panel.value) return 0; return pxSizes.value[index.value] ?? 0; }); const nextSize = computed(() => { if (!panel.value) return 0; return pxSizes.value[index.value + 1] ?? 0; }); const nextPanel = computed(() => { if (panel.value) return panels.value[index.value + 1]; return null; }); const isResizable = computed(() => { if (!nextPanel.value) return false; return props.resizable && nextPanel.value?.resizable && (panelSize.value !== 0 || !props.min) && (nextSize.value !== 0 || !nextPanel.value.min); }); const isShowBar = computed(() => { if (!panel.value) return false; return index.value !== panels.value.length - 1; }); const startCollapsible = computed(() => isCollapsible(panel.value, panelSize.value, nextPanel.value, nextSize.value)); const endCollapsible = computed(() => isCollapsible(nextPanel.value, nextSize.value, panel.value, panelSize.value)); function sizeToPx(str) { if (isPct(str)) return getPct(str) * containerSize.value || 0; else if (isPx(str)) return getPx(str); return str ?? 0; } let isSizeUpdating = false; watch(() => props.size, () => { if (!isSizeUpdating && panel.value) { if (!containerSize.value) { panel.value.size = props.size; return; } const size = sizeToPx(props.size); const maxSize = sizeToPx(props.max); const minSize = sizeToPx(props.min); const finalSize = Math.min(Math.max(size, minSize || 0), maxSize || size); if (finalSize !== size) emits("update:size", finalSize); panel.value.size = finalSize; } }); watch(() => panel.value?.size, (val) => { if (val !== props.size) { isSizeUpdating = true; emits("update:size", val); nextTick(() => isSizeUpdating = false); } }); watch(() => props.resizable, (val) => { if (panel.value) panel.value.resizable = val; }); const _panel = reactive({ uid, getVnode: () => instance.vnode, setIndex, ...props, collapsible: computed(() => getCollapsible(props.collapsible)) }); registerPanel(_panel); onBeforeUnmount(() => unregisterPanel(_panel)); __expose({ /** @description splitter-panel html element */ splitterPanelRef: panelEl }); return (_ctx, _cache) => { return openBlock(), createElementBlock(Fragment, null, [createElementVNode("div", mergeProps({ ref_key: "panelEl", ref: panelEl, class: [unref(ns).b()], style: { flexBasis: `${panelSize.value}px` } }, _ctx.$attrs), [renderSlot(_ctx.$slots, "default")], 16), isShowBar.value ? (openBlock(), createBlock(split_bar_default, { key: 0, index: index.value, layout: unref(layout), lazy: unref(lazy), resizable: isResizable.value, "start-collapsible": startCollapsible.value, "end-collapsible": endCollapsible.value, onMoveStart: unref(onMoveStart), onMoving: unref(onMoving), onMoveEnd: unref(onMoveEnd), onCollapse: unref(onCollapse) }, { "start-collapsible": withCtx(() => [renderSlot(_ctx.$slots, "start-collapsible")]), "end-collapsible": withCtx(() => [renderSlot(_ctx.$slots, "end-collapsible")]), _: 3 }, 8, [ "index", "layout", "lazy", "resizable", "start-collapsible", "end-collapsible", "onMoveStart", "onMoving", "onMoveEnd", "onCollapse" ])) : createCommentVNode("v-if", true)], 64); }; } }); //#endregion //#region ../../packages/components/splitter/src/split-panel.vue var split_panel_default = split_panel_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/splitter/index.ts const ElSplitter = withInstall(splitter_default, { SplitPanel: split_panel_default }); const ElSplitterPanel = withNoopInstall(split_panel_default); //#endregion //#region ../../packages/element-plus/component.ts var component_default = [ ElAffix, ElAlert, ElAutocomplete, ElAutoResizer, ElAvatar, ElAvatarGroup, ElBacktop, ElBadge, ElBreadcrumb, ElBreadcrumbItem, ElButton, ElButtonGroup, ElCalendar, ElCard, ElCarousel, ElCarouselItem, ElCascader, ElCascaderPanel, ElCheckTag, ElCheckbox, ElCheckboxButton, ElCheckboxGroup, ElCol, ElCollapse, ElCollapseItem, ElCollapseTransition, ElColorPickerPanel, ElColorPicker, ElConfigProvider, ElContainer, ElAside, ElFooter, ElHeader, ElMain, ElDatePicker, ElDatePickerPanel, ElDescriptions, ElDescriptionsItem, ElDialog, ElDivider, ElDrawer, ElDropdown, ElDropdownItem, ElDropdownMenu, ElEmpty, ElForm, ElFormItem, ElIcon, ElImage, ElImageViewer, ElInput, ElInputNumber, ElInputTag, ElInputOtp, ElLink, ElMenu, ElMenuItem, ElMenuItemGroup, ElSubMenu, ElPageHeader, ElPagination, ElPopconfirm, ElPopover, ElPopper, ElProgress, ElRadio, ElRadioButton, ElRadioGroup, ElRate, ElResult, ElRow, ElScrollbar, ElSelect, ElOption, ElOptionGroup, ElSelectV2, ElSkeleton, ElSkeletonItem, ElSlider, ElSpace, ElStatistic, ElCountdown, ElSteps, ElStep, ElSwitch, ElTable, ElTableColumn, ElTableV2, ElTabs, ElTabPane, ElTag, ElText, ElTimePicker, ElTimeSelect, ElTimeline, ElTimelineItem, ElTooltip, ElTransfer, ElTree, ElTreeSelect, ElTreeV2, ElUpload, ElWatermark, ElTour, ElTourStep, ElAnchor, ElAnchorLink, ElSegmented, ElMention, ElSplitter, ElSplitterPanel ]; //#endregion //#region ../../packages/components/infinite-scroll/src/index.ts const SCOPE$1 = "ElInfiniteScroll"; const CHECK_INTERVAL = 50; const DEFAULT_DELAY = 200; const DEFAULT_DISTANCE = 0; const attributes = { delay: { type: Number, default: 200 }, distance: { type: Number, default: 0 }, disabled: { type: Boolean, default: false }, immediate: { type: Boolean, default: true } }; const getScrollOptions = (el, instance) => { return Object.entries(attributes).reduce((acm, [name, option]) => { const { type, default: defaultValue } = option; const attrVal = el.getAttribute(`infinite-scroll-${name}`); let value = instance[attrVal] ?? attrVal ?? defaultValue; value = value === "false" ? false : value; value = type(value); acm[name] = Number.isNaN(value) ? defaultValue : value; return acm; }, {}); }; const destroyObserver = (el) => { const { observer } = el[SCOPE$1]; if (observer) { observer.disconnect(); delete el[SCOPE$1].observer; } }; const handleScroll = (el, cb) => { const { container, containerEl, instance, observer, lastScrollTop } = el[SCOPE$1]; const { disabled, distance } = getScrollOptions(el, instance); const { clientHeight, scrollHeight, scrollTop } = containerEl; const delta = scrollTop - lastScrollTop; el[SCOPE$1].lastScrollTop = scrollTop; if (observer || disabled || delta < 0) return; let shouldTrigger = false; if (container === el) shouldTrigger = scrollHeight - (clientHeight + scrollTop) <= distance; else { const { clientTop, scrollHeight: height } = el; const offsetTop = getOffsetTopDistance(el, containerEl); shouldTrigger = scrollTop + clientHeight >= offsetTop + clientTop + height - distance; } if (shouldTrigger) cb.call(instance); }; function checkFull(el, cb) { const { containerEl, instance } = el[SCOPE$1]; const { disabled } = getScrollOptions(el, instance); if (disabled || containerEl.clientHeight === 0) return; if (containerEl.scrollHeight <= containerEl.clientHeight) cb.call(instance); else destroyObserver(el); } const InfiniteScroll = { async mounted(el, binding) { const { instance, value: cb } = binding; useDeprecated({ scope: SCOPE$1, from: "the directive v-infinite-scroll", replacement: "the el-scrollbar infinite scroll", version: "3.0.0", ref: "https://element-plus.org/en-US/component/scrollbar#infinite-scroll" }, true); if (!isFunction$1(cb)) throwError(SCOPE$1, "'v-infinite-scroll' binding value must be a function"); await nextTick(); const { delay, immediate } = getScrollOptions(el, instance); const container = getScrollContainer(el, true); const containerEl = container === window ? document.documentElement : container; const onScroll = throttle(handleScroll.bind(null, el, cb), delay); if (!container) return; el[SCOPE$1] = { instance, container, containerEl, delay, cb, onScroll, lastScrollTop: containerEl.scrollTop }; if (immediate) { const observer = new MutationObserver(throttle(checkFull.bind(null, el, cb), 50)); el[SCOPE$1].observer = observer; observer.observe(el, { childList: true, subtree: true }); checkFull(el, cb); } container.addEventListener("scroll", onScroll); }, unmounted(el) { if (!el["ElInfiniteScroll"]) return; const { container, onScroll } = el[SCOPE$1]; container?.removeEventListener("scroll", onScroll); destroyObserver(el); }, async updated(el) { if (!el["ElInfiniteScroll"]) await nextTick(); else { const { containerEl, cb, observer } = el[SCOPE$1]; if (containerEl.clientHeight && observer) checkFull(el, cb); } } }; //#endregion //#region ../../packages/components/infinite-scroll/index.ts const _InfiniteScroll = InfiniteScroll; _InfiniteScroll.install = (app) => { app.directive("InfiniteScroll", _InfiniteScroll); }; const ElInfiniteScroll = _InfiniteScroll; //#endregion //#region ../../packages/components/loading/src/loading.ts function createLoadingComponent(options, appContext) { let afterLeaveTimer; const afterLeaveFlag = ref(false); const data = reactive({ ...options, originalPosition: "", originalOverflow: "", visible: false }); function setText(text) { data.text = text; } function destroySelf() { const target = data.parent; const ns = vm.ns; if (!target.vLoadingAddClassList) { let loadingNumber = target.getAttribute("loading-number"); loadingNumber = Number.parseInt(loadingNumber) - 1; if (!loadingNumber) { removeClass(target, ns.bm("parent", "relative")); target.removeAttribute("loading-number"); } else target.setAttribute("loading-number", loadingNumber.toString()); removeClass(target, ns.bm("parent", "hidden")); } removeElLoadingChild(); loadingInstance.unmount(); } function removeElLoadingChild() { vm.$el?.parentNode?.removeChild(vm.$el); } function close() { if (options.beforeClose && !options.beforeClose()) return; afterLeaveFlag.value = true; clearTimeout(afterLeaveTimer); afterLeaveTimer = setTimeout(handleAfterLeave, 400); data.visible = false; options.closed?.(); } function handleAfterLeave() { if (!afterLeaveFlag.value) return; const target = data.parent; afterLeaveFlag.value = false; target.vLoadingAddClassList = void 0; destroySelf(); } const loadingInstance = createApp(defineComponent({ name: "ElLoading", setup(_, { expose }) { const { ns, zIndex } = useGlobalComponentSettings("loading"); expose({ ns, zIndex }); return () => { const svg = data.spinner || data.svg; const spinner = h("svg", { class: "circular", viewBox: data.svgViewBox ? data.svgViewBox : "0 0 50 50", ...svg ? { innerHTML: svg } : {} }, [h("circle", { class: "path", cx: "25", cy: "25", r: "20", fill: "none" })]); const spinnerText = data.text ? h("p", { class: ns.b("text") }, [data.text]) : void 0; return h(Transition, { name: ns.b("fade"), onAfterLeave: handleAfterLeave }, { default: withCtx(() => [withDirectives(createVNode("div", { style: { backgroundColor: data.background || "" }, class: [ ns.b("mask"), data.customClass, ns.is("fullscreen", data.fullscreen) ] }, [h("div", { class: ns.b("spinner") }, [spinner, spinnerText])]), [[vShow, data.visible]])]) }); }; } })); Object.assign(loadingInstance._context, appContext ?? {}); const vm = loadingInstance.mount(document.createElement("div")); return { ...toRefs(data), setText, removeElLoadingChild, close, handleAfterLeave, vm, get $el() { return vm.$el; } }; } //#endregion //#region ../../packages/components/loading/src/service.ts let fullscreenInstance = void 0; const Loading = function(options = {}, context) { if (!isClient) return void 0; const resolved = resolveOptions(options); if (resolved.fullscreen && fullscreenInstance) return fullscreenInstance; const instance = createLoadingComponent({ ...resolved, closed: () => { resolved.closed?.(); if (resolved.fullscreen) fullscreenInstance = void 0; } }, context ?? Loading._context); addStyle(resolved, resolved.parent, instance); addClassList(resolved, resolved.parent, instance); resolved.parent.vLoadingAddClassList = () => addClassList(resolved, resolved.parent, instance); /** * add loading-number to parent. * because if a fullscreen loading is triggered when somewhere * a v-loading.body was triggered before and it's parent is * document.body which with a margin , the fullscreen loading's * destroySelf function will remove 'el-loading-parent--relative', * and then the position of v-loading.body will be error. */ let loadingNumber = resolved.parent.getAttribute("loading-number"); if (!loadingNumber) loadingNumber = "1"; else loadingNumber = `${Number.parseInt(loadingNumber) + 1}`; resolved.parent.setAttribute("loading-number", loadingNumber); resolved.parent.appendChild(instance.$el); nextTick(() => instance.visible.value = resolved.visible); if (resolved.fullscreen) fullscreenInstance = instance; return instance; }; const resolveOptions = (options) => { let target; if (isString(options.target)) target = document.querySelector(options.target) ?? document.body; else target = options.target || document.body; return { parent: target === document.body || options.body ? document.body : target, background: options.background || "", svg: options.svg || "", svgViewBox: options.svgViewBox || "", spinner: options.spinner || false, text: options.text || "", fullscreen: target === document.body && (options.fullscreen ?? true), lock: options.lock ?? false, customClass: options.customClass || "", visible: options.visible ?? true, beforeClose: options.beforeClose, closed: options.closed, target }; }; const addStyle = async (options, parent, instance) => { const { nextZIndex } = instance.vm.zIndex || instance.vm._.exposed.zIndex; const maskStyle = {}; if (options.fullscreen) { instance.originalPosition.value = getStyle(document.body, "position"); instance.originalOverflow.value = getStyle(document.body, "overflow"); maskStyle.zIndex = nextZIndex(); } else if (options.parent === document.body) { instance.originalPosition.value = getStyle(document.body, "position"); /** * await dom render when visible is true in init, * because some component's height maybe 0. * e.g. el-table. */ await nextTick(); for (const property of ["top", "left"]) { const scroll = property === "top" ? "scrollTop" : "scrollLeft"; maskStyle[property] = `${options.target.getBoundingClientRect()[property] + document.body[scroll] + document.documentElement[scroll] - Number.parseInt(getStyle(document.body, `margin-${property}`), 10)}px`; } for (const property of ["height", "width"]) maskStyle[property] = `${options.target.getBoundingClientRect()[property]}px`; } else instance.originalPosition.value = getStyle(parent, "position"); for (const [key, value] of Object.entries(maskStyle)) instance.$el.style[key] = value; }; const addClassList = (options, parent, instance) => { const ns = instance.vm.ns || instance.vm._.exposed.ns; if (![ "absolute", "fixed", "sticky" ].includes(instance.originalPosition.value)) addClass(parent, ns.bm("parent", "relative")); else removeClass(parent, ns.bm("parent", "relative")); if (options.fullscreen && options.lock) addClass(parent, ns.bm("parent", "hidden")); else removeClass(parent, ns.bm("parent", "hidden")); }; Loading._context = null; //#endregion //#region ../../packages/components/loading/src/directive.ts const INSTANCE_KEY = Symbol("ElLoading"); const getAttributeName = (name) => { return `element-loading-${hyphenate(name)}`; }; const createInstance = (el, binding) => { const vm = binding.instance; const getBindingProp = (key) => isObject$1(binding.value) ? binding.value[key] : void 0; const resolveExpression = (key) => { return ref(isString(key) && vm?.[key] || key); }; const getProp = (name) => resolveExpression(getBindingProp(name) || el.getAttribute(getAttributeName(name))); const fullscreen = getBindingProp("fullscreen") ?? binding.modifiers.fullscreen; const options = { text: getProp("text"), svg: getProp("svg"), svgViewBox: getProp("svgViewBox"), spinner: getProp("spinner"), background: getProp("background"), customClass: getProp("customClass"), fullscreen, target: getBindingProp("target") ?? (fullscreen ? void 0 : el), body: getBindingProp("body") ?? binding.modifiers.body, lock: getBindingProp("lock") ?? binding.modifiers.lock }; const instance = Loading(options); instance._context = vLoading._context; el[INSTANCE_KEY] = { options, instance }; }; const updateOptions = (originalOptions, newOptions) => { for (const key of Object.keys(originalOptions)) if (isRef(originalOptions[key])) originalOptions[key].value = newOptions[key]; }; const vLoading = { mounted(el, binding) { if (binding.value) createInstance(el, binding); }, updated(el, binding) { const instance = el[INSTANCE_KEY]; if (!binding.value) { instance?.instance.close(); el[INSTANCE_KEY] = null; return; } if (!instance) createInstance(el, binding); else updateOptions(instance.options, isObject$1(binding.value) ? binding.value : { text: el.getAttribute(getAttributeName("text")), svg: el.getAttribute(getAttributeName("svg")), svgViewBox: el.getAttribute(getAttributeName("svgViewBox")), spinner: el.getAttribute(getAttributeName("spinner")), background: el.getAttribute(getAttributeName("background")), customClass: el.getAttribute(getAttributeName("customClass")) }); }, unmounted(el) { el[INSTANCE_KEY]?.instance.close(); el[INSTANCE_KEY] = null; } }; vLoading._context = null; //#endregion //#region ../../packages/components/loading/index.ts const ElLoading = { install(app) { Loading._context = app._context; vLoading._context = app._context; app.directive("loading", vLoading); app.config.globalProperties.$loading = Loading; }, directive: vLoading, service: Loading }; //#endregion //#region ../../packages/components/message/src/message.ts const messageTypes = [ "primary", "success", "info", "warning", "error" ]; const messagePlacement = [ "top", "top-left", "top-right", "bottom", "bottom-left", "bottom-right" ]; const MESSAGE_DEFAULT_PLACEMENT = "top"; const messageDefaults = mutable({ customClass: "", dangerouslyUseHTMLString: false, duration: 3e3, icon: void 0, id: "", message: "", onClose: void 0, showClose: false, type: "info", plain: false, offset: 16, placement: void 0, zIndex: 0, grouping: false, repeatNum: 1, appendTo: isClient ? document.body : void 0 }); /** * @deprecated Removed after 3.0.0, Use `MessageProps` instead. */ const messageProps = buildProps({ /** * @description custom class name for Message */ customClass: { type: String, default: messageDefaults.customClass }, /** * @description whether `message` is treated as HTML string */ dangerouslyUseHTMLString: { type: Boolean, default: messageDefaults.dangerouslyUseHTMLString }, /** * @description display duration, millisecond. If set to 0, it will not turn off automatically */ duration: { type: Number, default: messageDefaults.duration }, /** * @description custom icon component, overrides `type` */ icon: { type: iconPropType, default: messageDefaults.icon }, /** * @description message dom id */ id: { type: String, default: messageDefaults.id }, /** * @description message text */ message: { type: definePropType([ String, Object, Function ]), default: messageDefaults.message }, /** * @description callback function when closed with the message instance as the parameter */ onClose: { type: definePropType(Function), default: messageDefaults.onClose }, /** * @description whether to show a close button */ showClose: { type: Boolean, default: messageDefaults.showClose }, /** * @description message type */ type: { type: String, values: messageTypes, default: messageDefaults.type }, /** * @description whether message is plain */ plain: { type: Boolean, default: messageDefaults.plain }, /** * @description set the distance to the top of viewport */ offset: { type: Number, default: messageDefaults.offset }, /** * @description message placement position */ placement: { type: String, values: messagePlacement, default: messageDefaults.placement }, /** * @description message element zIndex value */ zIndex: { type: Number, default: messageDefaults.zIndex }, /** * @description merge messages with the same content, type of VNode message is not supported */ grouping: { type: Boolean, default: messageDefaults.grouping }, /** * @description The number of repetitions, similar to badge, is used as the initial number when used with `grouping` */ repeatNum: { type: Number, default: messageDefaults.repeatNum } }); const messageEmits = { destroy: () => true }; //#endregion //#region ../../packages/components/message/src/instance.ts const placementInstances = shallowReactive({}); const getOrCreatePlacementInstances = (placement) => { if (!placementInstances[placement]) placementInstances[placement] = shallowReactive([]); return placementInstances[placement]; }; const getInstance = (id, placement) => { const instances = placementInstances[placement] || []; const idx = instances.findIndex((instance) => instance.id === id); const current = instances[idx]; let prev; if (idx > 0) prev = instances[idx - 1]; return { current, prev }; }; const getLastOffset = (id, placement) => { const { prev } = getInstance(id, placement); if (!prev) return 0; return prev.vm.exposed.bottom.value; }; const getOffsetOrSpace = (id, offset, placement) => { return (placementInstances[placement] || []).findIndex((instance) => instance.id === id) > 0 ? 16 : offset; }; //#endregion //#region ../../packages/components/message/src/message.vue?vue&type=script&setup=true&lang.ts const _hoisted_1$2 = ["id"]; const _hoisted_2$2 = ["innerHTML"]; var message_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElMessage", __name: "message", props: messageProps, emits: messageEmits, setup(__props, { expose: __expose, emit: __emit }) { const { Close } = TypeComponents; const props = __props; const emit = __emit; const isStartTransition = ref(false); const { ns, zIndex } = useGlobalComponentSettings("message"); const { currentZIndex, nextZIndex } = zIndex; const messageRef = ref(); const visible = ref(false); const height = ref(0); let stopTimer = void 0; const badgeType = computed(() => props.type ? props.type === "error" ? "danger" : props.type : "info"); const typeClass = computed(() => { const type = props.type; return { [ns.bm("icon", type)]: type && TypeComponentsMap[type] }; }); const iconComponent = computed(() => props.icon || TypeComponentsMap[props.type] || ""); const placement = computed(() => props.placement || "top"); const lastOffset = computed(() => getLastOffset(props.id, placement.value)); const offset = computed(() => { return Math.max(getOffsetOrSpace(props.id, props.offset, placement.value) + lastOffset.value, props.offset); }); const bottom = computed(() => height.value + offset.value); const horizontalClass = computed(() => { if (placement.value.includes("left")) return ns.is("left"); if (placement.value.includes("right")) return ns.is("right"); return ns.is("center"); }); const verticalProperty = computed(() => placement.value.startsWith("top") ? "top" : "bottom"); const customStyle = computed(() => ({ [verticalProperty.value]: `${offset.value}px`, zIndex: currentZIndex.value })); function startTimer() { if (props.duration === 0) return; ({stop: stopTimer} = useTimeoutFn(() => { close(); }, props.duration)); } function clearTimer() { stopTimer?.(); } function close() { visible.value = false; nextTick(() => { if (!isStartTransition.value) { props.onClose?.(); emit("destroy"); } }); } function keydown(event) { if (getEventCode(event) === EVENT_CODE.esc) close(); } onMounted(() => { startTimer(); nextZIndex(); visible.value = true; }); watch(() => props.repeatNum, () => { clearTimer(); startTimer(); }); useEventListener(document, "keydown", keydown); useResizeObserver(messageRef, () => { height.value = messageRef.value.getBoundingClientRect().height; }); __expose({ visible, bottom, close }); return (_ctx, _cache) => { return openBlock(), createBlock(Transition, { name: unref(ns).b("fade"), onBeforeEnter: _cache[0] || (_cache[0] = ($event) => isStartTransition.value = true), onBeforeLeave: __props.onClose, onAfterLeave: _cache[1] || (_cache[1] = ($event) => _ctx.$emit("destroy")), persisted: "" }, { default: withCtx(() => [withDirectives(createElementVNode("div", { id: __props.id, ref_key: "messageRef", ref: messageRef, class: normalizeClass([ unref(ns).b(), { [unref(ns).m(__props.type)]: __props.type }, unref(ns).is("closable", __props.showClose), unref(ns).is("plain", __props.plain), unref(ns).is("bottom", verticalProperty.value === "bottom"), horizontalClass.value, __props.customClass ]), style: normalizeStyle(customStyle.value), role: "alert", onMouseenter: clearTimer, onMouseleave: startTimer }, [ __props.repeatNum > 1 ? (openBlock(), createBlock(unref(ElBadge), { key: 0, value: __props.repeatNum, type: badgeType.value, class: normalizeClass(unref(ns).e("badge")) }, null, 8, [ "value", "type", "class" ])) : createCommentVNode("v-if", true), iconComponent.value ? (openBlock(), createBlock(unref(ElIcon), { key: 1, class: normalizeClass([unref(ns).e("icon"), typeClass.value]) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(iconComponent.value)))]), _: 1 }, 8, ["class"])) : createCommentVNode("v-if", true), !__props.dangerouslyUseHTMLString || _ctx.$slots.default ? (openBlock(), createElementBlock("p", { key: 2, class: normalizeClass(unref(ns).e("content")) }, [renderSlot(_ctx.$slots, "default", {}, () => [createTextVNode(toDisplayString(__props.message), 1)])], 2)) : (openBlock(), createElementBlock(Fragment, { key: 3 }, [createCommentVNode(" Caution here, message could've been compromised, never use user's input as message "), createElementVNode("p", { class: normalizeClass(unref(ns).e("content")), innerHTML: __props.message }, null, 10, _hoisted_2$2)], 2112)), __props.showClose ? (openBlock(), createBlock(unref(ElIcon), { key: 4, class: normalizeClass(unref(ns).e("closeBtn")), onClick: withModifiers(close, ["stop"]) }, { default: withCtx(() => [createVNode(unref(Close))]), _: 1 }, 8, ["class"])) : createCommentVNode("v-if", true) ], 46, _hoisted_1$2), [[vShow, visible.value]])]), _: 3 }, 8, ["name", "onBeforeLeave"]); }; } }); //#endregion //#region ../../packages/components/message/src/message.vue var message_default = message_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/message/src/method.ts let seed$1 = 1; const normalizeAppendTo = (normalized) => { if (!normalized.appendTo) normalized.appendTo = document.body; else if (isString(normalized.appendTo)) { let appendTo = document.querySelector(normalized.appendTo); if (!isElement$1(appendTo)) { /* @__PURE__ */ debugWarn("ElMessage", "the appendTo option is not an HTMLElement. Falling back to document.body."); appendTo = document.body; } normalized.appendTo = appendTo; } }; const normalizePlacement = (normalized) => { if (!normalized.placement && isString(messageConfig.placement) && messageConfig.placement) normalized.placement = messageConfig.placement; if (!normalized.placement) normalized.placement = "top"; if (!messagePlacement.includes(normalized.placement)) { /* @__PURE__ */ debugWarn("ElMessage", `Invalid placement: ${normalized.placement}. Falling back to '${"top"}'.`); normalized.placement = "top"; } }; const normalizeOptions = (params) => { const options = !params || isString(params) || isVNode(params) || isFunction$1(params) ? { message: params } : params; const normalized = { ...messageDefaults, ...options }; normalizeAppendTo(normalized); normalizePlacement(normalized); if (isBoolean(messageConfig.grouping) && !normalized.grouping) normalized.grouping = messageConfig.grouping; if (isNumber(messageConfig.duration) && normalized.duration === 3e3) normalized.duration = messageConfig.duration; if (isNumber(messageConfig.offset) && normalized.offset === 16) normalized.offset = messageConfig.offset; if (isBoolean(messageConfig.showClose) && !normalized.showClose) normalized.showClose = messageConfig.showClose; if (isBoolean(messageConfig.plain) && !normalized.plain) normalized.plain = messageConfig.plain; return normalized; }; const closeMessage = (instance) => { const instances = placementInstances[instance.props.placement || "top"]; const idx = instances.indexOf(instance); if (idx === -1) return; instances.splice(idx, 1); const { handler } = instance; handler.close(); }; const createMessage = ({ appendTo, ...options }, context) => { const id = `message_${seed$1++}`; const userOnClose = options.onClose; const container = document.createElement("div"); const props = { ...options, id, onClose: () => { userOnClose?.(); closeMessage(instance); }, onDestroy: () => { render(null, container); } }; const vnode = createVNode(message_default, props, isFunction$1(props.message) || isVNode(props.message) ? { default: isFunction$1(props.message) ? props.message : () => props.message } : null); vnode.appContext = context || message._context; render(vnode, container); appendTo.appendChild(container.firstElementChild); const vm = vnode.component; const instance = { id, vnode, vm, handler: { close: () => { vm.exposed.close(); } }, props: vnode.component.props }; return instance; }; const message = (options = {}, context) => { if (!isClient) return { close: () => void 0 }; const normalized = normalizeOptions(options); const instances = getOrCreatePlacementInstances(normalized.placement || "top"); if (normalized.grouping && instances.length) { const instance = instances.find(({ vnode: vm }) => vm.props?.message === normalized.message); if (instance) { instance.props.repeatNum += 1; instance.props.type = normalized.type; return instance.handler; } } if (isNumber(messageConfig.max) && instances.length >= messageConfig.max) return { close: () => void 0 }; const instance = createMessage(normalized, context); instances.push(instance); return instance.handler; }; messageTypes.forEach((type) => { message[type] = (options = {}, appContext) => { return message({ ...normalizeOptions(options), type }, appContext); }; }); function closeAll$1(type) { for (const placement in placementInstances) if (hasOwn(placementInstances, placement)) { const instances = [...placementInstances[placement]]; for (const instance of instances) if (!type || type === instance.props.type) instance.handler.close(); } } function closeAllByPlacement(placement) { if (!placementInstances[placement]) return; [...placementInstances[placement]].forEach((instance) => instance.handler.close()); } message.closeAll = closeAll$1; message.closeAllByPlacement = closeAllByPlacement; message._context = null; //#endregion //#region ../../packages/components/message/index.ts const ElMessage = withInstallFunction(message, "$message"); //#endregion //#region ../../packages/components/message-box/src/index.vue?vue&type=script&lang.ts var index_vue_vue_type_script_lang_default = defineComponent({ name: "ElMessageBox", directives: { TrapFocus }, components: { ElButton, ElFocusTrap: focus_trap_default, ElInput, ElOverlay, ElIcon, ...TypeComponents }, inheritAttrs: false, props: { buttonSize: { type: String, validator: isValidComponentSize }, modal: { type: Boolean, default: true }, lockScroll: { type: Boolean, default: true }, showClose: { type: Boolean, default: true }, closeOnClickModal: { type: Boolean, default: true }, closeOnPressEscape: { type: Boolean, default: true }, closeOnHashChange: { type: Boolean, default: true }, center: Boolean, draggable: Boolean, overflow: Boolean, roundButton: Boolean, container: { type: String, default: "body" }, boxType: { type: String, default: "" } }, emits: ["vanish", "action"], setup(props, { emit }) { const { locale, zIndex, ns, size: btnSize } = useGlobalComponentSettings("message-box", computed(() => props.buttonSize)); const { t } = locale; const { nextZIndex } = zIndex; const visible = ref(false); const state = reactive({ autofocus: true, beforeClose: null, callback: null, cancelButtonText: "", cancelButtonClass: "", confirmButtonText: "", confirmButtonClass: "", cancelButtonType: "", confirmButtonType: "primary", customClass: "", customStyle: {}, dangerouslyUseHTMLString: false, distinguishCancelAndClose: false, icon: "", closeIcon: "", inputPattern: null, inputPlaceholder: "", inputType: "text", inputValue: "", inputValidator: void 0, inputErrorMessage: "", message: "", modalFade: true, modalClass: "", showCancelButton: false, showConfirmButton: true, type: "", title: void 0, showInput: false, action: "", confirmButtonLoading: false, cancelButtonLoading: false, confirmButtonLoadingIcon: markRaw(loading_default), cancelButtonLoadingIcon: markRaw(loading_default), confirmButtonDisabled: false, editorErrorMessage: "", validateError: false, zIndex: nextZIndex() }); const typeClass = computed(() => { const type = state.type; return { [ns.bm("icon", type)]: type && TypeComponentsMap[type] }; }); const contentId = useId(); const inputId = useId(); const iconComponent = computed(() => { const type = state.type; return state.icon || type && TypeComponentsMap[type] || ""; }); const hasMessage = computed(() => !!state.message); const rootRef = ref(); const headerRef = ref(); const focusStartRef = ref(); const inputRef = ref(); const confirmRef = ref(); const confirmButtonClasses = computed(() => state.confirmButtonClass); watch(() => state.inputValue, async (val) => { await nextTick(); if (props.boxType === "prompt" && val) validate(); }, { immediate: true }); watch(() => visible.value, (val) => { if (val) { if (props.boxType !== "prompt") if (state.autofocus) focusStartRef.value = confirmRef.value?.$el ?? rootRef.value; else focusStartRef.value = rootRef.value; state.zIndex = nextZIndex(); } if (props.boxType !== "prompt") return; if (val) nextTick().then(() => { if (inputRef.value && inputRef.value.$el) if (state.autofocus) focusStartRef.value = getInputElement() ?? rootRef.value; else focusStartRef.value = rootRef.value; }); else { state.editorErrorMessage = ""; state.validateError = false; } }); const { isDragging } = useDraggable(rootRef, headerRef, computed(() => props.draggable), computed(() => props.overflow)); onMounted(async () => { await nextTick(); if (props.closeOnHashChange) window.addEventListener("hashchange", doClose); }); onBeforeUnmount(() => { if (props.closeOnHashChange) window.removeEventListener("hashchange", doClose); }); function doClose() { if (!visible.value) return; visible.value = false; nextTick(() => { if (state.action) emit("action", state.action); }); } const handleWrapperClick = () => { if (props.closeOnClickModal) handleAction(state.distinguishCancelAndClose ? "close" : "cancel"); }; const overlayEvent = useSameTarget(handleWrapperClick); const handleInputEnter = (e) => { if (state.inputType !== "textarea" && !inputRef.value?.isComposing) { e.preventDefault(); return handleAction("confirm"); } }; const handleAction = (action) => { if (props.boxType === "prompt" && action === "confirm" && !validate()) return; state.action = action; if (state.beforeClose) state.beforeClose?.(action, state, doClose); else doClose(); }; const validate = () => { if (props.boxType === "prompt") { const inputPattern = state.inputPattern; if (inputPattern && !inputPattern.test(state.inputValue || "")) { state.editorErrorMessage = state.inputErrorMessage || t("el.messagebox.error"); state.validateError = true; return false; } const inputValidator = state.inputValidator; if (isFunction$1(inputValidator)) { const validateResult = inputValidator(state.inputValue); if (validateResult === false) { state.editorErrorMessage = state.inputErrorMessage || t("el.messagebox.error"); state.validateError = true; return false; } if (isString(validateResult)) { state.editorErrorMessage = validateResult; state.validateError = true; return false; } } } state.editorErrorMessage = ""; state.validateError = false; return true; }; const getInputElement = () => { const inputRefs = inputRef.value?.$refs; return inputRefs?.input ?? inputRefs?.textarea; }; const handleClose = () => { handleAction("close"); }; const onCloseRequested = () => { if (props.closeOnPressEscape) handleClose(); }; if (props.lockScroll) useLockscreen(visible, { ns }); return { ...toRefs(state), ns, overlayEvent, visible, hasMessage, typeClass, contentId, inputId, btnSize, iconComponent, confirmButtonClasses, rootRef, focusStartRef, headerRef, inputRef, isDragging, confirmRef, doClose, handleClose, onCloseRequested, handleWrapperClick, handleInputEnter, handleAction, t }; } }); //#endregion //#region ../../packages/components/message-box/src/index.vue const _hoisted_1$1 = ["aria-label", "aria-describedby"]; const _hoisted_2$1 = ["aria-label"]; const _hoisted_3$1 = ["id"]; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_el_icon = resolveComponent("el-icon"); const _component_el_input = resolveComponent("el-input"); const _component_el_button = resolveComponent("el-button"); const _component_el_focus_trap = resolveComponent("el-focus-trap"); const _component_el_overlay = resolveComponent("el-overlay"); return openBlock(), createBlock(Transition, { name: "fade-in-linear", onAfterLeave: _cache[11] || (_cache[11] = ($event) => _ctx.$emit("vanish")), persisted: "" }, { default: withCtx(() => [withDirectives(createVNode(_component_el_overlay, { "z-index": _ctx.zIndex, "overlay-class": [_ctx.ns.is("message-box"), _ctx.modalClass], mask: _ctx.modal }, { default: withCtx(() => [createElementVNode("div", { role: "dialog", "aria-label": _ctx.title, "aria-modal": "true", "aria-describedby": !_ctx.showInput ? _ctx.contentId : void 0, class: normalizeClass(`${_ctx.ns.namespace.value}-overlay-message-box`), onClick: _cache[8] || (_cache[8] = (...args) => _ctx.overlayEvent.onClick && _ctx.overlayEvent.onClick(...args)), onMousedown: _cache[9] || (_cache[9] = (...args) => _ctx.overlayEvent.onMousedown && _ctx.overlayEvent.onMousedown(...args)), onMouseup: _cache[10] || (_cache[10] = (...args) => _ctx.overlayEvent.onMouseup && _ctx.overlayEvent.onMouseup(...args)) }, [createVNode(_component_el_focus_trap, { loop: "", trapped: _ctx.visible, "focus-trap-el": _ctx.rootRef, "focus-start-el": _ctx.focusStartRef, onReleaseRequested: _ctx.onCloseRequested }, { default: withCtx(() => [createElementVNode("div", { ref: "rootRef", class: normalizeClass([ _ctx.ns.b(), _ctx.customClass, _ctx.ns.is("draggable", _ctx.draggable), _ctx.ns.is("dragging", _ctx.isDragging), { [_ctx.ns.m("center")]: _ctx.center } ]), style: normalizeStyle(_ctx.customStyle), tabindex: "-1", onClick: _cache[7] || (_cache[7] = withModifiers(() => {}, ["stop"])) }, [ _ctx.title !== null && _ctx.title !== void 0 ? (openBlock(), createElementBlock("div", { key: 0, ref: "headerRef", class: normalizeClass([_ctx.ns.e("header"), { "show-close": _ctx.showClose }]) }, [createElementVNode("div", { class: normalizeClass(_ctx.ns.e("title")) }, [_ctx.iconComponent && _ctx.center ? (openBlock(), createBlock(_component_el_icon, { key: 0, class: normalizeClass([_ctx.ns.e("status"), _ctx.typeClass]) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(_ctx.iconComponent)))]), _: 1 }, 8, ["class"])) : createCommentVNode("v-if", true), createElementVNode("span", null, toDisplayString(_ctx.title), 1)], 2), _ctx.showClose ? (openBlock(), createElementBlock("button", { key: 0, type: "button", class: normalizeClass(_ctx.ns.e("headerbtn")), "aria-label": _ctx.t("el.messagebox.close"), onClick: _cache[0] || (_cache[0] = ($event) => _ctx.handleAction(_ctx.distinguishCancelAndClose ? "close" : "cancel")), onKeydown: _cache[1] || (_cache[1] = withKeys(withModifiers(($event) => _ctx.handleAction(_ctx.distinguishCancelAndClose ? "close" : "cancel"), ["prevent"]), ["enter"])) }, [createVNode(_component_el_icon, { class: normalizeClass(_ctx.ns.e("close")) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(_ctx.closeIcon || "close")))]), _: 1 }, 8, ["class"])], 42, _hoisted_2$1)) : createCommentVNode("v-if", true)], 2)) : createCommentVNode("v-if", true), createElementVNode("div", { id: _ctx.contentId, class: normalizeClass(_ctx.ns.e("content")) }, [createElementVNode("div", { class: normalizeClass(_ctx.ns.e("container")) }, [_ctx.iconComponent && !_ctx.center && _ctx.hasMessage ? (openBlock(), createBlock(_component_el_icon, { key: 0, class: normalizeClass([_ctx.ns.e("status"), _ctx.typeClass]) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(_ctx.iconComponent)))]), _: 1 }, 8, ["class"])) : createCommentVNode("v-if", true), _ctx.hasMessage ? (openBlock(), createElementBlock("div", { key: 1, class: normalizeClass(_ctx.ns.e("message")) }, [renderSlot(_ctx.$slots, "default", {}, () => [!_ctx.dangerouslyUseHTMLString ? (openBlock(), createBlock(resolveDynamicComponent(_ctx.showInput ? "label" : "p"), { key: 0, for: _ctx.showInput ? _ctx.inputId : void 0, textContent: toDisplayString(_ctx.message) }, null, 8, ["for", "textContent"])) : (openBlock(), createBlock(resolveDynamicComponent(_ctx.showInput ? "label" : "p"), { key: 1, for: _ctx.showInput ? _ctx.inputId : void 0, innerHTML: _ctx.message }, null, 8, ["for", "innerHTML"]))])], 2)) : createCommentVNode("v-if", true)], 2), withDirectives(createElementVNode("div", { class: normalizeClass(_ctx.ns.e("input")) }, [createVNode(_component_el_input, { id: _ctx.inputId, ref: "inputRef", modelValue: _ctx.inputValue, "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => _ctx.inputValue = $event), type: _ctx.inputType, placeholder: _ctx.inputPlaceholder, "aria-invalid": _ctx.validateError, class: normalizeClass({ invalid: _ctx.validateError }), onKeydown: withKeys(_ctx.handleInputEnter, ["enter"]) }, null, 8, [ "id", "modelValue", "type", "placeholder", "aria-invalid", "class", "onKeydown" ]), createElementVNode("div", { class: normalizeClass(_ctx.ns.e("errormsg")), style: normalizeStyle({ visibility: !!_ctx.editorErrorMessage ? "visible" : "hidden" }) }, toDisplayString(_ctx.editorErrorMessage), 7)], 2), [[vShow, _ctx.showInput]])], 10, _hoisted_3$1), createElementVNode("div", { class: normalizeClass(_ctx.ns.e("btns")) }, [_ctx.showCancelButton ? (openBlock(), createBlock(_component_el_button, { key: 0, type: _ctx.cancelButtonType === "text" ? "" : _ctx.cancelButtonType, text: _ctx.cancelButtonType === "text", loading: _ctx.cancelButtonLoading, "loading-icon": _ctx.cancelButtonLoadingIcon, class: normalizeClass([_ctx.cancelButtonClass]), round: _ctx.roundButton, size: _ctx.btnSize, onClick: _cache[3] || (_cache[3] = ($event) => _ctx.handleAction("cancel")), onKeydown: _cache[4] || (_cache[4] = withKeys(withModifiers(($event) => _ctx.handleAction("cancel"), ["prevent"]), ["enter"])) }, { default: withCtx(() => [createTextVNode(toDisplayString(_ctx.cancelButtonText || _ctx.t("el.messagebox.cancel")), 1)]), _: 1 }, 8, [ "type", "text", "loading", "loading-icon", "class", "round", "size" ])) : createCommentVNode("v-if", true), withDirectives(createVNode(_component_el_button, { ref: "confirmRef", type: _ctx.confirmButtonType === "text" ? "" : _ctx.confirmButtonType, text: _ctx.confirmButtonType === "text", loading: _ctx.confirmButtonLoading, "loading-icon": _ctx.confirmButtonLoadingIcon, class: normalizeClass([_ctx.confirmButtonClasses]), round: _ctx.roundButton, disabled: _ctx.confirmButtonDisabled, size: _ctx.btnSize, onClick: _cache[5] || (_cache[5] = ($event) => _ctx.handleAction("confirm")), onKeydown: _cache[6] || (_cache[6] = withKeys(withModifiers(($event) => _ctx.handleAction("confirm"), ["prevent"]), ["enter"])) }, { default: withCtx(() => [createTextVNode(toDisplayString(_ctx.confirmButtonText || _ctx.t("el.messagebox.confirm")), 1)]), _: 1 }, 8, [ "type", "text", "loading", "loading-icon", "class", "round", "disabled", "size" ]), [[vShow, _ctx.showConfirmButton]])], 2) ], 6)]), _: 3 }, 8, [ "trapped", "focus-trap-el", "focus-start-el", "onReleaseRequested" ])], 42, _hoisted_1$1)]), _: 3 }, 8, [ "z-index", "overlay-class", "mask" ]), [[vShow, _ctx.visible]])]), _: 3 }); } var src_default = /* @__PURE__ */ _plugin_vue_export_helper_default(index_vue_vue_type_script_lang_default, [["render", _sfc_render]]); //#endregion //#region ../../packages/components/message-box/src/messageBox.ts const messageInstance = /* @__PURE__ */ new Map(); const getAppendToElement = (props) => { let appendTo = document.body; if (props.appendTo) { if (isString(props.appendTo)) appendTo = document.querySelector(props.appendTo); if (isElement$1(props.appendTo)) appendTo = props.appendTo; if (!isElement$1(appendTo)) { /* @__PURE__ */ debugWarn("ElMessageBox", "the appendTo option is not an HTMLElement. Falling back to document.body."); appendTo = document.body; } } return appendTo; }; const handleAction = (vnode, action) => { const vm = vnode.component?.proxy; return () => vm.handleAction(action); }; const initInstance = (props, container, appContext = null) => { const vnode = createVNode(src_default, props, isFunction$1(props.message) || isVNode(props.message) ? { default: isFunction$1(props.message) ? () => props.message({ confirm: handleAction(vnode, "confirm"), cancel: handleAction(vnode, "cancel"), close: handleAction(vnode, "close") }) : () => props.message } : null); vnode.appContext = appContext; render(vnode, container); getAppendToElement(props).appendChild(container.firstElementChild); return vnode.component; }; const genContainer = () => { return document.createElement("div"); }; const showMessage = (options, appContext) => { const container = genContainer(); options.onVanish = () => { render(null, container); messageInstance.delete(vm); }; options.onAction = (action) => { const currentMsg = messageInstance.get(vm); let resolve; if (options.showInput) resolve = { value: vm.inputValue, action }; else resolve = action; if (options.callback) options.callback(resolve, instance.proxy); else if (action === "cancel" || action === "close") if (options.distinguishCancelAndClose && action !== "cancel") currentMsg.reject("close"); else currentMsg.reject("cancel"); else currentMsg.resolve(resolve); }; const instance = initInstance(options, container, appContext); const vm = instance.proxy; for (const prop in options) if (hasOwn(options, prop) && !hasOwn(vm.$props, prop)) if (prop === "closeIcon" && isObject$1(options[prop])) vm[prop] = markRaw(options[prop]); else vm[prop] = options[prop]; vm.visible = true; return vm; }; function MessageBox(options, appContext = null) { if (!isClient) return Promise.reject(); let callback; if (isString(options) || isVNode(options)) options = { message: options }; else callback = options.callback; return new Promise((resolve, reject) => { const vm = showMessage(options, appContext ?? MessageBox._context); messageInstance.set(vm, { options, callback, resolve, reject }); }); } const MESSAGE_BOX_VARIANTS = [ "alert", "confirm", "prompt" ]; const MESSAGE_BOX_DEFAULT_OPTS = { alert: { closeOnPressEscape: false, closeOnClickModal: false }, confirm: { showCancelButton: true }, prompt: { showCancelButton: true, showInput: true } }; MESSAGE_BOX_VARIANTS.forEach((boxType) => { MessageBox[boxType] = messageBoxFactory(boxType); }); function messageBoxFactory(boxType) { return (message, title, options, appContext) => { let titleOrOpts = ""; if (isObject$1(title)) { options = title; titleOrOpts = ""; } else if (isUndefined(title)) titleOrOpts = ""; else titleOrOpts = title; return MessageBox(Object.assign({ title: titleOrOpts, message, type: "", ...MESSAGE_BOX_DEFAULT_OPTS[boxType] }, options, { boxType }), appContext); }; } MessageBox.close = () => { messageInstance.forEach((_, vm) => { vm.doClose(); }); messageInstance.clear(); }; MessageBox._context = null; //#endregion //#region ../../packages/components/message-box/index.ts const _MessageBox = MessageBox; _MessageBox.install = (app) => { _MessageBox._context = app._context; app.config.globalProperties.$msgbox = _MessageBox; app.config.globalProperties.$messageBox = _MessageBox; app.config.globalProperties.$alert = _MessageBox.alert; app.config.globalProperties.$confirm = _MessageBox.confirm; app.config.globalProperties.$prompt = _MessageBox.prompt; }; const ElMessageBox = _MessageBox; //#endregion //#region ../../packages/components/notification/src/notification.ts const notificationTypes = [ "primary", "success", "info", "warning", "error" ]; /** * @deprecated Removed after 3.0.0, Use `NotificationProps` instead. */ const notificationProps = buildProps({ /** * @description custom class name for Notification */ customClass: { type: String, default: "" }, /** * @description whether `message` is treated as HTML string */ dangerouslyUseHTMLString: Boolean, /** * @description duration before close. It will not automatically close if set 0 */ duration: { type: Number, default: 4500 }, /** * @description custom icon component. It will be overridden by `type` */ icon: { type: iconPropType }, /** * @description notification dom id */ id: { type: String, default: "" }, /** * @description description text */ message: { type: definePropType([ String, Object, Function ]), default: "" }, /** * @description offset from the top edge of the screen. Every Notification instance of the same moment should have the same offset */ offset: { type: Number, default: 0 }, /** * @description callback function when notification clicked */ onClick: { type: definePropType(Function), default: () => void 0 }, /** * @description callback function when closed */ onClose: { type: definePropType(Function), required: true }, /** * @description custom position */ position: { type: String, values: [ "top-right", "top-left", "bottom-right", "bottom-left" ], default: "top-right" }, /** * @description whether to show a close button */ showClose: { type: Boolean, default: true }, /** * @description title */ title: { type: String, default: "" }, /** * @description notification type */ type: { type: String, values: [...notificationTypes, ""], default: "" }, /** * @description initial zIndex */ zIndex: Number, /** * @description custom close icon, default is Close */ closeIcon: { type: iconPropType, default: close_default } }); const notificationEmits = { destroy: () => true }; //#endregion //#region ../../packages/components/notification/src/notification.vue?vue&type=script&setup=true&lang.ts const _hoisted_1 = ["id"]; const _hoisted_2 = ["textContent"]; const _hoisted_3 = { key: 0 }; const _hoisted_4 = ["innerHTML"]; var notification_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ name: "ElNotification", __name: "notification", props: notificationProps, emits: notificationEmits, setup(__props, { expose: __expose }) { const props = __props; const { ns, zIndex } = useGlobalComponentSettings("notification"); const { nextZIndex, currentZIndex } = zIndex; const visible = ref(false); let timer = void 0; const typeClass = computed(() => { const type = props.type; return type && TypeComponentsMap[props.type] ? ns.m(type) : ""; }); const iconComponent = computed(() => { if (!props.type) return props.icon; return TypeComponentsMap[props.type] || props.icon; }); const horizontalClass = computed(() => props.position.endsWith("right") ? "right" : "left"); const verticalProperty = computed(() => props.position.startsWith("top") ? "top" : "bottom"); const positionStyle = computed(() => { return { [verticalProperty.value]: `${props.offset}px`, zIndex: props.zIndex ?? currentZIndex.value }; }); function startTimer() { if (props.duration > 0) ({stop: timer} = useTimeoutFn(() => { if (visible.value) close(); }, props.duration)); } function clearTimer() { timer?.(); } function close() { visible.value = false; } function onKeydown(event) { switch (getEventCode(event)) { case EVENT_CODE.delete: case EVENT_CODE.backspace: clearTimer(); break; case EVENT_CODE.esc: if (visible.value) close(); break; default: startTimer(); break; } } onMounted(() => { startTimer(); nextZIndex(); visible.value = true; }); useEventListener(document, "keydown", onKeydown); __expose({ visible, /** @description close notification */ close }); return (_ctx, _cache) => { return openBlock(), createBlock(Transition, { name: unref(ns).b("fade"), onBeforeLeave: __props.onClose, onAfterLeave: _cache[1] || (_cache[1] = ($event) => _ctx.$emit("destroy")), persisted: "" }, { default: withCtx(() => [withDirectives(createElementVNode("div", { id: __props.id, class: normalizeClass([ unref(ns).b(), __props.customClass, horizontalClass.value ]), style: normalizeStyle(positionStyle.value), role: "alert", onMouseenter: clearTimer, onMouseleave: startTimer, onClick: _cache[0] || (_cache[0] = (...args) => __props.onClick && __props.onClick(...args)) }, [iconComponent.value ? (openBlock(), createBlock(unref(ElIcon), { key: 0, class: normalizeClass([unref(ns).e("icon"), typeClass.value]) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(iconComponent.value)))]), _: 1 }, 8, ["class"])) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass(unref(ns).e("group")) }, [ createElementVNode("h2", { class: normalizeClass(unref(ns).e("title")), textContent: toDisplayString(__props.title) }, null, 10, _hoisted_2), withDirectives(createElementVNode("div", { class: normalizeClass(unref(ns).e("content")), style: normalizeStyle(!!__props.title ? void 0 : { margin: 0 }) }, [renderSlot(_ctx.$slots, "default", {}, () => [!__props.dangerouslyUseHTMLString ? (openBlock(), createElementBlock("p", _hoisted_3, toDisplayString(__props.message), 1)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [createCommentVNode(" Caution here, message could've been compromised, never use user's input as message "), createElementVNode("p", { innerHTML: __props.message }, null, 8, _hoisted_4)], 2112))])], 6), [[vShow, __props.message]]), __props.showClose ? (openBlock(), createBlock(unref(ElIcon), { key: 0, class: normalizeClass(unref(ns).e("closeBtn")), onClick: withModifiers(close, ["stop"]) }, { default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(__props.closeIcon)))]), _: 1 }, 8, ["class"])) : createCommentVNode("v-if", true) ], 2)], 46, _hoisted_1), [[vShow, visible.value]])]), _: 3 }, 8, ["name", "onBeforeLeave"]); }; } }); //#endregion //#region ../../packages/components/notification/src/notification.vue var notification_default = notification_vue_vue_type_script_setup_true_lang_default; //#endregion //#region ../../packages/components/notification/src/notify.ts const notifications = { "top-left": [], "top-right": [], "bottom-left": [], "bottom-right": [] }; const GAP_SIZE = 16; let seed = 1; const notify = function(options = {}, context) { if (!isClient) return { close: () => void 0 }; if (isString(options) || isVNode(options)) options = { message: options }; const position = options.position || "top-right"; let verticalOffset = options.offset || 0; notifications[position].forEach(({ vm }) => { verticalOffset += (vm.el?.offsetHeight || 0) + GAP_SIZE; }); verticalOffset += GAP_SIZE; const id = `notification_${seed++}`; const userOnClose = options.onClose; const props = { ...options, offset: verticalOffset, id, onClose: () => { close(id, position, userOnClose); } }; let appendTo = document.body; if (isElement$1(options.appendTo)) appendTo = options.appendTo; else if (isString(options.appendTo)) appendTo = document.querySelector(options.appendTo); if (!isElement$1(appendTo)) { /* @__PURE__ */ debugWarn("ElNotification", "the appendTo option is not an HTMLElement. Falling back to document.body."); appendTo = document.body; } const container = document.createElement("div"); const vm = createVNode(notification_default, props, isFunction$1(props.message) ? props.message : isVNode(props.message) ? () => props.message : null); vm.appContext = isUndefined(context) ? notify._context : context; vm.props.onDestroy = () => { render(null, container); }; render(vm, container); notifications[position].push({ vm }); appendTo.appendChild(container.firstElementChild); return { close: () => { vm.component.exposed.visible.value = false; } }; }; notificationTypes.forEach((type) => { notify[type] = (options = {}, appContext) => { if (isString(options) || isVNode(options)) options = { message: options }; return notify({ ...options, type }, appContext); }; }); /** * This function gets called when user click `x` button or press `esc` or the time reached its limitation. * Emitted by transition@before-leave event so that we can fetch the current notification.offsetHeight, if this was called * by @after-leave the DOM element will be removed from the page thus we can no longer fetch the offsetHeight. * @param {String} id notification id to be closed * @param {Position} position the positioning strategy * @param {Function} userOnClose the callback called when close passed by user */ function close(id, position, userOnClose) { const orientedNotifications = notifications[position]; const idx = orientedNotifications.findIndex(({ vm }) => vm.component?.props.id === id); if (idx === -1) return; const { vm } = orientedNotifications[idx]; if (!vm) return; userOnClose?.(vm); const removedHeight = vm.el.offsetHeight; const verticalPos = position.split("-")[0]; orientedNotifications.splice(idx, 1); const len = orientedNotifications.length; if (len < 1) return; for (let i = idx; i < len; i++) { const { el, component } = orientedNotifications[i].vm; const pos = Number.parseInt(el.style[verticalPos], 10) - removedHeight - GAP_SIZE; component.props.offset = pos; } } function closeAll() { for (const orientedNotifications of Object.values(notifications)) orientedNotifications.forEach(({ vm }) => { vm.component.exposed.visible.value = false; }); } function updateOffsets(position = "top-right") { let verticalOffset = notifications[position][0]?.vm.component?.props?.offset || 0; for (const { vm } of notifications[position]) { vm.component.props.offset = verticalOffset; verticalOffset += (vm.el?.offsetHeight || 0) + GAP_SIZE; } } notify.closeAll = closeAll; notify.updateOffsets = updateOffsets; notify._context = null; //#endregion //#region ../../packages/components/notification/index.ts const ElNotification = withInstallFunction(notify, "$notify"); //#endregion //#region ../../packages/element-plus/plugin.ts var plugin_default = [ ElInfiniteScroll, ElLoading, ElMessage, ElMessageBox, ElNotification, ElPopoverDirective ]; //#endregion //#region ../../packages/element-plus/defaults.ts var defaults_default = makeInstaller([...component_default, ...plugin_default]); //#endregion //#region ../../packages/element-plus/index.ts const install = defaults_default.install; const version = defaults_default.version; var element_plus_default = defaults_default; //#endregion var dayjs = import_dayjs_min.default; export { BAR_MAP, BORDER_HORIZONTAL_WIDTH, CAROUSEL_ITEM_NAME, CASCADER_PANEL_HEIGHT, CASCADER_PANEL_INJECTION_KEY, CASCADER_PANEL_ITEM_SIZE, CHANGE_EVENT, ClickOutside, picker_default as CommonPicker, CommonProps, DEFAULT_DIALOG_TRANSITION, DEFAULT_EMPTY_VALUES, DEFAULT_FORMATS_DATE, DEFAULT_FORMATS_DATEPICKER, DEFAULT_FORMATS_TIME, DEFAULT_STEP, DEFAULT_VALUE_ON_CLEAR, DROPDOWN_INJECTION_KEY, DROPDOWN_INSTANCE_INJECTION_KEY, DefaultProps, DynamicSizeGrid, DynamicSizeList, EVENT_CODE, Effect, ElAffix, ElAlert, ElAnchor, ElAnchorLink, ElAside, ElAutoResizer, ElAutocomplete, ElAvatar, ElAvatarGroup, ElBacktop, ElBadge, ElBreadcrumb, ElBreadcrumbItem, ElButton, ElButtonGroup, ElCalendar, ElCard, ElCarousel, ElCarouselItem, ElCascader, ElCascaderPanel, ElCheckTag, ElCheckbox, ElCheckboxButton, ElCheckboxGroup, ElCol, ElCollapse, ElCollapseItem, ElCollapseTransition, ElColorPicker, ElColorPickerPanel, ElConfigProvider, ElContainer, ElCountdown, ElDatePicker, ElDatePickerPanel, ElDescriptions, ElDescriptionsItem, ElDialog, ElDivider, ElDrawer, ElDropdown, ElDropdownItem, ElDropdownMenu, ElEmpty, ElFooter, ElForm, ElFormItem, ElHeader, ElIcon, ElImage, ElImageViewer, ElInfiniteScroll, ElInput, ElInputNumber, ElInputOtp, ElInputTag, ElLink, ElLoading, vLoading as ElLoadingDirective, vLoading, Loading as ElLoadingService, ElMain, ElMention, ElMenu, ElMenuItem, ElMenuItemGroup, ElMessage, ElMessageBox, ElNotification, ElOption, ElOptionGroup, ElOverlay, ElPageHeader, ElPagination, ElPopconfirm, ElPopover, ElPopoverDirective, ElPopper, arrow_default as ElPopperArrow, content_default as ElPopperContent, trigger_default as ElPopperTrigger, ElProgress, ElRadio, ElRadioButton, ElRadioGroup, ElRate, ElResult, ElRow, ElScrollbar, ElSegmented, ElSelect, ElSelectV2, ElSkeleton, ElSkeletonItem, ElSlider, ElSpace, ElSplitter, ElSplitterPanel, ElStatistic, ElStep, ElSteps, ElSubMenu, ElSwitch, ElTabPane, ElTable, ElTableColumn, ElTableV2, ElTabs, ElTag, ElText, ElTimePicker, ElTimeSelect, ElTimeline, ElTimelineItem, ElTooltip, ElTour, ElTourStep, ElTransfer, ElTree, ElTreeSelect, ElTreeV2, ElUpload, ElWatermark, FIRST_KEYS, FIRST_LAST_KEYS, FORWARD_REF_INJECTION_KEY, FixedSizeGrid, FixedSizeList, GAP, ID_INJECTION_KEY, INPUT_EVENT, INSTALLED_KEY, IconComponentMap, IconMap, LAST_KEYS, LEFT_CHECK_CHANGE_EVENT, MENU_INJECTION_KEY, MESSAGE_DEFAULT_PLACEMENT, MINIMUM_INPUT_WIDTH, Mousewheel, NODE_INSTANCE_INJECTION_KEY, PICKER_BASE_INJECTION_KEY, PICKER_POPPER_OPTIONS_INJECTION_KEY, POPPER_CONTENT_INJECTION_KEY, POPPER_INJECTION_KEY, RIGHT_CHECK_CHANGE_EVENT, ROOT_COMMON_COLOR_INJECTION_KEY, ROOT_COMMON_PICKER_INJECTION_KEY, ROOT_PICKER_INJECTION_KEY, ROOT_PICKER_IS_DEFAULT_FORMAT_INJECTION_KEY, ROOT_TREE_INJECTION_KEY, RowAlign, RowJustify, SCOPE, SIZE_INJECTION_KEY, STEPS_INJECTION_KEY, SUB_MENU_INJECTION_KEY, TIMELINE_INJECTION_KEY, TOOLTIP_INJECTION_KEY, TREE_NODE_MAP_INJECTION_KEY, TableV2, Alignment as TableV2Alignment, FixedDir as TableV2FixedDir, placeholderSign as TableV2Placeholder, SortOrder as TableV2SortOrder, panel_time_pick_default as TimePickPanel, TrapFocus, UPDATE_MODEL_EVENT, WEEK_DAYS, ZINDEX_INJECTION_KEY, affixEmits, affixProps, alertEffects, alertEmits, alertProps, anchorEmits, anchorProps, ariaProps, arrowMiddleware, autoResizerProps, autocompleteEmits, autocompleteProps, avatarEmits, avatarGroupContextKey, avatarGroupProps, avatarProps, backtopEmits, backtopProps, badgeProps, breadcrumbItemProps, breadcrumbKey, breadcrumbProps, buildLocaleContext, buildTimeList, buildTranslator, buttonEmits, buttonGroupContextKey, buttonNativeTypes, buttonProps, buttonTypes, calendarEmits, calendarProps, cardContextKey, cardProps, carouselContextKey, carouselEmits, carouselItemProps, carouselProps, cascaderEmits, cascaderPanelEmits, cascaderPanelProps, cascaderProps, checkTagEmits, checkTagProps, checkboxDefaultProps, checkboxEmits, checkboxGroupContextKey, checkboxGroupEmits, checkboxGroupProps, checkboxProps, checkboxPropsDefaults, colProps, collapseContextKey, collapseEmits, collapseItemProps, collapseProps, colorPickerEmits, colorPickerPanelContextKey, colorPickerPanelEmits, colorPickerPanelProps, colorPickerProps, colorPickerPropsDefaults, columnAlignment, componentSizeMap, componentSizes, configProviderContextKey, configProviderProps, countdownEmits, countdownProps, createModelToggleComposable, dateEquals, datePickTypes, datePickerPanelProps, datePickerProps, dayOrDaysToDate, dayjs, element_plus_default as default, defaultInitialZIndex, defaultNamespace, defaultProps, descriptionItemProps, descriptionProps, dialogContextKey, dialogEmits, dialogInjectionKey, dialogProps, dialogPropsDefaults, dividerProps, drawerEmits, drawerProps, dropdownItemProps, dropdownMenuProps, dropdownProps, elPaginationKey, emitChangeFn, emptyProps, emptyValuesContextKey, extractDateFormat, extractTimeFormat, formContextKey, formEmits, formItemContextKey, formItemProps, formItemValidateStates, formMetaProps, formProps, formatter, genFileId, getPositionDataWithUnit, iconProps, imageEmits, imageProps, imageViewerEmits, imageViewerProps, inputEmits, inputNumberEmits, inputNumberProps, inputOtpEmits, inputProps, inputPropsDefaults, inputTagEmits, inputTagProps, install, linkEmits, linkProps, localeContextKey, makeInstaller, makeList, mentionDefaultProps, mentionEmits, mentionProps, menuEmits, menuItemEmits, menuItemGroupProps, menuItemProps, menuProps, messageConfig, messageDefaults, messageEmits, messagePlacement, messageProps, messageTypes, namespaceContextKey, notificationEmits, notificationProps, notificationTypes, overlayEmits, overlayProps, pageHeaderEmits, pageHeaderProps, paginationEmits, paginationProps, parseDate, popconfirmEmits, popconfirmProps, popoverEmits, popoverProps, popoverPropsDefaults, popperArrowProps, popperArrowPropsDefaults, popperContentEmits, popperContentProps, popperContentPropsDefaults, popperCoreConfigProps, popperCoreConfigPropsDefaults, popperProps, popperTriggerProps, progressProps, provideGlobalConfig, radioButtonProps, radioButtonPropsDefaults, radioDefaultProps, radioEmits, radioGroupEmits, radioGroupKey, radioGroupProps, radioGroupPropsDefaults, radioProps, radioPropsBase, radioPropsDefaults, rangeArr, rateEmits, rateProps, renderThumbStyle, resultProps, roleTypes, rowContextKey, rowProps, scrollbarContextKey, scrollbarEmits, scrollbarProps, segmentedEmits, segmentedProps, selectEmits, selectGroupKey, selectKey, selectProps, selectV2InjectionKey, skeletonItemProps, skeletonProps, sliderContextKey, sliderEmits, sliderProps, spaceItemProps, spaceProps, splitterEmits, splitterPanelEmits, splitterPanelProps, splitterProps, statisticProps, stepProps, stepsEmits, stepsProps, subMenuProps, switchEmits, switchProps, tabBarProps, tabNavEmits, tabNavProps, tabPaneProps, tableV2Props, tableV2RowProps, tabsEmits, tabsProps, tabsRootContextKey, tagEmits, tagProps, textProps, thumbProps, timePickerDefaultProps, timePickerRangeTriggerProps, timePickerRngeTriggerProps, timeSelectProps, timeUnits, timelineItemProps, timelineProps, tooltipEmits, tourContentEmits, tourContentProps, tourEmits, tourPlacements, tourProps, tourStepEmits, tourStepProps, tourStrategies, transferCheckedChangeFn, transferEmits, transferProps, translate, treeEmits, treeProps, uploadBaseProps, uploadBasePropsDefaults, uploadContentProps, uploadContentPropsDefaults, uploadContextKey, uploadDraggerEmits, uploadDraggerProps, uploadListEmits, uploadListProps, uploadListTypes, uploadProps, uploadPropsDefaults, useAriaProps, useAttrs, useCalcInputWidth, useCascaderConfig, useComposition, useCursor, useDelayedRender, useDelayedToggle, useDelayedToggleProps, useDelayedTogglePropsDefaults, useDeprecated, useDialog, useDisabled, useDraggable, useEmptyValues, useEmptyValuesProps, useEscapeKeydown, useFloating, useFloatingProps, useFocus, useFocusController, useFormDisabled, useFormItem, useFormItemInputId, useFormSize, useForwardRef, useForwardRefDirective, useGetDerivedNamespace, useGlobalComponentSettings, useGlobalConfig, useGlobalSize, useId, useIdInjection, useLocale, useLockscreen, useModal, useModelToggle, useModelToggleEmits, useModelToggleProps, useNamespace, useOrderedChildren, usePopper, usePopperArrowProps, usePopperContainer, usePopperContainerId, usePopperContentEmits, usePopperContentProps, usePopperCoreConfigProps, usePopperProps, usePopperTriggerProps, usePreventGlobal, useProp, useSameTarget, useSize, useSizeProp, useSizeProps, useSpace, useTeleport, useThrottleRender, useTimeout, useTooltipContentProps, useTooltipContentPropsDefaults, useTooltipModelToggle, useTooltipModelToggleEmits, useTooltipModelToggleProps, useTooltipProps, useTooltipTriggerProps, useTooltipTriggerPropsDefaults, useTransitionFallthrough, useTransitionFallthroughEmits, useZIndex, vRepeatClick, valueEquals, version, virtualizedGridProps, virtualizedListProps, virtualizedProps, virtualizedScrollbarProps, watermarkProps, zIndexContextKey };