{"version":3,"file":"menu.cjs","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":["useId","computed","useProviderParent","useProviderChild","normalizeOptions","_useModel","ref","defineClasses","_createElementBlock","_unref","_openBlock","_createBlock","_resolveDynamicComponent","tag","_mergeProps","$attrs","disabled","submenuId","icon","OIcon","iconPack","iconSize","_renderSlot","_createElementVNode","label","$slots","options","_Transition","animation","_Fragment","_renderList","hidden","useTemplateRef","useSequentialId","mod","labelId","menuId","role","isGroupOption","OMenuItem","registerComponent","Menu","MenuItem"],"mappings":"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"}