diff --git a/addon/components/au-dropdown.hbs b/addon/components/au-dropdown.hbs
index 53f3d2129..4dc3ff3bc 100644
--- a/addon/components/au-dropdown.hbs
+++ b/addon/components/au-dropdown.hbs
@@ -1,5 +1,6 @@
\ No newline at end of file
+ {{#if this.dropdownOpen}}
+
+ {{/if}}
+
diff --git a/addon/components/au-dropdown.js b/addon/components/au-dropdown.js
index 839c76790..1d42c3a6c 100644
--- a/addon/components/au-dropdown.js
+++ b/addon/components/au-dropdown.js
@@ -2,8 +2,30 @@ import Component from '@glimmer/component';
import { deprecate } from '@ember/debug';
import { action } from '@ember/object';
import { tracked } from '@glimmer/tracking';
+import { modifier } from 'ember-modifier';
+
+import FloatingUiModifier from '@appuniversum/ember-appuniversum/private/modifiers/floating-ui';
export default class AuDropdown extends Component {
+ @tracked referenceElement = undefined;
+ @tracked arrowElement = undefined;
+
+ floatingUi = FloatingUiModifier;
+
+ reference = modifier(
+ (element) => {
+ this.referenceElement = element;
+ },
+ { eager: false }
+ );
+
+ arrow = modifier(
+ (element) => {
+ this.arrowElement = element;
+ },
+ { eager: false }
+ );
+
@tracked dropdownOpen = false;
@action
@@ -23,8 +45,7 @@ export default class AuDropdown extends Component {
@action
clickOutsideDeactivates(event) {
- let toggleButton = document.querySelector('[data-au-dropdown-toggle]');
- let isClosedByToggleButton = toggleButton.contains(event.target);
+ let isClosedByToggleButton = this.referenceElement.contains(event.target);
if (!isClosedByToggleButton) {
this.closeDropdown();
@@ -52,9 +73,9 @@ export default class AuDropdown extends Component {
// Dropdown alignment
get alignment() {
- if (this.args.alignment == 'left') return 'au-c-dropdown__menu--left';
- if (this.args.alignment == 'right') return 'au-c-dropdown__menu--right';
- return '';
+ if (this.args.alignment == 'left') return 'bottom-start';
+ if (this.args.alignment == 'right') return 'bottom-end';
+ return 'bottom';
}
// Set default button skin
@@ -74,4 +95,13 @@ export default class AuDropdown extends Component {
if (this.args.iconAlignment) return this.args.iconAlignment;
else return 'right';
}
+
+ // Set options for the floatingUi component
+ get floatingUiOptions() {
+ return {
+ arrow: {
+ offset: 0,
+ },
+ };
+ }
}
diff --git a/app/styles/ember-appuniversum/_c-dropdown.scss b/app/styles/ember-appuniversum/_c-dropdown.scss
index 4b1297b94..b7a2babcc 100644
--- a/app/styles/ember-appuniversum/_c-dropdown.scss
+++ b/app/styles/ember-appuniversum/_c-dropdown.scss
@@ -8,10 +8,9 @@
$au-dropdown-caret-size : .4rem !default;
/* Component
- ========================================================================== */
+ ========================================================================== */
.au-c-dropdown {
- position: relative;
display: inline-block;
}
@@ -38,31 +37,28 @@ $au-dropdown-caret-size : .4rem !default;
}
}
-.au-c-dropdown__menu {
- @include au-font-size(var(--au-base),1.5);
- font-family: var(--au-font);
- font-weight: var(--au-regular);
- position: absolute;
+.au-c-dropdown__floater {
z-index: var(--au-z-index-beta);
- background-color: var(--au-white);
- display: flex;
- flex-direction: column;
- flex-wrap: nowrap;
- left: 50%;
- transform: translateX(-50%);
- min-width: 100%;
width: auto;
- top: calc(100% + #{$au-unit-tiny});
+
box-shadow: 0 0 12px rgba($au-gray-900,.15), 0 0 2px rgba($au-gray-900,.1);
border-radius: var(--au-radius);
- display: none;
+ background-color: var(--au-white);
+
+ @include au-font-size(var(--au-base),1.5);
+ font-family: var(--au-font);
+ font-weight: var(--au-regular);
+}
+
+.au-c-dropdown__arrow {
+ position: absolute;
&:before,
&:after {
bottom: 100%;
left: 50%;
border: solid transparent;
- content: " ";
+ content: "";
height: 0;
width: 0;
position: absolute;
@@ -80,46 +76,18 @@ $au-dropdown-caret-size : .4rem !default;
border-color: rgba($au-white, 0);
border-bottom-color: var(--au-white);
}
+}
+
+.au-c-dropdown__menu {
+ position: relative;
+ z-index: var(--au-z-index-beta); // Re-apply z-index to fix overlapping arrow when focussing on a menu item
+ display: flex;
+ flex-direction: column;
+ flex-wrap: nowrap;
&:focus {
outline: 0;
}
-
- &.is-visible {
- display: flex;
- }
-
- // Modify the menu position
- &.au-c-dropdown__menu--left,
- &.au-c-dropdown__menu--right {
- transform: none;
- }
-
- &.au-c-dropdown__menu--left {
- left: 0;
- }
-
- &.au-c-dropdown__menu--right {
- left: auto;
- right: 0;
- }
-
- &.au-c-dropdown__menu--left:after {
- left: $au-unit-small;
- }
-
- &.au-c-dropdown__menu--right:after {
- right: $au-unit-small + $au-unit-tiny;
- left: auto;
- }
-
- .au-c-button--naked + &.au-c-dropdown__menu--left:after {
- left: $au-unit-tiny;
- }
-
- .au-c-button--naked + &.au-c-dropdown__menu--right:after {
- right: $au-unit-tiny;
- }
}
.au-c-dropdown__menu > .au-c-hr {
diff --git a/package-lock.json b/package-lock.json
index fd7d9cc55..f8f2c08bd 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1889,16 +1889,16 @@
}
},
"@floating-ui/core": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.0.1.tgz",
- "integrity": "sha512-bO37brCPfteXQfFY0DyNDGB3+IMe4j150KFQcgJ5aBP295p9nBGeHEs/p0czrRbtlHq4Px/yoPXO/+dOCcF4uA=="
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.1.0.tgz",
+ "integrity": "sha512-zbsLwtnHo84w1Kc8rScAo5GMk1GdecSlrflIbfnEBJwvTSj1SL6kkOYV+nHraMCPEy+RNZZUaZyL8JosDGCtGQ=="
},
"@floating-ui/dom": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.0.4.tgz",
- "integrity": "sha512-maYJRv+sAXTy4K9mzdv0JPyNW5YPVHrqtY90tEdI6XNpuLOP26Ci2pfwPsKBA/Wh4Z3FX5sUrtUFTdMYj9v+ug==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.1.0.tgz",
+ "integrity": "sha512-TSogMPVxbRe77QCj1dt8NmRiJasPvuc+eT5jnJ6YpLqgOD2zXc5UA3S1qwybN+GVCDNdKfpKy1oj8RpzLJvh6A==",
"requires": {
- "@floating-ui/core": "^1.0.1"
+ "@floating-ui/core": "^1.0.5"
}
},
"@gar/promisify": {
diff --git a/package.json b/package.json
index 9151e565c..f9fbaec9c 100644
--- a/package.json
+++ b/package.json
@@ -51,7 +51,7 @@
"dependencies": {
"@duetds/date-picker": "^1.4.0",
"@embroider/macros": "^1.9.0",
- "@floating-ui/dom": "^1.0.4",
+ "@floating-ui/dom": "^1.1.0",
"@glimmer/component": "^1.1.2",
"@glimmer/tracking": "^1.1.2",
"@zestia/ember-auto-focus": "^4.2.0",