mirror of
https://github.com/ArthurDanjou/ui.git
synced 2026-01-25 17:30:37 +01:00
@@ -14,8 +14,9 @@ links:
|
|||||||
Pass an array of arrays to the `items` prop of the Dropdown component. Each array represents a group of items. Each item can have the following properties:
|
Pass an array of arrays to the `items` prop of the Dropdown component. Each array represents a group of items. Each item can have the following properties:
|
||||||
|
|
||||||
- `label` - The label of the item.
|
- `label` - The label of the item.
|
||||||
|
- `labelClass` - The class of the item label. :u-badge{label="New" class="!rounded-full" variant="subtle"}
|
||||||
- `icon` - The icon of the item.
|
- `icon` - The icon of the item.
|
||||||
- `iconClass` - The class of the icon of the item.
|
- `iconClass` - The class of the item icon.
|
||||||
- `avatar` - The avatar of the item. You can pass all the props of the [Avatar](/elements/avatar) component.
|
- `avatar` - The avatar of the item. You can pass all the props of the [Avatar](/elements/avatar) component.
|
||||||
- `shortcuts` - The shortcuts of the item.
|
- `shortcuts` - The shortcuts of the item.
|
||||||
- `slot` - The slot of the item.
|
- `slot` - The slot of the item.
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<div v-if="popper.arrow" data-popper-arrow :class="Object.values(ui.arrow)" />
|
<div v-if="popper.arrow" data-popper-arrow :class="Object.values(ui.arrow)" />
|
||||||
<HMenuItems :class="[ui.base, ui.divide, ui.ring, ui.rounded, ui.shadow, ui.background, ui.height]" static>
|
<HMenuItems :class="[ui.base, ui.divide, ui.ring, ui.rounded, ui.shadow, ui.background, ui.height]" static>
|
||||||
<div v-for="(subItems, index) of items" :key="index" :class="ui.padding">
|
<div v-for="(subItems, index) of items" :key="index" :class="ui.padding">
|
||||||
<NuxtLink v-for="(item, subIndex) of subItems" :key="subIndex" v-slot="{ href, target, rel, navigate, isExternal }" v-bind="omit(item, ['label', 'slot', 'icon', 'iconClass', 'avatar', 'shortcuts', 'disabled', 'click'])" custom>
|
<NuxtLink v-for="(item, subIndex) of subItems" :key="subIndex" v-slot="{ href, target, rel, navigate, isExternal }" v-bind="omit(item, ['label', 'labelClass', 'slot', 'icon', 'iconClass', 'avatar', 'shortcuts', 'disabled', 'click'])" custom>
|
||||||
<HMenuItem v-slot="{ active, disabled: itemDisabled, close }" :disabled="item.disabled">
|
<HMenuItem v-slot="{ active, disabled: itemDisabled, close }" :disabled="item.disabled">
|
||||||
<component
|
<component
|
||||||
:is="!!href ? 'a' : 'button'"
|
:is="!!href ? 'a' : 'button'"
|
||||||
@@ -32,10 +32,10 @@
|
|||||||
@click="onClick($event, item, { href, navigate, close, isExternal })"
|
@click="onClick($event, item, { href, navigate, close, isExternal })"
|
||||||
>
|
>
|
||||||
<slot :name="item.slot || 'item'" :item="item">
|
<slot :name="item.slot || 'item'" :item="item">
|
||||||
<UIcon v-if="item.icon" :name="item.icon" :class="[ui.item.icon.base, active ? ui.item.icon.active : ui.item.icon.inactive, item.iconClass]" />
|
<UIcon v-if="item.icon" :name="item.icon" :class="twMerge(twJoin(ui.item.icon.base, active ? ui.item.icon.active : ui.item.icon.inactive), item.iconClass)" />
|
||||||
<UAvatar v-else-if="item.avatar" v-bind="{ size: ui.item.avatar.size, ...item.avatar }" :class="ui.item.avatar.base" />
|
<UAvatar v-else-if="item.avatar" v-bind="{ size: ui.item.avatar.size, ...item.avatar }" :class="ui.item.avatar.base" />
|
||||||
|
|
||||||
<span :class="ui.item.label">{{ item.label }}</span>
|
<span :class="twMerge(ui.item.label, item.labelClass)">{{ item.label }}</span>
|
||||||
|
|
||||||
<span v-if="item.shortcuts?.length" :class="ui.item.shortcuts">
|
<span v-if="item.shortcuts?.length" :class="ui.item.shortcuts">
|
||||||
<UKbd v-for="shortcut of item.shortcuts" :key="shortcut">{{ shortcut }}</UKbd>
|
<UKbd v-for="shortcut of item.shortcuts" :key="shortcut">{{ shortcut }}</UKbd>
|
||||||
@@ -57,6 +57,7 @@ import { defineComponent, ref, computed, toRef, onMounted, resolveComponent } fr
|
|||||||
import type { PropType } from 'vue'
|
import type { PropType } from 'vue'
|
||||||
import { Menu as HMenu, MenuButton as HMenuButton, MenuItems as HMenuItems, MenuItem as HMenuItem } from '@headlessui/vue'
|
import { Menu as HMenu, MenuButton as HMenuButton, MenuItems as HMenuItems, MenuItem as HMenuItem } from '@headlessui/vue'
|
||||||
import { defu } from 'defu'
|
import { defu } from 'defu'
|
||||||
|
import { twMerge, twJoin } from 'tailwind-merge'
|
||||||
import UIcon from '../elements/Icon.vue'
|
import UIcon from '../elements/Icon.vue'
|
||||||
import UAvatar from '../elements/Avatar.vue'
|
import UAvatar from '../elements/Avatar.vue'
|
||||||
import UKbd from '../elements/Kbd.vue'
|
import UKbd from '../elements/Kbd.vue'
|
||||||
@@ -214,6 +215,8 @@ export default defineComponent({
|
|||||||
onMouseLeave,
|
onMouseLeave,
|
||||||
onClick,
|
onClick,
|
||||||
omit,
|
omit,
|
||||||
|
twMerge,
|
||||||
|
twJoin,
|
||||||
NuxtLink
|
NuxtLink
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
1
src/runtime/types/dropdown.d.ts
vendored
1
src/runtime/types/dropdown.d.ts
vendored
@@ -3,6 +3,7 @@ import type { Avatar } from './avatar'
|
|||||||
|
|
||||||
export interface DropdownItem extends NuxtLinkProps {
|
export interface DropdownItem extends NuxtLinkProps {
|
||||||
label: string
|
label: string
|
||||||
|
labelClass?: string
|
||||||
slot?: string
|
slot?: string
|
||||||
icon?: string
|
icon?: string
|
||||||
iconClass?: string
|
iconClass?: string
|
||||||
|
|||||||
Reference in New Issue
Block a user