@@ -7,7 +7,12 @@ import Component from '@glimmer/component';
7
7
import { action } from '@ember/object' ;
8
8
import { assert } from '@ember/debug' ;
9
9
10
- import { HdsDropdownPositionValues } from './types.ts' ;
10
+ import {
11
+ // map Dropdown's `listPosition` values to PopoverPrimitive's `placement` values
12
+ HdsDropdownPositionToPlacementValues ,
13
+ // Dropdown's `listPosition` values
14
+ HdsDropdownPositionValues ,
15
+ } from './types.ts' ;
11
16
12
17
import type { ComponentLike } from '@glint/template' ;
13
18
import type { MenuPrimitiveSignature } from '../menu-primitive' ;
@@ -26,15 +31,19 @@ import type { HdsDropdownToggleButtonSignature } from './toggle/button';
26
31
import type { HdsDropdownToggleIconSignature } from './toggle/icon' ;
27
32
import type { HdsDropdownPositions } from './types' ;
28
33
34
+ import type { FloatingUIOptions } from '../../../modifiers/hds-anchored-position.ts' ;
35
+
29
36
export const DEFAULT_POSITION = HdsDropdownPositionValues . BottomRight ;
30
37
export const POSITIONS : string [ ] = Object . values ( HdsDropdownPositionValues ) ;
31
38
32
39
export interface HdsDropdownSignature {
33
40
Args : MenuPrimitiveSignature [ 'Args' ] & {
34
41
height ?: string ;
35
42
isInline ?: boolean ;
43
+ isOpen ?: boolean ;
36
44
listPosition ?: HdsDropdownPositions ;
37
45
width ?: string ;
46
+ enableCollisionDetection ?: FloatingUIOptions [ 'enableCollisionDetection' ] ;
38
47
} ;
39
48
Blocks : {
40
49
default : [
@@ -79,6 +88,24 @@ export default class HdsDropdownComponent extends Component<HdsDropdownSignature
79
88
return listPosition ;
80
89
}
81
90
91
+ get enableCollisionDetection ( ) : FloatingUIOptions [ 'enableCollisionDetection' ] {
92
+ return this . args . enableCollisionDetection ?? false ;
93
+ }
94
+
95
+ get anchoredPositionOptions ( ) : {
96
+ placement : FloatingUIOptions [ 'placement' ] ;
97
+ offsetOptions : FloatingUIOptions [ 'offsetOptions' ] ;
98
+ enableCollisionDetection : FloatingUIOptions [ 'enableCollisionDetection' ] ;
99
+ } {
100
+ // custom options specific for the `RichTooltip` component
101
+ // for details see the `hds-anchored-position` modifier
102
+ return {
103
+ placement : HdsDropdownPositionToPlacementValues [ this . listPosition ] ,
104
+ offsetOptions : 4 ,
105
+ enableCollisionDetection : this . enableCollisionDetection ? 'flip' : false ,
106
+ } ;
107
+ }
108
+
82
109
/**
83
110
* Get the class names to apply to the element
84
111
* @method classNames
@@ -104,6 +131,8 @@ export default class HdsDropdownComponent extends Component<HdsDropdownSignature
104
131
const classes = [ 'hds-dropdown__content' ] ;
105
132
106
133
// add a class based on the @listPosition argument
134
+ // TODO: we preserved these classes to avoid introducing breaking changes for consumers who rely on these classes for tests, but we aim to remove them in the next major release
135
+ // context: https://github.com/hashicorp/design-system/pull/2309#discussion_r1706941892
107
136
classes . push ( `hds-dropdown__content--position-${ this . listPosition } ` ) ;
108
137
109
138
// add a class based on the @width argument
0 commit comments