From 7981c8b76ea5708bfb75b59fcd65252e72ed72f3 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期二, 20 十月 2026 14:09:55 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_江苏商贸供销社' into dev_江苏商贸供销社
---
src/packages/@core/ui-kit/menu-ui/src/components/sub-menu.vue | 45 ++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 40 insertions(+), 5 deletions(-)
diff --git a/src/packages/@core/ui-kit/menu-ui/src/components/sub-menu.vue b/src/packages/@core/ui-kit/menu-ui/src/components/sub-menu.vue
index ce80f68..2acc973 100644
--- a/src/packages/@core/ui-kit/menu-ui/src/components/sub-menu.vue
+++ b/src/packages/@core/ui-kit/menu-ui/src/components/sub-menu.vue
@@ -1,12 +1,12 @@
<script lang="ts" setup>
-import type { HoverCardContentProps } from '..\..\..\shadcn-ui\src';
+import type { HoverCardContentProps } from '../../../shadcn-ui/src';
import type { MenuItemRegistered, MenuProvider, SubMenuProps } from '../types';
-import { computed, onBeforeUnmount, onMounted, reactive, ref } from 'vue';
+import { computed, nextTick, onBeforeUnmount, onMounted, reactive, ref } from 'vue';
-import { useNamespace } from '..\..\..\..\composables\src';
-import { VbenHoverCard } from '..\..\..\shadcn-ui\src';
+import { useNamespace } from '../../../../composables/src';
+import { VbenHoverCard } from '../../../shadcn-ui/src';
import {
createSubMenuContext,
@@ -41,6 +41,32 @@
const items = ref<MenuProvider['items']>({});
const subMenus = ref<MenuProvider['subMenus']>({});
const timer = ref<null | ReturnType<typeof setTimeout>>(null);
+const popupRef = ref<HTMLElement>();
+const popupTriggerRef = ref<InstanceType<typeof SubMenuContent>>();
+
+function togglePopup() {
+ if (props.disabled) return;
+ if (timer.value) window.clearTimeout(timer.value);
+ if (opened.value) rootMenu.closeMenu(props.path, parentPaths.value);
+ else rootMenu.openMenu(props.path, parentPaths.value);
+}
+
+async function handlePopupKeydown(event: KeyboardEvent) {
+ if (props.disabled) return;
+ if (['Enter', ' ', 'ArrowDown'].includes(event.key)) {
+ event.preventDefault();
+ event.stopPropagation();
+ rootMenu.openMenu(props.path, parentPaths.value);
+ await nextTick();
+ popupRef.value?.querySelector<HTMLElement>('[role="menuitem"]')?.focus();
+ } else if (event.key === 'Escape') {
+ event.preventDefault();
+ event.stopPropagation();
+ rootMenu.closeMenu(props.path, parentPaths.value);
+ const trigger = popupTriggerRef.value?.$el;
+ if (trigger instanceof HTMLElement) trigger.focus();
+ }
+}
createSubMenuContext({
addSubMenu,
@@ -218,13 +244,19 @@
>
<template #trigger>
<SubMenuContent
+ ref="popupTriggerRef"
:class="is('active', active)"
:icon="menuIcon"
:is-menu-more="isSubMenuMore"
:is-top-level-menu-submenu="isTopLevelMenuSubmenu"
:level="currentLevel"
:path="path"
- @click.stop="handleClick"
+ role="menuitem"
+ :tabindex="disabled ? -1 : 0"
+ aria-haspopup="menu"
+ :aria-expanded="opened"
+ @click.stop="togglePopup"
+ @keydown="handlePopupKeydown"
>
<template #title>
<slot name="title"></slot>
@@ -232,7 +264,9 @@
</SubMenuContent>
</template>
<div
+ ref="popupRef"
:class="[nsMenu.is(mode, true), nsMenu.e('popup')]"
+ @keydown.esc="handlePopupKeydown"
@focus="(e) => handleMouseenter(e, 100)"
@mouseenter="(e) => handleMouseenter(e, 100)"
@mouseleave="() => handleMouseleave(true)"
@@ -240,6 +274,7 @@
<ul
:class="[nsMenu.b(), is('rounded', rounded)]"
:style="subMenuStyle"
+ role="menu"
>
<slot></slot>
</ul>
--
Gitblit v1.9.3