import {
ChangeDetectionStrategy,
Component,
ElementRef,
forwardRef,
inject,
ViewEncapsulation,
} from "@angular/core";
import { SdDropdown } from "./sd-dropdown";
import { SdResizeDirective } from "../../core/events/sd-resize";
@Component({
selector: "sd-dropdown-popup",
changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None,
standalone: true,
imports: [SdResizeDirective],
host: {
"(keydown)": "onKeydown($event)",
},
template: `
`,
styles: [
/* language=SCSS */ `
@use "../../../scss/commons/mixins";
@use "../../../scss/commons/variables";
sd-dropdown-popup {
position: fixed;
z-index: var(--z-index-dropdown);
opacity: 0;
transform: translateY(-0.625rem);
transition: 0.1s linear;
transition-property: transform, opacity;
pointer-events: none;
background: var(--control-color);
min-width: 7.5rem;
@include mixins.elevation(4);
overflow: hidden;
border-radius: var(--border-radius-default);
border: 1px solid var(--border-color-light);
> div {
width: 100%;
height: 100%;
overflow: auto;
white-space: nowrap;
}
&:focus {
outline: 1px solid var(--theme-primary-default);
}
@media all and (max-width: variables.$breakpoint-mobile) {
@include mixins.elevation(0);
border: 1px solid var(--border-color-default);
}
&[data-sd-mobile] {
position: fixed;
left: 0;
right: 0;
bottom: 0;
top: auto;
max-height: 80vh;
border-radius: var(--border-radius-default) var(--border-radius-default) 0 0;
opacity: 1;
pointer-events: auto;
transform: none;
animation: sd-dropdown-slide-up 0.2s ease-out;
@include mixins.elevation(8);
}
}
@keyframes sd-dropdown-slide-up {
from {
transform: translateY(100%);
}
to {
transform: translateY(0);
}
}
`,
],
})
export class SdDropdownPopup {
private readonly _parentControl = inject(
forwardRef(() => SdDropdown),
);
private readonly _elRef = inject(ElementRef);
private _capped = false;
onKeydown(event: KeyboardEvent): void {
this._parentControl.onPopupKeydown(event);
}
onResize(): void {
const el = this._elRef.nativeElement;
const divEl = el.firstElementChild as HTMLElement;
const shouldCap = divEl.scrollHeight > 300;
if (shouldCap === this._capped) return;
this._capped = shouldCap;
if (shouldCap) {
el.style.height = "300px";
} else {
el.style.removeProperty("height");
}
}
}