1
1
<template >
2
2
<li class =" nav-item dropdown" >
3
- <BDropdown v-model =" dropdownValue" v-bind =" computedDropdownProps" is-nav >
3
+ <BDropdown
4
+ ref =" dropdown"
5
+ v-bind =" props"
6
+ is-nav
7
+ @show =" emit('show', $event)"
8
+ @shown =" emit('shown')"
9
+ @hide =" emit('hide', $event)"
10
+ @hidden =" emit('hidden')"
11
+ @hide-prevented =" emit('hide-prevented')"
12
+ @show-prevented =" emit('show-prevented')"
13
+ @click =" emit('click', $event)"
14
+ @toggle =" emit('toggle')"
15
+ @update:model-value =" emit('update:modelValue', $event)"
16
+ >
4
17
<template #button-content >
5
18
<slot name =" button-content" />
6
19
</template >
15
28
</template >
16
29
17
30
<script setup lang="ts">
18
- import type {Middleware , Strategy } from ' @floating-ui/vue'
19
- import {useVModel } from ' @vueuse/core'
20
- import {computed } from ' vue'
21
- import {useBooleanish } from ' ../../composables'
22
- import type {Booleanish , ButtonVariant , ClassValue , Size } from ' ../../types'
23
- import {omit } from ' ../../utils'
31
+ import type {Boundary , Middleware , RootBoundary , Strategy } from ' @floating-ui/vue'
32
+ import {ref } from ' vue'
33
+ import type {Booleanish , ButtonType , ButtonVariant , ClassValue , Size } from ' ../../types'
34
+ import {BvTriggerableEvent } from ' ../../utils'
24
35
import BDropdown from ' ../BDropdown/BDropdown.vue'
36
+ import type {RouteLocationRaw } from ' vue-router'
25
37
26
38
// TODO share props with BDropdown
27
39
const props = withDefaults (
28
40
defineProps <{
41
+ ariaLabel? : string
29
42
id? : string
43
+ menuClass? : ClassValue
44
+ size? : Size
45
+ splitClass? : ClassValue
46
+ splitVariant? : ButtonVariant | null
30
47
text? : string
31
48
toggleClass? : ClassValue
32
- size? : Size
33
- offset? : string
34
49
autoClose? : boolean | ' inside' | ' outside'
35
- splitVariant? : ButtonVariant | null
50
+ block? : Booleanish
51
+ disabled? : Booleanish
52
+ isNav? : Booleanish
53
+ dropup? : Booleanish
54
+ dropend? : Booleanish
55
+ dropstart? : Booleanish
56
+ center? : Booleanish
57
+ end? : Booleanish
58
+ noFlip? : Booleanish
59
+ noShift? : Booleanish
60
+ offset? :
61
+ | number
62
+ | string
63
+ | {mainAxis? : number ; crossAxis? : number ; alignmentAxis? : number | null }
64
+ role ?: string
65
+ split ?: Booleanish
66
+ splitButtonType ?: ButtonType
67
+ splitHref ?: string
68
+ splitDisabled ?: Booleanish
36
69
noCaret ?: Booleanish
70
+ toggleText ?: string
37
71
variant ?: ButtonVariant | null
38
72
modelValue ?: Booleanish
39
73
lazy ?: Booleanish
40
74
strategy ?: Strategy
41
75
floatingMiddleware ?: Middleware []
42
- noFlip? : Booleanish
43
- noShift? : Booleanish
44
- dropup? : Booleanish
45
- dropend? : Booleanish
46
- dropstart? : Booleanish
47
- center? : Booleanish
48
- end? : Booleanish
49
- menuClass? : ClassValue
76
+ splitTo ?: RouteLocationRaw
77
+ boundary ?: Boundary | RootBoundary
50
78
}>(),
51
79
{
52
- lazy: undefined ,
53
- strategy: undefined ,
54
- floatingMiddleware: undefined ,
55
- noFlip: undefined ,
56
- noShift: undefined ,
57
- dropup: undefined ,
58
- dropend: undefined ,
59
- dropstart: undefined ,
60
- center: undefined ,
61
- end: undefined ,
62
- menuClass: undefined ,
80
+ ariaLabel: undefined ,
63
81
id: undefined ,
64
- text: undefined ,
65
- toggleClass: undefined ,
82
+ menuClass: undefined ,
66
83
size: ' md' ,
67
- offset: undefined ,
68
- autoClose: undefined ,
84
+ splitClass: undefined ,
69
85
splitVariant: undefined ,
70
- noCaret: undefined ,
86
+ text: undefined ,
87
+ toggleClass: undefined ,
88
+ floatingMiddleware: undefined ,
89
+ splitDisabled: undefined ,
90
+ autoClose: true ,
91
+ block: false ,
92
+ disabled: false ,
93
+ isNav: false ,
94
+ dropup: false ,
95
+ dropend: false ,
96
+ dropstart: false ,
97
+ center: false ,
98
+ end: false ,
99
+ noFlip: false ,
100
+ lazy: false ,
101
+ noShift: false ,
102
+ offset: 0 ,
103
+ role: ' menu' ,
104
+ split: false ,
105
+ splitButtonType: ' button' ,
106
+ splitHref: undefined ,
107
+ noCaret: false ,
108
+ toggleText: ' Toggle dropdown' ,
71
109
variant: ' link' ,
72
110
modelValue: false ,
111
+ strategy: ' absolute' ,
112
+ splitTo: undefined ,
113
+ boundary: ' clippingAncestors' ,
73
114
}
74
115
)
75
116
76
117
const emit = defineEmits <{
118
+ ' show' : [value : BvTriggerableEvent ]
119
+ ' shown' : []
120
+ ' hide' : [value : BvTriggerableEvent ]
121
+ ' hidden' : []
122
+ ' hide-prevented' : []
123
+ ' show-prevented' : []
124
+ ' click' : [event : MouseEvent ]
125
+ ' toggle' : []
77
126
' update:modelValue' : [value : boolean ]
78
127
}>()
79
128
@@ -85,27 +134,16 @@ defineSlots<{
85
134
// eslint-disable-next-line @typescript-eslint/no-explicit-any
86
135
' button-content' ? : (props : Record <string , never >) => any
87
136
}>()
88
-
89
- const modelValue = useVModel (props , ' modelValue' , emit , {passive: true })
90
-
91
- const modelValueBoolean = useBooleanish (modelValue )
92
-
93
- const dropdownValue = computed ({
94
- get : () => modelValueBoolean .value ,
95
- set : (value : boolean ) => {
96
- modelValue .value = value
97
- },
98
- })
99
- const computedDropdownProps = computed (() => omit (props , [' modelValue' ]))
137
+ const dropdown = ref <InstanceType <typeof BDropdown >>()
100
138
101
139
const close = () => {
102
- modelValue .value = false
140
+ dropdown .value ?. close ()
103
141
}
104
142
const open = () => {
105
- modelValue .value = true
143
+ dropdown .value ?. open ()
106
144
}
107
145
const toggle = () => {
108
- modelValue .value = ! modelValueBoolean . value
146
+ dropdown .value ?. toggle ()
109
147
}
110
148
111
149
defineExpose ({
0 commit comments