UNPKG

@taiga-ui/core

Version:

Core library for creating Angular components and applications using Taiga UI

69 lines 11.4 kB
import { Directive, inject, Input } from '@angular/core'; import { EMPTY_CLIENT_RECT } from '@taiga-ui/cdk/constants'; import { tuiAsPositionAccessor, TuiPositionAccessor } from '@taiga-ui/core/classes'; import { TUI_VIEWPORT } from '@taiga-ui/core/tokens'; import { TUI_DROPDOWN_OPTIONS } from './dropdown-options.directive'; import { TuiDropdownPosition } from './dropdown-position.directive'; import * as i0 from "@angular/core"; class TuiDropdownPositionSided extends TuiPositionAccessor { constructor() { super(...arguments); this.options = inject(TUI_DROPDOWN_OPTIONS); this.viewport = inject(TUI_VIEWPORT); this.vertical = inject(TuiDropdownPosition); this.previous = this.options.direction || 'bottom'; this.tuiDropdownSided = ''; this.tuiDropdownSidedOffset = 4; this.type = 'dropdown'; } getPosition(rect) { if (this.tuiDropdownSided === false) { return this.vertical.getPosition(rect); } const { height, width } = rect; const hostRect = this.vertical.accessor?.getClientRect() ?? EMPTY_CLIENT_RECT; const viewport = this.viewport.getClientRect(); const { direction, offset } = this.options; const adjusted = this.vertical.getAlign(this.options.align); const align = adjusted === 'center' ? 'left' : adjusted; const available = { top: hostRect.bottom - viewport.top, left: hostRect.left - offset - viewport.left, right: viewport.right - hostRect.right - offset, bottom: viewport.bottom - hostRect.top, }; const position = { top: hostRect.bottom - height + this.tuiDropdownSidedOffset + 1, left: hostRect.left - width - offset, right: hostRect.right + offset, bottom: hostRect.top - this.tuiDropdownSidedOffset - 1, // 1 for border }; const better = available.top > available.bottom ? 'top' : 'bottom'; const maxLeft = available.left > available.right ? position.left : position.right; const left = available[align] > width ? position[align] : maxLeft; if ((available[this.previous] > height && direction) || this.previous === better) { this.vertical.emitDirection(this.previous); return [position[this.previous], left]; } this.previous = better; this.vertical.emitDirection(better); return [position[better], left]; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiDropdownPositionSided, deps: null, target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiDropdownPositionSided, isStandalone: true, selector: "[tuiDropdownSided]", inputs: { tuiDropdownSided: "tuiDropdownSided", tuiDropdownSidedOffset: "tuiDropdownSidedOffset" }, providers: [TuiDropdownPosition, tuiAsPositionAccessor(TuiDropdownPositionSided)], usesInheritance: true, ngImport: i0 }); } } export { TuiDropdownPositionSided }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiDropdownPositionSided, decorators: [{ type: Directive, args: [{ standalone: true, selector: '[tuiDropdownSided]', providers: [TuiDropdownPosition, tuiAsPositionAccessor(TuiDropdownPositionSided)], }] }], propDecorators: { tuiDropdownSided: [{ type: Input }], tuiDropdownSidedOffset: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tcG9zaXRpb24tc2lkZWQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9kaXJlY3RpdmVzL2Ryb3Bkb3duL2Ryb3Bkb3duLXBvc2l0aW9uLXNpZGVkLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdkQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFDLHFCQUFxQixFQUFFLG1CQUFtQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDbEYsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR25ELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLCtCQUErQixDQUFDOztBQUVsRSxNQUthLHdCQUF5QixTQUFRLG1CQUFtQjtJQUxqRTs7UUFNcUIsWUFBTyxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3ZDLGFBQVEsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEMsYUFBUSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hELGFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsSUFBSSxRQUFRLENBQUM7UUFHL0MscUJBQWdCLEdBQXFCLEVBQUUsQ0FBQztRQUd4QywyQkFBc0IsR0FBRyxDQUFDLENBQUM7UUFFbEIsU0FBSSxHQUFHLFVBQVUsQ0FBQztLQTJDckM7SUF6Q1UsV0FBVyxDQUFDLElBQWE7UUFDNUIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssS0FBSyxFQUFFO1lBQ2pDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxX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QkFMcEMsU0FBUzttQkFBQztvQkFDUCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLG9CQUFvQjtvQkFDOUIsU0FBUyxFQUFFLENBQUMsbUJBQW1CLEVBQUUscUJBQXFCLDBCQUEwQixDQUFDO2lCQUNwRjs4QkFRVSxnQkFBZ0I7c0JBRHRCLEtBQUs7Z0JBSUMsc0JBQXNCO3NCQUQ1QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEaXJlY3RpdmUsIGluamVjdCwgSW5wdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtFTVBUWV9DTElFTlRfUkVDVH0gZnJvbSAnQHRhaWdhLXVpL2Nkay9jb25zdGFudHMnO1xuaW1wb3J0IHt0dWlBc1Bvc2l0aW9uQWNjZXNzb3IsIFR1aVBvc2l0aW9uQWNjZXNzb3J9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NsYXNzZXMnO1xuaW1wb3J0IHtUVUlfVklFV1BPUlR9IGZyb20gJ0B0YWlnYS11aS9jb3JlL3Rva2Vucyc7XG5pbXBvcnQge3R5cGUgVHVpUG9pbnR9IGZyb20gJ0B0YWlnYS11aS9jb3JlL3R5cGVzJztcblxuaW1wb3J0IHtUVUlfRFJPUERPV05fT1BUSU9OU30gZnJvbSAnLi9kcm9wZG93bi1vcHRpb25zLmRpcmVjdGl2ZSc7XG5pbXBvcnQge1R1aURyb3Bkb3duUG9zaXRpb259IGZyb20gJy4vZHJvcGRvd24tcG9zaXRpb24uZGlyZWN0aXZlJztcblxuQERpcmVjdGl2ZSh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ1t0dWlEcm9wZG93blNpZGVkXScsXG4gICAgcHJvdmlkZXJzOiBbVHVpRHJvcGRvd25Qb3NpdGlvbiwgdHVpQXNQb3NpdGlvbkFjY2Vzc29yKFR1aURyb3Bkb3duUG9zaXRpb25TaWRlZCldLFxufSlcbmV4cG9ydCBjbGFzcyBUdWlEcm9wZG93blBvc2l0aW9uU2lkZWQgZXh0ZW5kcyBUdWlQb3NpdGlvbkFjY2Vzc29yIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnMgPSBpbmplY3QoVFVJX0RST1BET1dOX09QVElPTlMpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdmlld3BvcnQgPSBpbmplY3QoVFVJX1ZJRVdQT1JUKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZlcnRpY2FsID0gaW5qZWN0KFR1aURyb3Bkb3duUG9zaXRpb24pO1xuICAgIHByaXZhdGUgcHJldmlvdXMgPSB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uIHx8ICdib3R0b20nO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdHVpRHJvcGRvd25TaWRlZDogYm9vbGVhbiB8IHN0cmluZyA9ICcnO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdHVpRHJvcGRvd25TaWRlZE9mZnNldCA9IDQ7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZSA9ICdkcm9wZG93bic7XG5cbiAgICBwdWJsaWMgZ2V0UG9zaXRpb24ocmVjdDogRE9NUmVjdCk6IFR1aVBvaW50IHtcbiAgICAgICAgaWYgKHRoaXMudHVpRHJvcGRvd25TaWRlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZlcnRpY2FsLmdldFBvc2l0aW9uKHJlY3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qge2hlaWdodCwgd2lkdGh9ID0gcmVjdDtcbiAgICAgICAgY29uc3QgaG9zdFJlY3QgPSB0aGlzLnZlcnRpY2FsLmFjY2Vzc29yPy5nZXRDbGllbnRSZWN0KCkgPz8gRU1QVFlfQ0xJRU5UX1JFQ1Q7XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0ID0gdGhpcy52aWV3cG9ydC5nZXRDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHtkaXJlY3Rpb24sIG9mZnNldH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGFkanVzdGVkID0gdGhpcy52ZXJ0aWNhbC5nZXRBbGlnbih0aGlzLm9wdGlvbnMuYWxpZ24pO1xuICAgICAgICBjb25zdCBhbGlnbiA9IGFkanVzdGVkID09PSAnY2VudGVyJyA/ICdsZWZ0JyA6IGFkanVzdGVkO1xuICAgICAgICBjb25zdCBhdmFpbGFibGUgPSB7XG4gICAgICAgICAgICB0b3A6IGhvc3RSZWN0LmJvdHRvbSAtIHZpZXdwb3J0LnRvcCxcbiAgICAgICAgICAgIGxlZnQ6IGhvc3RSZWN0LmxlZnQgLSBvZmZzZXQgLSB2aWV3cG9ydC5sZWZ0LFxuICAgICAgICAgICAgcmlnaHQ6IHZpZXdwb3J0LnJpZ2h0IC0gaG9zdFJlY3QucmlnaHQgLSBvZmZzZXQsXG4gICAgICAgICAgICBib3R0b206IHZpZXdwb3J0LmJvdHRvbSAtIGhvc3RSZWN0LnRvcCxcbiAgICAgICAgfSBhcyBjb25zdDtcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSB7XG4gICAgICAgICAgICB0b3A6IGhvc3RSZWN0LmJvdHRvbSAtIGhlaWdodCArIHRoaXMudHVpRHJvcGRvd25TaWRlZE9mZnNldCArIDEsIC8vIDEgZm9yIGJvcmRlclxuICAgICAgICAgICAgbGVmdDogaG9zdFJlY3QubGVmdCAtIHdpZHRoIC0gb2Zmc2V0LFxuICAgICAgICAgICAgcmlnaHQ6IGhvc3RSZWN0LnJpZ2h0ICsgb2Zmc2V0LFxuICAgICAgICAgICAgYm90dG9tOiBob3N0UmVjdC50b3AgLSB0aGlzLnR1aURyb3Bkb3duU2lkZWRPZmZzZXQgLSAxLCAvLyAxIGZvciBib3JkZXJcbiAgICAgICAgfSBhcyBjb25zdDtcbiAgICAgICAgY29uc3QgYmV0dGVyID0gYXZhaWxhYmxlLnRvcCA+IGF2YWlsYWJsZS5ib3R0b20gPyAndG9wJyA6ICdib3R0b20nO1xuICAgICAgICBjb25zdCBtYXhMZWZ0ID0gYXZhaWxhYmxlLmxlZnQgPiBhdmFpbGFibGUucmlnaHQgPyBwb3NpdGlvbi5sZWZ0IDogcG9zaXRpb24ucmlnaHQ7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBhdmFpbGFibGVbYWxpZ25dID4gd2lkdGggPyBwb3NpdGlvblthbGlnbl0gOiBtYXhMZWZ0O1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIChhdmFpbGFibGVbdGhpcy5wcmV2aW91c10gPiBoZWlnaHQgJiYgZGlyZWN0aW9uKSB8fFxuICAgICAgICAgICAgdGhpcy5wcmV2aW91cyA9PT0gYmV0dGVyXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy52ZXJ0aWNhbC5lbWl0RGlyZWN0aW9uKHRoaXMucHJldmlvdXMpO1xuXG4gICAgICAgICAgICByZXR1cm4gW3Bvc2l0aW9uW3RoaXMucHJldmlvdXNdLCBsZWZ0XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJldmlvdXMgPSBiZXR0ZXI7XG4gICAgICAgIHRoaXMudmVydGljYWwuZW1pdERpcmVjdGlvbihiZXR0ZXIpO1xuXG4gICAgICAgIHJldHVybiBbcG9zaXRpb25bYmV0dGVyXSwgbGVmdF07XG4gICAgfVxufVxuIl19