From 1e6d0283c97c632115934eab5f75cbff82378918 Mon Sep 17 00:00:00 2001 From: xiaoxian521 <1923740402@qq.com> Date: Wed, 29 May 2024 11:06:01 +0800 Subject: [PATCH 1/7] docs: update --- README.en-US.md | 4 ++++ README.md | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/README.en-US.md b/README.en-US.md index d4a87307e..7272120e1 100644 --- a/README.en-US.md +++ b/README.en-US.md @@ -10,6 +10,10 @@ `vue-pure-admin` is an open source, free and out-of-the-box middle and backend management system template. Completely adopts `ECMAScript` module (`ESM`) specifications to write and organize code, using the latest `Vue3`, `Vite`, `Element-Plus`, `TypeScript`, `Pinia`, `Tailwindcss` and other mainstream technologies develop +## R&D philosophy + +Seek innovation in stability and see the future in technology + ## Sponsors - ## Thin version (offering non-internationalized and internationalized versions) The simplified version is based on the shelf extracted from [vue-pure-admin](https://github.com/pure-admin/vue-pure-admin), which contains main functions and is more suitable for actual project development. The packaged size is introduced globally [element-plus](https://element-plus.org) is still below `2.3MB`, and the full version of the code will be permanently synchronized. After enabling `brotli` compression and `cdn` to replace the local library mode, the package size is less than `350kb` diff --git a/README.md b/README.md index 04713f625..a14a182c9 100644 --- a/README.md +++ b/README.md @@ -15,12 +15,6 @@ 稳定中求创新,技术中见未来 -## 赞助商 - - - ## 精简版本(实际项目开发请用精简版本,提供 `非国际化` 、`国际化` 两个版本选择) 精简版本是基于 [vue-pure-admin](https://github.com/pure-admin/vue-pure-admin) 提炼出的架子,包含主体功能,更适合实际项目开发,打包后的大小在全局引入 [element-plus](https://element-plus.org) 的情况下仍然低于 `2.3MB`,并且会永久同步完整版的代码。开启 `brotli` 压缩和 `cdn` 替换本地库模式后,打包大小低于 `350kb` diff --git a/public/sponsors/aitools.svg b/public/sponsors/aitools.svg deleted file mode 100644 index 9110b2431..000000000 --- a/public/sponsors/aitools.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From 7a6ee58e6d6b5cb71bebd2541c97c6c9273bd95b Mon Sep 17 00:00:00 2001 From: way <1904628089@qq.com> Date: Tue, 4 Jun 2024 13:44:47 +0800 Subject: [PATCH 4/7] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=B0=B7?= =?UTF-8?q?=E6=AD=8C=E9=A3=8E=E6=A0=BC=E7=9A=84=E9=A1=B5=E7=AD=BE=20(#1160?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/en.yaml | 2 + locales/zh-CN.yaml | 2 + src/layout/components/lay-content/index.vue | 14 ++- src/layout/components/lay-setting/index.vue | 7 +- .../lay-tag/components/TagChrome.vue | 33 ++++++ src/layout/components/lay-tag/index.scss | 107 ++++++++++++++++++ src/layout/components/lay-tag/index.vue | 65 +++++++---- src/style/dark.scss | 16 +++ 8 files changed, 221 insertions(+), 25 deletions(-) create mode 100644 src/layout/components/lay-tag/components/TagChrome.vue diff --git a/locales/en.yaml b/locales/en.yaml index 37b95a940..d02f36f93 100644 --- a/locales/en.yaml +++ b/locales/en.yaml @@ -53,6 +53,8 @@ panel: pureTagsStyleSmartTip: Smart tags add fun and brilliance pureTagsStyleCard: Card pureTagsStyleCardTip: Card tags for efficient browsing + pureTagsStyleChrome: Chrome + pureTagsStyleChromeTip: Chrome style is classic and elegant pureInterfaceDisplay: Interface Display pureGreyModel: Grey Model pureWeakModel: Weak Model diff --git a/locales/zh-CN.yaml b/locales/zh-CN.yaml index 0412b0ff8..6ce420969 100644 --- a/locales/zh-CN.yaml +++ b/locales/zh-CN.yaml @@ -53,6 +53,8 @@ panel: pureTagsStyleSmartTip: 灵动标签,添趣生辉 pureTagsStyleCard: 卡片 pureTagsStyleCardTip: 卡片标签,高效浏览 + pureTagsStyleChrome: 谷歌 + pureTagsStyleChromeTip: 谷歌风格,经典美观 pureInterfaceDisplay: 界面显示 pureGreyModel: 灰色模式 pureWeakModel: 色弱模式 diff --git a/src/layout/components/lay-content/index.vue b/src/layout/components/lay-content/index.vue index 56bdd136c..5810d665b 100644 --- a/src/layout/components/lay-content/index.vue +++ b/src/layout/components/lay-content/index.vue @@ -2,6 +2,7 @@ import { useI18n } from "vue-i18n"; import LayFrame from "../lay-frame/index.vue"; import LayFooter from "../lay-footer/index.vue"; +import { useTags } from "@/layout/hooks/useTag"; import { useGlobal, isNumber } from "@pureadmin/utils"; import BackTopIcon from "@/assets/svg/back_top.svg?component"; import { h, computed, Transition, defineComponent } from "vue"; @@ -12,6 +13,7 @@ const props = defineProps({ }); const { t } = useI18n(); +const { showModel } = useTags(); const { $storage, $config } = useGlobal(); const isKeepAlive = computed(() => { @@ -51,9 +53,17 @@ const getMainWidth = computed(() => { const getSectionStyle = computed(() => { return [ hideTabs.value && layout ? "padding-top: 48px;" : "", - !hideTabs.value && layout ? "padding-top: 81px;" : "", + !hideTabs.value && layout + ? showModel.value == "chrome" + ? "padding-top: 85px;" + : "padding-top: 81px;" + : "", hideTabs.value && !layout.value ? "padding-top: 48px;" : "", - !hideTabs.value && !layout.value ? "padding-top: 81px;" : "", + !hideTabs.value && !layout.value + ? showModel.value == "chrome" + ? "padding-top: 85px;" + : "padding-top: 81px;" + : "", props.fixedHeader ? "" : `padding-top: 0;${ diff --git a/src/layout/components/lay-setting/index.vue b/src/layout/components/lay-setting/index.vue index b4c8b7fa0..18aacf256 100644 --- a/src/layout/components/lay-setting/index.vue +++ b/src/layout/components/lay-setting/index.vue @@ -232,6 +232,11 @@ const markOptions = computed>(() => { label: t("panel.pureTagsStyleCard"), tip: t("panel.pureTagsStyleCardTip"), value: "card" + }, + { + label: t("panel.pureTagsStyleChrome"), + tip: t("panel.pureTagsStyleChromeTip"), + value: "chrome" } ]; }); @@ -442,7 +447,7 @@ onUnmounted(() => removeMatchMedia); diff --git a/src/layout/components/lay-tag/components/TagChrome.vue b/src/layout/components/lay-tag/components/TagChrome.vue new file mode 100644 index 000000000..137365b46 --- /dev/null +++ b/src/layout/components/lay-tag/components/TagChrome.vue @@ -0,0 +1,33 @@ + diff --git a/src/layout/components/lay-tag/index.scss b/src/layout/components/lay-tag/index.scss index cc122dd2e..b88121690 100644 --- a/src/layout/components/lay-tag/index.scss +++ b/src/layout/components/lay-tag/index.scss @@ -41,6 +41,13 @@ padding-right: 24px; } + &.chrome-item { + padding-right: 0; + padding-left: 0; + margin-right: -18px; + box-shadow: none; + } + .el-icon-close { position: absolute; top: 50%; @@ -76,6 +83,14 @@ overflow: hidden; white-space: nowrap; + &.chrome-scroll-container { + padding-top: 4px; + + .fixed-tag { + padding: 0 !important; + } + } + .tab { position: relative; float: left; @@ -89,6 +104,12 @@ &:nth-child(1) { padding: 0 12px; } + + &.chrome-item { + &:nth-child(1) { + padding: 0; + } + } } .fixed-tag { @@ -173,9 +194,29 @@ color: #fff; box-shadow: 0 0 0.7px #888; + .chrome-tab { + z-index: 10; + } + + .chrome-tab__bg { + color: var(--el-color-primary-light-9) !important; + } + .tag-title { color: var(--el-color-primary) !important; } + + .chrome-close-btn { + color: var(--el-color-primary); + + &:hover { + background-color: var(--el-color-primary); + } + } + + .chrome-tab-divider { + opacity: 0; + } } .arrow-left, @@ -262,3 +303,69 @@ background: var(--el-color-primary); animation: schedule-out-width 200ms ease-in; } + +/* 谷歌风格的页签 */ +.chrome-tab { + position: relative; + display: inline-flex; + gap: 16px; + align-items: center; + justify-content: center; + padding: 0 24px; + white-space: nowrap; + cursor: pointer; + + .tag-title { + padding: 0; + } + + .chrome-tab-divider { + position: absolute; + right: 7px; + width: 1px; + height: 14px; + background-color: #2b2d2f; + } + + &:hover { + z-index: 10; + + .chrome-tab__bg { + color: #dee1e6; + } + + .tag-title { + color: #1f1f1f; + } + + .chrome-tab-divider { + opacity: 0; + } + } + + .chrome-tab__bg { + position: absolute; + top: 0; + left: 0; + z-index: -10; + width: 100%; + height: 100%; + color: transparent; + pointer-events: none; + } + + .chrome-close-btn { + display: inline-flex; + align-items: center; + justify-content: center; + width: 16px; + height: 16px; + color: #666; + border-radius: 50%; + + &:hover { + color: white; + background-color: #b1b3b8; + } + } +} diff --git a/src/layout/components/lay-tag/index.vue b/src/layout/components/lay-tag/index.vue index fa74ee935..373ceea44 100644 --- a/src/layout/components/lay-tag/index.vue +++ b/src/layout/components/lay-tag/index.vue @@ -5,6 +5,7 @@ import { RouteConfigs } from "../../types"; import { useTags } from "../../hooks/useTag"; import { routerArrays } from "@/layout/types"; import { onClickOutside } from "@vueuse/core"; +import TagChrome from "./components/TagChrome.vue"; import { handleAliveRoute, getTopMenu } from "@/router/utils"; import { useSettingStoreHook } from "@/store/modules/settings"; import { useMultiTagsStoreHook } from "@/store/modules/multiTags"; @@ -565,6 +566,7 @@ onBeforeUnmount(() => {
@@ -575,6 +577,7 @@ onBeforeUnmount(() => { :class="[ 'scroll-item is-closable', linkIsActive(item), + showModel === 'chrome' && 'chrome-item', !isAllEmpty(item?.meta?.fixedTag) && 'fixed-tag' ]" @contextmenu.prevent="openMenu(item, $event)" @@ -582,28 +585,46 @@ onBeforeUnmount(() => { @mouseleave.prevent="onMouseleave(index)" @click="tagOnClick(item)" > - - {{ transformI18n(item.meta.title) }} - - - - - + +
+
+ +
+ + {{ transformI18n(item.meta.title) }} + + + + + +
diff --git a/src/style/dark.scss b/src/style/dark.scss index 7c3cb65cb..74fe07474 100644 --- a/src/style/dark.scss +++ b/src/style/dark.scss @@ -115,6 +115,22 @@ html.dark { background-color: rgb(255 255 255 / 12%); } } + + .chrome-tab { + .tag-title { + color: #666; + } + + &:hover { + .chrome-tab__bg { + color: #333; + } + + .tag-title { + color: #adadad; + } + } + } } } From 649aab9c7dccf0820dd34058a15d1b2130c64a88 Mon Sep 17 00:00:00 2001 From: xiaoxian521 <1923740402@qq.com> Date: Tue, 4 Jun 2024 13:49:52 +0800 Subject: [PATCH 5/7] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=E7=89=B9?= =?UTF-8?q?=E5=88=AB=E4=BB=A3=E7=A0=81=E8=B4=A1=E7=8C=AE=E5=90=8D=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.en-US.md | 1 + README.md | 1 + 2 files changed, 2 insertions(+) diff --git a/README.en-US.md b/README.en-US.md index e0ec3b09a..8bf831f7e 100644 --- a/README.en-US.md +++ b/README.en-US.md @@ -182,6 +182,7 @@ Thank you very much for your in-depth understanding of the source code and your | [WitMiao](https://github.com/WitMiao) | [code](https://github.com/pure-admin/vue-pure-admin/commits?author=WitMiao) | | [QFifteen](https://github.com/QFifteen) | [code](https://github.com/pure-admin/vue-pure-admin/commits?author=QFifteen) | | [edgexie](https://github.com/edgexie) | [code](https://github.com/pure-admin/vue-pure-admin/commits?author=edgexie) | +| [way-jm](https://github.com/way-jm) | [code](https://github.com/pure-admin/vue-pure-admin/commits?author=way-jm) | ## Git Contribution submission specification diff --git a/README.md b/README.md index a14a182c9..e8ade06d6 100644 --- a/README.md +++ b/README.md @@ -187,6 +187,7 @@ docker run -dp 8080:80 --name pure-admin vue-pure-admin | [WitMiao](https://github.com/WitMiao) | [代码](https://github.com/pure-admin/vue-pure-admin/commits?author=WitMiao) | | [QFifteen](https://github.com/QFifteen) | [代码](https://github.com/pure-admin/vue-pure-admin/commits?author=QFifteen) | | [edgexie](https://github.com/edgexie) | [代码](https://github.com/pure-admin/vue-pure-admin/commits?author=edgexie) | +| [way-jm](https://github.com/way-jm) | [代码](https://github.com/pure-admin/vue-pure-admin/commits?author=way-jm) | ## `Git` 贡献提交规范 From 33a89834d7521846669f8e0f95936c62a4eac349 Mon Sep 17 00:00:00 2001 From: xiaoxian521 <1923740402@qq.com> Date: Tue, 4 Jun 2024 16:21:22 +0800 Subject: [PATCH 6/7] release: update `5.7.0` --- CHANGELOG.en_US.md | 10 ++++++++++ CHANGELOG.md | 10 ++++++++++ CHANGELOG.zh_CN.md | 10 ++++++++++ package.json | 2 +- public/platform-config.json | 2 +- 5 files changed, 32 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.en_US.md b/CHANGELOG.en_US.md index 1f223de68..385164b42 100644 --- a/CHANGELOG.en_US.md +++ b/CHANGELOG.en_US.md @@ -1,3 +1,13 @@ +# 5.7.0 (2024-06-04) + +### 🎫 Feat + +- Add Google style tabs + +### 🐞 Bug fixes + +- Fixed the issue where the text exceeds and is not hidden after the menu is folded in Firefox browser + # 5.6.0 (2024-05-14) ### ✔️ Refactor diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f223de68..385164b42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +# 5.7.0 (2024-06-04) + +### 🎫 Feat + +- Add Google style tabs + +### 🐞 Bug fixes + +- Fixed the issue where the text exceeds and is not hidden after the menu is folded in Firefox browser + # 5.6.0 (2024-05-14) ### ✔️ Refactor diff --git a/CHANGELOG.zh_CN.md b/CHANGELOG.zh_CN.md index a75670815..63bd83be3 100644 --- a/CHANGELOG.zh_CN.md +++ b/CHANGELOG.zh_CN.md @@ -1,3 +1,13 @@ +# 5.7.0 (2024-06-04) + +### 🎫 Feat + +- 添加谷歌风格的页签 + +### 🐞 Bug fixes + +- 修复在火狐浏览器中菜单折叠后,文字超出未隐藏的问题 + # 5.6.0 (2024-05-14) ### ✔️ Refactor diff --git a/package.json b/package.json index 4837f8c3f..30d615a31 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vue-pure-admin", - "version": "5.6.0", + "version": "5.7.0", "private": true, "type": "module", "scripts": { diff --git a/public/platform-config.json b/public/platform-config.json index ecc459b86..dbd8bb48b 100644 --- a/public/platform-config.json +++ b/public/platform-config.json @@ -1,5 +1,5 @@ { - "Version": "5.6.0", + "Version": "5.7.0", "Title": "PureAdmin", "FixedHeader": true, "HiddenSideBar": false, From a75cf8394eb2820fa4433f021d12a0e61e43aec8 Mon Sep 17 00:00:00 2001 From: sea <45450994+warmthsea@users.noreply.github.com> Date: Thu, 6 Jun 2024 16:26:32 +0800 Subject: [PATCH 7/7] =?UTF-8?q?types:=20=E4=BC=98=E5=8C=96=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E6=8C=87=E4=BB=A4=E7=9A=84=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=20(#1161)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/extensions.json | 1 + .vscode/settings.json | 26 +++++++++++++++++++++----- src/directives/auth/index.ts | 2 +- src/directives/copy/index.ts | 4 ++-- src/directives/longpress/index.ts | 2 +- src/directives/optimize/index.ts | 15 ++++++++++++++- src/directives/ripple/index.ts | 11 +++-------- types/directives.d.ts | 26 ++++++++++++++++++++++++++ 8 files changed, 69 insertions(+), 18 deletions(-) create mode 100644 types/directives.d.ts diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 99f21c9ab..a793646e6 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,6 +1,7 @@ { "recommendations": [ "christian-kohler.path-intellisense", + "warmthsea.vscode-custom-code-color", "vscode-icons-team.vscode-icons", "davidanson.vscode-markdownlint", "ms-azuretools.vscode-docker", diff --git a/.vscode/settings.json b/.vscode/settings.json index 9752f8985..b5aefceb4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -31,11 +31,18 @@ "i18n-ally.keystyle": "nested", "i18n-ally.sortKeys": true, "i18n-ally.namespace": true, - "i18n-ally.enabledParsers": ["yaml", "js"], + "i18n-ally.enabledParsers": [ + "yaml", + "js" + ], "i18n-ally.sourceLanguage": "en", "i18n-ally.displayLanguage": "zh-CN", - "i18n-ally.enabledFrameworks": ["vue"], - "iconify.excludes": ["el"], + "i18n-ally.enabledFrameworks": [ + "vue" + ], + "iconify.excludes": [ + "el" + ], "vsmqtt.brokerProfiles": [ { "name": "broker.emqx.io", @@ -43,5 +50,14 @@ "port": 1883, "clientId": "vsmqtt_client_db34" } - ] -} + ], + "vscodeCustomCodeColor.highlightValue": [ + "v-loading", + "v-auth", + "v-copy", + "v-longpress", + "v-optimize", + "v-ripple" + ], + "vscodeCustomCodeColor.highlightValueColor": "#b392f0", +} \ No newline at end of file diff --git a/src/directives/auth/index.ts b/src/directives/auth/index.ts index a7a4f2216..2fc649047 100644 --- a/src/directives/auth/index.ts +++ b/src/directives/auth/index.ts @@ -2,7 +2,7 @@ import { hasAuth } from "@/router/utils"; import type { Directive, DirectiveBinding } from "vue"; export const auth: Directive = { - mounted(el: HTMLElement, binding: DirectiveBinding) { + mounted(el: HTMLElement, binding: DirectiveBinding>) { const { value } = binding; if (value) { !hasAuth(value) && el.parentNode?.removeChild(el); diff --git a/src/directives/copy/index.ts b/src/directives/copy/index.ts index 8e9783381..b71fa1901 100644 --- a/src/directives/copy/index.ts +++ b/src/directives/copy/index.ts @@ -3,13 +3,13 @@ import { useEventListener } from "@vueuse/core"; import { copyTextToClipboard } from "@pureadmin/utils"; import type { Directive, DirectiveBinding } from "vue"; -interface CopyEl extends HTMLElement { +export interface CopyEl extends HTMLElement { copyValue: string; } /** 文本复制指令(默认双击复制) */ export const copy: Directive = { - mounted(el: CopyEl, binding: DirectiveBinding) { + mounted(el: CopyEl, binding: DirectiveBinding) { const { value } = binding; if (value) { el.copyValue = value; diff --git a/src/directives/longpress/index.ts b/src/directives/longpress/index.ts index 544278448..4eec6a22b 100644 --- a/src/directives/longpress/index.ts +++ b/src/directives/longpress/index.ts @@ -3,7 +3,7 @@ import type { Directive, DirectiveBinding } from "vue"; import { subBefore, subAfter, isFunction } from "@pureadmin/utils"; export const longpress: Directive = { - mounted(el: HTMLElement, binding: DirectiveBinding) { + mounted(el: HTMLElement, binding: DirectiveBinding) { const cb = binding.value; if (cb && isFunction(cb)) { let timer = null; diff --git a/src/directives/optimize/index.ts b/src/directives/optimize/index.ts index 395eb456c..7b92538d1 100644 --- a/src/directives/optimize/index.ts +++ b/src/directives/optimize/index.ts @@ -8,9 +8,22 @@ import { import { useEventListener } from "@vueuse/core"; import type { Directive, DirectiveBinding } from "vue"; +export interface OptimizeOptions { + /** 事件名 */ + event: string; + /** 事件触发的方法 */ + fn: (...params: any) => any; + /** 是否立即执行 */ + immediate?: boolean; + /** 防抖或节流的延迟时间(防抖默认:`200`毫秒、节流默认:`1000`毫秒) */ + timeout?: number; + /** 传递的参数 */ + params?: any; +} + /** 防抖(v-optimize或v-optimize:debounce)、节流(v-optimize:throttle)指令 */ export const optimize: Directive = { - mounted(el: HTMLElement, binding: DirectiveBinding) { + mounted(el: HTMLElement, binding: DirectiveBinding) { const { value } = binding; const optimizeType = binding.arg ?? "debounce"; const type = ["debounce", "throttle"].find(t => t === optimizeType); diff --git a/src/directives/ripple/index.ts b/src/directives/ripple/index.ts index 06ff25f26..3fd94d9cf 100644 --- a/src/directives/ripple/index.ts +++ b/src/directives/ripple/index.ts @@ -2,8 +2,10 @@ import "./index.scss"; import { isObject } from "@pureadmin/utils"; import type { Directive, DirectiveBinding } from "vue"; -interface RippleOptions { +export interface RippleOptions { + /** 自定义`ripple`颜色,支持`tailwindcss` */ class?: string; + /** 是否从中心扩散 */ center?: boolean; circle?: boolean; } @@ -220,13 +222,6 @@ function updated(el: HTMLElement, binding: RippleDirectiveBinding) { updateRipple(el, binding, wasEnabled); } -/** - * @description 指令 v-ripple - * @use 用法如下 - * 1. v-ripple 代表启用基本的 ripple 功能 - * 2. v-ripple="{ class: 'text-red' }" 代表自定义 ripple 颜色,支持 tailwindcss,生效样式是 color - * 3. v-ripple.center 代表从中心扩散 - */ export const Ripple: Directive = { mounted, unmounted, diff --git a/types/directives.d.ts b/types/directives.d.ts new file mode 100644 index 000000000..87256982f --- /dev/null +++ b/types/directives.d.ts @@ -0,0 +1,26 @@ +import type { Directive } from "vue"; +import type { CopyEl, OptimizeOptions, RippleOptions } from "@/directives"; + +declare module "vue" { + export interface ComponentCustomProperties { + /** `Loading` 动画加载指令,具体看:https://element-plus.org/zh-CN/component/loading.html#%E6%8C%87%E4%BB%A4 */ + vLoading: Directive; + /** 按钮权限指令 */ + vAuth: Directive>; + /** 文本复制指令(默认双击复制) */ + vCopy: Directive; + /** 长按指令 */ + vLongpress: Directive; + /** 防抖、节流指令 */ + vOptimize: Directive; + /** + * `v-ripple`指令,用法如下: + * 1. `v-ripple`代表启用基本的`ripple`功能 + * 2. `v-ripple="{ class: 'text-red' }"`代表自定义`ripple`颜色,支持`tailwindcss`,生效样式是`color` + * 3. `v-ripple.center`代表从中心扩散 + */ + vRipple: Directive; + } +} + +export {};