guava-ui 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"guava-ui.es.js","sources":["../packages/GvButton/src/GvButton.vue","../packages/GvButton/index.ts","../packages/utils/index.ts","../packages/GvIcon/src/GvIcon.vue","../packages/GvIcon/index.ts","../packages/utils/gv.propTypes.ts","../packages/GvLangSelect/src/GvLangSelect.vue","../packages/GvLangSelect/index.ts","../packages/GvBacktop/src/GvBacktop.vue","../packages/GvBacktop/index.ts","../packages/GvBreadCrumb/src/helper.ts","../packages/utils/gv.tree.ts","../packages/GvBreadCrumb/src/GvBreadCrumb.vue","../packages/GvBreadCrumb/index.ts","../packages/GvHamburger/src/GvHamburger.vue","../packages/GvHamburger/index.ts","../packages/GvScreenFull/src/GvScreenFull.vue","../packages/GvScreenFull/index.ts","../packages/GvSidebar/src/helper.ts","../packages/GvSidebar/src/components/useRenderMenuTitle.tsx","../packages/GvSidebar/src/components/useRenderMenuItem.tsx","../packages/GvSidebar/src/GvSidebar.vue","../packages/GvSidebar/index.ts","../src/assets/imgs/logo.png","../packages/GvSidebarLogo/src/GvSidebarLogo.vue","../packages/GvSidebarLogo/index.ts","../packages/GvTheme/src/GvTheme.vue","../packages/GvTheme/index.ts","../packages/hooks/web/usePinyin.ts","../packages/GvExpandMenu/src/GvMenuList.vue","../packages/GvExpandMenu/src/GvExpandMenu.vue","../packages/GvExpandMenu/index.ts","../packages/GvTagsView/src/GvTagsView.vue","../packages/GvTagsView/index.ts","../packages/bridge/index.ts","../packages/hooks/service/useCrud.ts","../packages/hooks/web/useStorage.ts","../packages/GvNotify/index.ts","../packages/hooks/web/useNotify.ts","../packages/utils/gv.secret.ts","../packages/index.ts"],"sourcesContent":["<!--\n * @title: GvButton组件,基于el-button封装\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-02-27 17:07:51\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-03-12 12:05:36\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { defineComponent, computed, watch } from 'vue';\n import { ElButton } from 'element-plus';\n export default defineComponent({\n name: 'GvButton',\n // --- pass params between parent-child ---\n props: {\n message: {\n type: String,\n default: 'GvButton',\n request: false,\n },\n },\n // --- register components ---\n components: {},\n // --- pass events between parent-child ---\n emits: ['click', 'submit'],\n\n setup(props, { emit, slots }) {\n // --- define computed ---\n // get default slot, Note: check if the slot is empty\n const getSlots = computed(() => slots.default?.());\n\n // --- listen data ---\n watch(\n () => props.message,\n (newVal) => {},\n );\n\n // --- define Methods ---\n const handleClick = (event: MouseEvent, msg: string): void => {\n alert('this is a child event');\n emit('click', event, msg);\n };\n\n return (): any => (\n <ElButton\n class=\"gv-button\"\n onClick={(event) => handleClick(event, props.message)}>\n {getSlots.value ?? props.message}\n </ElButton>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n .gv-button {\n &:hover {\n color: red;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvButton from './src/GvButton.vue';\n// Define the install method on the component\nGvButton.install = (app: App): void => {\n app.component(GvButton.name ?? 'GvButton', GvButton);\n};\n\nexport { GvButton };\nexport default GvButton;\n","/*\n * @title: common utility func\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-02-27 13:25:29\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-03-09 17:24:43\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\n/**\n * @todo: set html lang attr\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-03-24 10:37:13\n * @param {LocaleType} locale\n */\nexport const setHtmlAttrByLang = (locale: LocaleType): void => {\n document.querySelector('html')?.setAttribute('lang', locale);\n};\n\n/**\n * @todo: sleep async function\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 12:01:37\n * @param {*} timeLen\n */\nexport const sleep = async (timeLen: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, timeLen));\n/**\n * @todo: underline to camel case\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 15:21:09\n * @param {*} name\n */\nexport const toHump = (name: string): string => {\n if (!name) return '';\n // eslint-disable-next-line no-useless-escape\n return name.replace(/\\_(\\w)/g, function (all, letter) {\n return letter.toUpperCase();\n });\n};\n\n/**\n * @todo: camel case to underline\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 15:21:50\n * @param {*} name\n */\nexport const toLine = (name: string): string => name.replace(/([A-Z])/g, '_$1').toLowerCase();\n\n/**\n * 设置css style\n * @param prop\n * @param val\n * @param dom\n */\nexport const setDomCssProp = (prop: string, val: any, dom = document.documentElement): void => {\n dom.style.setProperty(prop, val);\n};\n\n/**\n * get css style\n * @param prop\n * @param dom\n * @returns\n */\nexport const getDomCssProp = (prop: string, dom = document.documentElement): string => getComputedStyle(dom).getPropertyValue(prop);\n\n/**\n * join icon class\n * @param icon\n * @returns\n */\nexport const joinIcon = function (icon) {\n let joinIcons = '';\n if (icon)\n if (icon.includes('el-icon')) joinIcons = icon;\n else if (icon.includes('gv-icon')) joinIcons = `iconfont ${icon}`;\n return joinIcons;\n};\n\n/**\n * @todo: set quick keys\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-22 09:38:53\n * @param {*} ev\n */\nexport const setQuickKeys = (ev) => {\n if (ev && ev.key)\n if (ev.key.toLowerCase() === 'q' && ev.ctrlKey === true) {\n // 绑定ctr + q\n ev.preventDefault();\n ev.stopPropagation();\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-search__bar>.ht-button.search') as HTMLElement;\n if (btnHtml && btnHtml.style.display !== 'none') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-edit__bar .ht-button.search') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n }\n } else if (ev.key.toLowerCase() === 'r' && ev.ctrlKey === true) {\n // 绑定crt + r\n ev.preventDefault();\n ev.stopPropagation();\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-form .ht-search__bar>.ht-button.reset') as HTMLElement;\n if (btnHtml && btnHtml.style.display !== 'none') if (btnHtml.getAttribute('refform')) btnHtml.click();\n } else if (ev.key.toLowerCase() === 'e' && ev.ctrlKey === true) {\n // 绑定crt + e\n ev.preventDefault();\n ev.stopPropagation();\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-form .ht-search__bar>.ht-button.shrink') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-form .ht-search__bar>.ht-button.expand') as HTMLElement;\n if (btnHtml.style.display === '') btnHtml.click();\n }\n } else if (ev.key.toLowerCase() === 's' && ev.ctrlKey === true) {\n // 绑定crt + s\n ev.preventDefault();\n ev.stopPropagation();\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-drawer__popup .ht-drawer .ht-drawer__footer>.ht-drawer__footer--inner .ht-button.save') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-edit__bar .ht-button.save') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n }\n } else if (ev.key.toLowerCase() === 'n' && ev.ctrlKey === true) {\n // 绑定crt + n\n ev.preventDefault();\n ev.stopPropagation();\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-table__container .ht-table__bar .ht-button.save') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-edit__bar .ht-button.save') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n }\n } else if (ev.key.toLowerCase() === '=' && ev.ctrlKey === true) {\n // 绑定crt + '='\n ev.preventDefault();\n ev.stopPropagation();\n const inputHtml = document.body.querySelector('.main-container .ht-container .ht-table__container .ht-table__search .ht-table__search-input > .el-input__inner') as HTMLElement;\n if (inputHtml) inputHtml.focus();\n } else if (ev.key === 'Escape') {\n // 绑定esc关闭弹窗\n ev.preventDefault();\n ev.stopPropagation();\n const messageConfirmHtml = document.documentElement.querySelector('body>.el-message-box__wrapper') as HTMLElement;\n if (messageConfirmHtml && messageConfirmHtml.style.display !== 'none') {\n const bodyButtonHtml = messageConfirmHtml.querySelector('.el-message-box .el-message-box__btns button') as HTMLElement;\n bodyButtonHtml.click();\n } else {\n const bodyDialogHtml = document.documentElement.querySelector('body>.ht-dialog') as HTMLElement;\n if (bodyDialogHtml && bodyDialogHtml.style.display !== 'none') {\n const bodyButtonHtml = bodyDialogHtml.querySelector('.el-dialog__header button') as HTMLElement;\n bodyButtonHtml.click();\n } else {\n const dialogArr = document.body.querySelectorAll('.main-container .ht-container .ht-dialog__popup .ht-dialog') as NodeListOf<HTMLElement>;\n if (dialogArr)\n for (let i = 0; i < dialogArr.length; i++)\n if (dialogArr[i].style.display !== 'none') {\n const buttonHtml = dialogArr[i].querySelector('.el-dialog__header button') as HTMLElement;\n if (buttonHtml && buttonHtml.style.display !== 'none') {\n buttonHtml.click();\n return;\n }\n }\n\n const buttonDHtml = document.body.querySelector('.main-container .ht-container .ht-drawer__popup .ht-drawer .el-drawer__header button') as HTMLElement;\n if (buttonDHtml && buttonDHtml.style.display !== 'none') buttonDHtml.click();\n }\n }\n }\n};\n// ------ is utils ------\nconst toString = Object.prototype.toString;\nexport const is = (val: unknown, type: string) => toString.call(val) === `[object ${type}]`;\n\nexport const isExternal = (path: string): boolean => /^(https?:|mailto:|tel:)/.test(path);\nexport const isString = (val: unknown): val is string => is(val, 'String');\nexport const isArray = (val: any): val is any[] => val && Array.isArray(val);\nexport const isError = (e: unknown): e is Error => typeof e === 'object' && e !== null && 'message' in e;\nexport const isObject = (val: any): val is Record<any, any> => val !== null && is(val, 'Object');\nexport const isDate = (val: unknown): val is Date => is(val, 'Date');\nexport const isNumber = (val: unknown): val is number => is(val, 'Number');\nexport const isBoolean = (val: unknown): val is boolean => is(val, 'Boolean');\nexport const isFunction = (val: unknown): val is (...args: any[]) => any => typeof val === 'function';\nexport const isElement = (val: unknown): val is Element => isObject(val) && !!val.tagName;\nexport const isMap = (val: unknown): val is Map<any, any> => is(val, 'Map');\nexport const isImgPath = (path: string): boolean => /(https?:\\/\\/|data:image\\/).*?\\.(png|jpg|jpeg|gif|svg|webp|ico)/gi.test(path);\nexport const isDark = (): boolean => window.matchMedia('(prefers-color-scheme: dark)').matches;\nexport const isNull = (val: unknown): val is null => val === null;\n\nexport const isEmpty = <T = unknown>(val: T): val is T => {\n if (isArray(val) || isString(val)) return val.length === 0;\n if (val instanceof Map || val instanceof Set) return val.size === 0;\n if (isObject(val)) return Object.keys(val).length === 0;\n return false;\n};\n\nexport const isUrl = (path: string): boolean => {\n try {\n new URL(path);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const pathResolve = (parentPath: string, path: string) => {\n if (isUrl(path)) return path;\n const childPath = path.startsWith('/') || !path ? path : `/${path}`;\n return `${parentPath}${childPath}`.replace(/\\/\\//g, '/').trim();\n};\n","<!--\n * @title: svg icon component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-01 17:02:13\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-01-30 11:57:59\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { computed, useAttrs } from 'vue';\n import { isExternal } from '@@/utils';\n import { useStyle } from '@/hook/web/useStyle';\n const { variables } = useStyle();\n const preNameSpace = variables.namespace;\n const attrs = useAttrs();\n // --- define name and inheritAttrs ---\n defineOptions({\n name: 'GvIcon', // 定义组件名称\n inheritAttrs: false, // 默认继承属性\n });\n // --- transfer props and define default values ---\n const props = withDefaults(\n defineProps<{\n iconType?: string;\n iconName: string;\n className?: string;\n size?: string; // 图标的font-size,单位是px\n }>(),\n {\n iconType: 'svg', // svg | iconfont\n className: '',\n },\n );\n const isLocal = computed(() => isExternal(props.iconName));\n const iconName = computed(() => {\n if (props.iconType === 'svg') return `#${preNameSpace}-icon-${props.iconName}`;\n else if (props.iconType === 'iconfont') return 'iconfont ' + props.iconName;\n else return `#${props.iconName}`;\n });\n const svgClass = computed(() => {\n if (props.className)\n if (props.iconType === 'svg') return 'svg-icon ' + props.className;\n else return props.className;\n else return 'svg-icon';\n });\n const styleExternalIcon = computed(() => ({\n mask: `url(${props.iconName}) no-repeat 50% 50%`,\n '-webkit-mask': `url(${props.iconName}) no-repeat 50% 50%`,\n }));\n</script>\n<template>\n <div\n v-if=\"isLocal\"\n :style=\"styleExternalIcon\"\n class=\"svg-external-icon svg-icon\"\n v-bind=\"attrs\"></div>\n <svg\n v-else-if=\"iconType === 'svg'\"\n :class=\"svgClass\"\n aria-hidden=\"true\"\n v-bind=\"attrs\">\n <use :href=\"iconName\" />\n </svg>\n <i\n v-else-if=\"iconType === 'iconfont'\"\n :class=\"[iconName, svgClass]\"\n v-bind=\"attrs\">\n </i>\n <svg\n v-else\n :class=\"svgClass\"\n :style=\"{ 'font-size': size + 'px' }\"\n aria-hidden=\"true\"\n v-bind=\"attrs\">\n <use :xlink:href=\"iconName\" />\n </svg>\n</template>\n\n<style lang=\"scss\" scoped>\n .svg-icon {\n width: 1em;\n height: 1em;\n overflow: hidden;\n vertical-align: -0.15em;\n fill: currentcolor;\n }\n\n .svg-external-icon {\n display: inline-block;\n background-color: currentcolor;\n mask-size: cover !important;\n }\n</style>\n","import type { App } from 'vue';\nimport GvIcon from './src/GvIcon.vue';\n// Define the install method on the component\nGvIcon.install = (app: App): void => {\n app.component(GvIcon.name ?? 'GvIcon', GvIcon);\n};\n\nexport { GvIcon };\nexport default GvIcon;\n","import { type VueTypeValidableDef, type VueTypesInterface, createTypes, toValidableType } from 'vue-types';\nimport type { CSSProperties } from 'vue';\n\ntype PropTypes = VueTypesInterface & {\n readonly style: VueTypeValidableDef<CSSProperties>;\n};\nconst newPropTypes = createTypes({\n func: undefined,\n bool: undefined,\n string: undefined,\n number: undefined,\n object: undefined,\n integer: undefined,\n}) as PropTypes;\n\nclass propTypes extends newPropTypes {\n static get style(): VueTypeValidableDef<CSSProperties> {\n return toValidableType('style', {\n type: [String, Object],\n });\n }\n}\n\nexport { propTypes };\n","<!--\n * @title: locale lang dropdown\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-03-25 11:43:51\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-06-09 14:15:05\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { computed, unref } from 'vue';\n import { useRouter } from 'vue-router';\n import { propTypes } from '../../utils/gv.propTypes';\n import { useLocaleStore } from '@/store/modules/locale';\n import { useLocale } from '@/hook/web/useLocale';\n import { useStyle } from '@/hook/web/useStyle';\n\n import { ElDropdown, ElDropdownMenu, ElDropdownItem } from 'element-plus';\n\n defineOptions({\n name: 'GvLangSelect', // 定义组件名称\n inheritAttrs: true, // 默认继承属性\n });\n defineProps({\n className: propTypes.string.def(''),\n });\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('lang-select');\n\n const localeStore = useLocaleStore();\n const langMap = computed(() => localeStore.getLocaleMap);\n const currentLang = computed(() => localeStore.getCurrentLocale);\n\n const router = useRouter();\n\n const handleSetLang = async (lang): Promise<void> => {\n if (lang === unref(currentLang).lang) return;\n\n const { switchLocale } = useLocale();\n await switchLocale(lang);\n router.go(0);\n };\n</script>\n\n<template>\n <ElDropdown\n :class=\"prefixCls\"\n trigger=\"click\"\n class=\"international\"\n @command=\"handleSetLang\">\n <div>\n <GvIcon\n :class-name=\"`international-icon ${className}`\"\n icon-name=\"language\" />\n </div>\n <template #dropdown>\n <ElDropdownMenu>\n <ElDropdownItem\n v-for=\"item in langMap\"\n :key=\"item.lang\"\n :command=\"item.lang\">\n {{ item.name }}\n </ElDropdownItem>\n </ElDropdownMenu>\n </template>\n </ElDropdown>\n</template>\n","import type { App } from 'vue';\nimport GvLangSelect from './src/GvLangSelect.vue';\n// Define the install method on the component\nGvLangSelect.install = (app: App): void => {\n app.component(GvLangSelect.name ?? 'GvLangSelect', GvLangSelect);\n};\n\nexport { GvLangSelect };\nexport default GvLangSelect;\n","<!--\n * @title: backtop\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-22 09:24:46\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-05-22 09:26:44\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script setup lang=\"ts\">\n import { ElBacktop } from 'element-plus';\n import { useStyle } from '@/hook/web/useStyle';\n\n // --- define name and inheritAttrs ---\n defineOptions({\n name: 'GvBacktop', // 定义组件名称\n inheritAttrs: true, // 默认继承属性\n });\n\n const { getPrefixCls, variables } = useStyle();\n\n const prefixCls = getPrefixCls('backtop');\n</script>\n\n<template>\n <ElBacktop\n :class=\"prefixCls\"\n :target=\"`.${variables.namespace}-layout-content-scrollbar .${variables.elNamespace}-scrollbar__wrap`\" />\n</template>\n","import type { App } from 'vue';\nimport GvBacktop from './src/GvBacktop.vue';\n// Define the install method on the GvButton component\nconst GvBacktopPlugin = {\n install(app: App): void {\n app.component(GvBacktop.name ?? 'GvBacktop', GvBacktop);\n },\n};\nexport default GvBacktopPlugin;\n\nexport { GvBacktop };\n","/*\n * @title: breadcrumb helper func\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-07-15 12:55:48\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-01-30 12:12:40\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport { pathResolve } from '../../utils/index';\n\nexport const filterBreadcrumb = (routes: AppRouteRecordRaw[], parentPath = ''): AppRouteRecordRaw[] => {\n const res: AppRouteRecordRaw[] = [];\n\n for (const route of routes) {\n const meta = route?.meta;\n if (route.name !== 'Root' && meta?.hidden && !meta.canTo) continue;\n\n const data: AppRouteRecordRaw = !meta?.alwaysShow && route.children?.length === 1 ? { ...route.children[0], path: pathResolve(route.path, route.children[0].path) } : { ...route };\n\n data.path = pathResolve(parentPath, data.path);\n\n if (data.children) data.children = filterBreadcrumb(data.children, data.path);\n\n if (data) res.push(data);\n }\n return res;\n};\n","interface TreeHelperConfig {\n id: string;\n children: string;\n pid: string;\n}\nconst DEFAULT_CONFIG: TreeHelperConfig = {\n id: 'id',\n children: 'children',\n pid: 'pid',\n};\nconst getConfig = (config: Partial<TreeHelperConfig>) => Object.assign({}, DEFAULT_CONFIG, config);\n// tree from list\nexport const listToTree = <T = any>(list: any[], config: Partial<TreeHelperConfig> = {}): T[] => {\n const conf = getConfig(config) as TreeHelperConfig;\n const nodeMap = new Map();\n const result: T[] = [];\n const { id, children, pid } = conf;\n\n for (const node of list) {\n node[children] = node[children] || [];\n nodeMap.set(node[id], node);\n }\n for (const node of list) {\n const parent = nodeMap.get(node[pid]);\n (parent ? parent.children : result).push(node);\n }\n return result;\n};\n\nexport const treeToList = <T = any>(tree: any, config: Partial<TreeHelperConfig> = {}): T => {\n config = getConfig(config);\n const { children } = config;\n const result: any = [...tree];\n for (let i = 0; i < result.length; i++) {\n if (!result[i][children!]) continue;\n result.splice(i + 1, 0, ...result[i][children!]);\n }\n return result;\n};\n\nexport const findNode = <T = any>(tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}): T | null => {\n config = getConfig(config);\n const { children } = config;\n const list = [...tree];\n for (const node of list) {\n if (func(node)) return node;\n node[children!] && list.push(...node[children!]);\n }\n return null;\n};\n\nexport const findNodeAll = <T = any>(tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}): T[] => {\n config = getConfig(config);\n const { children } = config;\n const list = [...tree];\n const result: T[] = [];\n for (const node of list) {\n func(node) && result.push(node);\n node[children!] && list.push(...node[children!]);\n }\n return result;\n};\n\nexport const findPath = <T = any>(tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}): T | T[] | null => {\n config = getConfig(config);\n const path: T[] = [];\n const list = [...tree];\n const visitedSet = new Set();\n const { children } = config;\n while (list.length) {\n const node = list[0];\n if (visitedSet.has(node)) {\n path.pop();\n list.shift();\n } else {\n visitedSet.add(node);\n node[children!] && list.unshift(...node[children!]);\n path.push(node);\n if (func(node)) return path;\n }\n }\n return null;\n};\n\nexport const findPathAll = (tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}) => {\n config = getConfig(config);\n const path: any[] = [];\n const list = [...tree];\n const result: any[] = [];\n const visitedSet = new Set();\n const { children } = config;\n while (list.length) {\n const node = list[0];\n if (visitedSet.has(node)) {\n path.pop();\n list.shift();\n } else {\n visitedSet.add(node);\n node[children!] && list.unshift(...node[children!]);\n path.push(node);\n func(node) && result.push([...path]);\n }\n }\n return result;\n};\n\nexport const filter = <T = any>(tree: T[], func: (n: T) => boolean, config: Partial<TreeHelperConfig> = {}): T[] => {\n config = getConfig(config);\n const children = config.children as string;\n function listFilter(list: T[]) {\n return list\n .map((node: any) => ({ ...node }))\n .filter((node) => {\n node[children] = node[children] && listFilter(node[children]);\n return func(node) || (node[children] && node[children].length);\n });\n }\n return listFilter(tree);\n};\n\nexport const forEach = <T = any>(tree: T[], func: (n: T) => any, config: Partial<TreeHelperConfig> = {}): void => {\n config = getConfig(config);\n const list: any[] = [...tree];\n const { children } = config;\n for (let i = 0; i < list.length; i++) {\n // func 返回true就终止遍历,避免大量节点场景下无意义循环,引起浏览器卡顿\n if (func(list[i])) return;\n\n children && list[i][children] && list.splice(i + 1, 0, ...list[i][children]);\n }\n};\n/**\n * @description: Extract tree specified structure\n */\nexport const treeMapEach = (data: any, { children = 'children', conversion }: { children?: string; conversion: Fn }) => {\n const haveChildren = Array.isArray(data[children]) && data[children].length > 0;\n const conversionData = conversion(data) || {};\n if (haveChildren)\n return {\n ...conversionData,\n [children]: data[children].map((i: number) =>\n treeMapEach(i, {\n children,\n conversion,\n }),\n ),\n };\n else\n return {\n ...conversionData,\n };\n};\n/**\n * @description: Extract tree specified structure\n */\nexport const treeMap = <T = any>(treeData: T[], opt: { children?: string; conversion: Fn }): T[] => treeData.map((item) => treeMapEach(item, opt));\n\n/**\n * 递归遍历树结构\n * @param treeDatas 树\n * @param callBack 回调\n * @param parentNode 父节点\n */\nexport const eachTree = (treeDatas: any[], callBack: Fn, parentNode = {}) => {\n treeDatas.forEach((element) => {\n const newNode = callBack(element, parentNode) || element;\n if (element.children) eachTree(element.children, callBack, newNode);\n });\n};\n","<!--\n * @title: breadcrumb \n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-22 09:13:03\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-03-09 16:51:15\n * @version: 1.0.4\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { ElBreadcrumb, ElBreadcrumbItem } from 'element-plus';\n import { ref, watch, computed, unref, defineComponent, TransitionGroup } from 'vue';\n import { useRouter } from 'vue-router';\n import { useI18n } from '@/hook/web/useI18n';\n import { GvIcon } from '../../GvIcon';\n import { useAppStore } from '@/store/modules/app';\n import { usePermsStore } from '@/store/modules/perms';\n import { useStyle } from '@/hook/web/useStyle';\n import { filterBreadcrumb } from './helper';\n import { filter, treeToList } from '../../utils/gv.tree';\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('breadcrumb');\n\n export default defineComponent({\n name: 'GvBreadcrumb',\n setup() {\n const appStore = useAppStore();\n const permStore = usePermsStore();\n // if you want to use the icon in breadcrumb, you can set it in appStore\n const showBreadcrumbIcon = computed(() => appStore.getShowBreadcrumbIcon);\n const { currentRoute } = useRouter();\n\n const { t } = useI18n();\n\n const levelList = ref<AppRouteRecordRaw[]>([]);\n const menuRouters = computed(() => {\n const routers = permStore.getRouters;\n return filterBreadcrumb(routers);\n });\n\n const getBreadcrumb = () => {\n const currentPath = currentRoute.value.matched.slice(-1)[0].path;\n levelList.value = filter<AppRouteRecordRaw>(unref(menuRouters), (node: AppRouteRecordRaw) => node.path === currentPath);\n };\n\n const renderBreadcrumb = () => {\n const breadcrumbList = treeToList<AppRouteRecordRaw[]>(unref(levelList));\n return breadcrumbList.map((v) => {\n const disabled = !v.redirect || v.redirect === 'noredirect';\n const meta = v.meta;\n return (\n <ElBreadcrumbItem\n to={{ path: disabled ? '' : v.path }}\n key={v.name}>\n {meta?.icon && showBreadcrumbIcon.value ? (\n <>\n <GvIcon\n iconType=\"iconfont\"\n iconName={meta.icon}\n className=\"text-[13px]\"></GvIcon>{' '}\n {t(v?.meta?.title || '')}\n </>\n ) : (\n t(v?.meta?.title || '')\n )}\n </ElBreadcrumbItem>\n );\n });\n };\n\n watch(\n () => currentRoute.value.path,\n (path) => {\n if (path.startsWith('/redirect/')) return;\n\n getBreadcrumb();\n },\n {\n immediate: true,\n },\n );\n\n return () => (\n <ElBreadcrumb\n separator=\"/\"\n class={`${prefixCls} flex items-center h-full ml-[10px]`}>\n <TransitionGroup\n appear\n enter-active-class=\"animate__animated animate__fadeInRight\">\n {renderBreadcrumb()}\n </TransitionGroup>\n </ElBreadcrumb>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-breadcrumb';\n .#{$prefixCls} {\n user-select: none;\n :deep(.el-breadcrumb__item) {\n display: flex;\n .el-breadcrumb__inner {\n display: flex;\n align-items: center;\n color: #afb3b9;\n cursor: text;\n //color: var(--top-header-text-color);\n //&:hover {\n // color: var(--el-color-primary);\n //}\n &.is-link {\n font-weight: 500;\n }\n }\n .iconfont {\n font-size: $textSizeSecondary;\n }\n }\n :deep(.el-breadcrumb__item):last-child {\n .el-breadcrumb__inner:hover {\n color: #afb3b9;\n cursor: text;\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvBreadCrumb from './src/GvBreadCrumb.vue';\n// Define the install method on the component\nGvBreadCrumb.install = (app: App): void => {\n app.component(GvBreadCrumb.name ?? 'GvBreadCrumb', GvBreadCrumb);\n};\n\nexport { GvBreadCrumb };\nexport default GvBreadCrumb;\n","<!--\n * @title: collapsed sidebar component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-06-03 13:48:02\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-07-15 17:14:09\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { computed, unref } from 'vue';\n import { ElIcon } from 'element-plus';\n import { Expand, Fold } from '@element-plus/icons-vue';\n import { useAppStore } from '@/store/modules/app';\n import { propTypes } from '../../utils/gv.propTypes';\n import { useStyle } from '@/hook/web/useStyle';\n\n defineOptions({\n name: 'GvHamburger', // 定义组件名称\n inheritAttrs: true, // 默认继承属性\n });\n\n defineProps({\n color: propTypes.string.def(''),\n });\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('hamburger');\n\n const appStore = useAppStore();\n const collapse = computed(() => appStore.getCollapseMenus);\n\n // set quick keys\n\n // load dict\n // const loadDict = async () => {\n // try {\n // await this.$store.dispatch('user/loadAllDict');\n // } catch (e) {\n // // empty\n // }\n // };\n // load division\n // const loadDictDivision = async () => {\n // try {\n // await this.$store.dispatch('user/loadDictDivision');\n // } catch (e) {\n // // empty\n // }\n // };\n\n const toggleCollapse = () => {\n const collapsed = unref(collapse);\n appStore.setCollapseMenus(!collapsed);\n };\n</script>\n<template>\n <div\n :class=\"prefixCls\"\n @click=\"toggleCollapse\">\n <div class=\"trigger\">\n <ElIcon\n :size=\"20\"\n :class=\"`${prefixCls}__icon`\">\n <Expand\n v-if=\"!collapse\"\n :class=\"`${prefixCls}__icon`\"\n :style=\"{ color: color }\" />\n <Fold\n v-else\n :class=\"`${prefixCls}__icon`\"\n :style=\"{ color: color }\" />\n </ElIcon>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-hamburger';\n .#{$prefixCls} {\n position: relative;\n z-index: 3;\n line-height: $navHeadHeight;\n background-color: #fff;\n &:hover {\n background-color: rgb(0 0 0 / 3%);\n }\n .trigger {\n display: inline-block;\n line-height: 1px;\n cursor: pointer;\n transition: color 0.3s ease;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvHamburger from './src/GvHamburger.vue';\nconst GvHamburgerPlugin = {\n install(app: App): void {\n app.component(GvHamburger.name ?? 'GvHamburger', GvHamburger);\n },\n};\nexport default GvHamburgerPlugin;\n\nexport { GvHamburger };\n","<!--\n * @title: screenfull\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-22 09:15:43\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-11-17 10:55:25\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script setup lang=\"ts\">\n import { useFullscreen } from '@vueuse/core';\n import { propTypes } from '../../utils/gv.propTypes';\n import { useStyle } from '@/hook/web/useStyle';\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('screenfull');\n\n defineProps({\n color: propTypes.string.def(''),\n });\n\n const { toggle, isFullscreen } = useFullscreen();\n\n const toggleFullscreen = () => {\n toggle();\n };\n</script>\n\n<template>\n <div\n :class=\"prefixCls\"\n @click=\"toggleFullscreen\">\n <GvIcon :icon-name=\"isFullscreen ? 'exit-fullscreen' : 'fullscreen'\" />\n </div>\n</template>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-screenfull';\n .#{$prefixCls} {\n display: inline-block;\n line-height: var(--right-item-line-height);\n height: var(--right-item-height);\n vertical-align: 10px;\n cursor: pointer;\n fill: #5a5e66;\n }\n</style>\n","import type { App } from 'vue';\nimport GvScreenFull from './src/GvScreenFull.vue';\n// Define the install method on the GvButton component\nconst GvScreenFullPlugin = {\n install(app: App): void {\n app.component(GvScreenFull.name ?? 'GvScreenFull', GvScreenFull);\n },\n};\nexport default GvScreenFullPlugin;\n\nexport { GvScreenFull };\n","import { ref, unref } from 'vue';\nimport { findPath } from '../../utils/gv.tree';\n\ntype OnlyOneChildType = AppRouteRecordRaw & { noShowingChildren?: boolean };\n\ninterface HasOneShowingChild {\n oneShowingChild?: boolean;\n onlyOneChild?: OnlyOneChildType;\n}\n\nexport const getAllParentPath = <T = Recordable>(treeData: T[], path: string) => {\n const menuList = findPath(treeData, (n) => n.path === path) as AppRouteRecordRaw[];\n return (menuList || []).map((item) => item.path);\n};\n\nexport const hasOneShowingChild = (parent: AppRouteRecordRaw, children: AppRouteRecordRaw[] = []): HasOneShowingChild => {\n const onlyOneChild = ref<OnlyOneChildType>();\n\n const showingChildren = children.filter((v) => {\n const meta = v.meta ?? {};\n if (meta.hidden) return false;\n else {\n // Temp set(will be used if only has one showing child)\n onlyOneChild.value = v;\n return true;\n }\n });\n\n // When there is only one child router, the child router is displayed by default\n if (showingChildren.length === 1)\n return {\n oneShowingChild: true,\n onlyOneChild: unref(onlyOneChild),\n };\n\n // Show parent if there are no child router to display\n if (!showingChildren.length) {\n onlyOneChild.value = { ...parent, path: '', noShowingChildren: true };\n return {\n oneShowingChild: true,\n onlyOneChild: unref(onlyOneChild),\n };\n }\n\n return {\n oneShowingChild: false,\n onlyOneChild: unref(onlyOneChild),\n };\n};\n","import type { RouteMeta } from 'vue-router';\nimport { useI18n } from '@/hook/web/useI18n';\nimport { GvIcon } from '../../../GvIcon';\nexport const useRenderMenuTitle = () => {\n const renderMenuTitle = (meta: RouteMeta) => {\n const { t } = useI18n();\n if (!meta) {\n return <span class=\"v-menu__title overflow-hidden overflow-ellipsis whitespace-nowrap\">No Title</span>;\n }\n const { title = 'Please set title', icon } = meta;\n\n return icon ? (\n <>\n <GvIcon iconName={meta.icon || ''}></GvIcon>\n <span class=\"v-menu__title overflow-hidden overflow-ellipsis whitespace-nowrap\">{t(title as string)}</span>\n </>\n ) : (\n <span class=\"v-menu__title overflow-hidden overflow-ellipsis whitespace-nowrap\">{t(title as string)}</span>\n );\n };\n\n return {\n renderMenuTitle,\n };\n};\n","/*\n * @title: render menu item - useRenderMenuItem\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-07-15 15:07:28\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-03-09 16:33:08\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport { ElSubMenu, ElMenuItem } from 'element-plus';\nimport { unref } from 'vue';\nimport { hasOneShowingChild } from '../helper';\nimport { isUrl } from '@@/utils';\nimport { useRenderMenuTitle } from './useRenderMenuTitle';\nimport { pathResolve } from '@@/utils';\nimport { useStyle } from '@/hook/web/useStyle';\nconst { getPrefixCls } = useStyle();\nconst prefixCls = getPrefixCls('submenu');\n\nconst { renderMenuTitle } = useRenderMenuTitle();\n\nexport const useRenderMenuItem = (menuMode) =>\n // allRouters: AppRouteRecordRaw[] = [],\n {\n const renderMenuItem = (routers: AppRouteRecordRaw[], parentPath = '/') => {\n if (!routers || !routers.length) return null;\n return routers\n .filter((v) => !v.meta?.hidden)\n .map((v) => {\n const meta = v.meta ?? {};\n const { oneShowingChild, onlyOneChild } = hasOneShowingChild(v, v.children);\n const fullPath = isUrl(v.path) ? String(v.path) : pathResolve(parentPath, v.path); // getAllParentPath<AppRouteRecordRaw>(allRouters, v.path).join('/')\n if (oneShowingChild && (!onlyOneChild?.children || onlyOneChild?.noShowingChildren) && !meta?.alwaysShow) {\n return (\n <ElMenuItem index={onlyOneChild ? pathResolve(fullPath, onlyOneChild.path) : fullPath}>\n {{\n default: () => renderMenuTitle(onlyOneChild ? (onlyOneChild.meta ?? meta) : meta),\n }}\n </ElMenuItem>\n );\n } else {\n return (\n <ElSubMenu\n index={fullPath}\n teleported\n popperClass={unref(menuMode) === 'vertical' ? `${prefixCls}-popper--vertical` : ''}>\n {{\n title: () => renderMenuTitle(meta),\n default: () => renderMenuItem(v.children!, fullPath),\n }}\n </ElSubMenu>\n );\n }\n });\n };\n return {\n renderMenuItem,\n };\n };\n","<!--\n * @title: left menus\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-30 16:12:28\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-03-09 14:26:39\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { computed, defineComponent, unref, type PropType } from 'vue';\n import { ElMenu, ElScrollbar } from 'element-plus';\n import { useAppStore } from '@/store/modules/app';\n import { usePermsStore } from '@/store/modules/perms';\n import { useRenderMenuItem } from './components/useRenderMenuItem';\n\n import { useRouter } from 'vue-router';\n import { isUrl } from '../../utils';\n import { useStyle } from '@/hook/web/useStyle';\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('sidebar');\n\n export default defineComponent({\n name: 'GvSidebar',\n props: {\n menuSelect: {\n type: Function as PropType<(index: string) => void>,\n default: undefined,\n },\n },\n setup(props) {\n const appStore = useAppStore();\n const layout = computed(() => appStore.getLayout);\n const { push, currentRoute } = useRouter();\n const permStore = usePermsStore();\n const menuMode = computed((): 'vertical' | 'horizontal' => {\n const vertical: LayoutType[] = ['default', 'topLeft', 'cutMenu'];\n\n if (vertical.includes(unref(layout))) return 'vertical';\n else return 'horizontal';\n });\n\n const routers = computed(() => (unref(layout) === 'cutMenu' ? permStore.getRouters : permStore.getRouters));\n\n // console.log(routers.value);\n\n const collapse = computed(() => appStore.getCollapseMenus);\n\n const leftMenuUniqueOpened = computed(() => appStore.getLeftMenuUniqueOpened);\n\n const activeMenu = computed(() => {\n const { meta, path } = unref(currentRoute);\n // if set path, the sidebar will highlight the path you set\n if (meta.activeMenu) return meta.activeMenu as string;\n\n return path;\n });\n\n const menuSelect = (index: string) => {\n props.menuSelect?.(index);\n\n // 自定义事件\n if (isUrl(index)) {\n window.open(index);\n return;\n }\n push(index);\n };\n\n const renderMenu = () => (\n <ElMenu\n defaultActive={unref(activeMenu)}\n mode={unref(menuMode)}\n collapse={unref(layout) === 'top' || unref(layout) === 'cutMenu' ? false : unref(collapse)}\n uniqueOpened={unref(layout) === 'top' ? false : unref(leftMenuUniqueOpened)}\n backgroundColor=\"var(--left-menu-bg-color)\"\n textColor=\"var(--left-menu-text-color)\"\n activeTextColor=\"var(--left-menu-text-active-color)\"\n popperClass={unref(menuMode) === 'vertical' ? `${prefixCls}-popper--vertical` : `${prefixCls}-popper--horizontal`}\n onSelect={menuSelect}>\n {{\n default: () => {\n const { renderMenuItem } = useRenderMenuItem(menuMode);\n // console.log('renderMenu', routers.value);\n return renderMenuItem(unref(routers));\n },\n }}\n </ElMenu>\n );\n const renderMenuWrap = () => {\n if (unref(layout) === 'top') return renderMenu();\n else return <ElScrollbar>{renderMenu()}</ElScrollbar>;\n };\n return () => (\n <div\n id=\"gv-sidebar\"\n class={[\n `${prefixCls} ${prefixCls}__${unref(menuMode)}`,\n 'h-[100%] overflow-hidden flex-col bg-[var(--left-menu-bg-color)]',\n {\n 'w-[var(--left-menu-min-width)]': unref(collapse) && unref(layout) !== 'cutMenu',\n 'w-[var(--left-menu-max-width)]': !unref(collapse) && unref(layout) !== 'cutMenu',\n },\n ]}>\n {renderMenuWrap()}\n </div>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-sidebar';\n\n .#{$prefixCls} {\n position: relative;\n transition: width var(--transition-time-02);\n\n :deep(.#{$elNamespace}-menu) {\n width: 100% !important;\n border-right: none;\n\n // 设置选中时子标题的颜色\n .is-active {\n & > .#{$elNamespace}-sub-menu__title {\n color: var(--left-menu-text-active-color) !important;\n }\n }\n\n // 设置子菜单悬停的高亮和背景色\n .#{$elNamespace}-sub-menu__title,\n .#{$elNamespace}-menu-item {\n &:hover {\n color: var(--left-menu-text-active-color) !important;\n background-color: var(--left-menu-bg-color) !important;\n }\n }\n\n // 设置选中时的高亮背景和高亮颜色\n .#{$elNamespace}-menu-item.is-active {\n color: var(--left-menu-text-active-color) !important;\n background-color: var(--left-menu-bg-active-color) !important;\n\n &:hover {\n background-color: var(--left-menu-bg-active-color) !important;\n }\n }\n\n .#{$elNamespace}-menu-item.is-active {\n position: relative;\n }\n\n // 设置子菜单的背景颜色\n .#{$elNamespace}-menu {\n .#{$elNamespace}-sub-menu__title {\n background-color: var(--left-menu-bg-color) !important;\n }\n .#{$elNamespace}-menu-item:not(.is-active) {\n background-color: var(--left-menu-item-bg-light-color) !important;\n }\n }\n }\n\n // 折叠时的最小宽度\n :deep(.#{$elNamespace}-menu--collapse) {\n width: var(--left-menu-min-width);\n\n & > .is-active,\n & > .is-active > .#{$elNamespace}-sub-menu__title {\n position: relative;\n background-color: var(--left-menu-collapse-bg-active-color) !important;\n }\n }\n\n // 折叠动画的时候,就需要把文字给隐藏掉\n :deep(.horizontal-collapse-transition) {\n .#{$prefixCls}__title {\n display: none;\n }\n }\n\n // 水平菜单\n &__horizontal {\n height: calc(var(--top-tool-height)) !important;\n\n :deep(.#{$elNamespace}-menu--horizontal) {\n height: calc(var(--top-tool-height));\n border-bottom: none;\n // 重新设置底部高亮颜色\n & > .#{$elNamespace}-sub-menu.is-active {\n .#{$elNamespace}-sub-menu__title {\n border-bottom-color: var(--el-color-primary) !important;\n }\n }\n\n .#{$elNamespace}-menu-item.is-active {\n position: relative;\n\n &::after {\n display: none !important;\n }\n }\n\n .#{$prefixCls}__title {\n /* stylelint-disable-next-line */\n max-height: calc(var(--top-tool-height) - 2px) !important;\n /* stylelint-disable-next-line */\n line-height: calc(var(--top-tool-height) - 2px);\n }\n }\n }\n }\n</style>\n\n<style lang=\"scss\">\n $prefixCls: '#{$gvNamespace}-sidebar-popper';\n\n .#{$prefixCls}--vertical,\n .#{$prefixCls}--horizontal {\n // 设置选中时子标题的颜色\n .is-active {\n & > .el-sub-menu__title {\n color: var(--left-menu-text-active-color) !important;\n }\n }\n\n // 设置子菜单悬停的高亮和背景色\n .el-sub-menu__title,\n .el-menu-item {\n &:hover {\n color: var(--left-menu-text-active-color) !important;\n background-color: var(--left-menu-bg-color) !important;\n }\n }\n\n // 设置选中时的高亮背景\n .el-menu-item.is-active {\n position: relative;\n background-color: var(--left-menu-bg-active-color) !important;\n\n &:hover {\n background-color: var(--left-menu-bg-active-color) !important;\n }\n }\n }\n\n $submenu-prefix-cls: '#{$gvNamespace}-submenu-popper';\n\n // 设置子菜单溢出时滚动样式\n .#{$submenu-prefix-cls}--vertical {\n max-height: 100%;\n overflow-y: auto;\n\n &::-webkit-scrollbar {\n width: 6px;\n background-color: transparent;\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: rgb(144 147 153 / 30%);\n border-radius: 4px;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvSidebar from './src/GvSidebar.vue';\n// Define the install method on the GvButton component\nconst GvSidebarPlugin = {\n install(app: App): void {\n app.component(GvSidebar.name ?? 'GvSidebar', GvSidebar);\n },\n};\nexport default GvSidebarPlugin;\n\nexport { GvSidebar };\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFYAAABaCAYAAAAilKGMAAAACXBIWXMAAAZ2AAAGdgEpJm+AAAAKDGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDIgNzkuYTZhNjM5NjhhLCAyMDI0LzAzLzA2LTExOjUyOjA1ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmQxNjAxODBkLTVlZmUtZjc0MS1iY2RhLTdjMDBjNTc4ZTVkMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1ZDE1ZDUxNC05YzkxLTQwNTYtYTgzNS05YjZlYmRlOTQ5ZmEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0iRTU1OUFCRUUwQ0NBMTg5NjNBREJDRTREOTQ1Q0M5MDkiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB0aWZmOkltYWdlV2lkdGg9IjYzNiIgdGlmZjpJbWFnZUxlbmd0aD0iNjYwIiB0aWZmOlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb249IjIiIHRpZmY6U2FtcGxlc1BlclBpeGVsPSIzIiB0aWZmOlhSZXNvbHV0aW9uPSIxNDQvMSIgdGlmZjpZUmVzb2x1dGlvbj0iMTQ0LzEiIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiIGV4aWY6RXhpZlZlcnNpb249IjAyMzEiIGV4aWY6Q29sb3JTcGFjZT0iNjU1MzUiIGV4aWY6UGl4ZWxYRGltZW5zaW9uPSI2MzYiIGV4aWY6UGl4ZWxZRGltZW5zaW9uPSI2NjAiIHhtcDpDcmVhdGVEYXRlPSIyMDI0LTExLTI5VDEyOjQ4OjMzKzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNC0xMS0yOVQxMjo1MToyNCswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyNC0xMS0yOVQxMjo1MToyNCswODowMCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmZiNWYzMGIyLWJmODgtNDQ3My1iMDk0LWIzMGUzYjkyMzczZiIgc3RFdnQ6d2hlbj0iMjAyNC0xMS0yOVQxMjo0OToxNyswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjExIChNYWNpbnRvc2gpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gaW1hZ2UvanBlZyB0byBpbWFnZS9wbmciLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImRlcml2ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImNvbnZlcnRlZCBmcm9tIGltYWdlL2pwZWcgdG8gaW1hZ2UvcG5nIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo4MDg4Y2NiMi05NDFlLTQ1YmItOGZhZi02YjA5Mjc0M2Q0MDciIHN0RXZ0OndoZW49IjIwMjQtMTEtMjlUMTI6NDk6MTcrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNS4xMSAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NWQxNWQ1MTQtOWM5MS00MDU2LWE4MzUtOWI2ZWJkZTk0OWZhIiBzdEV2dDp3aGVuPSIyMDI0LTExLTI5VDEyOjUxOjI0KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMTEgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOmZiNWYzMGIyLWJmODgtNDQ3My1iMDk0LWIzMGUzYjkyMzczZiIgc3RSZWY6ZG9jdW1lbnRJRD0iRTU1OUFCRUUwQ0NBMTg5NjNBREJDRTREOTQ1Q0M5MDkiIHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD0iRTU1OUFCRUUwQ0NBMTg5NjNBREJDRTREOTQ1Q0M5MDkiLz4gPHRpZmY6Qml0c1BlclNhbXBsZT4gPHJkZjpTZXE+IDxyZGY6bGk+ODwvcmRmOmxpPiA8cmRmOmxpPjg8L3JkZjpsaT4gPHJkZjpsaT44PC9yZGY6bGk+IDwvcmRmOlNlcT4gPC90aWZmOkJpdHNQZXJTYW1wbGU+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+WfjB/QAAOnxJREFUeJztvXe4XFd19//Z+9Tp5famq2rJVnE3trGxMcY0h2KMDSb04NBCDIQQQgukvKTwQAKEEkIS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\"","<!--\n * @title: sidebar logo\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-15 14:11:18\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-06-09 17:46:25\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script setup lang=\"ts\">\n import { ref, watch, computed, onMounted, unref } from 'vue';\n import { useAppStore } from '@/store/modules/app';\n import { useStyle } from '@/hook/web/useStyle';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('logo');\n\n const appStore = useAppStore();\n\n const show = ref(true);\n const title = computed(() => appStore.getTitle);\n const layout = computed(() => appStore.getLayout);\n const collapseMenus = computed(() => appStore.getCollapseMenus);\n\n watch(\n () => collapseMenus.value,\n (collapse: boolean) => {\n if (unref(layout) === 'topLeft' || unref(layout) === 'cutMenu') {\n show.value = true;\n return;\n }\n show.value = !collapse;\n },\n );\n\n watch(\n () => layout.value,\n (layout) => {\n if (layout === 'top' || layout === 'cutMenu') show.value = true;\n else if (unref(collapseMenus)) show.value = false;\n else show.value = true;\n },\n );\n\n onMounted(() => {\n if (unref(collapseMenus)) show.value = false;\n });\n</script>\n\n<template>\n <div>\n <router-link\n :class=\"[prefixCls, layout !== 'default' ? `${prefixCls}__Top` : '', 'flex !h-[var(--logo-height)] items-center cursor-pointer pl-[8px] relative decoration-none overflow-hidden']\"\n to=\"/\">\n <img\n src=\"@/assets/imgs/logo.png\"\n class=\"w-[calc(var(--logo-height)-10px)] h-[calc(var(--logo-height)-10px)]\" />\n <div\n v-if=\"show\"\n :class=\"[\n 'inline-block whitespace-nowrap ml-[10px] text-[16px] font-bold',\n {\n 'text-[var(--logo-title-text-color)]': layout === 'default',\n 'text-[var(--top-header-text-color)]': layout === 'topLeft' || layout === 'top' || layout === 'cutMenu',\n },\n ]\">\n {{ title }}\n </div>\n </router-link>\n </div>\n</template>\n<style lang=\"scss\" scoped></style>\n","import type { App } from 'vue';\nimport GvSidebarLogo from './src/GvSidebarLogo.vue';\n// Define the install method on the GvButton component\nconst GvSidebarLogoPlugin = {\n install(app: App): void {\n app.component(GvSidebarLogo.name ?? 'GvSidebarLogo', GvSidebarLogo);\n },\n};\nexport default GvSidebarLogoPlugin;\n\nexport { GvSidebarLogo };\n","<!--\n * @title: theme switcher\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-08-14 10:17:38\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-09-02 09:45:22\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { ElDropdown, ElDropdownMenu, ElDropdownItem } from 'element-plus';\n import { propTypes } from '../../utils/gv.propTypes';\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { computed } from 'vue';\n\n defineOptions({\n name: 'GvTheme',\n inheritAttrs: true,\n });\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('theme');\n\n defineProps({\n color: propTypes.string.def(''),\n });\n\n const appStore = useAppStore();\n const themeOptions = computed(() => appStore.getSwitchTheme);\n const currentTheme = computed(() => appStore.getCurrentTheme);\n\n const handleSetTheme = (theme: string) => {\n //appStore.setTheme(theme);\n };\n</script>\n<template>\n <ElDropdown\n trigger=\"click\"\n :class=\"prefixCls\"\n @command=\"handleSetTheme\">\n <div>\n <GvIcon\n class=\"international-icon ${className}\"\n icon-name=\"theme\" />\n </div>\n <template #dropdown>\n <ElDropdownMenu>\n <ElDropdownItem\n v-for=\"item of themeOptions\"\n :key=\"item.value\"\n :disabled=\"currentTheme === item.value\"\n :command=\"item.value\">\n {{ item.label }}\n </ElDropdownItem>\n </ElDropdownMenu>\n </template>\n </ElDropdown>\n</template>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-theme';\n .#{$prefixCls} {\n display: inline-block;\n line-height: var(--right-item-line-height);\n height: var(--right-item-height);\n vertical-align: 10px;\n cursor: pointer;\n fill: #5a5e66;\n }\n</style>\n","import type { App } from 'vue';\nimport GvTheme from './src/GvTheme.vue';\nconst GvThemePlugin = {\n install(app: App): void {\n app.component(GvTheme.name ?? 'GvTheme', GvTheme);\n },\n};\nexport default GvThemePlugin;\n\nexport { GvTheme };\n","/*\n * @title: pinyin-pro 汉字转拼音组件\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-10-10 11:21:59\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-10-10 11:22:02\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport { pinyin } from 'pinyin-pro';\n/**\n * usePinyin 组合式函数\n * 提供常见的中文转拼音功能\n */\nexport function usePinyin() {\n /**\n * 中文转拼音(默认无音调、空格分隔)\n * @param text 中文字符串\n * @param withTone 是否带音调(默认 false)\n */\n const toPinyin = (text: string, withTone = false): string => {\n if (!text) return '';\n return pinyin(text, {\n toneType: withTone ? 'symbol' : 'none',\n type: 'string',\n multiple: false,\n });\n };\n\n /**\n * 获取拼音首字母\n * @param text 中文字符串\n */\n const getFirstLetter = (text: string): string => {\n if (!text) return '';\n return pinyin(text, {\n pattern: 'first',\n toneType: 'none',\n type: 'string',\n }).replace(/\\s+/g, '');\n };\n\n /**\n * 获取拼音数组(按字分隔)\n * @param text 中文字符串\n */\n const getPinyinArray = (text: string): string[] => {\n if (!text) return [];\n return pinyin(text, {\n toneType: 'none',\n type: 'array',\n });\n };\n\n return {\n toPinyin,\n getFirstLetter,\n getPinyinArray,\n };\n}\n","<!--\n * @title: expand menu list\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-09-04 12:37:50\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-03-09 14:09:39\n * @version: 1.0.5\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { computed, ref, onMounted } from 'vue';\n import { ElAutocomplete, ElTabs, ElTabPane, ElIcon } from 'element-plus';\n import { Search, Star, StarFilled } from '@element-plus/icons-vue';\n import { useI18n } from 'vue-i18n';\n import { useStyle } from '@/hook/web/useStyle';\n import { usePermsStore } from '@/store/modules/perms';\n import { usePinyin } from '@@/hooks/web/usePinyin';\n import type { RouteType } from './types';\n import { pathResolve, isExternal, sleep } from '@@/utils';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('expand-menu-list');\n\n defineOptions({\n name: 'GvMenuList', // 定义组件名称\n });\n const { t } = useI18n();\n const permStore = usePermsStore();\n const pinYin = usePinyin();\n const routes = computed(() => permStore.getServerRouters);\n\n const emit = defineEmits(['close']);\n\n const menuList = ref<RouteType[]>();\n const menuPath = ref('');\n\n const fMenusList = ref<AppRouteRecordRaw[]>([]);\n\n // ------ watch hook------\n // watchEffect();\n // // [routes, menusList],\n // // [\n // // (n, o) => {\n // // this.menusList = this.generateRoutes(this.routes.value);\n // // },\n // // (list) => {\n // // // 转换拼音\n // // if (this.supportPinyinSearch) this.addPinyinField(list);\n // // },\n // // ],\n\n // ------ methods hook ------\n /**\n * @todo: generate routes\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-09-15 10:46:56\n * @param {*} sidebarRoutes\n * @param {*} basePath\n * @param {*} prefixTitle\n * @param {*} prefixCode\n */\n\n const generateRouter = (serverRoutes: AppRouteRecordRaw[], basePath = '/', prefixTitle: string[] = [], prefixCode: string[] = []): RouteType[] => {\n let res: RouteType[] = [];\n for (const router of serverRoutes) {\n if (router.redirect === '/404') continue;\n if (router.meta?.hidden) continue;\n const data: RouteType = {\n path: pathResolve(basePath, router.path),\n title: [...(prefixTitle as string[])],\n pinyinTitle: pinYin.getFirstLetter([...(prefixTitle as string[])].join('')),\n code: [...prefixCode],\n };\n if (router.meta && router.meta.title) {\n const i18ntitle = router.meta.title;\n const code = router.meta.code || '';\n data.title = [...data.title, i18ntitle];\n data.pinyinTitle = pinYin.getFirstLetter(data.title.join(''));\n data.code = [...data.code, String(code)];\n if (router.redirect !== 'noredirect') res.push(data);\n else if (basePath === '/') fMenusList.value.push(router);\n }\n if (router.children) {\n const tempRoutes = generateRouter(router.children, data.path, data.title);\n if (tempRoutes.length >= 1) res = [...res, ...tempRoutes];\n }\n }\n return res;\n };\n\n const handleCloseDrawer = () => {\n emit('close');\n };\n\n /**\n * @todo: click menu item handle\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-03-09 10:56:00\n * @param {*} item\n */\n const handleSelect = (item: RouteType) => {\n // push({ path: item.path });\n // handleCloseDrawer();\n sleep(200).then(() => {\n menuPath.value = '';\n });\n };\n\n const handleSearch = (query: string, cb: any) => {\n let res: RouteType[] = [];\n if (query !== '')\n if (Array.isArray(menuList.value))\n res = menuList.value.filter((item) => {\n if (item.title.join('').indexOf(query) !== -1) return item;\n else if (item.pinyinTitle.indexOf(query.toLowerCase()) !== -1) return item;\n else if (item.path.indexOf(query) !== -1) return item;\n });\n else res = menuList.value ?? [];\n else res = menuList.value ?? [];\n cb(res);\n };\n\n /**\n * @todo: star click handle\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-10-11 10:20:33\n * @param {*} star\n * @param {*} path\n * @param {*} title\n * @param {*} menuItem\n */\n const starClickHandle = (star, path, title, menuItem) => {};\n\n // ------ mounted hook ------\n onMounted(() => {\n menuList.value = generateRouter(routes.value);\n // console.log('routes', permStore.getServerRouters);\n // console.log('menuList', menuList.value);\n });\n</script>\n<template>\n <div :class=\"prefixCls\">\n <!-- search -->\n <div class=\"search\">\n <div class=\"top\">\n <ElAutocomplete\n v-model=\"menuPath\"\n value-key=\"path\"\n :fetch-suggestions=\"handleSearch\"\n :placeholder=\"t('sideBar.menuSearch')\"\n @select=\"handleSelect\">\n <template #prefix>\n <ElIcon>\n <Search />\n </ElIcon>\n </template>\n <template v-slot=\"{ item }\">\n <span class=\"name\">{{ item.title.join(' > ') }}</span>\n </template>\n </ElAutocomplete>\n </div>\n </div>\n <!-- main -->\n <div class=\"main\">\n <ElTabs tab-position=\"right\">\n <ElTabPane\n v-for=\"item in fMenusList\"\n :key=\"item.name\"\n :label=\"item.meta?.title\"\n lazy>\n <div class=\"column-wrap\">\n <div\n v-for=\"sub in item.children\"\n :key=\"sub.name\"\n class=\"box\">\n <template v-if=\"!sub.children || sub.children.length === 0\">\n <ul class=\"leaf\">\n <li>\n <ElIcon @click.stop=\"starClickHandle(sub.meta?.star, sub.path, sub.meta?.title, sub)\">\n <component :is=\"sub.meta?.star ? StarFilled : Star\" />\n </ElIcon>\n <router-link\n v-if=\"!isExternal(sub.path)\"\n :to=\"`${item.path}/${sub.path}`\"\n @click=\"handleCloseDrawer\">\n {{ sub.meta?.title }}\n </router-link>\n <a\n v-else\n :href=\"sub.path\"\n target=\"_blank\"\n rel=\"noopener\">\n {{ sub.meta?.title }}</a\n >\n </li>\n </ul>\n </template>\n <template v-else>\n <h4>{{ sub.meta?.title }}</h4>\n <ul>\n <li\n v-for=\"x in sub.children\"\n :key=\"x.name\">\n <ElIcon @click.stop=\"starClickHandle(x.meta?.star, x.name, x.meta?.title, x)\">\n <component :is=\"x.meta?.star ? StarFilled : Star\" />\n </ElIcon>\n <router-link\n v-if=\"!isExternal(sub.path)\"\n :to=\"`${item.path}/${sub.path}/${x.path}`\"\n @click=\"handleCloseDrawer\">\n {{ x.meta?.title }}\n </router-link>\n <a\n v-else\n :href=\"sub.path\"\n target=\"_blank\"\n rel=\"noopener\">\n {{ x.meta?.title }}</a\n >\n </li>\n </ul>\n </template>\n </div>\n </div>\n </ElTabPane>\n </ElTabs>\n </div>\n </div>\n</template>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-expand-menu-list';\n .#{$prefixCls} {\n position: absolute;\n width: 650px;\n height: 100%;\n left: 0px;\n background: #272b2c;\n &::after {\n top: 0;\n right: 0;\n width: 150px;\n height: 100%;\n content: '';\n background: #272b2c;\n }\n :deep(.search) {\n height: 100px;\n width: 500px;\n background: #313538;\n .top {\n padding: 30px 0 0 100px;\n i {\n color: var(--left-menu-text-color);\n }\n .el-autocomplete {\n width: 300px;\n border-bottom: 1px solid #626466;\n border-radius: 0;\n .el-input {\n .el-input__wrapper {\n background: var(--left-menu-expand-bg-color);\n box-shadow: none;\n padding-left: 30px;\n .el-input__inner {\n font-size: $appTextSize;\n color: #fff;\n border: none;\n line-height: 40px;\n height: 40px;\n }\n }\n }\n }\n }\n }\n :deep(.main) {\n position: relative;\n height: calc(100% - 100px);\n .el-tabs {\n height: 100%;\n overflow-y: auto;\n &::-webkit-scrollbar {\n display: none;\n }\n .el-tabs__header {\n position: absolute;\n top: 0;\n right: 0;\n .el-tabs__nav-wrap {\n padding: 0;\n .el-tabs__nav-scroll {\n overflow-y: auto;\n .el-tabs__nav {\n padding-bottom: $modulePadding;\n }\n }\n .el-tabs__item {\n height: 30px;\n padding: 0 0 0 15px;\n font-size: $textSize;\n line-height: 30px;\n color: $menuText;\n &.is-active {\n font-weight: 500;\n color: #fff;\n }\n }\n &.is-right {\n width: 151px;\n }\n &::after {\n display: none;\n }\n }\n }\n .el-tabs__content {\n background: #313538;\n margin-right: 150px;\n .el-tab-pane {\n padding-right: 20px;\n }\n .column-wrap {\n column-count: 2;\n column-gap: 0;\n .box {\n padding-bottom: 10px;\n padding-left: 30px;\n -webkit-column-break-inside: avoid;\n page-break-inside: avoid;\n break-inside: avoid;\n h4 {\n margin-bottom: 12px;\n height: 32px;\n font-size: $textSize;\n font-weight: 500;\n line-height: 32px;\n color: $menuText;\n border-bottom: 1px solid #626466;\n }\n ul {\n padding-left: 0;\n margin-top: 8px;\n list-style: none;\n &.leaf {\n margin-top: 18px;\n }\n li {\n line-height: 26px;\n i {\n font-size: 14px;\n cursor: pointer;\n top: 2px;\n }\n .el-icon {\n color: $menuText;\n }\n a {\n padding-left: 3px;\n font-size: $textSize;\n color: $menuText;\n transition: all 0.3s ease;\n &:hover {\n color: var(--menuActiveText, $menuActiveText);\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n</style>\n","<!--\n * @title: Expand Menu\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-09-02 09:39:04\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-03-09 11:18:26\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { computed, ref } from 'vue';\n import { ElDrawer } from 'element-plus';\n import { propTypes } from '../../utils/gv.propTypes';\n\n import { useI18n } from '@/hook/web/useI18n';\n import { useStyle } from '@/hook/web/useStyle';\n import GvMenuList from './GvMenuList.vue';\n\n defineOptions({\n name: 'GvExpandMenu', // 定义组件名称\n });\n\n const props = defineProps({\n collapse: propTypes.bool.def(true),\n });\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('expand-menu');\n\n const { t } = useI18n();\n const visible = ref(false);\n const sideWidth = computed(() => (props.collapse ? '54px' : '200px'));\n const expandHandle = () => {\n visible.value = !visible.value;\n };\n</script>\n<template>\n <div :class=\"prefixCls\">\n <div\n class=\"expand-menu-title\"\n :class=\"{ selected: visible ? true : false }\"\n @click.stop=\"expandHandle\">\n <i :class=\"['iconfont', 'gv-icon-wangzhandaohang']\"></i>\n <span\n v-if=\"!collapse\"\n class=\"text\"\n >{{ t('sideBar.menuNav') }}</span\n >\n </div>\n <ElDrawer\n v-model=\"visible\"\n :style=\"{ left: sideWidth, paddingLeft: sideWidth }\"\n class=\"sidebar-expand-drawer\"\n :with-header=\"false\"\n :append-to-body=\"true\"\n direction=\"ltr\"\n resizable\n :modal-class=\"!collapse ? 'sidebar-expand-menu-collapse' : 'sidebar-expand-menu-unCollapse'\"\n size=\"650\">\n <GvMenuList @close=\"visible = false\" />\n </ElDrawer>\n </div>\n</template>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-expand-menu';\n .#{$prefixCls} {\n height: 40px;\n background-color: $menuBg;\n\n .expand-menu-title {\n width: 100%;\n padding-left: 14px;\n line-height: 48px;\n color: $menuText;\n cursor: pointer;\n\n &.selected,\n &:hover {\n color: var(--left-menu-text-active-color);\n background-color: $menuHover;\n }\n\n i {\n width: 24px;\n font-size: 20px;\n font-weight: 500;\n color: var(--left-menu-text-color);\n text-align: center;\n vertical-align: middle;\n }\n\n .text {\n display: inline-block;\n line-height: 48px;\n margin-left: 10px;\n font-size: $textSize;\n color: var(--left-menu-text-color);\n vertical-align: middle;\n &:hover {\n color: var(--left-menu-text-active-color);\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvExpandMenu from './src/GvExpandMenu.vue';\n// Define the install method on the GvExpandMenu component\nconst GvExpandMenuPlugin = {\n install(app: App): void {\n app.component(GvExpandMenu.name ?? 'GvExpandMenu', GvExpandMenu);\n },\n};\n\nexport { GvExpandMenu };\n\nexport default GvExpandMenuPlugin;\n","<!--\n * @title: navigation tags view\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-11-20 10:57:41\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-03-10 17:29:01\n * @version: 1.0.4\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { computed, defineComponent, onMounted, ref, reactive, unref, watch, nextTick } from 'vue';\n import { ElTabs, ElTabPane } from 'element-plus';\n import { useRouter, type RouteLocationNormalizedLoaded } from 'vue-router';\n import { useI18n } from 'vue-i18n';\n import { useEventListener } from '@vueuse/core';\n import { useStyle } from '@/hook/web/useStyle';\n import { useTagsViewStoreWithOut } from '@/store/modules/tagsView';\n import { usePermsStoreWithOut } from '@/store/modules/perms';\n import { joinIcon, pathResolve } from '@@/utils';\n import { cloneDeep } from 'lodash-es';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('tags-view');\n export default defineComponent({\n name: 'GvTagsView',\n setup() {\n const visible = ref(false);\n const position = reactive({ x: 0, y: 0 });\n const currentKey = ref('');\n\n const { currentRoute, push, replace } = useRouter();\n const activeKey = ref<string>(unref(currentRoute).path || '/dashboard');\n const { t } = useI18n();\n const tagsViewStore = useTagsViewStoreWithOut();\n const usePermsStore = usePermsStoreWithOut();\n\n const visitedViews = computed(() => tagsViewStore.visitedViews);\n const mainAppRoutes = computed(() => usePermsStore.mainAppRoutes);\n\n const isRedirect = (path: string) => path.startsWith('/redirect');\n const isActive = (route) => route.path === unref(currentRoute).path;\n const isAffix = (tag) => tag.meta && tag.meta.affix;\n\n /**\n * @todo: filter affix nav menus\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-28 11:39:08\n * @param {*} mainAppRoutes\n * @param {*} basePath\n */\n const filterAffixNavMenus = (navMenus, basePath = '/'): RouteLocationNormalizedLoaded[] => {\n const affixTags: RouteLocationNormalizedLoaded[] = [];\n // console.log('navMenus:', navMenus.value);\n navMenus.value.forEach((route) => {\n if (route.meta && route.meta.affix === true) {\n const tagPath = pathResolve(basePath, route.path);\n affixTags.push({\n fullPath: tagPath,\n path: tagPath,\n name: route.name,\n meta: route.meta,\n matched: [],\n params: {},\n query: {},\n hash: '',\n redirectedFrom: undefined,\n });\n }\n });\n return affixTags;\n };\n /**\n * @todo: add affix tags\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-28 11:45:26\n */\n const addAffixTags = () => {\n const affixTags = filterAffixNavMenus(mainAppRoutes);\n\n for (const tagView of affixTags) if (tagView.name) tagsViewStore.addVisitedView(tagView);\n };\n /**\n * @todo: create tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 10:36:56\n */\n const createTabPanel = () =>\n visitedViews.value.map((v) => {\n const icons = joinIcon(v.meta?.picon);\n const closable = visitedViews.value.length > 1;\n const title = t(v.meta?.title ?? 'no-name');\n return (\n <ElTabPane\n key={String(v.path)}\n name={String(v.path)}\n label={title}\n closable={closable}>\n {{\n label: () => (\n <span class=\"tab-label\">\n {icons && <i class={icons}></i>}\n {title}\n </span>\n ),\n }}\n </ElTabPane>\n );\n });\n\n /**\n * @todo: show right context menu\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-28 17:22:53\n * @param {*} key\n */\n const showContextMenu = (key: string) => {\n currentKey.value = key;\n visible.value = true;\n };\n /**\n * @todo: close right context menu\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 09:31:06\n */\n const closeContextMenu = () => {\n visible.value = false;\n };\n /**\n * @todo: jump to link route\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-11-21 11:25:08\n * @param {*} routePath\n */\n const toLink = (routePath: string) => {\n // const { query } = this.$route;\n activeKey.value = routePath || '/dashboard';\n push({ path: routePath, query: {} });\n };\n /**\n * @todo: jump to last tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 10:31:01\n * @param {*} visitedView\n * @param {*} currentView\n */\n const toLastView = (visitedView: RouteLocationNormalizedLoaded[], currentView: RouteLocationNormalizedLoaded) => {\n const latestView = visitedView.slice(-1)[0];\n if (visitedView) {\n activeKey.value = latestView.path;\n push(latestView.fullPath);\n } else if (currentView.name === 'Dashboard') replace({ path: '/redirect' + currentView.fullPath });\n else push('/');\n };\n /**\n * @todo: add menu tab\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-11-21 10:27:35\n */\n const addNavMenu = () => {\n const name = currentRoute.value.name;\n if (name) tagsViewStore.addTagView(currentRoute.value);\n };\n\n const moveToCurrentTag = (view: RouteLocationNormalizedLoaded) => {\n // toLink(view.path);\n };\n\n /**\n * @todo: click tab event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 12:08:48\n * @param {*} tab\n */\n const clickTab = (tab) => {\n toLink(tab.props.name);\n };\n /**\n * @todo: close current tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 09:56:44\n * @param {*} targetKey\n */\n const closeCurrentTag = async (targetKey) => {\n const view = visitedViews.value.filter((view) => view.path === targetKey);\n if (isAffix(view[0])) return;\n\n await tagsViewStore.delTagView({ view: view[0] });\n\n // 清除缓存的search条件\n // currentRoute.value.meta.search = {};\n // 判断是否是当前标签页关闭\n if (isActive(view[0])) toLastView(visitedViews.value, view[0]);\n };\n /**\n * @todo: refresh selected tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 09:40:45\n */\n const refreshSelectedTag = async () => {\n tagsViewStore.delCachedView(unref(currentRoute));\n const { path, query } = unref(currentRoute);\n await nextTick();\n replace({\n path: '/redirect' + path,\n query: query,\n });\n };\n const findCurTagIndex = () => visitedViews.value.findIndex((x) => x.path === currentKey.value);\n /**\n * @todo: close right/left tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 10:42:33\n * @param {*} direction\n */\n const closeTagsOrientation = (direction) => {\n const index = findCurTagIndex();\n if (index === -1) return;\n let isClosed = false;\n const vV = cloneDeep(visitedViews.value);\n vV.map(({ path }, i) => {\n if (direction === 'right' && i > index) {\n if (path === unref(activeKey)) isClosed = true;\n closeCurrentTag(path);\n } else if (direction === 'left' && i < index) {\n if (path === unref(activeKey)) isClosed = true;\n closeCurrentTag(path);\n }\n });\n // 跳转至当前页\n if (isClosed) toLink(unref(currentKey));\n };\n /**\n * @todo: close other tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 11:04:12\n */\n const closeOthersTags = () => {\n const index = findCurTagIndex();\n if (index === -1) return;\n push(currentKey.value);\n\n tagsViewStore.delOthersViews(currentRoute.value).then(() => {\n moveToCurrentTag(unref(currentRoute));\n });\n };\n\n watch(\n () => [currentRoute.value.path, currentRoute.value.name],\n ([path, name], [, oldName]) => {\n // if /redirect\n if (isRedirect(path as string)) return;\n // 当前选中tab页\n activeKey.value = (path as string) || '/dashboard';\n // del notify msg\n if (oldName !== name) {\n const alertObj = document.body.querySelector('body>.el-notification');\n if (alertObj) alertObj.remove();\n }\n addNavMenu();\n // moveToCurrentTag(currentRoute.value);\n },\n );\n\n /**\n * @todo: bind right click event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-28 15:28:28\n */\n const tagsViewEl = ref<HTMLElement | null>(null);\n useEventListener(tagsViewEl, 'contextmenu', (ev: MouseEvent) => {\n ev.preventDefault();\n\n let targetNode: HTMLElement | null = null;\n const el = ev.target as HTMLElement;\n\n if (el.tagName === 'SPAN') targetNode = el.parentElement;\n else targetNode = el;\n\n const classNames = targetNode ? [...targetNode.classList] : [];\n if (classNames.includes('el-tabs__item')) {\n const path = targetNode?.getAttribute('aria-controls')?.replace(/^pane-/, '') || '';\n if (path !== unref(currentRoute).path) toLink(path);\n\n position.x = ev.clientX || ev.pageX;\n position.y = ev.clientY || ev.pageY;\n\n showContextMenu(path);\n }\n });\n /**\n * @todo: close context menu on window click\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 09:39:46\n */\n useEventListener(window, 'click', () => {\n closeContextMenu();\n });\n\n // mounted hooks\n onMounted(() => {\n addAffixTags();\n addNavMenu();\n });\n return () => (\n <div\n ref={tagsViewEl}\n class={[prefixCls, 'flex w-full relative bg-[#fff] dark:bg-[var(--el-bg-color)']}>\n <ElTabs\n class=\"multi-tab\"\n type=\"card\"\n modelValue={activeKey.value}\n onUpdate:modelValue={(v: string) => (activeKey.value = v)}\n onTabClick={clickTab}\n onTabRemove={closeCurrentTag}>\n {createTabPanel()}\n </ElTabs>\n {visible.value && (\n <ul\n class=\"tagsView-contextmenu\"\n style={{ left: `${position.x + 10}px`, top: `${position.y - 10}px` }}>\n <li onClick={refreshSelectedTag}>{t('tagsView.refresh')}</li>\n {currentKey.value !== '/dashboard' && visitedViews.value.length === 2 && <li onClick={() => closeCurrentTag(currentKey.value)}>{t('tagsView.close')}</li>}\n {currentKey.value !== '/dashboard' && visitedViews.value.length > 1 && findCurTagIndex() < visitedViews.value.length - 1 && (\n <li onClick={() => closeTagsOrientation('right')}>{t('tagsView.closeRight')}</li>\n )}\n {currentKey.value !== '/dashboard' && visitedViews.value.length > 2 && findCurTagIndex() > 1 && <li onClick={() => closeTagsOrientation('left')}>{t('tagsView.closeLeft')}</li>}\n {currentKey.value === '/dashboard' && visitedViews.value.length > 1 && <li onClick={closeOthersTags}>{t('tagsView.closeOthers')}</li>}\n {currentKey.value !== '/dashboard' && visitedViews.value.length > 2 && <li onClick={closeOthersTags}>{t('tagsView.closeOthers')}</li>}\n </ul>\n )}\n </div>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-tags-view';\n\n .#{$prefixCls} {\n user-select: none; // 禁止选中文本\n\n .multi-tab {\n width: 100%;\n position: relative;\n :deep(.el-tabs__header) {\n margin: 0;\n border-bottom-color: $borderColor;\n height: 34px;\n line-height: 34px;\n .el-tabs__nav {\n border-color: $borderColor;\n .el-tabs__item {\n height: 34px; // 38px\n line-height: 34px; // 38px\n padding: 2px 10px 0 10px; // 0 10px\n font-size: $textSize;\n border-left-color: $borderColor;\n\n &.is-active {\n & > span {\n font-weight: $fontWeight2;\n }\n color: var(--primaryColor, $primaryColor);\n }\n &:focus.is-focus:not(:active) {\n box-shadow: 0 0 1px 1px inset;\n }\n > span {\n font-weight: 500;\n > i {\n padding-right: 5px;\n font-size: $textSize;\n }\n }\n }\n }\n .is-scrollable {\n .el-tabs__nav-next,\n .el-tabs__nav-prev {\n line-height: 42px;\n }\n\n i {\n font-size: 18px;\n color: rgba(0, 0, 0, 0.65);\n }\n }\n }\n .el-tabs__content {\n display: none !important;\n }\n }\n :deep(.tagsView-contextmenu) {\n position: fixed;\n top: $navHeadHeight;\n left: 300px;\n z-index: 9999;\n min-width: 90px;\n padding: 6px 0;\n list-style: none;\n background-color: #fff;\n border: 1px solid $borderColorSecondary;\n border-radius: $borderRadius;\n box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);\n li {\n line-height: 27px;\n padding: 0 15px;\n font-size: 13px;\n &:hover,\n &:focus {\n background-color: $backgroundColor;\n color: var(--primaryColorHover, $primaryColorHover);\n cursor: pointer;\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvTagsView from './src/GvTagsView.vue';\n// Define the install method on the GvExpandMenu component\nconst GvTagsViewPlugin = {\n install(app: App): void {\n app.component(GvTagsView.name ?? 'GvTagsView', GvTagsView);\n },\n};\nexport default GvTagsViewPlugin;\n\nexport { GvTagsView };\n","// bridge/index.ts\nimport type { Router } from 'vue-router';\nimport type { Pinia } from 'pinia';\nimport type { Composer } from 'vue-i18n';\n\ninterface GlobalBridgeContext {\n router?: Router;\n i18n?: Composer;\n store?: Pinia;\n}\nconst globalBridgeKey = '__LIB_BRIDGE_CONTEXT__';\nconst getBridge = (): GlobalBridgeContext => {\n const g = globalThis as any;\n if (!g[globalBridgeKey]) g[globalBridgeKey] = {};\n\n return g[globalBridgeKey];\n};\nconst context: GlobalBridgeContext = {};\n\n// export function setBridgeContext(options: GlobalBridgeContext) {\n// if (options.router) context.router = options.router;\n// if (options.i18n) context.i18n = options.i18n;\n// if (options.pinia) context.pinia = options.pinia;\n// }\nexport const setBridgeContext = (ctx: GlobalBridgeContext) => {\n // console.log('setBridgeContext', ctx);\n Object.assign(getBridge(), ctx);\n};\n\nexport function useBridgeRouter(): Router {\n const router = getBridge().router;\n if (!router) throw new Error('[Bridge] router not set');\n return router;\n}\n// export function useBridgeRouter(): Router {\n// if (!context.router) throw new Error('[Bridge] Router is not injected');\n// return context.router;\n// }\n\nexport function useBridgeI18n(): Composer {\n const i18n = getBridge().i18n;\n if (!i18n) throw new Error('[Bridge] I18n is not injected');\n return i18n;\n}\n\n// export function useBridgeI18n(): Composer {\n// if (!context.i18n) throw new Error('[Bridge] I18n is not injected');\n// return context.i18n;\n// }\n\nexport function useBridgePinia(): Pinia {\n if (!context.store) throw new Error('[Bridge] Pinia is not injected');\n return context.store;\n}\n","/*\n * @title: CRUD hook\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 15:25:08\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-04-10 17:54:48\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\n/**\n * @todo: request data\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 15:39:44\n * @param {*} fetch\n * @param {*} datas\n */\nconst fetchData = async <T = any>(fetch, params): Promise<IResponse<T>> => (await fetch(params)) as IResponse<T>;\nexport const useCrud = () => ({\n fetchData,\n});\n","/*\n * @title: sessionStorage and localStorage hook\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-03-19 16:32:15\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-04-24 17:11:28\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\n// 获取传入的值的类型\nconst getValueType = (value: any): string => {\n const type = Object.prototype.toString.call(value);\n return type.slice(8, -1);\n};\n\nexport const useStorage = (type: 'sessionStorage' | 'localStorage' = 'sessionStorage'): IWebStorage => {\n const setStorage = (key: string, value: any): void => {\n const valueType = getValueType(value);\n window[type].setItem(key, JSON.stringify({ type: valueType, value }));\n };\n\n const getStorage = (key: string): any => {\n const value = window[type].getItem(key);\n if (value) {\n const { value: val } = JSON.parse(value);\n return val;\n } else return value;\n };\n\n const removeStorage = (key: string): void => {\n window[type].removeItem(key);\n };\n\n const clear = (excludes?: string[]): void => {\n // 获取排除项\n const keys = Object.keys(window[type]);\n const defaultExcludes = ['dynamicRouter', 'serverDynamicRouter'];\n const excludesArr = excludes ? [...excludes, ...defaultExcludes] : defaultExcludes;\n const excludesKeys = excludesArr ? keys.filter((key) => !excludesArr.includes(key)) : keys;\n // 排除项不清除\n excludesKeys.forEach((key) => {\n window[type].removeItem(key);\n });\n // window[type].clear()\n };\n\n return {\n setStorage,\n getStorage,\n removeStorage,\n clear,\n };\n};\n","/*\n * @title: message alert confirm\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 11:47:30\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-07-15 12:07:50\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport { ElMessageBox, ElNotification, ElMessage } from 'element-plus';\nimport { useStorage } from '@@/hooks/web/useStorage';\n// import { useLocaleStoreWithOut } from '@/store/modules/locale';\nimport { sleep, isError } from '@@/utils';\n// const localeStore = useLocaleStoreInstance();\n// const { lang } = localeStore.getCurrentLocale;\nconst { getStorage } = useStorage('localStorage');\nconst lang = getStorage('lang');\nconst notificationTime = 5000;\nconst notificationTimeError = 6000;\nconst messageTime = 2000;\nconst messageTimeError = 5000;\ninterface ConfirmOptions {\n title?: string;\n message: string;\n confirmButtonText?: string;\n cancelButtonText?: string;\n type?: 'success' | 'warning' | 'info' | 'error';\n showCancelButton?: boolean;\n}\n/**\n * @todo: Notification - MessageBox\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 13:48:24\n * @param {unknown} msg\n * @param {MessageType} type\n * @param {string} title\n */\nexport const alert = async (msg: unknown, type: MessageType = 'success') => {\n const alertObj = document.body.querySelector('body>.el-notification');\n if (alertObj) alertObj.remove();\n let promptMsg = '提示信息';\n if (lang === 'en') promptMsg = 'Hint';\n const duration = type === 'error' ? notificationTimeError : notificationTime;\n let m = 'No message...';\n if (isError(msg)) m = msg.message || 'No message...';\n else if (typeof msg === 'string') m = msg;\n else if (typeof msg === 'object') m = JSON.stringify(msg);\n\n ElNotification({\n title: promptMsg,\n message: m,\n type,\n duration: duration,\n });\n await sleep(duration);\n};\n/**\n * @todo: confirm - MessageBox\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 12:03:27\n * @param {*} msg\n * @param {*} type\n */\nexport const confirm = async (msg: string, type: MessageType = 'warning') => {\n if (document.body.querySelector('body>.el-confirm')) return;\n // 返回 Promise 对象\n let msgs: string;\n const showCancelButton = true;\n msgs = '是否确定此操作?';\n let hint = '提示信息';\n let ok = '确定';\n let cancel = '取消';\n if (msg) msgs = msg;\n else if (lang === 'en') {\n msgs = 'Are you sure you want to proceed?';\n hint = 'Hint';\n ok = 'Ok';\n cancel = 'Cancel';\n }\n\n return new Promise((resolve, reject) => {\n ElMessageBox.confirm(msgs, hint, {\n confirmButtonText: ok,\n cancelButtonText: cancel,\n type,\n showCancelButton,\n } as ConfirmOptions)\n .then(() => {\n resolve(true);\n })\n .catch(() => {\n reject(false);\n });\n });\n};\n\nexport const message = async (msg: unknown, type: MessageType = 'warning', tableedit: boolean = false) => {\n if (tableedit === false) {\n const messageObj = document.body.querySelector('body>.el-message');\n // if (messageObj) messageObj.style.display = 'none';\n if (messageObj) return;\n const notifyObj = document.body.querySelector('body>.el-notification');\n if (notifyObj) return;\n }\n let m = 'No message...';\n if (isError(msg)) m = msg.message || 'No message...';\n else if (typeof msg === 'string') m = msg;\n else if (typeof msg === 'object') m = JSON.stringify(msg);\n const duration = type === 'error' ? messageTimeError : messageTime;\n ElMessage({\n message: m,\n showClose: true,\n type,\n duration: duration,\n });\n await sleep(duration);\n};\n","import { alert, message, confirm } from '@@/GvNotify';\n\nexport const useNotify = () => ({\n alert,\n message,\n confirm,\n});\n","/*\r\n * @title: encrypt\r\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\r\n * @Date: 2023-12-16 08:07:24\r\n * @LastEditors: andy.ten@tom.com\r\n * @LastEditTime: 2025-04-07 13:54:00\r\n * @version: 1.0.1\r\n * @copyright: copyright (c) 2025 Andy Xu\r\n * node: you can not copy and/or use and/or modify this program free,\r\n * please reserve the segment above.Please mail me if you have any question.\r\n */\r\n\r\nimport CryptoJS from 'crypto-js';\r\nexport const key = 'abcdefgabcdefg12';\r\nexport const encrypt = (word: any): string => {\r\n const keyStr = CryptoJS.enc.Utf8.parse(key);\r\n let ww;\r\n if (typeof word === 'object') ww = JSON.stringify(word);\r\n else ww = word;\r\n const srcs = CryptoJS.enc.Utf8.parse(ww);\r\n const encrypted = CryptoJS.AES.encrypt(srcs, keyStr, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });\r\n return encrypted.toString();\r\n};\r\nexport const decrypt = (word: string): any => {\r\n const keyStr = CryptoJS.enc.Utf8.parse(key);\r\n const decrypt = CryptoJS.AES.decrypt(word, keyStr, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });\r\n return CryptoJS.enc.Utf8.stringify(decrypt).toString();\r\n};\r\n// Randomly generate a specified number of hexadecimal keys\r\nexport const generateKey = (num: number): string => {\r\n const library = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\r\n let key = '';\r\n for (let i = 0; i < num; i++) {\r\n const randomPoz = Math.floor(Math.random() * library.length);\r\n key += library.substring(randomPoz, randomPoz + 1);\r\n }\r\n return key;\r\n};\r\n","/*\n * @title: package lib entry\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2024-11-28 18:18:44\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-03-12 15:55:55\n * @version: 1.0.3\n * @copyright: copyright (c) 2024 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\nimport type { App } from 'vue';\nimport type { Pinia } from 'pinia';\nimport { setActivePinia } from 'pinia';\nimport type { Composer } from 'vue-i18n';\n\nimport GvButton from './GvButton';\nimport GvIcon from './GvIcon';\nimport GvLangSelect from './GvLangSelect';\nimport GvBacktop from './GvBacktop';\nimport GvBreadCrumb from './GvBreadCrumb';\nimport GvHamburger from './GvHamburger';\nimport GvScreenFull from './GvScreenFull';\nimport GvSidebar from './GvSidebar';\nimport GvSidebarLogo from './GvSidebarLogo';\nimport GvTheme from './GvTheme';\nimport GvExpandMenu from './GvExpandMenu';\nimport GvTagsView from './GvTagsView';\n\nimport { setBridgeContext } from './bridge';\n\nconst components = [GvButton, GvIcon, GvLangSelect, GvBacktop, GvBreadCrumb, GvHamburger, GvScreenFull, GvSidebar, GvSidebarLogo, GvTheme, GvExpandMenu, GvTagsView];\n\nexport type GuavaUIOptions = {\n store: Pinia;\n i18n: Composer;\n};\n\nexport const install = (app: App, options: GuavaUIOptions) => {\n if ((install as any).INSTALLED) return;\n (install as any).INSTALLED = true;\n\n setActivePinia(options.store);\n setBridgeContext(options);\n\n components.forEach((c) => c.install(app));\n};\n\nconst GuavaUI = { install };\n\n// 🔹 按需导出组件\nexport { GvButton, GvIcon, GvLangSelect, GvBacktop, GvBreadCrumb, GvHamburger, GvScreenFull, GvSidebar, GvSidebarLogo, GvTheme, GvExpandMenu, GvTagsView };\n\n// 🔹 hooks / utils\nexport * from './hooks/service/useCrud';\nexport * from './hooks/web/useNotify';\nexport * from './hooks/web/useStorage';\nexport * from './hooks/web/usePinyin';\nexport * from './utils/gv.propTypes';\nexport * from './utils/gv.secret';\nexport * from './utils/gv.tree';\nexport * from './utils/index';\n\n// 🔹 默认导出统一安装对象\nexport { GuavaUI };\n"],"names":["_sfc_main$c","name","props","message","type","String","default","request","components","emits","setup","emit","slots","getSlots","computed","watch","newVal","handleClick","event","msg","alert","_createVNode","ElButton","value","_export_sfc","sfc","GvButton","app","_a","setHtmlAttrByLang","locale","sleep","timeLen","__async","resolve","toHump","all","letter","toLine","setDomCssProp","prop","val","dom","getDomCssProp","joinIcon","icon","joinIcons","setQuickKeys","ev","btnHtml","inputHtml","messageConfirmHtml","bodyDialogHtml","dialogArr","i","buttonHtml","buttonDHtml","toString","is","isExternal","path","isString","isArray","isError","isObject","isDate","isNumber","isBoolean","isFunction","isElement","isMap","isImgPath","isDark","isNull","isEmpty","isUrl","e","pathResolve","parentPath","childPath","variables","useStyle","preNameSpace","attrs","useAttrs","__props","isLocal","iconName","svgClass","styleExternalIcon","_openBlock","_createElementBlock","_mergeProps","_unref","_createElementVNode","_hoisted_1","_hoisted_2","GvIcon","newPropTypes","createTypes","propTypes","toValidableType","getPrefixCls","prefixCls","localeStore","useLocaleStore","langMap","currentLang","router","useRouter","handleSetLang","lang","unref","switchLocale","useLocale","_createBlock","ElDropdown","_normalizeClass","ElDropdownMenu","_Fragment","_renderList","item","ElDropdownItem","_createTextVNode","_toDisplayString","_component_GvIcon","GvLangSelect","ElBacktop","GvBacktopPlugin","GvBacktop","filterBreadcrumb","routes","res","route","meta","data","__spreadProps","__spreadValues","DEFAULT_CONFIG","getConfig","config","listToTree","list","conf","nodeMap","result","id","children","pid","node","parent","treeToList","tree","findNode","func","findNodeAll","findPath","visitedSet","findPathAll","filter","listFilter","forEach","treeMapEach","conversion","haveChildren","conversionData","treeMap","treeData","opt","eachTree","treeDatas","callBack","parentNode","element","newNode","_isSlot","s","Object","prototype","call","_isVNode","_sfc_main$8","appStore","useAppStore","permStore","usePermsStore","showBreadcrumbIcon","getShowBreadcrumbIcon","currentRoute","t","useI18n","levelList","ref","menuRouters","routers","getRouters","getBreadcrumb","currentPath","matched","slice","renderBreadcrumb","map","v","disabled","redirect","ElBreadcrumbItem","title","startsWith","immediate","_slot","ElBreadcrumb","TransitionGroup","GvBreadCrumb","collapse","toggleCollapse","collapsed","ElIcon","Fold","Expand","GvHamburgerPlugin","GvHamburger","toggle","isFullscreen","useFullscreen","toggleFullscreen","GvScreenFullPlugin","GvScreenFull","hasOneShowingChild","onlyOneChild","showingChildren","useRenderMenuTitle","renderMenuTitle","useRenderMenuItem","menuMode","renderMenuItem","length","hidden","oneShowingChild","fullPath","noShowingChildren","alwaysShow","ElMenuItem","ElSubMenu","_sfc_main$5","menuSelect","Function","undefined","layout","getLayout","push","includes","getCollapseMenus","leftMenuUniqueOpened","getLeftMenuUniqueOpened","activeMenu","index","window","open","renderMenu","ElMenu","renderMenuWrap","ElScrollbar","GvSidebarPlugin","GvSidebar","_imports_0","show","collapseMenus","onMounted","_component_router_link","GvSidebarLogoPlugin","GvSidebarLogo","themeOptions","currentTheme","handleSetTheme","theme","GvThemePlugin","GvTheme","usePinyin","text","withTone","pinyin","pinYin","__emit","menuList","menuPath","fMenusList","generateRouter","serverRoutes","basePath","prefixTitle","prefixCode","i18ntitle","code","tempRoutes","handleCloseDrawer","handleSelect","handleSearch","query","cb","_b","starClickHandle","star","menuItem","ElAutocomplete","$event","Search","_withCtx","_hoisted_3","_hoisted_4","ElTabs","ElTabPane","_hoisted_5","sub","_hoisted_6","_resolveDynamicComponent","StarFilled","Star","_hoisted_7","x","_hoisted_8","visible","sideWidth","expandHandle","ElDrawer","_normalizeStyle","GvMenuList","GvExpandMenuPlugin","GvExpandMenu","_sfc_main","position","reactive","y","currentKey","replace","activeKey","tagsViewStore","useTagsViewStoreWithOut","usePermsStoreWithOut","visitedViews","mainAppRoutes","isRedirect","isActive","isAffix","tag","affix","filterAffixNavMenus","navMenus","affixTags","tagPath","params","hash","redirectedFrom","addAffixTags","tagView","addVisitedView","createTabPanel","icons","picon","closable","label","showContextMenu","key","closeContextMenu","toLink","routePath","toLastView","visitedView","currentView","latestView","addNavMenu","addTagView","moveToCurrentTag","view","clickTab","tab","closeCurrentTag","targetKey","delTagView","refreshSelectedTag","delCachedView","nextTick","findCurTagIndex","findIndex","closeTagsOrientation","direction","isClosed","vV","cloneDeep","closeOthersTags","delOthersViews","then","oldName","alertObj","document","body","querySelector","remove","tagsViewEl","useEventListener","preventDefault","targetNode","el","target","tagName","parentElement","classList","getAttribute","clientX","pageX","clientY","pageY","left","top","onClick","GvTagsViewPlugin","GvTagsView","globalBridgeKey","getBridge","g","setBridgeContext","ctx","fetchData","fetch","useCrud","getValueType","useStorage","valueType","excludes","keys","defaultExcludes","excludesArr","getStorage","notificationTime","notificationTimeError","messageTime","messageTimeError","promptMsg","duration","m","ElNotification","confirm","msgs","showCancelButton","hint","ok","cancel","reject","ElMessageBox","tableedit","ElMessage","useNotify","encrypt","word","keyStr","CryptoJS","ww","srcs","decrypt","generateKey","num","library","randomPoz","install","options","setActivePinia","c","GuavaUI"],"mappings":"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"}
1
+ {"version":3,"file":"guava-ui.es.js","sources":["../packages/GvButton/src/GvButton.vue","../packages/GvButton/index.ts","../packages/utils/index.ts","../packages/GvIcon/src/GvIcon.vue","../packages/GvIcon/index.ts","../packages/utils/gv.propTypes.ts","../packages/GvLangSelect/src/GvLangSelect.vue","../packages/GvLangSelect/index.ts","../packages/GvBacktop/src/GvBacktop.vue","../packages/GvBacktop/index.ts","../packages/GvBreadCrumb/src/helper.ts","../packages/utils/gv.tree.ts","../packages/GvBreadCrumb/src/GvBreadCrumb.vue","../packages/GvBreadCrumb/index.ts","../packages/GvHamburger/src/GvHamburger.vue","../packages/GvHamburger/index.ts","../packages/GvScreenFull/src/GvScreenFull.vue","../packages/GvScreenFull/index.ts","../packages/GvSidebar/src/helper.ts","../packages/GvSidebar/src/components/useRenderMenuTitle.tsx","../packages/GvSidebar/src/components/useRenderMenuItem.tsx","../packages/GvSidebar/src/GvSidebar.vue","../packages/GvSidebar/index.ts","../src/assets/imgs/logo.png","../packages/GvSidebarLogo/src/GvSidebarLogo.vue","../packages/GvSidebarLogo/index.ts","../packages/GvTheme/src/GvTheme.vue","../packages/GvTheme/index.ts","../packages/hooks/web/usePinyin.ts","../packages/GvExpandMenu/src/GvMenuList.vue","../packages/GvExpandMenu/src/GvExpandMenu.vue","../packages/GvExpandMenu/index.ts","../packages/GvTagsView/src/GvTagsView.vue","../packages/GvTagsView/index.ts","../packages/bridge/index.ts","../packages/hooks/service/useCrud.ts","../packages/hooks/web/useStorage.ts","../packages/utils/gv.secret.ts","../packages/GvNotify/index.ts","../packages/index.ts"],"sourcesContent":["<!--\n * @title: GvButton组件,基于el-button封装\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-02-27 17:07:51\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-03-12 12:05:36\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { defineComponent, computed, watch } from 'vue';\n import { ElButton } from 'element-plus';\n export default defineComponent({\n name: 'GvButton',\n // --- pass params between parent-child ---\n props: {\n message: {\n type: String,\n default: 'GvButton',\n request: false,\n },\n },\n // --- register components ---\n components: {},\n // --- pass events between parent-child ---\n emits: ['click', 'submit'],\n\n setup(props, { emit, slots }) {\n // --- define computed ---\n // get default slot, Note: check if the slot is empty\n const getSlots = computed(() => slots.default?.());\n\n // --- listen data ---\n watch(\n () => props.message,\n (newVal) => {},\n );\n\n // --- define Methods ---\n const handleClick = (event: MouseEvent, msg: string): void => {\n alert('this is a child event');\n emit('click', event, msg);\n };\n\n return (): any => (\n <ElButton\n class=\"gv-button\"\n onClick={(event) => handleClick(event, props.message)}>\n {getSlots.value ?? props.message}\n </ElButton>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n .gv-button {\n &:hover {\n color: red;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvButton from './src/GvButton.vue';\n// Define the install method on the component\nGvButton.install = (app: App): void => {\n app.component(GvButton.name ?? 'GvButton', GvButton);\n};\n\nexport { GvButton };\nexport default GvButton;\n","/*\n * @title: common utility func\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-02-27 13:25:29\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-03-09 17:24:43\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\n/**\n * @todo: set html lang attr\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-03-24 10:37:13\n * @param {LocaleType} locale\n */\nexport const setHtmlAttrByLang = (locale: LocaleType): void => {\n document.querySelector('html')?.setAttribute('lang', locale);\n};\n\n/**\n * @todo: sleep async function\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 12:01:37\n * @param {*} timeLen\n */\nexport const sleep = async (timeLen: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, timeLen));\n/**\n * @todo: underline to camel case\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 15:21:09\n * @param {*} name\n */\nexport const toHump = (name: string): string => {\n if (!name) return '';\n // eslint-disable-next-line no-useless-escape\n return name.replace(/\\_(\\w)/g, function (all, letter) {\n return letter.toUpperCase();\n });\n};\n\n/**\n * @todo: camel case to underline\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 15:21:50\n * @param {*} name\n */\nexport const toLine = (name: string): string => name.replace(/([A-Z])/g, '_$1').toLowerCase();\n\n/**\n * 设置css style\n * @param prop\n * @param val\n * @param dom\n */\nexport const setDomCssProp = (prop: string, val: any, dom = document.documentElement): void => {\n dom.style.setProperty(prop, val);\n};\n\n/**\n * get css style\n * @param prop\n * @param dom\n * @returns\n */\nexport const getDomCssProp = (prop: string, dom = document.documentElement): string => getComputedStyle(dom).getPropertyValue(prop);\n\n/**\n * join icon class\n * @param icon\n * @returns\n */\nexport const joinIcon = function (icon) {\n let joinIcons = '';\n if (icon)\n if (icon.includes('el-icon')) joinIcons = icon;\n else if (icon.includes('gv-icon')) joinIcons = `iconfont ${icon}`;\n return joinIcons;\n};\n\n/**\n * @todo: set quick keys\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-22 09:38:53\n * @param {*} ev\n */\nexport const setQuickKeys = (ev) => {\n if (ev && ev.key)\n if (ev.key.toLowerCase() === 'q' && ev.ctrlKey === true) {\n // 绑定ctr + q\n ev.preventDefault();\n ev.stopPropagation();\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-search__bar>.ht-button.search') as HTMLElement;\n if (btnHtml && btnHtml.style.display !== 'none') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-edit__bar .ht-button.search') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n }\n } else if (ev.key.toLowerCase() === 'r' && ev.ctrlKey === true) {\n // 绑定crt + r\n ev.preventDefault();\n ev.stopPropagation();\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-form .ht-search__bar>.ht-button.reset') as HTMLElement;\n if (btnHtml && btnHtml.style.display !== 'none') if (btnHtml.getAttribute('refform')) btnHtml.click();\n } else if (ev.key.toLowerCase() === 'e' && ev.ctrlKey === true) {\n // 绑定crt + e\n ev.preventDefault();\n ev.stopPropagation();\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-form .ht-search__bar>.ht-button.shrink') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-form .ht-search__bar>.ht-button.expand') as HTMLElement;\n if (btnHtml.style.display === '') btnHtml.click();\n }\n } else if (ev.key.toLowerCase() === 's' && ev.ctrlKey === true) {\n // 绑定crt + s\n ev.preventDefault();\n ev.stopPropagation();\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-drawer__popup .ht-drawer .ht-drawer__footer>.ht-drawer__footer--inner .ht-button.save') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-edit__bar .ht-button.save') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n }\n } else if (ev.key.toLowerCase() === 'n' && ev.ctrlKey === true) {\n // 绑定crt + n\n ev.preventDefault();\n ev.stopPropagation();\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-table__container .ht-table__bar .ht-button.save') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-edit__bar .ht-button.save') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n }\n } else if (ev.key.toLowerCase() === '=' && ev.ctrlKey === true) {\n // 绑定crt + '='\n ev.preventDefault();\n ev.stopPropagation();\n const inputHtml = document.body.querySelector('.main-container .ht-container .ht-table__container .ht-table__search .ht-table__search-input > .el-input__inner') as HTMLElement;\n if (inputHtml) inputHtml.focus();\n } else if (ev.key === 'Escape') {\n // 绑定esc关闭弹窗\n ev.preventDefault();\n ev.stopPropagation();\n const messageConfirmHtml = document.documentElement.querySelector('body>.el-message-box__wrapper') as HTMLElement;\n if (messageConfirmHtml && messageConfirmHtml.style.display !== 'none') {\n const bodyButtonHtml = messageConfirmHtml.querySelector('.el-message-box .el-message-box__btns button') as HTMLElement;\n bodyButtonHtml.click();\n } else {\n const bodyDialogHtml = document.documentElement.querySelector('body>.ht-dialog') as HTMLElement;\n if (bodyDialogHtml && bodyDialogHtml.style.display !== 'none') {\n const bodyButtonHtml = bodyDialogHtml.querySelector('.el-dialog__header button') as HTMLElement;\n bodyButtonHtml.click();\n } else {\n const dialogArr = document.body.querySelectorAll('.main-container .ht-container .ht-dialog__popup .ht-dialog') as NodeListOf<HTMLElement>;\n if (dialogArr)\n for (let i = 0; i < dialogArr.length; i++)\n if (dialogArr[i].style.display !== 'none') {\n const buttonHtml = dialogArr[i].querySelector('.el-dialog__header button') as HTMLElement;\n if (buttonHtml && buttonHtml.style.display !== 'none') {\n buttonHtml.click();\n return;\n }\n }\n\n const buttonDHtml = document.body.querySelector('.main-container .ht-container .ht-drawer__popup .ht-drawer .el-drawer__header button') as HTMLElement;\n if (buttonDHtml && buttonDHtml.style.display !== 'none') buttonDHtml.click();\n }\n }\n }\n};\n// ------ is utils ------\nconst toString = Object.prototype.toString;\nexport const is = (val: unknown, type: string) => toString.call(val) === `[object ${type}]`;\n\nexport const isExternal = (path: string): boolean => /^(https?:|mailto:|tel:)/.test(path);\nexport const isString = (val: unknown): val is string => is(val, 'String');\nexport const isArray = (val: any): val is any[] => val && Array.isArray(val);\nexport const isError = (e: unknown): e is Error => typeof e === 'object' && e !== null && 'message' in e;\nexport const isObject = (val: any): val is Record<any, any> => val !== null && is(val, 'Object');\nexport const isDate = (val: unknown): val is Date => is(val, 'Date');\nexport const isNumber = (val: unknown): val is number => is(val, 'Number');\nexport const isBoolean = (val: unknown): val is boolean => is(val, 'Boolean');\nexport const isFunction = (val: unknown): val is (...args: any[]) => any => typeof val === 'function';\nexport const isElement = (val: unknown): val is Element => isObject(val) && !!val.tagName;\nexport const isMap = (val: unknown): val is Map<any, any> => is(val, 'Map');\nexport const isImgPath = (path: string): boolean => /(https?:\\/\\/|data:image\\/).*?\\.(png|jpg|jpeg|gif|svg|webp|ico)/gi.test(path);\nexport const isDark = (): boolean => window.matchMedia('(prefers-color-scheme: dark)').matches;\nexport const isNull = (val: unknown): val is null => val === null;\n\nexport const isEmpty = <T = unknown>(val: T): val is T => {\n if (isArray(val) || isString(val)) return val.length === 0;\n if (val instanceof Map || val instanceof Set) return val.size === 0;\n if (isObject(val)) return Object.keys(val).length === 0;\n return false;\n};\n\nexport const isUrl = (path: string): boolean => {\n try {\n new URL(path);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const pathResolve = (parentPath: string, path: string) => {\n if (isUrl(path)) return path;\n const childPath = path.startsWith('/') || !path ? path : `/${path}`;\n return `${parentPath}${childPath}`.replace(/\\/\\//g, '/').trim();\n};\n","<!--\n * @title: svg icon component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-01 17:02:13\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-01-30 11:57:59\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { computed, useAttrs } from 'vue';\n import { isExternal } from '@@/utils';\n import { useStyle } from '@/hook/web/useStyle';\n const { variables } = useStyle();\n const preNameSpace = variables.namespace;\n const attrs = useAttrs();\n // --- define name and inheritAttrs ---\n defineOptions({\n name: 'GvIcon', // 定义组件名称\n inheritAttrs: false, // 默认继承属性\n });\n // --- transfer props and define default values ---\n const props = withDefaults(\n defineProps<{\n iconType?: string;\n iconName: string;\n className?: string;\n size?: string; // 图标的font-size,单位是px\n }>(),\n {\n iconType: 'svg', // svg | iconfont\n className: '',\n },\n );\n const isLocal = computed(() => isExternal(props.iconName));\n const iconName = computed(() => {\n if (props.iconType === 'svg') return `#${preNameSpace}-icon-${props.iconName}`;\n else if (props.iconType === 'iconfont') return 'iconfont ' + props.iconName;\n else return `#${props.iconName}`;\n });\n const svgClass = computed(() => {\n if (props.className)\n if (props.iconType === 'svg') return 'svg-icon ' + props.className;\n else return props.className;\n else return 'svg-icon';\n });\n const styleExternalIcon = computed(() => ({\n mask: `url(${props.iconName}) no-repeat 50% 50%`,\n '-webkit-mask': `url(${props.iconName}) no-repeat 50% 50%`,\n }));\n</script>\n<template>\n <div\n v-if=\"isLocal\"\n :style=\"styleExternalIcon\"\n class=\"svg-external-icon svg-icon\"\n v-bind=\"attrs\"></div>\n <svg\n v-else-if=\"iconType === 'svg'\"\n :class=\"svgClass\"\n aria-hidden=\"true\"\n v-bind=\"attrs\">\n <use :href=\"iconName\" />\n </svg>\n <i\n v-else-if=\"iconType === 'iconfont'\"\n :class=\"[iconName, svgClass]\"\n v-bind=\"attrs\">\n </i>\n <svg\n v-else\n :class=\"svgClass\"\n :style=\"{ 'font-size': size + 'px' }\"\n aria-hidden=\"true\"\n v-bind=\"attrs\">\n <use :xlink:href=\"iconName\" />\n </svg>\n</template>\n\n<style lang=\"scss\" scoped>\n .svg-icon {\n width: 1em;\n height: 1em;\n overflow: hidden;\n vertical-align: -0.15em;\n fill: currentcolor;\n }\n\n .svg-external-icon {\n display: inline-block;\n background-color: currentcolor;\n mask-size: cover !important;\n }\n</style>\n","import type { App } from 'vue';\nimport GvIcon from './src/GvIcon.vue';\n// Define the install method on the component\nGvIcon.install = (app: App): void => {\n app.component(GvIcon.name ?? 'GvIcon', GvIcon);\n};\n\nexport { GvIcon };\nexport default GvIcon;\n","import { type VueTypeValidableDef, type VueTypesInterface, createTypes, toValidableType } from 'vue-types';\nimport type { CSSProperties } from 'vue';\n\ntype PropTypes = VueTypesInterface & {\n readonly style: VueTypeValidableDef<CSSProperties>;\n};\nconst newPropTypes = createTypes({\n func: undefined,\n bool: undefined,\n string: undefined,\n number: undefined,\n object: undefined,\n integer: undefined,\n}) as PropTypes;\n\nclass propTypes extends newPropTypes {\n static get style(): VueTypeValidableDef<CSSProperties> {\n return toValidableType('style', {\n type: [String, Object],\n });\n }\n}\n\nexport { propTypes };\n","<!--\n * @title: locale lang dropdown\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-03-25 11:43:51\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-06-09 14:15:05\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { computed, unref } from 'vue';\n import { useRouter } from 'vue-router';\n import { propTypes } from '../../utils/gv.propTypes';\n import { useLocaleStore } from '@/store/modules/locale';\n import { useLocale } from '@/hook/web/useLocale';\n import { useStyle } from '@/hook/web/useStyle';\n\n import { ElDropdown, ElDropdownMenu, ElDropdownItem } from 'element-plus';\n\n defineOptions({\n name: 'GvLangSelect', // 定义组件名称\n inheritAttrs: true, // 默认继承属性\n });\n defineProps({\n className: propTypes.string.def(''),\n });\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('lang-select');\n\n const localeStore = useLocaleStore();\n const langMap = computed(() => localeStore.getLocaleMap);\n const currentLang = computed(() => localeStore.getCurrentLocale);\n\n const router = useRouter();\n\n const handleSetLang = async (lang): Promise<void> => {\n if (lang === unref(currentLang).lang) return;\n\n const { switchLocale } = useLocale();\n await switchLocale(lang);\n router.go(0);\n };\n</script>\n\n<template>\n <ElDropdown\n :class=\"prefixCls\"\n trigger=\"click\"\n class=\"international\"\n @command=\"handleSetLang\">\n <div>\n <GvIcon\n :class-name=\"`international-icon ${className}`\"\n icon-name=\"language\" />\n </div>\n <template #dropdown>\n <ElDropdownMenu>\n <ElDropdownItem\n v-for=\"item in langMap\"\n :key=\"item.lang\"\n :command=\"item.lang\">\n {{ item.name }}\n </ElDropdownItem>\n </ElDropdownMenu>\n </template>\n </ElDropdown>\n</template>\n","import type { App } from 'vue';\nimport GvLangSelect from './src/GvLangSelect.vue';\n// Define the install method on the component\nGvLangSelect.install = (app: App): void => {\n app.component(GvLangSelect.name ?? 'GvLangSelect', GvLangSelect);\n};\n\nexport { GvLangSelect };\nexport default GvLangSelect;\n","<!--\n * @title: backtop\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-22 09:24:46\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-05-22 09:26:44\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script setup lang=\"ts\">\n import { ElBacktop } from 'element-plus';\n import { useStyle } from '@/hook/web/useStyle';\n\n // --- define name and inheritAttrs ---\n defineOptions({\n name: 'GvBacktop', // 定义组件名称\n inheritAttrs: true, // 默认继承属性\n });\n\n const { getPrefixCls, variables } = useStyle();\n\n const prefixCls = getPrefixCls('backtop');\n</script>\n\n<template>\n <ElBacktop\n :class=\"prefixCls\"\n :target=\"`.${variables.namespace}-layout-content-scrollbar .${variables.elNamespace}-scrollbar__wrap`\" />\n</template>\n","import type { App } from 'vue';\nimport GvBacktop from './src/GvBacktop.vue';\n// Define the install method on the GvButton component\nconst GvBacktopPlugin = {\n install(app: App): void {\n app.component(GvBacktop.name ?? 'GvBacktop', GvBacktop);\n },\n};\nexport default GvBacktopPlugin;\n\nexport { GvBacktop };\n","/*\n * @title: breadcrumb helper func\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-07-15 12:55:48\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-01-30 12:12:40\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport { pathResolve } from '../../utils/index';\n\nexport const filterBreadcrumb = (routes: AppRouteRecordRaw[], parentPath = ''): AppRouteRecordRaw[] => {\n const res: AppRouteRecordRaw[] = [];\n\n for (const route of routes) {\n const meta = route?.meta;\n if (route.name !== 'Root' && meta?.hidden && !meta.canTo) continue;\n\n const data: AppRouteRecordRaw = !meta?.alwaysShow && route.children?.length === 1 ? { ...route.children[0], path: pathResolve(route.path, route.children[0].path) } : { ...route };\n\n data.path = pathResolve(parentPath, data.path);\n\n if (data.children) data.children = filterBreadcrumb(data.children, data.path);\n\n if (data) res.push(data);\n }\n return res;\n};\n","interface TreeHelperConfig {\n id: string;\n children: string;\n pid: string;\n}\nconst DEFAULT_CONFIG: TreeHelperConfig = {\n id: 'id',\n children: 'children',\n pid: 'pid',\n};\nconst getConfig = (config: Partial<TreeHelperConfig>) => Object.assign({}, DEFAULT_CONFIG, config);\n// tree from list\nexport const listToTree = <T = any>(list: any[], config: Partial<TreeHelperConfig> = {}): T[] => {\n const conf = getConfig(config) as TreeHelperConfig;\n const nodeMap = new Map();\n const result: T[] = [];\n const { id, children, pid } = conf;\n\n for (const node of list) {\n node[children] = node[children] || [];\n nodeMap.set(node[id], node);\n }\n for (const node of list) {\n const parent = nodeMap.get(node[pid]);\n (parent ? parent.children : result).push(node);\n }\n return result;\n};\n\nexport const treeToList = <T = any>(tree: any, config: Partial<TreeHelperConfig> = {}): T => {\n config = getConfig(config);\n const { children } = config;\n const result: any = [...tree];\n for (let i = 0; i < result.length; i++) {\n if (!result[i][children!]) continue;\n result.splice(i + 1, 0, ...result[i][children!]);\n }\n return result;\n};\n\nexport const findNode = <T = any>(tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}): T | null => {\n config = getConfig(config);\n const { children } = config;\n const list = [...tree];\n for (const node of list) {\n if (func(node)) return node;\n node[children!] && list.push(...node[children!]);\n }\n return null;\n};\n\nexport const findNodeAll = <T = any>(tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}): T[] => {\n config = getConfig(config);\n const { children } = config;\n const list = [...tree];\n const result: T[] = [];\n for (const node of list) {\n func(node) && result.push(node);\n node[children!] && list.push(...node[children!]);\n }\n return result;\n};\n\nexport const findPath = <T = any>(tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}): T | T[] | null => {\n config = getConfig(config);\n const path: T[] = [];\n const list = [...tree];\n const visitedSet = new Set();\n const { children } = config;\n while (list.length) {\n const node = list[0];\n if (visitedSet.has(node)) {\n path.pop();\n list.shift();\n } else {\n visitedSet.add(node);\n node[children!] && list.unshift(...node[children!]);\n path.push(node);\n if (func(node)) return path;\n }\n }\n return null;\n};\n\nexport const findPathAll = (tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}) => {\n config = getConfig(config);\n const path: any[] = [];\n const list = [...tree];\n const result: any[] = [];\n const visitedSet = new Set();\n const { children } = config;\n while (list.length) {\n const node = list[0];\n if (visitedSet.has(node)) {\n path.pop();\n list.shift();\n } else {\n visitedSet.add(node);\n node[children!] && list.unshift(...node[children!]);\n path.push(node);\n func(node) && result.push([...path]);\n }\n }\n return result;\n};\n\nexport const filter = <T = any>(tree: T[], func: (n: T) => boolean, config: Partial<TreeHelperConfig> = {}): T[] => {\n config = getConfig(config);\n const children = config.children as string;\n function listFilter(list: T[]) {\n return list\n .map((node: any) => ({ ...node }))\n .filter((node) => {\n node[children] = node[children] && listFilter(node[children]);\n return func(node) || (node[children] && node[children].length);\n });\n }\n return listFilter(tree);\n};\n\nexport const forEach = <T = any>(tree: T[], func: (n: T) => any, config: Partial<TreeHelperConfig> = {}): void => {\n config = getConfig(config);\n const list: any[] = [...tree];\n const { children } = config;\n for (let i = 0; i < list.length; i++) {\n // func 返回true就终止遍历,避免大量节点场景下无意义循环,引起浏览器卡顿\n if (func(list[i])) return;\n\n children && list[i][children] && list.splice(i + 1, 0, ...list[i][children]);\n }\n};\n/**\n * @description: Extract tree specified structure\n */\nexport const treeMapEach = (data: any, { children = 'children', conversion }: { children?: string; conversion: Fn }) => {\n const haveChildren = Array.isArray(data[children]) && data[children].length > 0;\n const conversionData = conversion(data) || {};\n if (haveChildren)\n return {\n ...conversionData,\n [children]: data[children].map((i: number) =>\n treeMapEach(i, {\n children,\n conversion,\n }),\n ),\n };\n else\n return {\n ...conversionData,\n };\n};\n/**\n * @description: Extract tree specified structure\n */\nexport const treeMap = <T = any>(treeData: T[], opt: { children?: string; conversion: Fn }): T[] => treeData.map((item) => treeMapEach(item, opt));\n\n/**\n * 递归遍历树结构\n * @param treeDatas 树\n * @param callBack 回调\n * @param parentNode 父节点\n */\nexport const eachTree = (treeDatas: any[], callBack: Fn, parentNode = {}) => {\n treeDatas.forEach((element) => {\n const newNode = callBack(element, parentNode) || element;\n if (element.children) eachTree(element.children, callBack, newNode);\n });\n};\n","<!--\n * @title: breadcrumb \n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-22 09:13:03\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-03-09 16:51:15\n * @version: 1.0.4\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { ElBreadcrumb, ElBreadcrumbItem } from 'element-plus';\n import { ref, watch, computed, unref, defineComponent, TransitionGroup } from 'vue';\n import { useRouter } from 'vue-router';\n import { useI18n } from '@/hook/web/useI18n';\n import { GvIcon } from '../../GvIcon';\n import { useAppStore } from '@/store/modules/app';\n import { usePermsStore } from '@/store/modules/perms';\n import { useStyle } from '@/hook/web/useStyle';\n import { filterBreadcrumb } from './helper';\n import { filter, treeToList } from '../../utils/gv.tree';\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('breadcrumb');\n\n export default defineComponent({\n name: 'GvBreadcrumb',\n setup() {\n const appStore = useAppStore();\n const permStore = usePermsStore();\n // if you want to use the icon in breadcrumb, you can set it in appStore\n const showBreadcrumbIcon = computed(() => appStore.getShowBreadcrumbIcon);\n const { currentRoute } = useRouter();\n\n const { t } = useI18n();\n\n const levelList = ref<AppRouteRecordRaw[]>([]);\n const menuRouters = computed(() => {\n const routers = permStore.getRouters;\n return filterBreadcrumb(routers);\n });\n\n const getBreadcrumb = () => {\n const currentPath = currentRoute.value.matched.slice(-1)[0].path;\n levelList.value = filter<AppRouteRecordRaw>(unref(menuRouters), (node: AppRouteRecordRaw) => node.path === currentPath);\n };\n\n const renderBreadcrumb = () => {\n const breadcrumbList = treeToList<AppRouteRecordRaw[]>(unref(levelList));\n return breadcrumbList.map((v) => {\n const disabled = !v.redirect || v.redirect === 'noredirect';\n const meta = v.meta;\n return (\n <ElBreadcrumbItem\n to={{ path: disabled ? '' : v.path }}\n key={v.name}>\n {meta?.icon && showBreadcrumbIcon.value ? (\n <>\n <GvIcon\n iconType=\"iconfont\"\n iconName={meta.icon}\n className=\"text-[13px]\"></GvIcon>{' '}\n {t(v?.meta?.title || '')}\n </>\n ) : (\n t(v?.meta?.title || '')\n )}\n </ElBreadcrumbItem>\n );\n });\n };\n\n watch(\n () => currentRoute.value.path,\n (path) => {\n if (path.startsWith('/redirect/')) return;\n\n getBreadcrumb();\n },\n {\n immediate: true,\n },\n );\n\n return () => (\n <ElBreadcrumb\n separator=\"/\"\n class={`${prefixCls} flex items-center h-full ml-[10px]`}>\n <TransitionGroup\n appear\n enter-active-class=\"animate__animated animate__fadeInRight\">\n {renderBreadcrumb()}\n </TransitionGroup>\n </ElBreadcrumb>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-breadcrumb';\n .#{$prefixCls} {\n user-select: none;\n :deep(.el-breadcrumb__item) {\n display: flex;\n .el-breadcrumb__inner {\n display: flex;\n align-items: center;\n color: #afb3b9;\n cursor: text;\n //color: var(--top-header-text-color);\n //&:hover {\n // color: var(--el-color-primary);\n //}\n &.is-link {\n font-weight: 500;\n }\n }\n .iconfont {\n font-size: $textSizeSecondary;\n }\n }\n :deep(.el-breadcrumb__item):last-child {\n .el-breadcrumb__inner:hover {\n color: #afb3b9;\n cursor: text;\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvBreadCrumb from './src/GvBreadCrumb.vue';\n// Define the install method on the component\nGvBreadCrumb.install = (app: App): void => {\n app.component(GvBreadCrumb.name ?? 'GvBreadCrumb', GvBreadCrumb);\n};\n\nexport { GvBreadCrumb };\nexport default GvBreadCrumb;\n","<!--\n * @title: collapsed sidebar component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-06-03 13:48:02\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-07-15 17:14:09\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { computed, unref } from 'vue';\n import { ElIcon } from 'element-plus';\n import { Expand, Fold } from '@element-plus/icons-vue';\n import { useAppStore } from '@/store/modules/app';\n import { propTypes } from '../../utils/gv.propTypes';\n import { useStyle } from '@/hook/web/useStyle';\n\n defineOptions({\n name: 'GvHamburger', // 定义组件名称\n inheritAttrs: true, // 默认继承属性\n });\n\n defineProps({\n color: propTypes.string.def(''),\n });\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('hamburger');\n\n const appStore = useAppStore();\n const collapse = computed(() => appStore.getCollapseMenus);\n\n // set quick keys\n\n // load dict\n // const loadDict = async () => {\n // try {\n // await this.$store.dispatch('user/loadAllDict');\n // } catch (e) {\n // // empty\n // }\n // };\n // load division\n // const loadDictDivision = async () => {\n // try {\n // await this.$store.dispatch('user/loadDictDivision');\n // } catch (e) {\n // // empty\n // }\n // };\n\n const toggleCollapse = () => {\n const collapsed = unref(collapse);\n appStore.setCollapseMenus(!collapsed);\n };\n</script>\n<template>\n <div\n :class=\"prefixCls\"\n @click=\"toggleCollapse\">\n <div class=\"trigger\">\n <ElIcon\n :size=\"20\"\n :class=\"`${prefixCls}__icon`\">\n <Expand\n v-if=\"!collapse\"\n :class=\"`${prefixCls}__icon`\"\n :style=\"{ color: color }\" />\n <Fold\n v-else\n :class=\"`${prefixCls}__icon`\"\n :style=\"{ color: color }\" />\n </ElIcon>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-hamburger';\n .#{$prefixCls} {\n position: relative;\n z-index: 3;\n line-height: $navHeadHeight;\n background-color: #fff;\n &:hover {\n background-color: rgb(0 0 0 / 3%);\n }\n .trigger {\n display: inline-block;\n line-height: 1px;\n cursor: pointer;\n transition: color 0.3s ease;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvHamburger from './src/GvHamburger.vue';\nconst GvHamburgerPlugin = {\n install(app: App): void {\n app.component(GvHamburger.name ?? 'GvHamburger', GvHamburger);\n },\n};\nexport default GvHamburgerPlugin;\n\nexport { GvHamburger };\n","<!--\n * @title: screenfull\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-22 09:15:43\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-11-17 10:55:25\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script setup lang=\"ts\">\n import { useFullscreen } from '@vueuse/core';\n import { propTypes } from '../../utils/gv.propTypes';\n import { useStyle } from '@/hook/web/useStyle';\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('screenfull');\n\n defineProps({\n color: propTypes.string.def(''),\n });\n\n const { toggle, isFullscreen } = useFullscreen();\n\n const toggleFullscreen = () => {\n toggle();\n };\n</script>\n\n<template>\n <div\n :class=\"prefixCls\"\n @click=\"toggleFullscreen\">\n <GvIcon :icon-name=\"isFullscreen ? 'exit-fullscreen' : 'fullscreen'\" />\n </div>\n</template>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-screenfull';\n .#{$prefixCls} {\n display: inline-block;\n line-height: var(--right-item-line-height);\n height: var(--right-item-height);\n vertical-align: 10px;\n cursor: pointer;\n fill: #5a5e66;\n }\n</style>\n","import type { App } from 'vue';\nimport GvScreenFull from './src/GvScreenFull.vue';\n// Define the install method on the GvButton component\nconst GvScreenFullPlugin = {\n install(app: App): void {\n app.component(GvScreenFull.name ?? 'GvScreenFull', GvScreenFull);\n },\n};\nexport default GvScreenFullPlugin;\n\nexport { GvScreenFull };\n","import { ref, unref } from 'vue';\nimport { findPath } from '../../utils/gv.tree';\n\ntype OnlyOneChildType = AppRouteRecordRaw & { noShowingChildren?: boolean };\n\ninterface HasOneShowingChild {\n oneShowingChild?: boolean;\n onlyOneChild?: OnlyOneChildType;\n}\n\nexport const getAllParentPath = <T = Recordable>(treeData: T[], path: string) => {\n const menuList = findPath(treeData, (n) => n.path === path) as AppRouteRecordRaw[];\n return (menuList || []).map((item) => item.path);\n};\n\nexport const hasOneShowingChild = (parent: AppRouteRecordRaw, children: AppRouteRecordRaw[] = []): HasOneShowingChild => {\n const onlyOneChild = ref<OnlyOneChildType>();\n\n const showingChildren = children.filter((v) => {\n const meta = v.meta ?? {};\n if (meta.hidden) return false;\n else {\n // Temp set(will be used if only has one showing child)\n onlyOneChild.value = v;\n return true;\n }\n });\n\n // When there is only one child router, the child router is displayed by default\n if (showingChildren.length === 1)\n return {\n oneShowingChild: true,\n onlyOneChild: unref(onlyOneChild),\n };\n\n // Show parent if there are no child router to display\n if (!showingChildren.length) {\n onlyOneChild.value = { ...parent, path: '', noShowingChildren: true };\n return {\n oneShowingChild: true,\n onlyOneChild: unref(onlyOneChild),\n };\n }\n\n return {\n oneShowingChild: false,\n onlyOneChild: unref(onlyOneChild),\n };\n};\n","import type { RouteMeta } from 'vue-router';\nimport { useI18n } from '@/hook/web/useI18n';\nimport { GvIcon } from '../../../GvIcon';\nexport const useRenderMenuTitle = () => {\n const renderMenuTitle = (meta: RouteMeta) => {\n const { t } = useI18n();\n if (!meta) {\n return <span class=\"v-menu__title overflow-hidden overflow-ellipsis whitespace-nowrap\">No Title</span>;\n }\n const { title = 'Please set title', icon } = meta;\n\n return icon ? (\n <>\n <GvIcon iconName={meta.icon || ''}></GvIcon>\n <span class=\"v-menu__title overflow-hidden overflow-ellipsis whitespace-nowrap\">{t(title as string)}</span>\n </>\n ) : (\n <span class=\"v-menu__title overflow-hidden overflow-ellipsis whitespace-nowrap\">{t(title as string)}</span>\n );\n };\n\n return {\n renderMenuTitle,\n };\n};\n","/*\n * @title: render menu item - useRenderMenuItem\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-07-15 15:07:28\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-03-09 16:33:08\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport { ElSubMenu, ElMenuItem } from 'element-plus';\nimport { unref } from 'vue';\nimport { hasOneShowingChild } from '../helper';\nimport { isUrl } from '@@/utils';\nimport { useRenderMenuTitle } from './useRenderMenuTitle';\nimport { pathResolve } from '@@/utils';\nimport { useStyle } from '@/hook/web/useStyle';\nconst { getPrefixCls } = useStyle();\nconst prefixCls = getPrefixCls('submenu');\n\nconst { renderMenuTitle } = useRenderMenuTitle();\n\nexport const useRenderMenuItem = (menuMode) =>\n // allRouters: AppRouteRecordRaw[] = [],\n {\n const renderMenuItem = (routers: AppRouteRecordRaw[], parentPath = '/') => {\n if (!routers || !routers.length) return null;\n return routers\n .filter((v) => !v.meta?.hidden)\n .map((v) => {\n const meta = v.meta ?? {};\n const { oneShowingChild, onlyOneChild } = hasOneShowingChild(v, v.children);\n const fullPath = isUrl(v.path) ? String(v.path) : pathResolve(parentPath, v.path); // getAllParentPath<AppRouteRecordRaw>(allRouters, v.path).join('/')\n if (oneShowingChild && (!onlyOneChild?.children || onlyOneChild?.noShowingChildren) && !meta?.alwaysShow) {\n return (\n <ElMenuItem index={onlyOneChild ? pathResolve(fullPath, onlyOneChild.path) : fullPath}>\n {{\n default: () => renderMenuTitle(onlyOneChild ? (onlyOneChild.meta ?? meta) : meta),\n }}\n </ElMenuItem>\n );\n } else {\n return (\n <ElSubMenu\n index={fullPath}\n teleported\n popperClass={unref(menuMode) === 'vertical' ? `${prefixCls}-popper--vertical` : ''}>\n {{\n title: () => renderMenuTitle(meta),\n default: () => renderMenuItem(v.children!, fullPath),\n }}\n </ElSubMenu>\n );\n }\n });\n };\n return {\n renderMenuItem,\n };\n };\n","<!--\n * @title: left menus\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-30 16:12:28\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-03-09 14:26:39\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { computed, defineComponent, unref, type PropType } from 'vue';\n import { ElMenu, ElScrollbar } from 'element-plus';\n import { useAppStore } from '@/store/modules/app';\n import { usePermsStore } from '@/store/modules/perms';\n import { useRenderMenuItem } from './components/useRenderMenuItem';\n\n import { useRouter } from 'vue-router';\n import { isUrl } from '../../utils';\n import { useStyle } from '@/hook/web/useStyle';\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('sidebar');\n\n export default defineComponent({\n name: 'GvSidebar',\n props: {\n menuSelect: {\n type: Function as PropType<(index: string) => void>,\n default: undefined,\n },\n },\n setup(props) {\n const appStore = useAppStore();\n const layout = computed(() => appStore.getLayout);\n const { push, currentRoute } = useRouter();\n const permStore = usePermsStore();\n const menuMode = computed((): 'vertical' | 'horizontal' => {\n const vertical: LayoutType[] = ['default', 'topLeft', 'cutMenu'];\n\n if (vertical.includes(unref(layout))) return 'vertical';\n else return 'horizontal';\n });\n\n const routers = computed(() => (unref(layout) === 'cutMenu' ? permStore.getRouters : permStore.getRouters));\n\n // console.log(routers.value);\n\n const collapse = computed(() => appStore.getCollapseMenus);\n\n const leftMenuUniqueOpened = computed(() => appStore.getLeftMenuUniqueOpened);\n\n const activeMenu = computed(() => {\n const { meta, path } = unref(currentRoute);\n // if set path, the sidebar will highlight the path you set\n if (meta.activeMenu) return meta.activeMenu as string;\n\n return path;\n });\n\n const menuSelect = (index: string) => {\n props.menuSelect?.(index);\n\n // 自定义事件\n if (isUrl(index)) {\n window.open(index);\n return;\n }\n push(index);\n };\n\n const renderMenu = () => (\n <ElMenu\n defaultActive={unref(activeMenu)}\n mode={unref(menuMode)}\n collapse={unref(layout) === 'top' || unref(layout) === 'cutMenu' ? false : unref(collapse)}\n uniqueOpened={unref(layout) === 'top' ? false : unref(leftMenuUniqueOpened)}\n backgroundColor=\"var(--left-menu-bg-color)\"\n textColor=\"var(--left-menu-text-color)\"\n activeTextColor=\"var(--left-menu-text-active-color)\"\n popperClass={unref(menuMode) === 'vertical' ? `${prefixCls}-popper--vertical` : `${prefixCls}-popper--horizontal`}\n onSelect={menuSelect}>\n {{\n default: () => {\n const { renderMenuItem } = useRenderMenuItem(menuMode);\n // console.log('renderMenu', routers.value);\n return renderMenuItem(unref(routers));\n },\n }}\n </ElMenu>\n );\n const renderMenuWrap = () => {\n if (unref(layout) === 'top') return renderMenu();\n else return <ElScrollbar>{renderMenu()}</ElScrollbar>;\n };\n return () => (\n <div\n id=\"gv-sidebar\"\n class={[\n `${prefixCls} ${prefixCls}__${unref(menuMode)}`,\n 'h-[100%] overflow-hidden flex-col bg-[var(--left-menu-bg-color)]',\n {\n 'w-[var(--left-menu-min-width)]': unref(collapse) && unref(layout) !== 'cutMenu',\n 'w-[var(--left-menu-max-width)]': !unref(collapse) && unref(layout) !== 'cutMenu',\n },\n ]}>\n {renderMenuWrap()}\n </div>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-sidebar';\n\n .#{$prefixCls} {\n position: relative;\n transition: width var(--transition-time-02);\n\n :deep(.#{$elNamespace}-menu) {\n width: 100% !important;\n border-right: none;\n\n // 设置选中时子标题的颜色\n .is-active {\n & > .#{$elNamespace}-sub-menu__title {\n color: var(--left-menu-text-active-color) !important;\n }\n }\n\n // 设置子菜单悬停的高亮和背景色\n .#{$elNamespace}-sub-menu__title,\n .#{$elNamespace}-menu-item {\n &:hover {\n color: var(--left-menu-text-active-color) !important;\n background-color: var(--left-menu-bg-color) !important;\n }\n }\n\n // 设置选中时的高亮背景和高亮颜色\n .#{$elNamespace}-menu-item.is-active {\n color: var(--left-menu-text-active-color) !important;\n background-color: var(--left-menu-bg-active-color) !important;\n\n &:hover {\n background-color: var(--left-menu-bg-active-color) !important;\n }\n }\n\n .#{$elNamespace}-menu-item.is-active {\n position: relative;\n }\n\n // 设置子菜单的背景颜色\n .#{$elNamespace}-menu {\n .#{$elNamespace}-sub-menu__title {\n background-color: var(--left-menu-bg-color) !important;\n }\n .#{$elNamespace}-menu-item:not(.is-active) {\n background-color: var(--left-menu-item-bg-light-color) !important;\n }\n }\n }\n\n // 折叠时的最小宽度\n :deep(.#{$elNamespace}-menu--collapse) {\n width: var(--left-menu-min-width);\n\n & > .is-active,\n & > .is-active > .#{$elNamespace}-sub-menu__title {\n position: relative;\n background-color: var(--left-menu-collapse-bg-active-color) !important;\n }\n }\n\n // 折叠动画的时候,就需要把文字给隐藏掉\n :deep(.horizontal-collapse-transition) {\n .#{$prefixCls}__title {\n display: none;\n }\n }\n\n // 水平菜单\n &__horizontal {\n height: calc(var(--top-tool-height)) !important;\n\n :deep(.#{$elNamespace}-menu--horizontal) {\n height: calc(var(--top-tool-height));\n border-bottom: none;\n // 重新设置底部高亮颜色\n & > .#{$elNamespace}-sub-menu.is-active {\n .#{$elNamespace}-sub-menu__title {\n border-bottom-color: var(--el-color-primary) !important;\n }\n }\n\n .#{$elNamespace}-menu-item.is-active {\n position: relative;\n\n &::after {\n display: none !important;\n }\n }\n\n .#{$prefixCls}__title {\n /* stylelint-disable-next-line */\n max-height: calc(var(--top-tool-height) - 2px) !important;\n /* stylelint-disable-next-line */\n line-height: calc(var(--top-tool-height) - 2px);\n }\n }\n }\n }\n</style>\n\n<style lang=\"scss\">\n $prefixCls: '#{$gvNamespace}-sidebar-popper';\n\n .#{$prefixCls}--vertical,\n .#{$prefixCls}--horizontal {\n // 设置选中时子标题的颜色\n .is-active {\n & > .el-sub-menu__title {\n color: var(--left-menu-text-active-color) !important;\n }\n }\n\n // 设置子菜单悬停的高亮和背景色\n .el-sub-menu__title,\n .el-menu-item {\n &:hover {\n color: var(--left-menu-text-active-color) !important;\n background-color: var(--left-menu-bg-color) !important;\n }\n }\n\n // 设置选中时的高亮背景\n .el-menu-item.is-active {\n position: relative;\n background-color: var(--left-menu-bg-active-color) !important;\n\n &:hover {\n background-color: var(--left-menu-bg-active-color) !important;\n }\n }\n }\n\n $submenu-prefix-cls: '#{$gvNamespace}-submenu-popper';\n\n // 设置子菜单溢出时滚动样式\n .#{$submenu-prefix-cls}--vertical {\n max-height: 100%;\n overflow-y: auto;\n\n &::-webkit-scrollbar {\n width: 6px;\n background-color: transparent;\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: rgb(144 147 153 / 30%);\n border-radius: 4px;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvSidebar from './src/GvSidebar.vue';\n// Define the install method on the GvButton component\nconst GvSidebarPlugin = {\n install(app: App): void {\n app.component(GvSidebar.name ?? 'GvSidebar', GvSidebar);\n },\n};\nexport default GvSidebarPlugin;\n\nexport { GvSidebar };\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFYAAABaCAYAAAAilKGMAAAACXBIWXMAAAZ2AAAGdgEpJm+AAAAKDGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDIgNzkuYTZhNjM5NjhhLCAyMDI0LzAzLzA2LTExOjUyOjA1ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmQxNjAxODBkLTVlZmUtZjc0MS1iY2RhLTdjMDBjNTc4ZTVkMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1ZDE1ZDUxNC05YzkxLTQwNTYtYTgzNS05YjZlYmRlOTQ5ZmEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0iRTU1OUFCRUUwQ0NBMTg5NjNBREJDRTREOTQ1Q0M5MDkiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB0aWZmOkltYWdlV2lkdGg9IjYzNiIgdGlmZjpJbWFnZUxlbmd0aD0iNjYwIiB0aWZmOlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb249IjIiIHRpZmY6U2FtcGxlc1BlclBpeGVsPSIzIiB0aWZmOlhSZXNvbHV0aW9uPSIxNDQvMSIgdGlmZjpZUmVzb2x1dGlvbj0iMTQ0LzEiIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiIGV4aWY6RXhpZlZlcnNpb249IjAyMzEiIGV4aWY6Q29sb3JTcGFjZT0iNjU1MzUiIGV4aWY6UGl4ZWxYRGltZW5zaW9uPSI2MzYiIGV4aWY6UGl4ZWxZRGltZW5zaW9uPSI2NjAiIHhtcDpDcmVhdGVEYXRlPSIyMDI0LTExLTI5VDEyOjQ4OjMzKzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNC0xMS0yOVQxMjo1MToyNCswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyNC0xMS0yOVQxMjo1MToyNCswODowMCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmZiNWYzMGIyLWJmODgtNDQ3My1iMDk0LWIzMGUzYjkyMzczZiIgc3RFdnQ6d2hlbj0iMjAyNC0xMS0yOVQxMjo0OToxNyswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjExIChNYWNpbnRvc2gpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gaW1hZ2UvanBlZyB0byBpbWFnZS9wbmciLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImRlcml2ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImNvbnZlcnRlZCBmcm9tIGltYWdlL2pwZWcgdG8gaW1hZ2UvcG5nIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo4MDg4Y2NiMi05NDFlLTQ1YmItOGZhZi02YjA5Mjc0M2Q0MDciIHN0RXZ0OndoZW49IjIwMjQtMTEtMjlUMTI6NDk6MTcrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNS4xMSAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NWQxNWQ1MTQtOWM5MS00MDU2LWE4MzUtOWI2ZWJkZTk0OWZhIiBzdEV2dDp3aGVuPSIyMDI0LTExLTI5VDEyOjUxOjI0KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMTEgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOmZiNWYzMGIyLWJmODgtNDQ3My1iMDk0LWIzMGUzYjkyMzczZiIgc3RSZWY6ZG9jdW1lbnRJRD0iRTU1OUFCRUUwQ0NBMTg5NjNBREJDRTREOTQ1Q0M5MDkiIHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD0iRTU1OUFCRUUwQ0NBMTg5NjNBREJDRTREOTQ1Q0M5MDkiLz4gPHRpZmY6Qml0c1BlclNhbXBsZT4gPHJkZjpTZXE+IDxyZGY6bGk+ODwvcmRmOmxpPiA8cmRmOmxpPjg8L3JkZjpsaT4gPHJkZjpsaT44PC9yZGY6bGk+IDwvcmRmOlNlcT4gPC90aWZmOkJpdHNQZXJTYW1wbGU+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+WfjB/QAAOnxJREFUeJztvXe4XFd19//Z+9Tp5famq2rJVnE3trGxMcY0h2KMDSb04NBCDIQQQgukvKTwQAKEEkIS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\"","<!--\n * @title: sidebar logo\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-15 14:11:18\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-06-09 17:46:25\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script setup lang=\"ts\">\n import { ref, watch, computed, onMounted, unref } from 'vue';\n import { useAppStore } from '@/store/modules/app';\n import { useStyle } from '@/hook/web/useStyle';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('logo');\n\n const appStore = useAppStore();\n\n const show = ref(true);\n const title = computed(() => appStore.getTitle);\n const layout = computed(() => appStore.getLayout);\n const collapseMenus = computed(() => appStore.getCollapseMenus);\n\n watch(\n () => collapseMenus.value,\n (collapse: boolean) => {\n if (unref(layout) === 'topLeft' || unref(layout) === 'cutMenu') {\n show.value = true;\n return;\n }\n show.value = !collapse;\n },\n );\n\n watch(\n () => layout.value,\n (layout) => {\n if (layout === 'top' || layout === 'cutMenu') show.value = true;\n else if (unref(collapseMenus)) show.value = false;\n else show.value = true;\n },\n );\n\n onMounted(() => {\n if (unref(collapseMenus)) show.value = false;\n });\n</script>\n\n<template>\n <div>\n <router-link\n :class=\"[prefixCls, layout !== 'default' ? `${prefixCls}__Top` : '', 'flex !h-[var(--logo-height)] items-center cursor-pointer pl-[8px] relative decoration-none overflow-hidden']\"\n to=\"/\">\n <img\n src=\"@/assets/imgs/logo.png\"\n class=\"w-[calc(var(--logo-height)-10px)] h-[calc(var(--logo-height)-10px)]\" />\n <div\n v-if=\"show\"\n :class=\"[\n 'inline-block whitespace-nowrap ml-[10px] text-[16px] font-bold',\n {\n 'text-[var(--logo-title-text-color)]': layout === 'default',\n 'text-[var(--top-header-text-color)]': layout === 'topLeft' || layout === 'top' || layout === 'cutMenu',\n },\n ]\">\n {{ title }}\n </div>\n </router-link>\n </div>\n</template>\n<style lang=\"scss\" scoped></style>\n","import type { App } from 'vue';\nimport GvSidebarLogo from './src/GvSidebarLogo.vue';\n// Define the install method on the GvButton component\nconst GvSidebarLogoPlugin = {\n install(app: App): void {\n app.component(GvSidebarLogo.name ?? 'GvSidebarLogo', GvSidebarLogo);\n },\n};\nexport default GvSidebarLogoPlugin;\n\nexport { GvSidebarLogo };\n","<!--\n * @title: theme switcher\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-08-14 10:17:38\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-09-02 09:45:22\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { ElDropdown, ElDropdownMenu, ElDropdownItem } from 'element-plus';\n import { propTypes } from '../../utils/gv.propTypes';\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { computed } from 'vue';\n\n defineOptions({\n name: 'GvTheme',\n inheritAttrs: true,\n });\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('theme');\n\n defineProps({\n color: propTypes.string.def(''),\n });\n\n const appStore = useAppStore();\n const themeOptions = computed(() => appStore.getSwitchTheme);\n const currentTheme = computed(() => appStore.getCurrentTheme);\n\n const handleSetTheme = (theme: string) => {\n //appStore.setTheme(theme);\n };\n</script>\n<template>\n <ElDropdown\n trigger=\"click\"\n :class=\"prefixCls\"\n @command=\"handleSetTheme\">\n <div>\n <GvIcon\n class=\"international-icon ${className}\"\n icon-name=\"theme\" />\n </div>\n <template #dropdown>\n <ElDropdownMenu>\n <ElDropdownItem\n v-for=\"item of themeOptions\"\n :key=\"item.value\"\n :disabled=\"currentTheme === item.value\"\n :command=\"item.value\">\n {{ item.label }}\n </ElDropdownItem>\n </ElDropdownMenu>\n </template>\n </ElDropdown>\n</template>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-theme';\n .#{$prefixCls} {\n display: inline-block;\n line-height: var(--right-item-line-height);\n height: var(--right-item-height);\n vertical-align: 10px;\n cursor: pointer;\n fill: #5a5e66;\n }\n</style>\n","import type { App } from 'vue';\nimport GvTheme from './src/GvTheme.vue';\nconst GvThemePlugin = {\n install(app: App): void {\n app.component(GvTheme.name ?? 'GvTheme', GvTheme);\n },\n};\nexport default GvThemePlugin;\n\nexport { GvTheme };\n","/*\n * @title: pinyin-pro 汉字转拼音组件\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-10-10 11:21:59\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-10-10 11:22:02\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport { pinyin } from 'pinyin-pro';\n/**\n * usePinyin 组合式函数\n * 提供常见的中文转拼音功能\n */\nexport function usePinyin() {\n /**\n * 中文转拼音(默认无音调、空格分隔)\n * @param text 中文字符串\n * @param withTone 是否带音调(默认 false)\n */\n const toPinyin = (text: string, withTone = false): string => {\n if (!text) return '';\n return pinyin(text, {\n toneType: withTone ? 'symbol' : 'none',\n type: 'string',\n multiple: false,\n });\n };\n\n /**\n * 获取拼音首字母\n * @param text 中文字符串\n */\n const getFirstLetter = (text: string): string => {\n if (!text) return '';\n return pinyin(text, {\n pattern: 'first',\n toneType: 'none',\n type: 'string',\n }).replace(/\\s+/g, '');\n };\n\n /**\n * 获取拼音数组(按字分隔)\n * @param text 中文字符串\n */\n const getPinyinArray = (text: string): string[] => {\n if (!text) return [];\n return pinyin(text, {\n toneType: 'none',\n type: 'array',\n });\n };\n\n return {\n toPinyin,\n getFirstLetter,\n getPinyinArray,\n };\n}\n","<!--\n * @title: expand menu list\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-09-04 12:37:50\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-03-09 14:09:39\n * @version: 1.0.5\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { computed, ref, onMounted } from 'vue';\n import { ElAutocomplete, ElTabs, ElTabPane, ElIcon } from 'element-plus';\n import { Search, Star, StarFilled } from '@element-plus/icons-vue';\n import { useI18n } from 'vue-i18n';\n import { useStyle } from '@/hook/web/useStyle';\n import { usePermsStore } from '@/store/modules/perms';\n import { usePinyin } from '@@/hooks/web/usePinyin';\n import type { RouteType } from './types';\n import { pathResolve, isExternal, sleep } from '@@/utils';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('expand-menu-list');\n\n defineOptions({\n name: 'GvMenuList', // 定义组件名称\n });\n const { t } = useI18n();\n const permStore = usePermsStore();\n const pinYin = usePinyin();\n const routes = computed(() => permStore.getServerRouters);\n\n const emit = defineEmits(['close']);\n\n const menuList = ref<RouteType[]>();\n const menuPath = ref('');\n\n const fMenusList = ref<AppRouteRecordRaw[]>([]);\n\n // ------ watch hook------\n // watchEffect();\n // // [routes, menusList],\n // // [\n // // (n, o) => {\n // // this.menusList = this.generateRoutes(this.routes.value);\n // // },\n // // (list) => {\n // // // 转换拼音\n // // if (this.supportPinyinSearch) this.addPinyinField(list);\n // // },\n // // ],\n\n // ------ methods hook ------\n /**\n * @todo: generate routes\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-09-15 10:46:56\n * @param {*} sidebarRoutes\n * @param {*} basePath\n * @param {*} prefixTitle\n * @param {*} prefixCode\n */\n\n const generateRouter = (serverRoutes: AppRouteRecordRaw[], basePath = '/', prefixTitle: string[] = [], prefixCode: string[] = []): RouteType[] => {\n let res: RouteType[] = [];\n for (const router of serverRoutes) {\n if (router.redirect === '/404') continue;\n if (router.meta?.hidden) continue;\n const data: RouteType = {\n path: pathResolve(basePath, router.path),\n title: [...(prefixTitle as string[])],\n pinyinTitle: pinYin.getFirstLetter([...(prefixTitle as string[])].join('')),\n code: [...prefixCode],\n };\n if (router.meta && router.meta.title) {\n const i18ntitle = router.meta.title;\n const code = router.meta.code || '';\n data.title = [...data.title, i18ntitle];\n data.pinyinTitle = pinYin.getFirstLetter(data.title.join(''));\n data.code = [...data.code, String(code)];\n if (router.redirect !== 'noredirect') res.push(data);\n else if (basePath === '/') fMenusList.value.push(router);\n }\n if (router.children) {\n const tempRoutes = generateRouter(router.children, data.path, data.title);\n if (tempRoutes.length >= 1) res = [...res, ...tempRoutes];\n }\n }\n return res;\n };\n\n const handleCloseDrawer = () => {\n emit('close');\n };\n\n /**\n * @todo: click menu item handle\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-03-09 10:56:00\n * @param {*} item\n */\n const handleSelect = (item: RouteType) => {\n // push({ path: item.path });\n // handleCloseDrawer();\n sleep(200).then(() => {\n menuPath.value = '';\n });\n };\n\n const handleSearch = (query: string, cb: any) => {\n let res: RouteType[] = [];\n if (query !== '')\n if (Array.isArray(menuList.value))\n res = menuList.value.filter((item) => {\n if (item.title.join('').indexOf(query) !== -1) return item;\n else if (item.pinyinTitle.indexOf(query.toLowerCase()) !== -1) return item;\n else if (item.path.indexOf(query) !== -1) return item;\n });\n else res = menuList.value ?? [];\n else res = menuList.value ?? [];\n cb(res);\n };\n\n /**\n * @todo: star click handle\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-10-11 10:20:33\n * @param {*} star\n * @param {*} path\n * @param {*} title\n * @param {*} menuItem\n */\n const starClickHandle = (star, path, title, menuItem) => {};\n\n // ------ mounted hook ------\n onMounted(() => {\n menuList.value = generateRouter(routes.value);\n // console.log('routes', permStore.getServerRouters);\n // console.log('menuList', menuList.value);\n });\n</script>\n<template>\n <div :class=\"prefixCls\">\n <!-- search -->\n <div class=\"search\">\n <div class=\"top\">\n <ElAutocomplete\n v-model=\"menuPath\"\n value-key=\"path\"\n :fetch-suggestions=\"handleSearch\"\n :placeholder=\"t('sideBar.menuSearch')\"\n @select=\"handleSelect\">\n <template #prefix>\n <ElIcon>\n <Search />\n </ElIcon>\n </template>\n <template v-slot=\"{ item }\">\n <span class=\"name\">{{ item.title.join(' > ') }}</span>\n </template>\n </ElAutocomplete>\n </div>\n </div>\n <!-- main -->\n <div class=\"main\">\n <ElTabs tab-position=\"right\">\n <ElTabPane\n v-for=\"item in fMenusList\"\n :key=\"item.name\"\n :label=\"item.meta?.title\"\n lazy>\n <div class=\"column-wrap\">\n <div\n v-for=\"sub in item.children\"\n :key=\"sub.name\"\n class=\"box\">\n <template v-if=\"!sub.children || sub.children.length === 0\">\n <ul class=\"leaf\">\n <li>\n <ElIcon @click.stop=\"starClickHandle(sub.meta?.star, sub.path, sub.meta?.title, sub)\">\n <component :is=\"sub.meta?.star ? StarFilled : Star\" />\n </ElIcon>\n <router-link\n v-if=\"!isExternal(sub.path)\"\n :to=\"`${item.path}/${sub.path}`\"\n @click=\"handleCloseDrawer\">\n {{ sub.meta?.title }}\n </router-link>\n <a\n v-else\n :href=\"sub.path\"\n target=\"_blank\"\n rel=\"noopener\">\n {{ sub.meta?.title }}</a\n >\n </li>\n </ul>\n </template>\n <template v-else>\n <h4>{{ sub.meta?.title }}</h4>\n <ul>\n <li\n v-for=\"x in sub.children\"\n :key=\"x.name\">\n <ElIcon @click.stop=\"starClickHandle(x.meta?.star, x.name, x.meta?.title, x)\">\n <component :is=\"x.meta?.star ? StarFilled : Star\" />\n </ElIcon>\n <router-link\n v-if=\"!isExternal(sub.path)\"\n :to=\"`${item.path}/${sub.path}/${x.path}`\"\n @click=\"handleCloseDrawer\">\n {{ x.meta?.title }}\n </router-link>\n <a\n v-else\n :href=\"sub.path\"\n target=\"_blank\"\n rel=\"noopener\">\n {{ x.meta?.title }}</a\n >\n </li>\n </ul>\n </template>\n </div>\n </div>\n </ElTabPane>\n </ElTabs>\n </div>\n </div>\n</template>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-expand-menu-list';\n .#{$prefixCls} {\n position: absolute;\n width: 650px;\n height: 100%;\n left: 0px;\n background: #272b2c;\n &::after {\n top: 0;\n right: 0;\n width: 150px;\n height: 100%;\n content: '';\n background: #272b2c;\n }\n :deep(.search) {\n height: 100px;\n width: 500px;\n background: #313538;\n .top {\n padding: 30px 0 0 100px;\n i {\n color: var(--left-menu-text-color);\n }\n .el-autocomplete {\n width: 300px;\n border-bottom: 1px solid #626466;\n border-radius: 0;\n .el-input {\n .el-input__wrapper {\n background: var(--left-menu-expand-bg-color);\n box-shadow: none;\n padding-left: 30px;\n .el-input__inner {\n font-size: $appTextSize;\n color: #fff;\n border: none;\n line-height: 40px;\n height: 40px;\n }\n }\n }\n }\n }\n }\n :deep(.main) {\n position: relative;\n height: calc(100% - 100px);\n .el-tabs {\n height: 100%;\n overflow-y: auto;\n &::-webkit-scrollbar {\n display: none;\n }\n .el-tabs__header {\n position: absolute;\n top: 0;\n right: 0;\n .el-tabs__nav-wrap {\n padding: 0;\n .el-tabs__nav-scroll {\n overflow-y: auto;\n .el-tabs__nav {\n padding-bottom: $modulePadding;\n }\n }\n .el-tabs__item {\n height: 30px;\n padding: 0 0 0 15px;\n font-size: $textSize;\n line-height: 30px;\n color: $menuText;\n &.is-active {\n font-weight: 500;\n color: #fff;\n }\n }\n &.is-right {\n width: 151px;\n }\n &::after {\n display: none;\n }\n }\n }\n .el-tabs__content {\n background: #313538;\n margin-right: 150px;\n .el-tab-pane {\n padding-right: 20px;\n }\n .column-wrap {\n column-count: 2;\n column-gap: 0;\n .box {\n padding-bottom: 10px;\n padding-left: 30px;\n -webkit-column-break-inside: avoid;\n page-break-inside: avoid;\n break-inside: avoid;\n h4 {\n margin-bottom: 12px;\n height: 32px;\n font-size: $textSize;\n font-weight: 500;\n line-height: 32px;\n color: $menuText;\n border-bottom: 1px solid #626466;\n }\n ul {\n padding-left: 0;\n margin-top: 8px;\n list-style: none;\n &.leaf {\n margin-top: 18px;\n }\n li {\n line-height: 26px;\n i {\n font-size: 14px;\n cursor: pointer;\n top: 2px;\n }\n .el-icon {\n color: $menuText;\n }\n a {\n padding-left: 3px;\n font-size: $textSize;\n color: $menuText;\n transition: all 0.3s ease;\n &:hover {\n color: var(--menuActiveText, $menuActiveText);\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n</style>\n","<!--\n * @title: Expand Menu\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-09-02 09:39:04\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-03-09 11:18:26\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { computed, ref } from 'vue';\n import { ElDrawer } from 'element-plus';\n import { propTypes } from '../../utils/gv.propTypes';\n\n import { useI18n } from '@/hook/web/useI18n';\n import { useStyle } from '@/hook/web/useStyle';\n import GvMenuList from './GvMenuList.vue';\n\n defineOptions({\n name: 'GvExpandMenu', // 定义组件名称\n });\n\n const props = defineProps({\n collapse: propTypes.bool.def(true),\n });\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('expand-menu');\n\n const { t } = useI18n();\n const visible = ref(false);\n const sideWidth = computed(() => (props.collapse ? '54px' : '200px'));\n const expandHandle = () => {\n visible.value = !visible.value;\n };\n</script>\n<template>\n <div :class=\"prefixCls\">\n <div\n class=\"expand-menu-title\"\n :class=\"{ selected: visible ? true : false }\"\n @click.stop=\"expandHandle\">\n <i :class=\"['iconfont', 'gv-icon-wangzhandaohang']\"></i>\n <span\n v-if=\"!collapse\"\n class=\"text\"\n >{{ t('sideBar.menuNav') }}</span\n >\n </div>\n <ElDrawer\n v-model=\"visible\"\n :style=\"{ left: sideWidth, paddingLeft: sideWidth }\"\n class=\"sidebar-expand-drawer\"\n :with-header=\"false\"\n :append-to-body=\"true\"\n direction=\"ltr\"\n resizable\n :modal-class=\"!collapse ? 'sidebar-expand-menu-collapse' : 'sidebar-expand-menu-unCollapse'\"\n size=\"650\">\n <GvMenuList @close=\"visible = false\" />\n </ElDrawer>\n </div>\n</template>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-expand-menu';\n .#{$prefixCls} {\n height: 40px;\n background-color: $menuBg;\n\n .expand-menu-title {\n width: 100%;\n padding-left: 14px;\n line-height: 48px;\n color: $menuText;\n cursor: pointer;\n\n &.selected,\n &:hover {\n color: var(--left-menu-text-active-color);\n background-color: $menuHover;\n }\n\n i {\n width: 24px;\n font-size: 20px;\n font-weight: 500;\n color: var(--left-menu-text-color);\n text-align: center;\n vertical-align: middle;\n }\n\n .text {\n display: inline-block;\n line-height: 48px;\n margin-left: 10px;\n font-size: $textSize;\n color: var(--left-menu-text-color);\n vertical-align: middle;\n &:hover {\n color: var(--left-menu-text-active-color);\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvExpandMenu from './src/GvExpandMenu.vue';\n// Define the install method on the GvExpandMenu component\nconst GvExpandMenuPlugin = {\n install(app: App): void {\n app.component(GvExpandMenu.name ?? 'GvExpandMenu', GvExpandMenu);\n },\n};\n\nexport { GvExpandMenu };\n\nexport default GvExpandMenuPlugin;\n","<!--\n * @title: navigation tags view\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-11-20 10:57:41\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-03-10 17:29:01\n * @version: 1.0.4\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { computed, defineComponent, onMounted, ref, reactive, unref, watch, nextTick } from 'vue';\n import { ElTabs, ElTabPane } from 'element-plus';\n import { useRouter, type RouteLocationNormalizedLoaded } from 'vue-router';\n import { useI18n } from 'vue-i18n';\n import { useEventListener } from '@vueuse/core';\n import { useStyle } from '@/hook/web/useStyle';\n import { useTagsViewStoreWithOut } from '@/store/modules/tagsView';\n import { usePermsStoreWithOut } from '@/store/modules/perms';\n import { joinIcon, pathResolve } from '@@/utils';\n import { cloneDeep } from 'lodash-es';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('tags-view');\n export default defineComponent({\n name: 'GvTagsView',\n setup() {\n const visible = ref(false);\n const position = reactive({ x: 0, y: 0 });\n const currentKey = ref('');\n\n const { currentRoute, push, replace } = useRouter();\n const activeKey = ref<string>(unref(currentRoute).path || '/dashboard');\n const { t } = useI18n();\n const tagsViewStore = useTagsViewStoreWithOut();\n const usePermsStore = usePermsStoreWithOut();\n\n const visitedViews = computed(() => tagsViewStore.visitedViews);\n const mainAppRoutes = computed(() => usePermsStore.mainAppRoutes);\n\n const isRedirect = (path: string) => path.startsWith('/redirect');\n const isActive = (route) => route.path === unref(currentRoute).path;\n const isAffix = (tag) => tag.meta && tag.meta.affix;\n\n /**\n * @todo: filter affix nav menus\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-28 11:39:08\n * @param {*} mainAppRoutes\n * @param {*} basePath\n */\n const filterAffixNavMenus = (navMenus, basePath = '/'): RouteLocationNormalizedLoaded[] => {\n const affixTags: RouteLocationNormalizedLoaded[] = [];\n // console.log('navMenus:', navMenus.value);\n navMenus.value.forEach((route) => {\n if (route.meta && route.meta.affix === true) {\n const tagPath = pathResolve(basePath, route.path);\n affixTags.push({\n fullPath: tagPath,\n path: tagPath,\n name: route.name,\n meta: route.meta,\n matched: [],\n params: {},\n query: {},\n hash: '',\n redirectedFrom: undefined,\n });\n }\n });\n return affixTags;\n };\n /**\n * @todo: add affix tags\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-28 11:45:26\n */\n const addAffixTags = () => {\n const affixTags = filterAffixNavMenus(mainAppRoutes);\n\n for (const tagView of affixTags) if (tagView.name) tagsViewStore.addVisitedView(tagView);\n };\n /**\n * @todo: create tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 10:36:56\n */\n const createTabPanel = () =>\n visitedViews.value.map((v) => {\n const icons = joinIcon(v.meta?.picon);\n const closable = visitedViews.value.length > 1;\n const title = t(v.meta?.title ?? 'no-name');\n return (\n <ElTabPane\n key={String(v.path)}\n name={String(v.path)}\n label={title}\n closable={closable}>\n {{\n label: () => (\n <span class=\"tab-label\">\n {icons && <i class={icons}></i>}\n {title}\n </span>\n ),\n }}\n </ElTabPane>\n );\n });\n\n /**\n * @todo: show right context menu\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-28 17:22:53\n * @param {*} key\n */\n const showContextMenu = (key: string) => {\n currentKey.value = key;\n visible.value = true;\n };\n /**\n * @todo: close right context menu\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 09:31:06\n */\n const closeContextMenu = () => {\n visible.value = false;\n };\n /**\n * @todo: jump to link route\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-11-21 11:25:08\n * @param {*} routePath\n */\n const toLink = (routePath: string) => {\n // const { query } = this.$route;\n activeKey.value = routePath || '/dashboard';\n push({ path: routePath, query: {} });\n };\n /**\n * @todo: jump to last tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 10:31:01\n * @param {*} visitedView\n * @param {*} currentView\n */\n const toLastView = (visitedView: RouteLocationNormalizedLoaded[], currentView: RouteLocationNormalizedLoaded) => {\n const latestView = visitedView.slice(-1)[0];\n if (visitedView) {\n activeKey.value = latestView.path;\n push(latestView.fullPath);\n } else if (currentView.name === 'Dashboard') replace({ path: '/redirect' + currentView.fullPath });\n else push('/');\n };\n /**\n * @todo: add menu tab\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-11-21 10:27:35\n */\n const addNavMenu = () => {\n const name = currentRoute.value.name;\n if (name) tagsViewStore.addTagView(currentRoute.value);\n };\n\n const moveToCurrentTag = (view: RouteLocationNormalizedLoaded) => {\n // toLink(view.path);\n };\n\n /**\n * @todo: click tab event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 12:08:48\n * @param {*} tab\n */\n const clickTab = (tab) => {\n toLink(tab.props.name);\n };\n /**\n * @todo: close current tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 09:56:44\n * @param {*} targetKey\n */\n const closeCurrentTag = async (targetKey) => {\n const view = visitedViews.value.filter((view) => view.path === targetKey);\n if (isAffix(view[0])) return;\n\n await tagsViewStore.delTagView({ view: view[0] });\n\n // 清除缓存的search条件\n // currentRoute.value.meta.search = {};\n // 判断是否是当前标签页关闭\n if (isActive(view[0])) toLastView(visitedViews.value, view[0]);\n };\n /**\n * @todo: refresh selected tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 09:40:45\n */\n const refreshSelectedTag = async () => {\n tagsViewStore.delCachedView(unref(currentRoute));\n const { path, query } = unref(currentRoute);\n await nextTick();\n replace({\n path: '/redirect' + path,\n query: query,\n });\n };\n const findCurTagIndex = () => visitedViews.value.findIndex((x) => x.path === currentKey.value);\n /**\n * @todo: close right/left tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 10:42:33\n * @param {*} direction\n */\n const closeTagsOrientation = (direction) => {\n const index = findCurTagIndex();\n if (index === -1) return;\n let isClosed = false;\n const vV = cloneDeep(visitedViews.value);\n vV.map(({ path }, i) => {\n if (direction === 'right' && i > index) {\n if (path === unref(activeKey)) isClosed = true;\n closeCurrentTag(path);\n } else if (direction === 'left' && i < index) {\n if (path === unref(activeKey)) isClosed = true;\n closeCurrentTag(path);\n }\n });\n // 跳转至当前页\n if (isClosed) toLink(unref(currentKey));\n };\n /**\n * @todo: close other tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 11:04:12\n */\n const closeOthersTags = () => {\n const index = findCurTagIndex();\n if (index === -1) return;\n push(currentKey.value);\n\n tagsViewStore.delOthersViews(currentRoute.value).then(() => {\n moveToCurrentTag(unref(currentRoute));\n });\n };\n\n watch(\n () => [currentRoute.value.path, currentRoute.value.name],\n ([path, name], [, oldName]) => {\n // if /redirect\n if (isRedirect(path as string)) return;\n // 当前选中tab页\n activeKey.value = (path as string) || '/dashboard';\n // del notify msg\n if (oldName !== name) {\n const alertObj = document.body.querySelector('body>.el-notification');\n if (alertObj) alertObj.remove();\n }\n addNavMenu();\n // moveToCurrentTag(currentRoute.value);\n },\n );\n\n /**\n * @todo: bind right click event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-28 15:28:28\n */\n const tagsViewEl = ref<HTMLElement | null>(null);\n useEventListener(tagsViewEl, 'contextmenu', (ev: MouseEvent) => {\n ev.preventDefault();\n\n let targetNode: HTMLElement | null = null;\n const el = ev.target as HTMLElement;\n\n if (el.tagName === 'SPAN') targetNode = el.parentElement;\n else targetNode = el;\n\n const classNames = targetNode ? [...targetNode.classList] : [];\n if (classNames.includes('el-tabs__item')) {\n const path = targetNode?.getAttribute('aria-controls')?.replace(/^pane-/, '') || '';\n if (path !== unref(currentRoute).path) toLink(path);\n\n position.x = ev.clientX || ev.pageX;\n position.y = ev.clientY || ev.pageY;\n\n showContextMenu(path);\n }\n });\n /**\n * @todo: close context menu on window click\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 09:39:46\n */\n useEventListener(window, 'click', () => {\n closeContextMenu();\n });\n\n // mounted hooks\n onMounted(() => {\n addAffixTags();\n addNavMenu();\n });\n return () => (\n <div\n ref={tagsViewEl}\n class={[prefixCls, 'flex w-full relative bg-[#fff] dark:bg-[var(--el-bg-color)']}>\n <ElTabs\n class=\"multi-tab\"\n type=\"card\"\n modelValue={activeKey.value}\n onUpdate:modelValue={(v: string) => (activeKey.value = v)}\n onTabClick={clickTab}\n onTabRemove={closeCurrentTag}>\n {createTabPanel()}\n </ElTabs>\n {visible.value && (\n <ul\n class=\"tagsView-contextmenu\"\n style={{ left: `${position.x + 10}px`, top: `${position.y - 10}px` }}>\n <li onClick={refreshSelectedTag}>{t('tagsView.refresh')}</li>\n {currentKey.value !== '/dashboard' && visitedViews.value.length === 2 && <li onClick={() => closeCurrentTag(currentKey.value)}>{t('tagsView.close')}</li>}\n {currentKey.value !== '/dashboard' && visitedViews.value.length > 1 && findCurTagIndex() < visitedViews.value.length - 1 && (\n <li onClick={() => closeTagsOrientation('right')}>{t('tagsView.closeRight')}</li>\n )}\n {currentKey.value !== '/dashboard' && visitedViews.value.length > 2 && findCurTagIndex() > 1 && <li onClick={() => closeTagsOrientation('left')}>{t('tagsView.closeLeft')}</li>}\n {currentKey.value === '/dashboard' && visitedViews.value.length > 1 && <li onClick={closeOthersTags}>{t('tagsView.closeOthers')}</li>}\n {currentKey.value !== '/dashboard' && visitedViews.value.length > 2 && <li onClick={closeOthersTags}>{t('tagsView.closeOthers')}</li>}\n </ul>\n )}\n </div>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-tags-view';\n\n .#{$prefixCls} {\n user-select: none; // 禁止选中文本\n\n .multi-tab {\n width: 100%;\n position: relative;\n :deep(.el-tabs__header) {\n margin: 0;\n border-bottom-color: $borderColor;\n height: 34px;\n line-height: 34px;\n .el-tabs__nav {\n border-color: $borderColor;\n .el-tabs__item {\n height: 34px; // 38px\n line-height: 34px; // 38px\n padding: 2px 10px 0 10px; // 0 10px\n font-size: $textSize;\n border-left-color: $borderColor;\n\n &.is-active {\n & > span {\n font-weight: $fontWeight2;\n }\n color: var(--primaryColor, $primaryColor);\n }\n &:focus.is-focus:not(:active) {\n box-shadow: 0 0 1px 1px inset;\n }\n > span {\n font-weight: 500;\n > i {\n padding-right: 5px;\n font-size: $textSize;\n }\n }\n }\n }\n .is-scrollable {\n .el-tabs__nav-next,\n .el-tabs__nav-prev {\n line-height: 42px;\n }\n\n i {\n font-size: 18px;\n color: rgba(0, 0, 0, 0.65);\n }\n }\n }\n .el-tabs__content {\n display: none !important;\n }\n }\n :deep(.tagsView-contextmenu) {\n position: fixed;\n top: $navHeadHeight;\n left: 300px;\n z-index: 9999;\n min-width: 90px;\n padding: 6px 0;\n list-style: none;\n background-color: #fff;\n border: 1px solid $borderColorSecondary;\n border-radius: $borderRadius;\n box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);\n li {\n line-height: 27px;\n padding: 0 15px;\n font-size: 13px;\n &:hover,\n &:focus {\n background-color: $backgroundColor;\n color: var(--primaryColorHover, $primaryColorHover);\n cursor: pointer;\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvTagsView from './src/GvTagsView.vue';\n// Define the install method on the GvExpandMenu component\nconst GvTagsViewPlugin = {\n install(app: App): void {\n app.component(GvTagsView.name ?? 'GvTagsView', GvTagsView);\n },\n};\nexport default GvTagsViewPlugin;\n\nexport { GvTagsView };\n","// bridge/index.ts\nimport type { Router } from 'vue-router';\nimport type { Pinia } from 'pinia';\nimport type { Composer } from 'vue-i18n';\n\ninterface GlobalBridgeContext {\n router?: Router;\n i18n?: Composer;\n store?: Pinia;\n}\nconst globalBridgeKey = '__LIB_BRIDGE_CONTEXT__';\nconst getBridge = (): GlobalBridgeContext => {\n const g = globalThis as any;\n if (!g[globalBridgeKey]) g[globalBridgeKey] = {};\n\n return g[globalBridgeKey];\n};\nconst context: GlobalBridgeContext = {};\n\n// export function setBridgeContext(options: GlobalBridgeContext) {\n// if (options.router) context.router = options.router;\n// if (options.i18n) context.i18n = options.i18n;\n// if (options.pinia) context.pinia = options.pinia;\n// }\nexport const setBridgeContext = (ctx: GlobalBridgeContext) => {\n // console.log('setBridgeContext', ctx);\n Object.assign(getBridge(), ctx);\n};\n\nexport function useBridgeRouter(): Router {\n const router = getBridge().router;\n if (!router) throw new Error('[Bridge] router not set');\n return router;\n}\n// export function useBridgeRouter(): Router {\n// if (!context.router) throw new Error('[Bridge] Router is not injected');\n// return context.router;\n// }\n\nexport function useBridgeI18n(): Composer {\n const i18n = getBridge().i18n;\n if (!i18n) throw new Error('[Bridge] I18n is not injected');\n return i18n;\n}\n\n// export function useBridgeI18n(): Composer {\n// if (!context.i18n) throw new Error('[Bridge] I18n is not injected');\n// return context.i18n;\n// }\n\nexport function useBridgePinia(): Pinia {\n if (!context.store) throw new Error('[Bridge] Pinia is not injected');\n return context.store;\n}\n","/*\n * @title: CRUD hook\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 15:25:08\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-04-10 17:54:48\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\n/**\n * @todo: request data\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 15:39:44\n * @param {*} fetch\n * @param {*} datas\n */\nconst fetchData = async <T = any>(fetch, params): Promise<IResponse<T>> => (await fetch(params)) as IResponse<T>;\nexport const useCrud = () => ({\n fetchData,\n});\n","/*\n * @title: sessionStorage and localStorage hook\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-03-19 16:32:15\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-04-24 17:11:28\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\n// 获取传入的值的类型\nconst getValueType = (value: any): string => {\n const type = Object.prototype.toString.call(value);\n return type.slice(8, -1);\n};\n\nexport const useStorage = (type: 'sessionStorage' | 'localStorage' = 'sessionStorage'): IWebStorage => {\n const setStorage = (key: string, value: any): void => {\n const valueType = getValueType(value);\n window[type].setItem(key, JSON.stringify({ type: valueType, value }));\n };\n\n const getStorage = (key: string): any => {\n const value = window[type].getItem(key);\n if (value) {\n const { value: val } = JSON.parse(value);\n return val;\n } else return value;\n };\n\n const removeStorage = (key: string): void => {\n window[type].removeItem(key);\n };\n\n const clear = (excludes?: string[]): void => {\n // 获取排除项\n const keys = Object.keys(window[type]);\n const defaultExcludes = ['dynamicRouter', 'serverDynamicRouter'];\n const excludesArr = excludes ? [...excludes, ...defaultExcludes] : defaultExcludes;\n const excludesKeys = excludesArr ? keys.filter((key) => !excludesArr.includes(key)) : keys;\n // 排除项不清除\n excludesKeys.forEach((key) => {\n window[type].removeItem(key);\n });\n // window[type].clear()\n };\n\n return {\n setStorage,\n getStorage,\n removeStorage,\n clear,\n };\n};\n","/*\r\n * @title: encrypt\r\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\r\n * @Date: 2023-12-16 08:07:24\r\n * @LastEditors: andy.ten@tom.com\r\n * @LastEditTime: 2025-04-07 13:54:00\r\n * @version: 1.0.1\r\n * @copyright: copyright (c) 2025 Andy Xu\r\n * node: you can not copy and/or use and/or modify this program free,\r\n * please reserve the segment above.Please mail me if you have any question.\r\n */\r\n\r\nimport CryptoJS from 'crypto-js';\r\nexport const key = 'abcdefgabcdefg12';\r\nexport const encrypt = (word: any): string => {\r\n const keyStr = CryptoJS.enc.Utf8.parse(key);\r\n let ww;\r\n if (typeof word === 'object') ww = JSON.stringify(word);\r\n else ww = word;\r\n const srcs = CryptoJS.enc.Utf8.parse(ww);\r\n const encrypted = CryptoJS.AES.encrypt(srcs, keyStr, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });\r\n return encrypted.toString();\r\n};\r\nexport const decrypt = (word: string): any => {\r\n const keyStr = CryptoJS.enc.Utf8.parse(key);\r\n const decrypt = CryptoJS.AES.decrypt(word, keyStr, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });\r\n return CryptoJS.enc.Utf8.stringify(decrypt).toString();\r\n};\r\n// Randomly generate a specified number of hexadecimal keys\r\nexport const generateKey = (num: number): string => {\r\n const library = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\r\n let key = '';\r\n for (let i = 0; i < num; i++) {\r\n const randomPoz = Math.floor(Math.random() * library.length);\r\n key += library.substring(randomPoz, randomPoz + 1);\r\n }\r\n return key;\r\n};\r\n","/*\n * @title: message alert confirm\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 11:47:30\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-03-12 17:03:01\n * @version: 1.0.4\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport { ElMessageBox, ElNotification, ElMessage } from 'element-plus';\nimport { useStorage } from '@@/hooks/web/useStorage';\n// import { useLocaleStoreWithOut } from '@/store/modules/locale';\nimport { sleep, isError } from '@@/utils';\n// const localeStore = useLocaleStoreInstance();\n// const { lang } = localeStore.getCurrentLocale;\nconst { getStorage } = useStorage('localStorage');\nconst lang = getStorage('lang');\nconst notificationTime = 5000;\nconst notificationTimeError = 6000;\nconst messageTime = 2000;\nconst messageTimeError = 5000;\ninterface ConfirmOptions {\n title?: string;\n message: string;\n confirmButtonText?: string;\n cancelButtonText?: string;\n type?: 'success' | 'warning' | 'info' | 'error';\n showCancelButton?: boolean;\n}\n/**\n * @todo: Notification - MessageBox\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 13:48:24\n * @param {unknown} msg\n * @param {MessageType} type\n * @param {string} title\n */\nconst alert = async (msg: unknown, type: MessageType = 'success') => {\n const alertObj = document.body.querySelector('body>.el-notification');\n if (alertObj) alertObj.remove();\n let promptMsg = '提示信息';\n if (lang === 'en') promptMsg = 'Hint';\n const duration = type === 'error' ? notificationTimeError : notificationTime;\n let m = 'No message...';\n if (isError(msg)) m = msg.message || 'No message...';\n else if (typeof msg === 'string') m = msg;\n else if (typeof msg === 'object') m = JSON.stringify(msg);\n\n ElNotification({\n title: promptMsg,\n message: m,\n type,\n duration: duration,\n });\n await sleep(duration);\n};\n/**\n * @todo: confirm - MessageBox\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 12:03:27\n * @param {*} msg\n * @param {*} type\n */\nconst confirm = async (msg: string, type: MessageType = 'warning') => {\n if (document.body.querySelector('body>.el-confirm')) return;\n // 返回 Promise 对象\n let msgs: string;\n const showCancelButton = true;\n msgs = '是否确定此操作?';\n let hint = '提示信息';\n let ok = '确定';\n let cancel = '取消';\n if (msg) msgs = msg;\n else if (lang === 'en') {\n msgs = 'Are you sure you want to proceed?';\n hint = 'Hint';\n ok = 'Ok';\n cancel = 'Cancel';\n }\n\n return new Promise((resolve, reject) => {\n ElMessageBox.confirm(msgs, hint, {\n confirmButtonText: ok,\n cancelButtonText: cancel,\n type,\n showCancelButton,\n } as ConfirmOptions)\n .then(() => {\n resolve(true);\n })\n .catch(() => {\n reject(false);\n });\n });\n};\n\nconst message = async (msg: unknown, type: MessageType = 'warning', tableedit: boolean = false) => {\n if (tableedit === false) {\n const messageObj = document.body.querySelector('body>.el-message');\n // if (messageObj) messageObj.style.display = 'none';\n if (messageObj) return;\n const notifyObj = document.body.querySelector('body>.el-notification');\n if (notifyObj) return;\n }\n let m = 'No message...';\n if (isError(msg)) m = msg.message || 'No message...';\n else if (typeof msg === 'string') m = msg;\n else if (typeof msg === 'object') m = JSON.stringify(msg);\n const duration = type === 'error' ? messageTimeError : messageTime;\n ElMessage({\n message: m,\n showClose: true,\n type,\n duration: duration,\n });\n await sleep(duration);\n};\nexport const notify = {\n alert,\n message,\n confirm,\n};\n","/*\n * @title: package lib entry\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2024-11-28 18:18:44\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-03-12 16:59:51\n * @version: 1.0.4\n * @copyright: copyright (c) 2024 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\nimport type { App } from 'vue';\nimport type { Pinia } from 'pinia';\nimport { setActivePinia } from 'pinia';\nimport type { Composer } from 'vue-i18n';\n\nimport GvButton from './GvButton';\nimport GvIcon from './GvIcon';\nimport GvLangSelect from './GvLangSelect';\nimport GvBacktop from './GvBacktop';\nimport GvBreadCrumb from './GvBreadCrumb';\nimport GvHamburger from './GvHamburger';\nimport GvScreenFull from './GvScreenFull';\nimport GvSidebar from './GvSidebar';\nimport GvSidebarLogo from './GvSidebarLogo';\nimport GvTheme from './GvTheme';\nimport GvExpandMenu from './GvExpandMenu';\nimport GvTagsView from './GvTagsView';\nimport { setBridgeContext } from './bridge';\n\nconst components = [GvButton, GvIcon, GvLangSelect, GvBacktop, GvBreadCrumb, GvHamburger, GvScreenFull, GvSidebar, GvSidebarLogo, GvTheme, GvExpandMenu, GvTagsView];\n\nexport type GuavaUIOptions = {\n store: Pinia;\n i18n: Composer;\n};\n\nexport const install = (app: App, options: GuavaUIOptions) => {\n if ((install as any).INSTALLED) return;\n (install as any).INSTALLED = true;\n\n setActivePinia(options.store);\n setBridgeContext(options);\n\n components.forEach((c) => c.install(app));\n};\n\nconst GuavaUI = { install };\n\n// 🔹 按需导出组件\nexport { GvButton, GvIcon, GvLangSelect, GvBacktop, GvBreadCrumb, GvHamburger, GvScreenFull, GvSidebar, GvSidebarLogo, GvTheme, GvExpandMenu, GvTagsView };\n\n// 🔹 hooks / utils\nexport * from './hooks/service/useCrud';\n// export * from './hooks/web/useNotify';\nexport * from './hooks/web/useStorage';\nexport * from './hooks/web/usePinyin';\nexport * from './utils/gv.propTypes';\nexport * from './utils/gv.secret';\nexport * from './utils/gv.tree';\nexport * from './utils/index';\nexport * from './GvNotify/index';\n\n// 🔹 默认导出统一安装对象\nexport { GuavaUI };\n"],"names":["_sfc_main$c","name","props","message","type","String","default","request","components","emits","setup","emit","slots","getSlots","computed","watch","newVal","handleClick","event","msg","alert","_createVNode","ElButton","value","_export_sfc","sfc","GvButton","app","_a","setHtmlAttrByLang","locale","sleep","timeLen","__async","resolve","toHump","all","letter","toLine","setDomCssProp","prop","val","dom","getDomCssProp","joinIcon","icon","joinIcons","setQuickKeys","ev","btnHtml","inputHtml","messageConfirmHtml","bodyDialogHtml","dialogArr","i","buttonHtml","buttonDHtml","toString","is","isExternal","path","isString","isArray","isError","isObject","isDate","isNumber","isBoolean","isFunction","isElement","isMap","isImgPath","isDark","isNull","isEmpty","isUrl","e","pathResolve","parentPath","childPath","variables","useStyle","preNameSpace","attrs","useAttrs","__props","isLocal","iconName","svgClass","styleExternalIcon","_openBlock","_createElementBlock","_mergeProps","_unref","_createElementVNode","_hoisted_1","_hoisted_2","GvIcon","newPropTypes","createTypes","propTypes","toValidableType","getPrefixCls","prefixCls","localeStore","useLocaleStore","langMap","currentLang","router","useRouter","handleSetLang","lang","unref","switchLocale","useLocale","_createBlock","ElDropdown","_normalizeClass","ElDropdownMenu","_Fragment","_renderList","item","ElDropdownItem","_createTextVNode","_toDisplayString","_component_GvIcon","GvLangSelect","ElBacktop","GvBacktopPlugin","GvBacktop","filterBreadcrumb","routes","res","route","meta","data","__spreadProps","__spreadValues","DEFAULT_CONFIG","getConfig","config","listToTree","list","conf","nodeMap","result","id","children","pid","node","parent","treeToList","tree","findNode","func","findNodeAll","findPath","visitedSet","findPathAll","filter","listFilter","forEach","treeMapEach","conversion","haveChildren","conversionData","treeMap","treeData","opt","eachTree","treeDatas","callBack","parentNode","element","newNode","_isSlot","s","Object","prototype","call","_isVNode","_sfc_main$8","appStore","useAppStore","permStore","usePermsStore","showBreadcrumbIcon","getShowBreadcrumbIcon","currentRoute","t","useI18n","levelList","ref","menuRouters","routers","getRouters","getBreadcrumb","currentPath","matched","slice","renderBreadcrumb","map","v","disabled","redirect","ElBreadcrumbItem","title","startsWith","immediate","_slot","ElBreadcrumb","TransitionGroup","GvBreadCrumb","collapse","toggleCollapse","collapsed","ElIcon","Fold","Expand","GvHamburgerPlugin","GvHamburger","toggle","isFullscreen","useFullscreen","toggleFullscreen","GvScreenFullPlugin","GvScreenFull","hasOneShowingChild","onlyOneChild","showingChildren","useRenderMenuTitle","renderMenuTitle","useRenderMenuItem","menuMode","renderMenuItem","length","hidden","oneShowingChild","fullPath","noShowingChildren","alwaysShow","ElMenuItem","ElSubMenu","_sfc_main$5","menuSelect","Function","undefined","layout","getLayout","push","includes","getCollapseMenus","leftMenuUniqueOpened","getLeftMenuUniqueOpened","activeMenu","index","window","open","renderMenu","ElMenu","renderMenuWrap","ElScrollbar","GvSidebarPlugin","GvSidebar","_imports_0","show","collapseMenus","onMounted","_component_router_link","GvSidebarLogoPlugin","GvSidebarLogo","themeOptions","currentTheme","handleSetTheme","theme","GvThemePlugin","GvTheme","usePinyin","text","withTone","pinyin","pinYin","__emit","menuList","menuPath","fMenusList","generateRouter","serverRoutes","basePath","prefixTitle","prefixCode","i18ntitle","code","tempRoutes","handleCloseDrawer","handleSelect","handleSearch","query","cb","_b","starClickHandle","star","menuItem","ElAutocomplete","$event","Search","_withCtx","_hoisted_3","_hoisted_4","ElTabs","ElTabPane","_hoisted_5","sub","_hoisted_6","_resolveDynamicComponent","StarFilled","Star","_hoisted_7","x","_hoisted_8","visible","sideWidth","expandHandle","ElDrawer","_normalizeStyle","GvMenuList","GvExpandMenuPlugin","GvExpandMenu","_sfc_main","position","reactive","y","currentKey","replace","activeKey","tagsViewStore","useTagsViewStoreWithOut","usePermsStoreWithOut","visitedViews","mainAppRoutes","isRedirect","isActive","isAffix","tag","affix","filterAffixNavMenus","navMenus","affixTags","tagPath","params","hash","redirectedFrom","addAffixTags","tagView","addVisitedView","createTabPanel","icons","picon","closable","label","showContextMenu","key","closeContextMenu","toLink","routePath","toLastView","visitedView","currentView","latestView","addNavMenu","addTagView","moveToCurrentTag","view","clickTab","tab","closeCurrentTag","targetKey","delTagView","refreshSelectedTag","delCachedView","nextTick","findCurTagIndex","findIndex","closeTagsOrientation","direction","isClosed","vV","cloneDeep","closeOthersTags","delOthersViews","then","oldName","alertObj","document","body","querySelector","remove","tagsViewEl","useEventListener","preventDefault","targetNode","el","target","tagName","parentElement","classList","getAttribute","clientX","pageX","clientY","pageY","left","top","onClick","GvTagsViewPlugin","GvTagsView","globalBridgeKey","getBridge","g","setBridgeContext","ctx","fetchData","fetch","useCrud","getValueType","useStorage","valueType","excludes","keys","defaultExcludes","excludesArr","encrypt","word","keyStr","CryptoJS","ww","srcs","decrypt","generateKey","num","library","randomPoz","getStorage","notificationTime","notificationTimeError","messageTime","messageTimeError","promptMsg","duration","m","ElNotification","confirm","msgs","showCancelButton","hint","ok","cancel","reject","ElMessageBox","tableedit","ElMessage","notify","install","options","setActivePinia","c","GuavaUI"],"mappings":"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"}