mirror of
https://github.com/ArthurDanjou/ui.git
synced 2026-01-29 19:30:37 +01:00
feat: expose open state to slots
This commit is contained in:
@@ -28,7 +28,7 @@ export interface AccordionProps<T> extends Omit<AccordionRootProps, 'asChild' |
|
|||||||
|
|
||||||
export interface AccordionEmits extends AccordionRootEmits {}
|
export interface AccordionEmits extends AccordionRootEmits {}
|
||||||
|
|
||||||
type SlotProps<T> = (props: { item: T, index: number }) => any
|
type SlotProps<T> = (props: { item: T, index: number, open: boolean }) => any
|
||||||
|
|
||||||
export type AccordionSlots<T extends { slot?: string }> = {
|
export type AccordionSlots<T extends { slot?: string }> = {
|
||||||
leading: SlotProps<T>
|
leading: SlotProps<T>
|
||||||
@@ -60,25 +60,32 @@ const ui = computed(() => tv({ extend: accordion, slots: props.ui })({ disabled:
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<AccordionRoot v-bind="rootProps" :class="ui.root({ class: props.class })">
|
<AccordionRoot v-bind="rootProps" :class="ui.root({ class: props.class })">
|
||||||
<AccordionItem v-for="(item, index) in items" :key="index" :value="item.value || String(index)" :disabled="item.disabled" :class="ui.item()">
|
<AccordionItem
|
||||||
|
v-for="(item, index) in items"
|
||||||
|
v-slot="{ open }"
|
||||||
|
:key="index"
|
||||||
|
:value="item.value || String(index)"
|
||||||
|
:disabled="item.disabled"
|
||||||
|
:class="ui.item()"
|
||||||
|
>
|
||||||
<AccordionHeader :class="ui.header()">
|
<AccordionHeader :class="ui.header()">
|
||||||
<AccordionTrigger :class="ui.trigger({ disabled: item.disabled })">
|
<AccordionTrigger :class="ui.trigger({ disabled: item.disabled })">
|
||||||
<slot name="leading" :item="item" :index="index">
|
<slot name="leading" :item="item" :index="index" :open="open">
|
||||||
<UIcon v-if="item.icon" :name="item.icon" :class="ui.leadingIcon()" />
|
<UIcon v-if="item.icon" :name="item.icon" :class="ui.leadingIcon()" />
|
||||||
</slot>
|
</slot>
|
||||||
|
|
||||||
<span v-if="item.label || !!slots.default" :class="ui.label()">
|
<span v-if="item.label || !!slots.default" :class="ui.label()">
|
||||||
<slot :item="item" :index="index">{{ item.label }}</slot>
|
<slot :item="item" :index="index" :open="open">{{ item.label }}</slot>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<slot name="trailing" :item="item" :index="index">
|
<slot name="trailing" :item="item" :index="index" :open="open">
|
||||||
<UIcon :name="item.trailingIcon || trailingIcon || appConfig.ui.icons.chevronDown" :class="ui.trailingIcon()" />
|
<UIcon :name="item.trailingIcon || trailingIcon || appConfig.ui.icons.chevronDown" :class="ui.trailingIcon()" />
|
||||||
</slot>
|
</slot>
|
||||||
</AccordionTrigger>
|
</AccordionTrigger>
|
||||||
</AccordionHeader>
|
</AccordionHeader>
|
||||||
|
|
||||||
<AccordionContent v-if="item.content || !!slots.content || (item.slot && !!slots[item.slot])" v-bind="contentProps" :class="ui.content()">
|
<AccordionContent v-if="item.content || !!slots.content || (item.slot && !!slots[item.slot])" v-bind="contentProps" :class="ui.content()">
|
||||||
<slot :name="item.slot || 'content'" :item="item" :index="index">
|
<slot :name="item.slot || 'content'" :item="item" :index="index" :open="open">
|
||||||
{{ item.content }}
|
{{ item.content }}
|
||||||
</slot>
|
</slot>
|
||||||
</AccordionContent>
|
</AccordionContent>
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ export interface CollapsibleProps extends Omit<CollapsibleRootProps, 'asChild'>
|
|||||||
export interface CollapsibleEmits extends CollapsibleRootEmits {}
|
export interface CollapsibleEmits extends CollapsibleRootEmits {}
|
||||||
|
|
||||||
export interface CollapsibleSlots {
|
export interface CollapsibleSlots {
|
||||||
default(): any
|
default(props: { open: boolean }): any
|
||||||
content(): any
|
content(): any
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
@@ -37,9 +37,9 @@ const ui = computed(() => tv({ extend: collapsible, slots: props.ui })())
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<CollapsibleRoot v-bind="rootProps" :class="ui.root({ class: props.class })">
|
<CollapsibleRoot v-slot="{ open }" v-bind="rootProps" :class="ui.root({ class: props.class })">
|
||||||
<CollapsibleTrigger v-if="!!slots.default" as-child>
|
<CollapsibleTrigger v-if="!!slots.default" as-child>
|
||||||
<slot />
|
<slot :open="open" />
|
||||||
</CollapsibleTrigger>
|
</CollapsibleTrigger>
|
||||||
|
|
||||||
<CollapsibleContent :class="ui.content()">
|
<CollapsibleContent :class="ui.content()">
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ export interface DropdownMenuEmits extends DropdownMenuRootEmits {}
|
|||||||
type SlotProps<T> = (props: { item: T, active?: boolean, index: number }) => any
|
type SlotProps<T> = (props: { item: T, active?: boolean, index: number }) => any
|
||||||
|
|
||||||
export type DropdownMenuSlots<T extends { slot?: string }> = {
|
export type DropdownMenuSlots<T extends { slot?: string }> = {
|
||||||
'default'(): any
|
'default'(props: { open: boolean }): any
|
||||||
'item': SlotProps<T>
|
'item': SlotProps<T>
|
||||||
'item-leading': SlotProps<T>
|
'item-leading': SlotProps<T>
|
||||||
'item-label': SlotProps<T>
|
'item-label': SlotProps<T>
|
||||||
@@ -75,9 +75,9 @@ const ui = computed(() => tv({ extend: dropdownMenu, slots: props.ui })())
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<DropdownMenuRoot v-bind="rootProps">
|
<DropdownMenuRoot v-slot="{ open }" v-bind="rootProps">
|
||||||
<DropdownMenuTrigger v-if="!!slots.default" as-child :disabled="disabled">
|
<DropdownMenuTrigger v-if="!!slots.default" as-child :disabled="disabled">
|
||||||
<slot />
|
<slot :open="open" />
|
||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
|
|
||||||
<UDropdownMenuContent :class="ui.content({ class: props.class })" :ui="ui" v-bind="contentProps" :items="items" :portal="portal">
|
<UDropdownMenuContent :class="ui.content({ class: props.class })" :ui="ui" v-bind="contentProps" :items="items" :portal="portal">
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export interface ModalProps extends DialogRootProps {
|
|||||||
export interface ModalEmits extends DialogRootEmits {}
|
export interface ModalEmits extends DialogRootEmits {}
|
||||||
|
|
||||||
export interface ModalSlots {
|
export interface ModalSlots {
|
||||||
default(): any
|
default(props: { open: boolean }): any
|
||||||
content(): any
|
content(): any
|
||||||
header(): any
|
header(): any
|
||||||
title(): any
|
title(): any
|
||||||
@@ -75,9 +75,9 @@ const ui = computed(() => tv({ extend: modal, slots: props.ui })({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<DialogRoot v-bind="rootProps">
|
<DialogRoot v-slot="{ open }" v-bind="rootProps">
|
||||||
<DialogTrigger v-if="!!slots.default" as-child>
|
<DialogTrigger v-if="!!slots.default" as-child>
|
||||||
<slot />
|
<slot :open="open" />
|
||||||
</DialogTrigger>
|
</DialogTrigger>
|
||||||
|
|
||||||
<DialogPortal :disabled="!portal">
|
<DialogPortal :disabled="!portal">
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ export interface PopoverProps extends PopoverRootProps, Pick<HoverCardRootProps,
|
|||||||
export interface PopoverEmits extends PopoverRootEmits {}
|
export interface PopoverEmits extends PopoverRootEmits {}
|
||||||
|
|
||||||
export interface PopoverSlots {
|
export interface PopoverSlots {
|
||||||
default(): any
|
default(props: { open: boolean }): any
|
||||||
content(): any
|
content(): any
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
@@ -57,9 +57,9 @@ const Component = computed(() => props.mode === 'hover' ? HoverCard : Popover)
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<Component.Root v-bind="rootProps">
|
<Component.Root v-slot="{ open }" v-bind="rootProps">
|
||||||
<Component.Trigger v-if="!!slots.default" as-child>
|
<Component.Trigger v-if="!!slots.default" as-child>
|
||||||
<slot />
|
<slot :open="open" />
|
||||||
</Component.Trigger>
|
</Component.Trigger>
|
||||||
|
|
||||||
<Component.Portal :disabled="!portal">
|
<Component.Portal :disabled="!portal">
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ export interface SlideoverProps extends DialogRootProps {
|
|||||||
export interface SlideoverEmits extends DialogRootEmits {}
|
export interface SlideoverEmits extends DialogRootEmits {}
|
||||||
|
|
||||||
export interface SlideoverSlots {
|
export interface SlideoverSlots {
|
||||||
default(): any
|
default(props: { open: boolean }): any
|
||||||
content(): any
|
content(): any
|
||||||
header(): any
|
header(): any
|
||||||
title(): any
|
title(): any
|
||||||
@@ -78,9 +78,9 @@ const ui = computed(() => tv({ extend: slideover, slots: props.ui })({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<DialogRoot v-bind="rootProps">
|
<DialogRoot v-slot="{ open }" v-bind="rootProps">
|
||||||
<DialogTrigger v-if="!!slots.default" as-child>
|
<DialogTrigger v-if="!!slots.default" as-child>
|
||||||
<slot />
|
<slot :open="open" />
|
||||||
</DialogTrigger>
|
</DialogTrigger>
|
||||||
|
|
||||||
<DialogPortal :disabled="!portal">
|
<DialogPortal :disabled="!portal">
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ export interface TooltipProps extends TooltipRootProps {
|
|||||||
export interface TooltipEmits extends TooltipRootEmits {}
|
export interface TooltipEmits extends TooltipRootEmits {}
|
||||||
|
|
||||||
export interface TooltipSlots {
|
export interface TooltipSlots {
|
||||||
default(): any
|
default(props: { open: boolean }): any
|
||||||
content(): any
|
content(): any
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
@@ -47,9 +47,9 @@ const ui = computed(() => tv({ extend: tooltip, slots: props.ui })({ side: conte
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<TooltipRoot v-bind="rootProps">
|
<TooltipRoot v-slot="{ open }" v-bind="rootProps">
|
||||||
<TooltipTrigger v-if="!!slots.default" as-child>
|
<TooltipTrigger v-if="!!slots.default" as-child>
|
||||||
<slot />
|
<slot :open="open" />
|
||||||
</TooltipTrigger>
|
</TooltipTrigger>
|
||||||
|
|
||||||
<TooltipPortal :disabled="!portal">
|
<TooltipPortal :disabled="!portal">
|
||||||
|
|||||||
Reference in New Issue
Block a user