UNPKG

@oruga-ui/oruga-next

Version:

UI components for Vue.js and CSS framework agnostic

1 lines 27.1 kB
{"version":3,"file":"menu.mjs","sources":["../../src/components/menu/MenuItem.vue","../../src/components/menu/Menu.vue","../../src/components/menu/index.ts"],"sourcesContent":["<script setup lang=\"ts\" generic=\"T\">\nimport { computed, ref, useId } from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\nimport PlainButton from \"../utils/PlainButton\";\n\nimport { getDefault } from \"@/utils/config\";\nimport {\n defineClasses,\n normalizeOptions,\n useProviderChild,\n useProviderParent,\n type ProviderItem,\n} from \"@/composables\";\n\nimport type {\n MenuComponent,\n MenuItemComponent,\n MenuItemProvider,\n} from \"./types\";\nimport type { MenuItemProps } from \"./props\";\n\n/**\n * A menu list item.\n * @displayName Menu Item\n */\ndefineOptions({\n isOruga: true,\n name: \"OMenuItem\",\n configField: \"menu\",\n inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<MenuItemProps<T>>(), {\n override: undefined,\n active: false,\n options: undefined,\n label: undefined,\n expanded: false,\n disabled: false,\n hidden: false,\n submenuId: () => useId(),\n icon: undefined,\n iconPack: () => getDefault(\"menu.iconPack\"),\n iconSize: () => getDefault(\"menu.iconSize\"),\n animation: () => getDefault(\"menu.animation\", \"slide\"),\n tag: () => getDefault(\"menu.itemTag\", PlainButton),\n});\n\nconst emits = defineEmits<{\n /**\n * active prop two-way binding\n * @param value {boolean} updated active prop\n */\n \"update:active\": [value: boolean];\n /**\n * onclick event\n * @param value {string | number | object} value prop data\n * @param event {event} Native Event\n */\n click: [value: T, event: Event];\n}>();\n\nconst itemValue = props.value ?? useId();\n\n// provided data is a computed ref to ensure reactivity\nconst provideData = computed<MenuItemProvider<T>>(() => ({\n expanded: isExpanded.value,\n setExpand,\n triggerReset,\n}));\n\n/** provide functionalities and data to child item components */\nconst { childItems } = useProviderParent({\n key: \"menu-item\",\n data: provideData,\n});\n\n/** inject functionalities and data from the parent menu-item component */\nconst menuItem = useProviderChild<MenuItemProvider<T>>({\n key: \"menu-item\",\n needParent: false,\n});\n\n// provided data is a computed ref to ensure reactivity\nconst providedData = computed<MenuItemComponent<T>>(() => ({\n ...props,\n value: itemValue,\n parent: menuItem.parent.value,\n hasChildren: hasChildren.value,\n expanded: isExpanded.value,\n setExpand,\n reset,\n selectItem,\n}));\n\n/** inject functionalities and data from the parent menu component */\nconst { parent, item } = useProviderChild<\n MenuComponent<T>,\n MenuItemComponent<T>\n>({ data: providedData });\n\nconst nextSequence = parent.value.nextSequence;\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n normalizeOptions<T>(props.options, nextSequence),\n);\n\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\nconst hasChildren = computed(() => !!childItems.value.length);\n\nconst isFocused = computed(\n () => item.value.identifier === parent.value.focsuedIdentifier,\n);\n\nfunction selectItem(event: Event): void {\n if (props.disabled || parent.value.disabled) return;\n triggerReset();\n isActive.value = !isActive.value;\n if (parent.value.accordion) isExpanded.value = isActive.value;\n parent.value.selectItem(isActive.value ? item.value : undefined);\n emits(\"click\", itemValue as T, event);\n}\n\nfunction triggerReset(childs?: ProviderItem<MenuItemComponent<T>>[]): void {\n // The point of this method is to collect references to the clicked item and any parent,\n // this way we can skip resetting those elements.\n if (typeof menuItem.parent.value?.triggerReset === \"function\") {\n menuItem.parent.value.triggerReset(\n childs ? [item.value, ...childs] : [item.value],\n );\n }\n // else if not a sub item reset parent menu\n else if (typeof parent.value.resetMenu === \"function\") {\n parent.value.resetMenu(childs ? [item.value, ...childs] : [item.value]);\n }\n}\n\nconst isExpanded = ref(props.expanded);\n// always expand if not accordion feature\nif (!parent.value.accordion) isExpanded.value = true;\n\nfunction setExpand(state: boolean): void {\n if (!parent.value.accordion) return;\n isExpanded.value = state;\n\n if (typeof menuItem.parent.value?.setExpand === \"function\")\n menuItem.parent.value.setExpand(state);\n}\n\nfunction reset(): void {\n if (parent.value.accordion) isExpanded.value = false;\n isActive.value = false;\n}\n\n// #region --- Computed Component Classes ---\n\nconst itemClasses = defineClasses(\n [\"itemClass\", \"o-menu__item\"],\n [\"itemActiveClass\", \"o-menu__item--active\", null, isActive],\n [\"itemFocusedClass\", \"o-menu__item--focused\", null, isFocused],\n [\n \"itemDisabledClass\",\n \"o-menu__item--disabled\",\n null,\n computed(() => props.disabled || parent.value.disabled),\n ],\n);\n\nconst buttonClasses = defineClasses(\n [\"itemButtonClass\", \"o-menu__item__button\"],\n [\"itemButtonActiveClass\", \"o-menu__item__button--active\", null, isActive],\n [\n \"itemButtonFocusedClass\",\n \"o-menu__item__button--focused\",\n null,\n isFocused,\n ],\n [\n \"itemButtonDisabledClass\",\n \"o-menu__item__button--disabled\",\n null,\n computed(() => props.disabled || parent.value.disabled),\n ],\n [\n \"itemButtonIconClass\",\n \"o-menu__item__button--icon\",\n null,\n computed(() => !!props.icon),\n ],\n);\n\nconst submenuClasses = defineClasses([\n \"itemSubmenuClass\",\n \"o-menu__item__submenu\",\n]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n <li\n v-show=\"!hidden\"\n :id=\"`${parent.menuId}-${item.identifier}`\"\n data-oruga=\"menu-item\"\n :data-id=\"`menu-${item.identifier}`\"\n :class=\"itemClasses\"\n role=\"none\">\n <component\n :is=\"tag\"\n v-bind=\"$attrs\"\n :class=\"buttonClasses\"\n :role=\"parent.role + 'item'\"\n :disabled=\"disabled || parent.disabled\"\n tabindex=\"-1\"\n :aria-selected=\"parent.role == 'tree' ? isActive : undefined\"\n :aria-disabled=\"disabled || parent.disabled\"\n :aria-expanded=\"hasChildren ? isExpanded : undefined\"\n :aria-owns=\"hasChildren ? submenuId : undefined\"\n @click=\"selectItem\"\n @keydown.enter=\"selectItem\"\n @keydown.space=\"selectItem\">\n <o-icon\n v-if=\"icon\"\n :icon=\"icon\"\n :pack=\"iconPack\"\n :size=\"iconSize\" />\n <!-- \n @slot Override label\n @binding {boolean} expanded - item expanded state\n @binding {boolean} active - item active state\n -->\n <slot name=\"label\" :expanded=\"isExpanded\" :active=\"isActive\">\n <span>{{ label }}</span>\n </slot>\n </component>\n\n <!-- sub menu items -->\n <transition v-if=\"$slots.default || options\" :name=\"animation\">\n <ul\n v-show=\"isExpanded\"\n :id=\"submenuId\"\n :class=\"submenuClasses\"\n tabindex=\"-1\"\n role=\"group\">\n <!--\n @slot Place menu items here \n -->\n <slot>\n <OMenuItem\n v-for=\"option in normalizedOptions\"\n :key=\"option.key\"\n v-bind=\"option.attrs\"\n :value=\"option.value\"\n :label=\"option.label\"\n :hidden=\"option.hidden\" />\n </slot>\n </ul>\n </transition>\n </li>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, ref, useId, useTemplateRef } from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\nimport OMenuItem from \"../menu/MenuItem.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { mod } from \"@/utils/helpers\";\nimport {\n defineClasses,\n isGroupOption,\n normalizeOptions,\n useProviderParent,\n useSequentialId,\n type ProviderItem,\n} from \"@/composables\";\n\nimport type { MenuChildItem, MenuComponent, MenuItemComponent } from \"./types\";\nimport type { MenuProps } from \"./props\";\n\n/**\n * A simple menu, for any type of vertical navigation.\n * @displayName Menu\n * @requires ./MenuItem.vue\n * @style _menu.scss\n */\ndefineOptions({\n isOruga: true,\n name: \"OMenu\",\n configField: \"menu\",\n});\n\ntype ModelValue = MenuProps<T>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<MenuProps<T>>(), {\n override: undefined,\n modelValue: undefined,\n options: undefined,\n label: undefined,\n accordion: true,\n disabled: false,\n menuId: () => useId(),\n labelId: () => useId(),\n role: () => getDefault(\"menu.role\", \"tree\"),\n icon: undefined,\n iconPack: () => getDefault(\"menu.iconPack\"),\n iconSize: () => getDefault(\"menu.iconSize\"),\n});\n\ndefineEmits<{\n /**\n * modelValue prop two-way binding\n * @param value {T} updated modelValue prop\n */\n \"update:model-value\": [value: ModelValue];\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\n// provided data is a computed ref to ensure reactivity\nconst provideData = computed<MenuComponent<T>>(() => ({\n focsuedIdentifier: focusedItem.value?.identifier,\n menuId: props.menuId,\n accordion: props.accordion,\n disabled: props.disabled,\n role: props.role,\n nextSequence,\n resetMenu,\n selectItem,\n}));\n\n/** provide functionalities and data to child item components */\nconst { childItems } = useProviderParent<\n MenuItemComponent<T>,\n MenuComponent<T>\n>({ rootRef, data: provideData });\n\n// create a unique id sequence\nconst { nextSequence } = useSequentialId();\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n normalizeOptions<T>(props.options, nextSequence),\n);\n\n/** call reset for every menu item excluding the given one */\nfunction resetMenu(\n excludedItems: ProviderItem<MenuItemComponent<T>>[] = [],\n): void {\n childItems.value.forEach((item) => {\n if (!excludedItems.map((i) => i?.identifier).includes(item.identifier))\n item.data?.reset();\n });\n}\n\n// #region --- Select Feature ---\n\n/** The selected item value, use v-model to make it two-way binding */\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\nconst selectedItem = ref<MenuChildItem<T>>();\n\nfunction selectItem(\n item: ProviderItem<MenuItemComponent<T>> | undefined,\n): void {\n const value = item?.data?.value;\n if (vmodel.value == value) return;\n vmodel.value = value;\n selectedItem.value = item;\n}\n\n// #endregion --- Select Feature ---\n\n// #region --- Focus Feature ---\n\nconst focusedItem = ref<MenuChildItem<T>>();\n\n/** is any option visible */\nconst isNotEmpty = computed(() => childItems.value.some(isItemViable));\n\nfunction onCollapse(): void {\n if (!focusedItem.value) return;\n\n // collapse the item if already expanded\n if (focusedItem.value.data?.expanded)\n focusedItem.value.data?.setExpand(false);\n // else move focus to the previus item\n else moveFocus(-1);\n}\n\nfunction onExpend(): void {\n if (!focusedItem.value) return;\n\n // expand the item if not already expanded\n if (\n focusedItem.value.data?.hasChildren &&\n !focusedItem.value.data?.expanded\n )\n focusedItem.value.data?.setExpand(true);\n // else move focus to the next item\n else moveFocus(1);\n}\n\n/** Set focus on a dropdown item. */\nfunction setFocus(item: MenuChildItem<T>): void {\n focusedItem.value = item;\n}\n\n/** Set focus on a tab item. */\nfunction moveFocus(delta: 1 | -1): void {\n if (!isNotEmpty.value) return;\n const item = getFirstViableItem(focusedItem.value?.index || 0, delta);\n setFocus(item);\n}\n\nfunction onUpPressed(): void {\n moveFocus(-1);\n}\n\nfunction onDownPressed(): void {\n moveFocus(1);\n}\n\nfunction onEnter(event: Event): void {\n if (!focusedItem.value) return;\n setFocus(focusedItem.value);\n focusedItem.value.data?.selectItem(event);\n}\n\n/** Go to the first viable item */\nfunction onHomePressed(): void {\n if (!isNotEmpty.value) return;\n const item = getFirstViableItem(0, 1);\n setFocus(item);\n}\n\n/** Go to the last viable item */\nfunction onEndPressed(): void {\n if (!isNotEmpty.value) return;\n const item = getFirstViableItem(childItems.value.length - 1, -1);\n setFocus(item);\n}\n\n/**\n * Get the first 'viable' child, starting at startingIndex and in the direction specified\n * by the boolean parameter forward. In other words, first try to select the child at index\n * startingIndex, and if it is not visible or it is disabled, then go to the index in the\n * specified direction until either returning to startIndex or finding a viable child item.\n */\nfunction getFirstViableItem(\n startingIndex: number,\n delta: 1 | -1,\n): MenuChildItem<T> {\n let newIndex = mod(\n focusedItem.value?.index == startingIndex\n ? startingIndex + delta\n : startingIndex,\n childItems.value.length,\n );\n for (\n ;\n newIndex !== focusedItem.value?.index;\n newIndex = mod(newIndex + delta, childItems.value.length)\n ) {\n // Break if the item at this index is viable (not disabled)\n if (isItemViable(childItems.value[newIndex])) break;\n }\n\n return childItems.value[newIndex];\n}\n\nfunction isItemViable(item: MenuChildItem<T>): boolean {\n return (\n !item.data?.disabled &&\n !item.data?.hidden &&\n (item.data?.parent?.expanded ?? true)\n );\n}\n\nfunction onFocusLeave(): void {\n focusedItem.value = undefined;\n}\n\n// #endregion --- Focus Feature ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses([\"rootClass\", \"o-menu\"]);\n\nconst listClasses = defineClasses([\"listClass\", \"o-menu__list\"]);\n\nconst labelClasses = defineClasses([\"labelClass\", \"o-menu__label\"]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n <nav\n ref=\"rootElement\"\n data-oruga=\"menu\"\n :class=\"rootClasses\"\n @focusout=\"onFocusLeave\">\n <div v-if=\"label || $slots.label\" :id=\"labelId\" :class=\"labelClasses\">\n <!-- \n @slot Override icon and label\n @binding {T} focused - the focused item value\n @binding {number} focusedIndex - index of the focused item\n @binding {T} selected - the selected item value\n @binding {number} selectedIndex - index of the selected item\n -->\n <slot\n name=\"label\"\n :focused=\"focusedItem?.data\"\n :focused-index=\"focusedItem?.index\"\n :selected=\"selectedItem?.data\"\n :selected-index=\"selectedItem?.index\">\n <o-icon\n v-if=\"icon\"\n :icon=\"icon\"\n :pack=\"iconPack\"\n :size=\"iconSize\" />\n <span>{{ label }}</span>\n </slot>\n </div>\n\n <ul\n :id=\"menuId\"\n :class=\"listClasses\"\n :role=\"role\"\n :tabindex=\"0\"\n :aria-labelledby=\"labelId\"\n @keydown.left=\"onCollapse\"\n @keydown.right=\"onExpend\"\n @keydown.enter.prevent=\"onEnter\"\n @keydown.space.prevent=\"onEnter\"\n @keydown.up.prevent=\"onUpPressed\"\n @keydown.down.prevent=\"onDownPressed\"\n @keydown.home.prevent=\"onHomePressed\"\n @keydown.end.prevent=\"onEndPressed\">\n <!--\n @slot Place menu items here \n @binding {T} focused - the focused item value\n @binding {number} focusedIndex - index of the focused item\n @binding {T} selected - the selected item value\n @binding {number} selectedIndex - index of the selected item\n -->\n <slot\n :focused=\"focusedItem?.data\"\n :focused-index=\"focusedItem?.index\"\n :selected=\"selectedItem?.data\"\n :selected-index=\"selectedItem?.index\">\n <template v-for=\"option in normalizedOptions\" :key=\"option.key\">\n <OMenuItem\n v-if=\"isGroupOption(option)\"\n v-bind=\"option.attrs\"\n :label=\"option.label\"\n :hidden=\"option.hidden\">\n <OMenuItem\n v-for=\"_option in option.options\"\n v-bind=\"_option.attrs\"\n :key=\"_option.key\"\n :value=\"_option.value\"\n :label=\"_option.label\"\n :hidden=\"_option.hidden\" />\n </OMenuItem>\n\n <OMenuItem\n v-else\n v-bind=\"option.attrs\"\n :value=\"option.value\"\n :label=\"option.label\"\n :hidden=\"option.hidden\" />\n </template>\n </slot>\n </ul>\n </nav>\n</template>\n","import type { App, Plugin } from \"vue\";\n\nimport Menu from \"./Menu.vue\";\nimport MenuItem from \"./MenuItem.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\n\n/** export menu plugin */\nexport default {\n install(app: App) {\n registerComponent(app, Menu);\n registerComponent(app, MenuItem);\n },\n} as Plugin;\n\n/** export menu components */\nexport { Menu as OMenu, MenuItem as OMenuItem };\n"],"names":["_useModel","_createElementBlock","_unref","_openBlock","_createBlock","_resolveDynamicComponent","tag","_mergeProps","$attrs","disabled","submenuId","icon","OIcon","iconPack","iconSize","_renderSlot","_createElementVNode","label","$slots","options","_Transition","animation","_Fragment","_renderList","hidden","labelId","menuId","role","OMenuItem","Menu","MenuItem"],"mappings":"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"}