Skip to content

Commit ff2f78a

Browse files
committed
refactor(CDropdown): add focus trap when used with teleport
1 parent 095ac24 commit ff2f78a

File tree

1 file changed

+24
-17
lines changed

1 file changed

+24
-17
lines changed

packages/coreui-vue/src/components/dropdown/CDropdown.ts

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { getNextActiveElement, isRTL } from '../../utils'
77

88
import type { Alignments } from './types'
99
import { getPlacement } from './utils'
10+
import { CFocusTrap } from '../focus-trap'
1011

1112
const CDropdown = defineComponent({
1213
name: 'CDropdown',
@@ -217,7 +218,8 @@ const CDropdown = defineComponent({
217218
window.removeEventListener('click', handleClick)
218219
window.removeEventListener('keyup', handleKeyup)
219220
dropdownMenuRef.value && dropdownMenuRef.value.removeEventListener('keydown', handleKeydown)
220-
dropdownToggleRef.value && dropdownToggleRef.value.removeEventListener('keydown', handleKeydown)
221+
dropdownToggleRef.value &&
222+
dropdownToggleRef.value.removeEventListener('keydown', handleKeydown)
221223
emit('hide')
222224
})
223225

@@ -315,22 +317,27 @@ const CDropdown = defineComponent({
315317
provide('setVisible', setVisible)
316318

317319
return () =>
318-
props.variant === 'input-group'
319-
? [slots.default && slots.default()]
320-
: h(
321-
'div',
322-
{
323-
class: [
324-
props.variant === 'nav-item' ? 'nav-item dropdown' : props.variant,
325-
props.direction === 'center'
326-
? 'dropdown-center'
327-
: props.direction === 'dropup-center'
328-
? 'dropup dropup-center'
329-
: props.direction,
330-
],
331-
},
332-
slots.default && slots.default()
333-
)
320+
h(
321+
CFocusTrap,
322+
{ active: props.teleport && visible.value, additionalContainer: dropdownMenuRef },
323+
() =>
324+
props.variant === 'input-group'
325+
? [slots.default && slots.default()]
326+
: h(
327+
'div',
328+
{
329+
class: [
330+
props.variant === 'nav-item' ? 'nav-item dropdown' : props.variant,
331+
props.direction === 'center'
332+
? 'dropdown-center'
333+
: props.direction === 'dropup-center'
334+
? 'dropup dropup-center'
335+
: props.direction,
336+
],
337+
},
338+
slots.default && slots.default()
339+
)
340+
)
334341
},
335342
})
336343

0 commit comments

Comments
 (0)