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",