قائمة التنقل Menu
مكوّن تنقّل الصفحات. يدعم التخطيط الأفقي / العمودي، والقوائم الفرعية المتداخلة، والحالة المطوية، والأكورديون، ويحاذي لوحة المفاتيح مع نمط قائمة APG.
التخطيط العمودي (قوائم فرعية مضمَّنة)
يدعم الوضع العمودي المضمَّن التنقّل بلوحة المفاتيح: بعد توسيع قائمة فرعية، يتنقّل ↑/↓ عبر حدود «عنصر ورقة ↔ عنوان القائمة الفرعية ↔ عناصر اللوحة» (ويقفز Home/End إلى الأوّل والأخير)، وتُتخطَّى تلقائيًا العناصر المعطّلة والعناصر داخل اللوحات المطوية.
- الرئيسية
- الإعدادات▾
- إعدادات أساسية
- إعدادات الأمان
- عنصر معطّل
<script setup>
import { ref } from 'vue'
const active = ref('home')
const active2 = ref('settings2-basic')
</script>
<template>
<!-- التخطيط العمودي -->
<LhMenu v-model="active">
<LhMenuItem index="home">الرئيسية</LhMenuItem>
<LhSubMenu index="settings" title="الإعدادات">
<LhMenuItem index="settings-basic">إعدادات أساسية</LhMenuItem>
<LhMenuItem index="settings-security">إعدادات الأمان</LhMenuItem>
</LhSubMenu>
<LhMenuItem index="docs" disabled>عنصر معطّل</LhMenuItem>
</LhMenu>
</template><script>
export default {
data() {
return {
active: 'home',
active2: 'settings2-basic',
}
},
}
</script>
<template>
<!-- التخطيط العمودي -->
<LhMenu v-model="active">
<LhMenuItem index="home">الرئيسية</LhMenuItem>
<LhSubMenu index="settings" title="الإعدادات">
<LhMenuItem index="settings-basic">إعدادات أساسية</LhMenuItem>
<LhMenuItem index="settings-security">إعدادات الأمان</LhMenuItem>
</LhSubMenu>
<LhMenuItem index="docs" disabled>عنصر معطّل</LhMenuItem>
</LhMenu>
</template>التحكّم في التوسيع
يضبط default-openeds القوائم الفرعية الموسَّعة ابتدائيًا؛ ويتحكّم openeds (مع v-model:openeds) في مجموعة التوسيع الموجَّهة؛ ويسمح unique-opened بتوسيع قائمة فرعية واحدة فقط في الوقت ذاته. ويدعم LhSubMenu أيضًا disabled للتعطيل الكامل.
- الإعدادات (موسَّعة افتراضيًا)▾
- إعدادات أساسية
- إعدادات الأمان
- الإدارة (معطّلة)▾
- إدارة المستخدمين
- حول
<script setup>
import { ref } from 'vue'
const active2 = ref('settings2-basic')
</script>
<template>
<!-- التحكّم في التوسيع -->
<LhMenu
v-model="active2"
:default-openeds="['settings2']"
unique-opened
style="max-width: 240px"
>
<LhSubMenu index="settings2" title="الإعدادات (موسَّعة افتراضيًا)">
<LhMenuItem index="settings2-basic">إعدادات أساسية</LhMenuItem>
<LhMenuItem index="settings2-security">إعدادات الأمان</LhMenuItem>
</LhSubMenu>
<LhSubMenu index="manage" title="الإدارة (معطّلة)" disabled>
<LhMenuItem index="manage-users">إدارة المستخدمين</LhMenuItem>
</LhSubMenu>
<LhMenuItem index="about2">حول</LhMenuItem>
</LhMenu>
</template><script>
export default {
data() {
return { active2: 'settings2-basic' }
},
}
</script>
<template>
<!-- التحكّم في التوسيع -->
<LhMenu
v-model="active2"
:default-openeds="['settings2']"
unique-opened
style="max-width: 240px"
>
<LhSubMenu index="settings2" title="الإعدادات (موسَّعة افتراضيًا)">
<LhMenuItem index="settings2-basic">إعدادات أساسية</LhMenuItem>
<LhMenuItem index="settings2-security">إعدادات الأمان</LhMenuItem>
</LhSubMenu>
<LhSubMenu index="manage" title="الإدارة (معطّلة)" disabled>
<LhMenuItem index="manage-users">إدارة المستخدمين</LhMenuItem>
</LhSubMenu>
<LhMenuItem index="about2">حول</LhMenuItem>
</LhMenu>
</template>- الإعدادات▾
- إعدادات أساسية
<script setup lang="ts">
import { ref } from 'vue'
const active2 = ref('settings2-basic')
</script>
<template>
<!-- مجموعة التوسيع الموجَّهة -->
<LhMenu v-model="active2" :openeds="['settings2']">
<LhSubMenu index="settings2" title="الإعدادات">
<LhMenuItem index="settings2-basic">إعدادات أساسية</LhMenuItem>
</LhSubMenu>
</LhMenu>
</template><script>
export default {
data() {
return { active2: 'settings2-basic' }
},
}
</script>
<template>
<!-- مجموعة التوسيع الموجَّهة -->
<LhMenu v-model="active2" :openeds="['settings2']">
<LhSubMenu index="settings2" title="الإعدادات">
<LhMenuItem index="settings2-basic">إعدادات أساسية</LhMenuItem>
</LhSubMenu>
</LhMenu>
</template>التخطيط الأفقي (قوائم فرعية مُحلِّقة)
- الرئيسية
- الإعدادات▾
<script setup lang="ts">
import { ref } from 'vue'
const active = ref('home')
</script>
<template>
<!-- التخطيط الأفقي -->
<LhMenu v-model="active" mode="horizontal">
<LhMenuItem index="home">الرئيسية</LhMenuItem>
<LhSubMenu index="settings" title="الإعدادات">
<LhMenuItem index="settings-basic">إعدادات أساسية</LhMenuItem>
</LhSubMenu>
</LhMenu>
</template><script>
export default {
data() {
return { active: 'home' }
},
}
</script>
<template>
<!-- التخطيط الأفقي -->
<LhMenu v-model="active" mode="horizontal">
<LhMenuItem index="home">الرئيسية</LhMenuItem>
<LhSubMenu index="settings" title="الإعدادات">
<LhMenuItem index="settings-basic">إعدادات أساسية</LhMenuItem>
</LhSubMenu>
</LhMenu>
</template>الحالة المطوية والتجميع
- المحتوى
- الرئيسية
<script setup lang="ts">
import { ref } from 'vue'
const active = ref('home')
</script>
<template>
<!-- طيّ + تجميع -->
<LhMenu v-model="active" collapse>
<LhMenuItemGroup title="المحتوى">
<LhMenuItem index="home">الرئيسية</LhMenuItem>
</LhMenuItemGroup>
</LhMenu>
</template><script>
export default {
data() {
return { active: 'home' }
},
}
</script>
<template>
<!-- طيّ + تجميع -->
<LhMenu v-model="active" collapse>
<LhMenuItemGroup title="المحتوى">
<LhMenuItem index="home">الرئيسية</LhMenuItem>
</LhMenuItemGroup>
</LhMenu>
</template>API
LhMenu Props
| اسم الخاصية | الوصف | النوع | الافتراضي |
|---|---|---|---|
| modelValue | العنصر النشط الحالي (v-model موجَّه؛ عند عدم التمرير يُدار داخليًا) | string | — |
| mode | وضع التخطيط | "horizontal" | "vertical" | 'vertical' |
| collapse | يطوي الوضع العمودي إلى شريط أيقونات (تتحوّل القوائم الفرعية إلى لوحات مُحلِّقة) | boolean | false |
| defaultOpeneds | مفاتيح القوائم الفرعية الموسَّعة افتراضيًا (غير موجَّهة) | string[] | () => [] |
| openeds | مفاتيح القوائم الفرعية الموسَّعة موجَّهًا | string[] | — |
| uniqueOpened | أكورديون: توسيع قائمة فرعية واحدة فقط في الوقت ذاته | boolean | false |
| sx | خصائص التخطيط السريع sx | LhSxProps | — |
Events
| اسم الحدث | الوصف | وسائط الاستدعاء |
|---|---|---|
| update:modelValue | يُطلق عند تغيّر العنصر النشط (v-model) | (value: string) |
| update:openeds | يُطلق عند تغيّر مجموعة القوائم الفرعية الموسَّعة (v-model:openeds) | (value: string[]) |
| select | يُطلق عند اختيار عنصر في القائمة | (index: string, indexPath: string[]) |
| open | يُطلق عند توسيع قائمة فرعية | (index: string, indexPath: string[]) |
| close | يُطلق عند طيّ قائمة فرعية | (index: string, indexPath: string[]) |
LhMenuItem Props
| اسم الخاصية | الوصف | النوع | الافتراضي |
|---|---|---|---|
| index | مُعرِّف فريد (مطلوب) | string | — |
| disabled | تعطيل | boolean | false |
| sx | خصائص التخطيط السريع sx | LhSxProps | — |
الأحداث: click(index)؛ الفتحات: default.
LhSubMenu Props
| اسم الخاصية | الوصف | النوع | الافتراضي |
|---|---|---|---|
| index | مُعرِّف فريد (مطلوب) | string | — |
| title | العنوان (يمكن أيضًا استخدام فتحة title) | string | — |
| disabled | تعطيل | boolean | false |
| sx | خصائص التخطيط السريع sx | LhSxProps | — |
الأحداث: select(index, indexPath) (تتدفّق للأعلى)؛ الفتحات: title، default (يمكن تداخل LhSubMenu بداخلها).
LhMenuItemGroup Props
| اسم الخاصية | الوصف | النوع | الافتراضي |
|---|---|---|---|
| title | عنوان المجموعة (يمكن أيضًا استخدام فتحة title) | string | — |
| sx | خصائص التخطيط السريع sx | LhSxProps | — |
الفتحات: title، default.
إمكانية الوصول
- الأفقي
role="menubar"والعموديrole="menu"؛ والعناصرrole="menuitem"، والمجموعاتrole="group"(الحاويةrole="presentation") - يربط عنوان القائمة الفرعية لوحته عبر
aria-haspopup+aria-expanded+aria-controls - لوحة المفاتيح: Enter/Space/→ يوسِّع ويُركِّز على العنصر الأوّل، ← يطوي، Esc يُغلق؛ وفي الوضع العمودي المضمَّن يتنقّل ↑/↓/Home/End بين العناصر المرئية (عناصر الورقة، وعناوين القوائم الفرعية، وعناصر اللوحات الموسَّعة) عبر الحدود مع التكرار، وتُتخطَّى تلقائيًا العناصر المعطّلة والعناصر داخل اللوحات المطوية
- ارتفاع التوسيع المضمَّن عبر
grid-template-rows: 0fr/1frفي CSS (بلا قياس ارتفاع بـ JS)؛ وتُحدَّد اللوحات المُحلِّقة بواسطة محرّك popper (flip/shift/الطيّ عند الخروج من إطار العرض)
تعريفات الأنواع
بنى TypeScript التي يصدّرها هذا المكوّن للخارج (مستخرجة تلقائيًا من packages/components/menu/src/types.ts و@lh-ui/share/core/*؛ انقر كل عنصر لتوسيع تعريفه الكامل؛ لأوصاف الخصائص انظر جدول Props أعلاه):
LhMenuProps
/** props القائمة */
export interface LhMenuProps {
/** العنصر النشط الحالي (v-model موجَّه؛ عند عدم التمرير يُدار داخليًا في المكوّن) */
modelValue?: string
/** وضع التخطيط */
mode?: LhMenuMode
/** يطوي الوضع العمودي إلى شريط أيقونات (تتحوّل القوائم الفرعية إلى لوحات مُحلِّقة) */
collapse?: boolean
/** مفاتيح القوائم الفرعية الموسَّعة افتراضيًا (غير موجَّهة) */
defaultOpeneds?: string[]
/** مفاتيح القوائم الفرعية الموسَّعة موجَّهًا */
openeds?: string[]
/** أكورديون: توسيع قائمة فرعية واحدة فقط في الوقت ذاته */
uniqueOpened?: boolean
/** خصائص التخطيط السريع sx */
sx?: LhSxProps
}LhMenuItemProps
/** props عنصر الورقة */
export interface LhMenuItemProps {
/** مُعرِّف فريد (مطلوب) */
index: string
disabled?: boolean
/** خصائص التخطيط السريع sx */
sx?: LhSxProps
}LhSubMenuProps
/** props القائمة الفرعية (قابلة للتداخل التكراري) */
export interface LhSubMenuProps {
/** مُعرِّف فريد (مطلوب) */
index: string
/** العنوان (يمكن أيضًا استخدام فتحة title) */
title?: string
disabled?: boolean
/** خصائص التخطيط السريع sx */
sx?: LhSxProps
}LhMenuItemGroupProps
/** props المجموعة */
export interface LhMenuItemGroupProps {
/** عنوان المجموعة (يمكن أيضًا استخدام فتحة title) */
title?: string
/** خصائص التخطيط السريع sx */
sx?: LhSxProps
}LhMenuMode (مأخوذ من @lh-ui/share/core/menu)
/** وضع تخطيط القائمة */
export type LhMenuMode = 'horizontal' | 'vertical'