{"version":3,"file":"koobiq-components-tags.mjs","sources":["../../../packages/components/tags/tag-default-options.ts","../../../packages/components/tags/tag.component.ts","../../../packages/components/tags/tag-list.component.ts","../../../packages/components/tags/tag-input.ts","../../../packages/components/tags/tag.module.ts","../../../packages/components/tags/koobiq-components-tags.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { KbqTagSeparator } from './tag-input';\n\n/** Default options, for the chips module, that can be overridden. */\nexport interface KbqTagsDefaultOptions {\n    /** The list of key codes that will trigger a chipEnd event. */\n    separatorKeyCodes: number[];\n    separators?: { [key: number]: KbqTagSeparator };\n    addOnPaste?: boolean;\n}\n\n/** Injection token to be used to override the default options for the chips module. */\nexport const KBQ_TAGS_DEFAULT_OPTIONS = new InjectionToken<KbqTagsDefaultOptions>('kbq-tags-default-options');\n","import { FocusMonitor, FocusOrigin } from '@angular/cdk/a11y';\nimport { CdkDrag } from '@angular/cdk/drag-drop';\nimport { BACKSPACE, DELETE, ENTER, ESCAPE, F2, SPACE } from '@angular/cdk/keycodes';\nimport {\n    AfterContentInit,\n    AfterViewInit,\n    booleanAttribute,\n    ChangeDetectionStrategy,\n    ChangeDetectorRef,\n    Component,\n    ContentChild,\n    ContentChildren,\n    DestroyRef,\n    Directive,\n    ElementRef,\n    EventEmitter,\n    forwardRef,\n    inject,\n    Inject,\n    Input,\n    OnDestroy,\n    Output,\n    QueryList,\n    signal,\n    ViewChild,\n    ViewEncapsulation\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { IFocusableOption } from '@koobiq/cdk/a11y';\nimport { hasModifierKey } from '@koobiq/cdk/keycodes';\nimport {\n    isNull,\n    KBQ_TITLE_TEXT_REF,\n    KbqColorDirective,\n    KbqComponentColors,\n    KbqFieldSizingContent,\n    KbqTitleTextRef\n} from '@koobiq/components/core';\nimport { KbqIcon } from '@koobiq/components/icon';\nimport { Subject } from 'rxjs';\nimport { KbqTagList } from './tag-list.component';\n\n/**\n * Event object emitted by KbqTag.\n */\nexport type KbqTagEvent = {\n    tag: KbqTag;\n};\n\n/**\n * Event object emitted by KbqTag when the tag is edited.\n */\nexport class KbqTagEditChange {\n    constructor(\n        public readonly tag: KbqTag,\n        public readonly type: 'start' | 'submit' | 'cancel',\n        public readonly reason: string\n    ) {}\n}\n\n/** Event object emitted by KbqTag when selected or deselected. */\nexport class KbqTagSelectionChange {\n    constructor(\n        public source: KbqTag,\n        public selected: boolean,\n        public isUserInput = false\n    ) {}\n}\n\n/**\n * Event object emitted when the KbqTag is focused.\n */\nexport type KbqTagFocusEvent = KbqTagEvent & {\n    origin: FocusOrigin;\n};\n\nconst TAG_ATTRIBUTE_NAMES = ['kbq-basic-tag'];\n\nconst getTagEditInputMissingError = (): Error => {\n    return Error('Editable kbq-tag must contain a KbqTagEditInput.');\n};\n\n/**\n * Object passed to the drag data event when a tag is being dragged.\n *\n * @docs-private\n */\nexport type KbqTagDragData = KbqTagEvent;\n\n/**\n * Dummy directive to add CSS class to tag avatar.\n * @docs-private\n */\n@Directive({\n    selector: 'kbq-tag-avatar, [kbqTagAvatar]',\n    host: { class: 'kbq-tag-avatar' }\n})\nexport class KbqTagAvatar {}\n\n/**\n * Dummy directive to add CSS class to tag trailing icon.\n * @docs-private\n */\n@Directive({\n    selector: 'kbq-tag-trailing-icon, [kbqTagTrailingIcon]',\n    host: { class: 'kbq-tag-trailing-icon' }\n})\nexport class KbqTagTrailingIcon {}\n\n/**\n * Directive to add submit behavior for the editable tag.\n */\n@Directive({\n    selector: '[kbqTagEditSubmit]',\n    exportAs: 'kbqTagEditSubmit',\n    host: {\n        class: 'kbq-tag-edit-submit',\n        '[attr.tabindex]': '-1',\n\n        '(click)': 'tag.submitEditing(\"click\")'\n    }\n})\nexport class KbqTagEditSubmit {\n    /** @docs-private */\n    protected readonly tag = inject(KbqTag);\n}\n\n/**\n * Directive to add input behavior for the editable tag.\n */\n@Directive({\n    selector: '[kbqTagEditInput]',\n    exportAs: 'kbqTagEditInput',\n    host: {\n        class: 'kbq-tag-edit-input',\n\n        '(keydown)': 'handleKeydown($event)',\n        '(click)': 'handleClick($event)'\n    },\n    hostDirectives: [KbqFieldSizingContent]\n})\nexport class KbqTagEditInput {\n    private readonly tag = inject(KbqTag);\n\n    /** @docs-private */\n    protected handleClick(event: MouseEvent): void {\n        event.stopPropagation();\n    }\n\n    /** @docs-private */\n    protected handleKeydown(event: KeyboardEvent): void {\n        switch (event.keyCode) {\n            case ESCAPE: {\n                event.stopPropagation();\n                this.tag.cancelEditing('escape');\n                break;\n            }\n            case ENTER: {\n                event.stopPropagation();\n                this.tag.submitEditing('enter');\n                break;\n            }\n\n            // We should prevent KbqTag from receiving these keydown events\n            case BACKSPACE:\n            case SPACE:\n            case DELETE: {\n                event.stopPropagation();\n                break;\n            }\n\n            default:\n        }\n    }\n}\n\n@Component({\n    selector: 'kbq-tag, [kbq-tag], kbq-basic-tag, [kbq-basic-tag]',\n    template: `\n        <div class=\"kbq-tag__wrapper\">\n            <ng-content select=\"[kbq-icon]:not([kbqTagRemove]):not([kbqTagEditSubmit])\" />\n            <span #kbqTitleText class=\"kbq-tag__text\">\n                @if (editing()) {\n                    <ng-content select=\"[kbqTagEditInput]\" />\n                } @else {\n                    <ng-content />\n                }\n            </span>\n            @if (editing()) {\n                <ng-content select=\"[kbqTagEditSubmit]\" />\n            } @else {\n                @if (removable) {\n                    <ng-content select=\"[kbqTagRemove]\" />\n                }\n            }\n        </div>\n    `,\n    styleUrls: ['./tag.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    exportAs: 'kbqTag',\n    hostDirectives: [CdkDrag],\n    host: {\n        class: 'kbq-tag',\n        '[attr.tabindex]': 'tabindex',\n        '[attr.disabled]': 'disabled || null',\n        '[class.kbq-selected]': 'selected',\n        '[class.kbq-tag-with-avatar]': 'avatar',\n        '[class.kbq-tag-with-icon]': 'contentChildren',\n        '[class.kbq-tag-with-trailing-icon]': 'trailingIcon || removeIcon',\n        '[class.kbq-disabled]': 'disabled',\n        '[class.kbq-tag_editable]': 'editable',\n        '[class.kbq-tag_editing]': 'editing()',\n        '[class.kbq-tag_removable]': 'removable',\n        '[class.kbq-tag_selectable]': 'selectable',\n        '[class.kbq-tag_draggable]': 'draggable',\n        '(dblclick)': 'handleDblClick($event)',\n        '(click)': 'handleClick($event)',\n        '(keydown)': 'handleKeydown($event)'\n    },\n    providers: [{ provide: KBQ_TITLE_TEXT_REF, useExisting: KbqTag }]\n})\nexport class KbqTag\n    extends KbqColorDirective\n    implements IFocusableOption, OnDestroy, KbqTitleTextRef, AfterContentInit, AfterViewInit\n{\n    private readonly focusMonitor = inject(FocusMonitor);\n    private readonly tagList = inject(KbqTagList, { optional: true });\n    private readonly drag: CdkDrag<KbqTagDragData> = inject(CdkDrag, { host: true });\n    private readonly destroyRef = inject(DestroyRef);\n\n    /** @docs-private */\n    readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n    /**\n     * Emits when the tag is focused.\n     *\n     * @docs-private\n     */\n    readonly onFocus = new Subject<KbqTagFocusEvent>();\n\n    /**\n     * Emits when the tag is blurred.\n     *\n     * @docs-private\n     */\n    readonly onBlur = new Subject<KbqTagEvent>();\n\n    /** @docs-private */\n    readonly nativeElement = this.elementRef.nativeElement;\n\n    /**\n     * Whether the tag has focus.\n     *\n     * @docs-private\n     */\n    hasFocus: boolean = false;\n\n    /** Whether the tag is editable. */\n    @Input({ transform: booleanAttribute })\n    get editable(): boolean {\n        return this._editable ?? !!this.tagList?.editable;\n    }\n\n    set editable(value: boolean) {\n        this._editable = value;\n    }\n\n    private _editable: boolean | undefined;\n\n    /** Whether the tag edits can't be submitted. */\n    @Input({ transform: booleanAttribute }) preventEditSubmit: boolean = false;\n\n    @ContentChild(KbqTagEditInput, { read: ElementRef })\n    private readonly editInputElementRef: ElementRef<HTMLInputElement>;\n\n    /**\n     * Emits event when the tag is edited.\n     */\n    @Output() readonly editChange = new EventEmitter<KbqTagEditChange>();\n\n    /**\n     * @docs-private\n     */\n    protected readonly editing = signal(false);\n\n    /**\n     * @docs-private\n     */\n    @ViewChild('kbqTitleText') readonly textElement: ElementRef<HTMLSpanElement>;\n\n    @ContentChildren(KbqIcon) contentChildren: QueryList<KbqIcon>;\n\n    /** The tag avatar */\n    @ContentChild(KbqTagAvatar, { static: false }) avatar: KbqTagAvatar;\n\n    /** The tag's trailing icon. */\n    @ContentChild(KbqTagTrailingIcon, { static: false }) trailingIcon: KbqTagTrailingIcon;\n\n    /** The tag's remove toggler. */\n    @ContentChild(forwardRef(() => KbqTagRemove), { static: false }) removeIcon: KbqTagRemove;\n\n    /** Emitted when the tag is selected or deselected. */\n    @Output() readonly selectionChange: EventEmitter<KbqTagSelectionChange> = new EventEmitter<KbqTagSelectionChange>();\n\n    /** Emitted when the tag is destroyed and leaving the DOM. */\n    @Output() readonly destroyed: EventEmitter<KbqTagEvent> = new EventEmitter<KbqTagEvent>();\n\n    /**\n     * Emitted when a tag is to be removed.\n     * Fires on programmatic and UI removal (click or keyboard).\n     */\n    @Output() readonly removed: EventEmitter<KbqTagEvent> = new EventEmitter<KbqTagEvent>();\n\n    /** Whether the tag is selected. */\n    @Input({ transform: booleanAttribute })\n    get selected(): boolean {\n        return this._selected;\n    }\n\n    set selected(value: boolean) {\n        this.setSelectedState(value, { emitEvent: true });\n    }\n\n    private _selected: boolean = false;\n\n    /** The value of the tag. Defaults to the content inside `<kbq-tag>` tags. */\n    @Input()\n    get value(): any {\n        return this._value ?? this.elementRef.nativeElement.textContent?.trim();\n    }\n\n    set value(value: any) {\n        this._value = value;\n    }\n\n    private _value: any;\n\n    /**\n     * Whether the tag is selectable.\n     */\n    @Input({ transform: booleanAttribute })\n    get selectable(): boolean {\n        return this._selectable || !!this.tagList?.selectable;\n    }\n\n    set selectable(value: boolean) {\n        this._selectable = value;\n    }\n\n    private _selectable: boolean = false;\n\n    /**\n     * Determines whether the tag is removable.\n     */\n    @Input({ transform: booleanAttribute })\n    get removable(): boolean {\n        return this._removable && (this.tagList?.removable ?? true);\n    }\n\n    set removable(value: boolean) {\n        this._removable = value;\n    }\n\n    private _removable: boolean = true;\n\n    @Input()\n    get tabindex() {\n        if (this.disabled) return null;\n        if (this._tabindex === -1 && this.selectable && !this.tagList) return 0;\n\n        return this._tabindex;\n    }\n\n    set tabindex(value: any) {\n        this._tabindex = value;\n    }\n\n    private _tabindex = -1;\n\n    /**\n     * Whether the tag is disabled.\n     */\n    @Input({ transform: booleanAttribute })\n    get disabled(): boolean {\n        return this._disabled || (this.tagList?.disabled ?? false);\n    }\n\n    set disabled(value: boolean) {\n        this._disabled = value;\n        this.syncDragDisabledState();\n    }\n\n    private _disabled: boolean = false;\n\n    /**\n     * Whether the tag is draggable.\n     *\n     * @docs-private\n     */\n    protected get draggable(): boolean {\n        return (this.tagList?.draggable ?? false) && !this.disabled;\n    }\n\n    constructor(public changeDetectorRef: ChangeDetectorRef) {\n        super();\n\n        this.color = KbqComponentColors.ContrastFade;\n        this.setDefaultColor(KbqComponentColors.ContrastFade);\n\n        this.addHostClassName();\n        this.setupDragInitialProperties();\n    }\n\n    ngAfterContentInit() {\n        this.addClassModificatorForIcons();\n    }\n\n    ngAfterViewInit(): void {\n        this.setupFocusMonitor();\n    }\n\n    ngOnDestroy(): void {\n        this.cancelEditing('destroy');\n        this.focusMonitor.stopMonitoring(this.elementRef);\n        this.destroyed.emit({ tag: this });\n    }\n\n    /** @docs-private */\n    addClassModificatorForIcons() {\n        const icons = this.contentChildren.map((item) => item.elementRef.nativeElement);\n\n        if (icons.length === 1) {\n            const iconElement = icons[0];\n\n            if (iconElement.classList.contains('kbq-tag-remove')) {\n                iconElement.classList.add('kbq-icon_right');\n                this.nativeElement.classList.add('kbq-right-icon');\n            } else {\n                iconElement.classList.add('kbq-icon_left');\n                this.nativeElement.classList.add('kbq-left-icon');\n            }\n        } else if (icons.length > 1) {\n            const firstIconElement = icons[0];\n            const secondIconElement = icons[1];\n\n            firstIconElement.classList.add('kbq-icon_left');\n            secondIconElement.classList.add('kbq-icon_right');\n        }\n    }\n\n    /** @docs-private */\n    addHostClassName() {\n        // Add class for the different tags\n        for (const attr of TAG_ATTRIBUTE_NAMES) {\n            if (\n                this.elementRef.nativeElement.hasAttribute(attr) ||\n                this.elementRef.nativeElement.tagName.toLowerCase() === attr\n            ) {\n                (this.elementRef.nativeElement as HTMLElement).classList.add(attr);\n\n                return;\n            }\n        }\n\n        (this.elementRef.nativeElement as HTMLElement).classList.add('kbq-standard-tag');\n    }\n\n    /**\n     * Selects the tag.\n     */\n    select(): void {\n        if (this.disabled || !this.selectable) return;\n\n        this.setSelectedState(true, { emitEvent: true });\n    }\n\n    /**\n     * Deselects the tag.\n     */\n    deselect(): void {\n        if (this.disabled || !this.selectable) return;\n\n        this.setSelectedState(false, { emitEvent: true });\n    }\n\n    /**\n     * Selects the tag and emits event with isUserInput flag.\n     *\n     * @docs-private\n     */\n    selectViaInteraction(): void {\n        if (this.disabled || !this.selectable) return;\n\n        this.setSelectedState(true, { isUserInput: true, emitEvent: true });\n    }\n\n    /**\n     * Toggles the current selected state of the tag.\n     */\n    toggleSelected(isUserInput: boolean = false): boolean {\n        if (this.disabled || !this.selectable) return this.selected;\n\n        this.setSelectedState(!this.selected, { isUserInput, emitEvent: true });\n\n        return this.selected;\n    }\n\n    /** Focuses the tag. */\n    focus(): void {\n        if (this.disabled) return;\n\n        this.elementRef.nativeElement.focus();\n    }\n\n    /**\n     * Allows for programmatic removal of the tag. Called by the KbqTagList when the DELETE or\n     * BACKSPACE keys are pressed.\n     *\n     * Informs any listeners of the removal request. Does not remove the tag from the DOM.\n     */\n    remove(): void {\n        if (this.removable) {\n            this.removed.emit({ tag: this });\n        }\n    }\n\n    /** @docs-private */\n    handleClick(event: MouseEvent): void {\n        if (this.disabled || this.editing()) {\n            event.preventDefault();\n\n            return;\n        }\n\n        if (\n            // We should toggle selection only if tag inside of a tag list.\n            // Single tag can only be toggled on focus or blur.\n            this.tagList &&\n            this.selectable &&\n            hasModifierKey(event, 'metaKey', 'ctrlKey', 'shiftKey')\n        ) {\n            this.toggleSelected(true);\n\n            // We should stop event propagation to prevent the tag list from handling the click event.\n            event.stopPropagation();\n\n            return;\n        }\n\n        if (!this.tagList && this.selectable) {\n            this.toggleSelected(true);\n        }\n    }\n\n    /** @docs-private */\n    handleKeydown(event: KeyboardEvent): void {\n        if (this.disabled || this.editing()) return;\n\n        switch (event.keyCode) {\n            case DELETE:\n            case BACKSPACE: {\n                // If there is a tag list and it has selected tags, remove them, otherwise remove focused tag.\n                this.tagList?.selected.length ? this.tagList.removeSelected() : this.remove();\n\n                // Always prevent so page navigation does not occur\n                event.preventDefault();\n                break;\n            }\n            case SPACE: {\n                this.toggleSelected(true);\n                this.focusMonitor.focusVia(this.elementRef, 'keyboard');\n\n                // Always prevent space from scrolling the page since the list has focus\n                event.preventDefault();\n                break;\n            }\n            case F2:\n            case ENTER:\n                this.startEditing(event.key);\n                break;\n            default:\n        }\n    }\n\n    /** @docs-private */\n    blur(): void {\n        this.elementRef.nativeElement.blur();\n    }\n\n    /** @docs-private */\n    protected handleDblClick(event: MouseEvent): void {\n        if (this.disabled || !this.editable) return;\n\n        event.stopPropagation();\n        this.startEditing('dblclick');\n    }\n\n    private startEditing(reason: string): void {\n        if (!this.editable || this.editing()) return;\n\n        this.editing.set(true);\n        this.editChange.emit({ tag: this, type: 'start', reason });\n\n        setTimeout(() => {\n            const input = this.editInputElementRef?.nativeElement;\n\n            if (!input) throw getTagEditInputMissingError();\n\n            this.focusMonitor.focusVia(this.elementRef.nativeElement, 'keyboard');\n            input.select();\n        });\n    }\n\n    /** @docs-private */\n    cancelEditing(reason: string): void {\n        if (!this.editing()) return;\n\n        this.editing.set(false);\n        this.editChange.emit({ tag: this, type: 'cancel', reason });\n\n        this.textElement.nativeElement.scrollTo?.({ left: 0, behavior: 'instant' });\n    }\n\n    /** @docs-private */\n    submitEditing(reason: string): void {\n        if (!this.editing() || this.preventEditSubmit) return;\n\n        this.editing.set(false);\n        this.editChange.emit({ tag: this, type: 'submit', reason });\n\n        this.textElement.nativeElement.scrollTo?.({ left: 0, behavior: 'instant' });\n    }\n\n    /**\n     * Sets the selected state of the tag.\n     *\n     * @docs-private\n     */\n    setSelectedState(selected: boolean, options: Partial<{ isUserInput: boolean; emitEvent: boolean }> = {}): void {\n        const { isUserInput = false, emitEvent = false } = options;\n\n        if (selected !== this.selected) {\n            this._selected = selected;\n\n            if (emitEvent) {\n                this.selectionChange.emit({\n                    source: this,\n                    isUserInput,\n                    selected: this.selected\n                });\n            }\n\n            this.changeDetectorRef.markForCheck();\n        }\n    }\n\n    private setupDragInitialProperties(): void {\n        this.syncDragDisabledState();\n\n        this.drag.started.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n            this.drag.data = { tag: this };\n        });\n    }\n\n    private syncDragDisabledState(): void {\n        this.drag.disabled = !this.draggable;\n    }\n\n    private setupFocusMonitor(): void {\n        this.focusMonitor.monitor(this.elementRef, true).subscribe((origin) => {\n            if (this.disabled) return;\n\n            const hasFocus = !isNull(origin);\n\n            if (hasFocus !== this.hasFocus) {\n                this.hasFocus = hasFocus;\n\n                if (this.hasFocus) {\n                    this.onFocus.next({ tag: this, origin });\n                    if (!this.tagList && origin !== 'mouse') this.select();\n                } else {\n                    this.onBlur.next({ tag: this });\n                    this.cancelEditing('blur');\n                    if (!this.tagList) this.deselect();\n                }\n\n                this.changeDetectorRef.markForCheck();\n            }\n        });\n    }\n}\n\n/**\n *\n * Example:\n *\n *     `<kbq-tag>\n *       <kbq-icon kbqTagRemove>cancel</kbq-icon>\n *     </kbq-tag>`\n *\n * You *may* use a custom icon, but you may need to override the `kbq-tag-remove` positioning\n * styles to properly center the icon within the tag.\n */\n@Directive({\n    selector: '[kbqTagRemove]',\n    host: {\n        class: 'kbq-tag-remove kbq-tag-trailing-icon',\n        '[attr.tabindex]': '-1',\n        '(click)': 'handleClick($event)',\n        '(focus)': 'focus($event)'\n    }\n})\nexport class KbqTagRemove {\n    constructor(@Inject(forwardRef(() => KbqTag)) protected parentTag: KbqTag) {}\n\n    /** @docs-private */\n    focus(event: FocusEvent): void {\n        event.stopPropagation();\n    }\n\n    /**\n     * Calls the parent tag's public `remove()` method if applicable.\n     *\n     * @docs-private\n     */\n    handleClick(event: Event): void {\n        if (this.parentTag.removable) {\n            this.parentTag.hasFocus = true;\n\n            this.parentTag.remove();\n        }\n\n        // We need to stop event propagation because otherwise the event will bubble up to the\n        // form field and cause the `onContainerClick` method to be invoked. This method would then\n        // reset the focused tag that has been focused after tag removal. Usually the parent\n        // the parent click listener of the `KbqTag` would prevent propagation, but it can happen\n        // that the tag is being removed before the event bubbles up.\n        event.stopPropagation();\n    }\n}\n","import { FocusMonitor } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport { CdkDragDrop, CdkDropList } from '@angular/cdk/drag-drop';\nimport { BACKSPACE, END, HOME, LEFT_ARROW, TAB } from '@angular/cdk/keycodes';\nimport {\n    AfterContentInit,\n    AfterViewInit,\n    booleanAttribute,\n    ChangeDetectionStrategy,\n    ChangeDetectorRef,\n    Component,\n    ContentChild,\n    ContentChildren,\n    DestroyRef,\n    DoCheck,\n    ElementRef,\n    EventEmitter,\n    forwardRef,\n    inject,\n    Input,\n    OnDestroy,\n    Optional,\n    Output,\n    QueryList,\n    Self,\n    ViewEncapsulation\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ControlValueAccessor, FormGroupDirective, NgControl, NgForm, UntypedFormControl } from '@angular/forms';\nimport { FocusKeyManager } from '@koobiq/cdk/a11y';\nimport { isSelectAll } from '@koobiq/cdk/keycodes';\nimport {\n    CanUpdateErrorState,\n    ErrorStateMatcher,\n    isNull,\n    KBQ_VALIDATION,\n    KbqOrientation\n} from '@koobiq/components/core';\nimport { KbqCleaner, KbqFormFieldControl } from '@koobiq/components/form-field';\nimport { merge, Observable, Subject } from 'rxjs';\nimport { filter, startWith, takeUntil } from 'rxjs/operators';\nimport { KbqTagTextControl } from './tag-text-control';\nimport {\n    KbqTag,\n    KbqTagDragData,\n    KbqTagEditChange,\n    KbqTagEvent,\n    KbqTagFocusEvent,\n    KbqTagSelectionChange\n} from './tag.component';\n\n// Increasing integer for generating unique ids for tag-list components.\nlet nextUniqueId = 0;\n\n/** Change event object that is emitted when the tag list value has changed. */\nexport class KbqTagListChange {\n    constructor(\n        public source: KbqTagList,\n        public value: any\n    ) {}\n}\n\nexport type KbqTagListDroppedEvent = Pick<CdkDragDrop<unknown>, 'event' | 'previousIndex' | 'currentIndex'> & {\n    tag: KbqTag;\n};\n\n@Component({\n    selector: 'kbq-tag-list',\n    exportAs: 'kbqTagList',\n    template: `\n        <div class=\"kbq-tags-list__list-container\">\n            <ng-content />\n        </div>\n\n        @if (canShowCleaner) {\n            <div class=\"kbq-tags-list__cleaner\">\n                <ng-content select=\"kbq-cleaner\" />\n            </div>\n        }\n    `,\n    styleUrls: ['tag-list.scss', 'tag-tokens.scss'],\n    host: {\n        class: 'kbq-tag-list',\n        '[class.kbq-disabled]': 'disabled',\n        '[class.kbq-invalid]': 'errorState',\n        '[class.kbq-tag-list_selectable]': 'selectable',\n        '[class.kbq-tag-list_editable]': 'editable',\n        '[class.kbq-tag-list_removable]': 'removable',\n        '[class.kbq-tag-list_draggable]': 'draggable',\n        '[attr.tabindex]': 'tabIndex',\n        '[id]': 'uid',\n        '(focus)': 'focus()',\n        '(blur)': 'blur()',\n        '(keydown)': 'keydown($event)'\n    },\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [{ provide: KbqFormFieldControl, useExisting: KbqTagList }],\n    hostDirectives: [CdkDropList]\n})\nexport class KbqTagList\n    implements\n        KbqFormFieldControl<any>,\n        ControlValueAccessor,\n        AfterContentInit,\n        DoCheck,\n        OnDestroy,\n        CanUpdateErrorState,\n        AfterViewInit\n{\n    private readonly useLegacyValidation = inject(KBQ_VALIDATION, { optional: true })?.useValidation ?? false;\n    private readonly dropList = inject(CdkDropList, { host: true });\n    private readonly destroyRef = inject(DestroyRef);\n    private readonly focusMonitor = inject(FocusMonitor);\n\n    /**\n     * Implemented as part of KbqFormFieldControl.\n     *\n     * @docs-private\n     */\n    readonly controlType: string = 'tag-list';\n\n    /**\n     * Emits whenever the component state changes and should cause the parent\n     * form-field to update. Implemented as part of `KbqFormFieldControl`.\n     * @docs-private\n     */\n    readonly stateChanges = new Subject<void>();\n\n    /**\n     * Combined stream of all of the child tags' selection change events.\n     *\n     * @docs-private\n     */\n    get tagSelectionChanges(): Observable<KbqTagSelectionChange> {\n        return merge(...this.tags.map((tag) => tag.selectionChange));\n    }\n\n    /**\n     * Combined stream of all of the child tags' focus change events.\n     *\n     * @docs-private\n     */\n    get tagFocusChanges(): Observable<KbqTagFocusEvent> {\n        return merge(...this.tags.map((tag) => tag.onFocus));\n    }\n\n    /**\n     * Combined stream of all of the child tags' blur change events.\n     *\n     * @docs-private\n     */\n    get tagBlurChanges(): Observable<KbqTagEvent> {\n        return merge(...this.tags.map((tag) => tag.onBlur));\n    }\n\n    /**\n     * Combined stream of all of the child tags' destroyed events.\n     *\n     * @docs-private\n     */\n    get tagRemoveChanges(): Observable<KbqTagEvent> {\n        return merge(...this.tags.map((tag) => tag.destroyed));\n    }\n\n    /**\n     * Combined stream of all of the child tags' removal request events.\n     *\n     * @docs-private\n     */\n    protected get tagBeforeRemoveChanges(): Observable<KbqTagEvent> {\n        return merge(...this.tags.map((tag) => tag.removed));\n    }\n\n    /**\n     * Combined stream of all of the child tags' edit change events.\n     *\n     * @docs-private\n     */\n    get tagEditChanges(): Observable<KbqTagEditChange> {\n        return merge(...this.tags.map((tag) => tag.editChange));\n    }\n\n    /**\n     * The array of selected tags inside tag list.\n     *\n     * @docs-private\n     */\n    get selected(): KbqTag[] {\n        return this.tags.filter(({ selected }) => selected);\n    }\n\n    /** @docs-private */\n    get canShowCleaner(): boolean {\n        return this.cleaner && this.tags.length > 0;\n    }\n\n    /**\n     * @deprecated Unused. Will be removed in next major release.\n     *\n     * @docs-private\n     */\n    @Input({ transform: booleanAttribute }) multiple: boolean = false;\n\n    /**\n     * A function to compare the option values with the selected values. The first argument\n     * is a value from an option. The second is a value from the selection. A boolean\n     * should be returned.\n     *\n     * @deprecated Unused. Will be removed in next major release.\n     */\n    @Input() compareWith = (o1: any, o2: any) => o1 === o2;\n\n    /**\n     * Implemented as part of KbqFormFieldControl.\n     * @docs-private\n     */\n    @Input()\n    get value(): any {\n        return this._value;\n    }\n\n    set value(value: any) {\n        this._value = value;\n    }\n\n    private _value: any;\n\n    /**\n     * Implemented as part of KbqFormFieldControl.\n     * @docs-private\n     */\n    get id(): string {\n        return this.tagInput ? this.tagInput.id : this.uid;\n    }\n\n    /**\n     * Implemented as part of KbqFormFieldControl.\n     * @docs-private\n     */\n    @Input()\n    get required(): boolean {\n        return this._required;\n    }\n\n    set required(value: boolean) {\n        this._required = coerceBooleanProperty(value);\n\n        this.stateChanges.next();\n    }\n\n    private _required: boolean = false;\n\n    /**\n     * Implemented as part of KbqFormFieldControl.\n     * @docs-private\n     */\n    @Input()\n    get placeholder(): string {\n        return this.tagInput ? this.tagInput.placeholder : this._placeholder;\n    }\n\n    set placeholder(value: string) {\n        this._placeholder = value;\n        this.stateChanges.next();\n    }\n\n    private _placeholder: string;\n\n    /** Whether any tags or the kbqTagInput inside of this tag-list has focus. */\n    get focused(): boolean {\n        return (this.tagInput && this.tagInput.focused) || this.hasFocusedTag();\n    }\n\n    /**\n     * Implemented as part of KbqFormFieldControl.\n     * @docs-private\n     */\n    get empty(): boolean {\n        return (!this.tagInput || this.tagInput.empty) && this.tags.length === 0;\n    }\n\n    /**\n     * Implemented as part of KbqFormFieldControl.\n     * @docs-private\n     */\n    get shouldLabelFloat(): boolean {\n        return !this.empty || this.focused;\n    }\n\n    /**\n     * Implemented as part of KbqFormFieldControl.\n     * @docs-private\n     */\n    @Input({ transform: booleanAttribute })\n    get disabled(): boolean {\n        return this.ngControl ? !!this.ngControl.disabled : this._disabled;\n    }\n\n    set disabled(value: boolean) {\n        this._disabled = value;\n        this.syncDropListDisabledState();\n    }\n\n    private _disabled: boolean = false;\n\n    @Input({ transform: booleanAttribute })\n    get draggable(): boolean {\n        return this._draggable && !this.disabled;\n    }\n\n    set draggable(value: boolean) {\n        this._draggable = value;\n        this.syncDropListDisabledState();\n    }\n\n    private _draggable: boolean = false;\n\n    /**\n     * Emits when the user drops tag inside tag list container.\n     */\n    @Output() readonly dropped = new EventEmitter<KbqTagListDroppedEvent>();\n\n    /**\n     * Whether or not this tag list is selectable. When a tag list is not selectable,\n     * the selected states for all the tags inside the tag list are always ignored.\n     */\n    @Input({ transform: booleanAttribute }) selectable = true;\n\n    /** Whether the tags in the list are editable. */\n    @Input({ transform: booleanAttribute }) editable = false;\n\n    /**\n     * Whether to emit change events when tags are added/removed.\n     *\n     * @deprecated No longer needed. Will be removed in the next major release.\n     */\n    @Input({ transform: booleanAttribute }) emitOnTagChanges = true;\n\n    /** Whether the tags in the list are removable. */\n    @Input({ transform: booleanAttribute })\n    get removable(): boolean {\n        return this._removable;\n    }\n\n    set removable(value: boolean) {\n        this._removable = value;\n        this.syncTagsRemovableState();\n    }\n\n    private _removable = true;\n\n    /**\n     * Tab index of the tag list. This property is ignored when the tag list contains a tag input or is disabled.\n     *\n     * @docs-private\n     */\n    @Input()\n    get tabIndex(): number | null {\n        return this.disabled || this.tagInput ? null : this._tabIndex;\n    }\n\n    set tabIndex(value: number) {\n        this.userTabIndex = value;\n        this._tabIndex = value;\n    }\n\n    private _tabIndex = 0;\n\n    /**\n     * Event that emits whenever the raw value of the tag-list changes. This is here primarily\n     * to facilitate the two-way binding for the `value` input.\n     * @docs-private\n     */\n    @Output() readonly valueChange: EventEmitter<any> = new EventEmitter<any>();\n\n    /** @docs-private */\n    uid: string = `kbq-tag-list-${nextUniqueId++}`;\n\n    /**\n     * User defined tab index.\n     * When it is not null, use user defined tab index. Otherwise use tabIndex\n     *\n     * @docs-private\n     */\n    userTabIndex: number | null = null;\n\n    /** @docs-private */\n    keyManager: FocusKeyManager<KbqTag>;\n\n    /**\n     * @docs-private\n     *\n     * @deprecated Unused. Will be removed in next major release.\n     */\n    selectionModel: SelectionModel<KbqTag>;\n\n    /**\n     * @docs-private\n     *\n     * @deprecated Unused. Will be removed in next major release.\n     */\n    tagChanges = new EventEmitter<any>();\n\n    /** An object used to control when error messages are shown. */\n    @Input() errorStateMatcher: ErrorStateMatcher;\n\n    /**\n     * Orientation of the tag list.\n     *\n     * @deprecated Unused. Will be removed in next major release.\n     */\n    @Input() orientation: KbqOrientation = 'horizontal';\n\n    /** Event emitted when the selected tag list value has been changed by the user. */\n    @Output() readonly change: EventEmitter<KbqTagListChange> = new EventEmitter<KbqTagListChange>();\n\n    /** @docs-private */\n    @ContentChild('kbqTagListCleaner', { static: true }) cleaner: KbqCleaner;\n\n    /**\n     * The tag components contained within this tag list.\n     *\n     * @docs-private\n     */\n    @ContentChildren(forwardRef(() => KbqTag), {\n        // Need to use `descendants: true`,\n        // Ivy will no longer match indirect descendants if it's left as false.\n        descendants: true\n    })\n    tags: QueryList<KbqTag>;\n\n    /**\n     * Whether the component is in an error state.\n     *\n     * @docs-private\n     */\n    errorState: boolean = false;\n\n    /** The tag input to add more tags */\n    private tagInput: KbqTagTextControl;\n\n    /** True when the next `tags.changes` emission is triggered by a UI action, not programmatic update. */\n    private pendingUIChange = false;\n\n    /**\n     * When a tag is destroyed, we store the index of the destroyed tag until the tags\n     * query list notifies about the update. This is necessary because we cannot determine an\n     * appropriate tag that should receive focus until the array of tags updated completely.\n     */\n    private lastDestroyedTagIndex: number | null = null;\n\n    /** Triggers unsubscription from all per-tags streams when tags are reset. */\n    private readonly tagsSubscriptions$ = new Subject<void>();\n\n    constructor(\n        protected elementRef: ElementRef<HTMLElement>,\n        private changeDetectorRef: ChangeDetectorRef,\n        public defaultErrorStateMatcher: ErrorStateMatcher,\n        @Optional() private dir: Directionality,\n        @Optional() public parentForm: NgForm,\n        @Optional() public parentFormGroup: FormGroupDirective,\n        @Optional() @Self() public ngControl: NgControl\n    ) {\n        if (this.ngControl) {\n            this.ngControl.valueAccessor = this;\n        }\n\n        this.setupDropListInitialProperties();\n    }\n\n    ngDoCheck() {\n        if (this.ngControl) {\n            // We need to re-evaluate this on every change detection cycle, because there are some\n            // error triggers that we can't subscribe to (e.g. parent form submissions). This means\n            // that whatever logic is in here has to be super lean or we risk destroying the performance.\n            this.updateErrorState();\n        }\n    }\n\n    ngAfterContentInit() {\n        this.keyManager = new FocusKeyManager<KbqTag>(this.tags)\n            .withVerticalOrientation()\n            .withHorizontalOrientation(this.dir ? this.dir.value : 'ltr')\n            .skipPredicate(({ disabled }) => disabled);\n\n        if (this.dir) {\n            this.dir.change\n                .pipe(takeUntilDestroyed(this.destroyRef))\n                .subscribe((dir) => this.keyManager.withHorizontalOrientation(dir));\n        }\n\n        // Prevents the tag list from capturing focus and redirecting\n        // it back to the first tag when the user tabs out.\n        this.keyManager.tabOut.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n            this._tabIndex = -1;\n\n            setTimeout(() => {\n                this._tabIndex = this.userTabIndex || 0;\n                this.changeDetectorRef.markForCheck();\n            });\n        });\n\n        // When the list changes, re-subscribe\n        this.tags.changes\n            .pipe(startWith(null), takeUntilDestroyed(this.destroyRef))\n            .subscribe((currentTags: QueryList<KbqTag> | null) => {\n                this.resetTags();\n\n                // Check to see if we need to update our tab index\n                this.updateTabIndex();\n\n                // Check to see if we have a destroyed tag and need to refocus\n                this.updateFocusForDestroyedTags();\n\n                // Defer setting the value in order to avoid the \"Expression\n                // has changed after it was checked\" errors from Angular.\n                Promise.resolve().then(() => {\n                    this.stateChanges.next();\n\n                    if (currentTags && this.pendingUIChange) {\n                        this.pendingUIChange = false;\n                        this.propagateTagsChanges();\n                    }\n                });\n            });\n    }\n\n    ngAfterViewInit(): void {\n        this.setupFocusMonitor();\n    }\n\n    ngOnDestroy() {\n        this.stateChanges.complete();\n        this.focusMonitor.stopMonitoring(this.elementRef);\n        this.tagsSubscriptions$.next();\n    }\n\n    /** @docs-private */\n    updateErrorState() {\n        const oldState = this.errorState;\n        const parent = this.parentFormGroup || this.parentForm;\n        const matcher = this.errorStateMatcher || this.defaultErrorStateMatcher;\n        const control = this.ngControl ? (this.ngControl.control as UntypedFormControl) : null;\n        const newState = matcher.isErrorState(control, parent);\n\n        if (newState !== oldState) {\n            this.errorState = newState;\n            this.stateChanges.next();\n        }\n    }\n\n    /** @docs-private */\n    onTouched = () => {};\n\n    /** @docs-private */\n    onChange: (value: any) => void = () => {};\n\n    /** Notifies that the next `tags.changes` emission is UI-initiated. */\n    notifyPendingTagChange(): void {\n        this.pendingUIChange = true;\n    }\n\n    /**\n     * Associates an HTML input element with this tag list.\n     *\n     * @docs-private\n     */\n    registerInput(inputElement: KbqTagTextControl): void {\n        this.tagInput = inputElement;\n\n        // todo need rethink about it (#DS-3740)\n        if (this.ngControl && inputElement.ngControl?.statusChanges) {\n            inputElement.ngControl.statusChanges.subscribe(() =>\n                this.ngControl.control!.setErrors(inputElement.ngControl!.errors)\n            );\n        }\n    }\n\n    /**\n     * Implemented as part of ControlValueAccessor.\n     */\n    writeValue(value: any): void {\n        this.value = value;\n    }\n\n    /**\n     * Implemented as part of ControlValueAccessor.\n     */\n    registerOnChange(fn: (value: any) => void): void {\n        this.onChange = fn;\n    }\n\n    /**\n     * Implemented as part of ControlValueAccessor.\n     */\n    registerOnTouched(fn: () => void): void {\n        this.onTouched = fn;\n    }\n\n    /**\n     * Implemented as part of ControlValueAccessor.\n     */\n    setDisabledState(isDisabled: boolean): void {\n        this.disabled = isDisabled;\n        this.stateChanges.next();\n    }\n\n    /**\n     * Implemented as part of KbqFormFieldControl.\n     *\n     * @docs-private\n     */\n    onContainerClick(): void {\n        this.focus();\n    }\n\n    /**\n     * Focuses the tag list. If there is a tag input, focuses that instead.\n     */\n    focus(): void {\n        if (this.disabled) return;\n\n        if (this.tagInput) {\n            this.focusInput();\n            this.stateChanges.next();\n\n            return;\n        }\n\n        if (this.tags.length > 0) {\n            this.keyManager.setFirstItemActive();\n            this.stateChanges.next();\n\n            return;\n        }\n    }\n\n    /**\n     * Focuses the tag input inside the tag list.\n     *\n     * @docs-private\n     */\n    focusInput() {\n        if (this.tagInput) {\n            this.tagInput.focus();\n        }\n    }\n\n    /**\n     * Pass events to the keyboard manager. Available here for tests.\n     *\n     * @docs-private\n     */\n    keydown(event: KeyboardEvent): void {\n        const target = event.target as HTMLElement | null;\n\n        if (this.disabled || isNull(target)) return;\n\n        const shouldSelectAll = this.selectable && isSelectAll(event);\n\n        if (this.isInputEmpty(target)) {\n            if (\n                event.keyCode === BACKSPACE ||\n                event.keyCode === LEFT_ARROW ||\n                (event.keyCode === TAB && event.shiftKey)\n            ) {\n                this.keyManager.setLastItemActive();\n                event.preventDefault();\n\n                return;\n            }\n\n            if (shouldSelectAll) {\n                this.selectAll();\n                this.keyManager.setLastItemActive();\n                event.preventDefault();\n\n                return;\n            }\n        } else if (this.isTagElement(target)) {\n            if (event.keyCode === HOME) {\n                this.keyManager.setFirstItemActive();\n                event.preventDefault();\n            } else if (event.keyCode === END) {\n                this.keyManager.setLastItemActive();\n                event.preventDefault();\n            } else if (shouldSelectAll) {\n                this.selectAll();\n                this.keyManager.setLastItemActive();\n                event.preventDefault();\n            } else {\n                this.keyManager.onKeydown(event);\n            }\n\n            this.stateChanges.next();\n        }\n    }\n\n    /**\n     * @docs-private\n     *\n     * @deprecated Unused. Will be removed in next major release.\n     */\n    setSelectionByValue(_value: any, _isUserInput: boolean = true): void {}\n\n    /** When blurred, mark the field as touched when focus moved outside the tag list. */\n    blur() {\n        if (!this.hasFocusedTag()) {\n            this.keyManager.setActiveItem(-1);\n        }\n\n        if (!this.disabled) {\n            if (this.tagInput) {\n                // If there's a tag input, we should check whether the focus moved to tag input.\n                // If the focus is not moved to tag input, mark the field as touched. If the focus moved\n                // to tag input, do nothing.\n                // Timeout is needed to wait for the focus() event trigger on tag input.\n                setTimeout(() => {\n                    if (!this.focused) {\n                        this.markAsTouched();\n                        this.revalidate();\n                    }\n                });\n            } else {\n                // If there's no tag input, then mark the field as touched.\n                this.markAsTouched();\n                this.revalidate();\n            }\n        }\n    }\n\n    /** Mark the field as touched */\n    markAsTouched() {\n        this.onTouched();\n        this.changeDetectorRef.markForCheck();\n        this.stateChanges.next();\n    }\n\n    /**\n     * Check the tab index as you should not be allowed to focus an empty list.\n     *\n     * @docs-private\n     */\n    protected updateTabIndex(): void {\n        // If we have 0 tags, we should not allow keyboard focus\n        this._tabIndex = this.userTabIndex || (this.tags.length === 0 ? -1 : 0);\n    }\n\n    /**\n     * If the amount of tags changed, we need to update the\n     * key manager state and focus the next closest tag.\n     *\n     * @docs-private\n     */\n    protected updateFocusForDestroyedTags() {\n        if (this.lastDestroyedTagIndex != null) {\n            if (this.tags.length) {\n                const newTagIndex = Math.min(this.lastDestroyedTagIndex, this.tags.length - 1);\n\n                this.keyManager.setActiveItem(newTagIndex);\n            } else {\n                this.focusInput();\n            }\n        }\n\n        this.lastDestroyedTagIndex = null;\n    }\n\n    /**\n     * Utility to ensure all indexes are valid.\n     *\n     * @param index The index to be checked.\n     * @returns True if the index is valid for our list of tags.\n     */\n    private isValidIndex(index: number): boolean {\n        return index >= 0 && index < this.tags.length;\n    }\n\n    private isInputElement(element: HTMLElement): element is HTMLInputElement {\n        return element.nodeName.toLowerCase() === 'input';\n    }\n\n    private isInputEmpty(element: HTMLElement): boolean {\n        if (!this.isInputElement(element)) return false;\n\n        return !element.value;\n    }\n\n    private isTagElement(element: HTMLElement): boolean {\n        return element.classList.contains('kbq-tag');\n    }\n\n    private selectAll(): void {\n        this.tags.forEach((tag) => tag.selectViaInteraction());\n    }\n\n    /**\n     * Unselects all tags in the list.\n     *\n     * @docs-private\n     */\n    unselectAll(): void {\n        this.tags.forEach((tag) => tag.setSelectedState(false));\n    }\n\n    /**\n     * Removes all selected tags from the list.\n     *\n     * @docs-private\n     */\n    removeSelected(): void {\n        this.selected.forEach((tag) => tag.remove());\n    }\n\n    private propagateTagsChanges(): void {\n        const valueToEmit: any = this.tags.map((tag) => tag.value);\n\n        this._value = valueToEmit;\n        this.change.emit(new KbqTagListChange(this, valueToEmit));\n        this.valueChange.emit(valueToEmit);\n        this.onChange(valueToEmit);\n        this.changeDetectorRef.markForCheck();\n    }\n\n    private resetTags(): void {\n        this.tagsSubscriptions$.next();\n        this.listenToTagsFocus();\n        this.listenToTagsRemoved();\n        this.listenToTagsEdit();\n    }\n\n    /** Listens to user-generated selection events on each tag. */\n    private listenToTagsFocus(): void {\n        this.tagFocusChanges.pipe(takeUntil(this.tagsSubscriptions$)).subscribe(({ tag, origin }) => {\n            const tagIndex = this.tags.toArray().indexOf(tag);\n\n            if (this.isValidIndex(tagIndex)) {\n                this.keyManager.setFocusOrigin(origin);\n                this.keyManager.updateActiveItem(tagIndex);\n            }\n\n            this.stateChanges.next();\n        });\n\n        this.tagBlurChanges.pipe(takeUntil(this.tagsSubscriptions$)).subscribe(() => {\n            this.blur();\n\n            this.stateChanges.next();\n        });\n    }\n\n    private listenToTagsRemoved(): void {\n        this.tagRemoveChanges.pipe(takeUntil(this.tagsSubscriptions$)).subscribe((event) => {\n            const tag = event.tag;\n            const tagIndex = this.tags.toArray().indexOf(event.tag);\n\n            // In case the tag that will be removed is currently focused, we temporarily store\n            // the index in order to be able to determine an appropriate sibling tag that will\n            // receive focus.\n            if (this.isValidIndex(tagIndex) && tag.hasFocus) {\n                this.lastDestroyedTagIndex = tagIndex;\n            }\n        });\n\n        // Set the pending flag so the subsequent `tags.changes` is treated as UI action.\n        this.tagBeforeRemoveChanges\n            .pipe(takeUntil(this.tagsSubscriptions$))\n            .subscribe(() => (this.pendingUIChange = true));\n    }\n\n    private listenToTagsEdit(): void {\n        this.tagEditChanges\n            .pipe(\n                filter(({ type }) => type === 'submit'),\n                takeUntil(this.tagsSubscriptions$)\n            )\n            .subscribe(() => this.propagateTagsChanges());\n    }\n\n    /** Checks whether any of the tags is focused. */\n    private hasFocusedTag() {\n        return this.tags.some((tag) => tag.hasFocus);\n    }\n\n    private syncTagsRemovableState(): void {\n        this.tags?.forEach((tag) => (tag.removable = this.removable));\n    }\n\n    /** Revalidate control. */\n    private revalidate() {\n        if (this.useLegacyValidation && this.ngControl?.control) {\n            const control = this.ngControl.control;\n\n            control.updateValueAndValidity({ emitEvent: false });\n            (control.statusChanges as EventEmitter<string>).emit(control.status);\n        }\n    }\n\n    private setupDropListInitialProperties(): void {\n        this.syncDropListDisabledState();\n        this.dropList.elementContainerSelector = '.kbq-tags-list__list-container';\n        this.dropList.orientation = 'mixed';\n        this.dropList.dropped\n            .pipe(takeUntilDestroyed(this.destroyRef))\n            .subscribe(({ currentIndex, previousIndex, event, item }) => {\n                this.pendingUIChange = true;\n\n                const { tag }: KbqTagDragData = item.data;\n\n                this.dropped.emit({ currentIndex, previousIndex, event, tag });\n            });\n    }\n\n    private syncDropListDisabledState(): void {\n        this.dropList.disabled = !this.draggable;\n    }\n\n    private setupFocusMonitor(): void {\n        this.focusMonitor.monitor(this.elementRef, true).subscribe((origin) => {\n            if (!origin) this.unselectAll();\n        });\n    }\n}\n","import { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport {\n    booleanAttribute,\n    Directive,\n    ElementRef,\n    EventEmitter,\n    Inject,\n    Input,\n    OnChanges,\n    Optional,\n    Output,\n    Self\n} from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport { COMMA, ENTER, hasModifierKey, SEMICOLON, SPACE, TAB } from '@koobiq/cdk/keycodes';\nimport { KbqAutocompleteTrigger } from '@koobiq/components/autocomplete';\nimport { KbqFieldSizingContent } from '@koobiq/components/core';\nimport { KbqTrim } from '@koobiq/components/form-field';\nimport { KBQ_TAGS_DEFAULT_OPTIONS, KbqTagsDefaultOptions } from './tag-default-options';\nimport { KbqTagList } from './tag-list.component';\nimport { KbqTagTextControl } from './tag-text-control';\n\nconst KBQ_TAG_INPUT_DEFAULT_SEPARATORS: { [key: number]: KbqTagSeparator } = {\n    [ENTER]: { symbol: /\\r?\\n/, key: 'Enter' },\n    [TAB]: { symbol: /\\t/, key: 'Tab' },\n    [SPACE]: { symbol: / /, key: ' ' },\n    [COMMA]: { symbol: /,/, key: ',' },\n    [SEMICOLON]: { symbol: /;/, key: ';' }\n};\n\n/** Represents an input event on a `kbqTagInput`. */\nexport interface KbqTagInputEvent {\n    /** The native `<input>` element that the event is being fired for. */\n    input: HTMLInputElement;\n\n    /** The value of the input. */\n    value: string;\n}\n\nexport interface KbqTagSeparator {\n    symbol: RegExp;\n    key: string;\n}\n// Increasing integer for generating unique ids.\nlet nextUniqueId = 0;\n\n/**\n * Directive that adds tag-specific behaviors to an input element inside `<kbq-form-field>`.\n * May be placed inside or outside of an `<kbq-tag-list>`.\n */\n@Directive({\n    selector: 'input[kbqTagInputFor]',\n    exportAs: 'kbqTagInput, kbqTagInputFor',\n    host: {\n        class: 'kbq-tag-input',\n        '[id]': 'id',\n        '[attr.disabled]': 'disabled || null',\n        '[attr.placeholder]': 'placeholder || null',\n        '(keydown)': 'onKeydown($event)',\n        '(blur)': 'blur($event)',\n        '(focus)': 'onFocus()',\n        '(input)': 'onInput()',\n        '(paste)': 'onPaste($event)'\n    },\n    hostDirectives: [KbqFieldSizingContent]\n})\nexport class KbqTagInput implements KbqTagTextControl, OnChanges {\n    /** Whether the control is focused. */\n    focused: boolean = false;\n\n    /**\n     * The list of key codes that will trigger a tagEnd event.\n     *\n     * Defaults to `[ENTER]`.\n     */\n    @Input('kbqTagInputSeparatorKeyCodes')\n    set separatorKeyCodes(value: number[]) {\n        this._separatorKeyCodes = value || [];\n    }\n\n    private _separatorKeyCodes: number[] = this.defaultOptions.separatorKeyCodes;\n\n    /** @docs-private */\n    get separators(): KbqTagSeparator[] {\n        return this._separatorKeyCodes.reduce((acc: any, key) => {\n            const separator = this.getSeparatorByKeyCode(key);\n\n            return separator ? [...acc, separator] : acc;\n        }, []);\n    }\n\n    private _separators = this.defaultOptions.separators || KBQ_TAG_INPUT_DEFAULT_SEPARATORS;\n\n    /** Emitted when a tag is to be added. */\n    @Output('kbqTagInputTokenEnd') readonly tagEnd: EventEmitter<KbqTagInputEvent> =\n        new EventEmitter<KbqTagInputEvent>();\n\n    /** A value indicating whether allow/prevent tags duplication  */\n    @Input() distinct: boolean = false;\n\n    /** The input's placeholder text. */\n    @Input() placeholder: string = '';\n\n    /** Unique id for the input. */\n    @Input() id: string = `kbq-tag-list-input-${nextUniqueId++}`;\n\n    /** Register input for tag list */\n    @Input('kbqTagInputFor')\n    set tagList(value: KbqTagList) {\n        if (value) {\n            this._tagList = value;\n            this._tagList.registerInput(this);\n        }\n    }\n\n    private _tagList: KbqTagList;\n\n    /**\n     * Whether or not the tagEnd event will be emitted when the input is blurred.\n     */\n    @Input('kbqTagInputAddOnBlur')\n    get addOnBlur(): boolean {\n        return this._addOnBlur;\n    }\n\n    set addOnBlur(value: boolean) {\n        this._addOnBlur = coerceBooleanProperty(value);\n    }\n\n    private _addOnBlur: boolean = true;\n\n    /**\n     * Whether the tagEnd event will be emitted when the text pasted.\n     * @default true\n     */\n    @Input({ alias: 'kbqTagInputAddOnPaste', transform: booleanAttribute }) addOnPaste =\n        this.defaultOptions.addOnPaste ?? true;\n\n    /** Whether the input is disabled. */\n    @Input()\n    get disabled(): boolean {\n        return this._disabled || (this._tagList && this._tagList.disabled);\n    }\n\n    set disabled(value: boolean) {\n        this._disabled = coerceBooleanProperty(value);\n    }\n\n    private _disabled: boolean = false;\n\n    /** Whether the input is empty. */\n    get empty(): boolean {\n        return !this.inputElement.value;\n    }\n\n    /**\n     * @docs-private\n     *\n     * @deprecated Unused. Will be removed in next major release.\n     */\n    countOfSymbolsForUpdateWidth: number = 3;\n\n    /** The native input element to which this directive is attached. */\n    private inputElement: HTMLInputElement;\n\n    constructor(\n        private elementRef: ElementRef<HTMLInputElement>,\n        @Inject(KBQ_TAGS_DEFAULT_OPTIONS) private defaultOptions: KbqTagsDefaultOptions,\n        @Optional() @Self() private trimDirective: KbqTrim,\n        @Optional() @Self() public ngControl: NgControl,\n        @Optional() @Self() public autocompleteTrigger?: KbqAutocompleteTrigger\n    ) {\n        this.inputElement = this.elementRef.nativeElement as HTMLInputElement;\n    }\n\n    ngOnChanges() {\n        this._tagList.stateChanges.next();\n    }\n\n    /** @docs-private */\n    onKeydown(event: KeyboardEvent) {\n        const isSeparatorKey = this.isSeparatorKey(event);\n\n        if (!this.inputElement.value) {\n            if (isSeparatorKey) {\n                event.preventDefault();\n            }\n\n            this._tagList.keydown(event);\n            event.stopPropagation();\n\n            return;\n        }\n\n        if (isSeparatorKey) {\n            this.emitTagEnd();\n\n            event.preventDefault();\n        }\n    }\n\n    /** Checks to see if the blur should emit the (tagEnd) event. */\n    blur(event: FocusEvent) {\n        this.focused = false;\n\n        // Blur the tag list if it is not focused\n        if (!this._tagList.focused) {\n            this.triggerValidation();\n\n            this._tagList.blur();\n        }\n\n        if (this.addOnBlur && (this.autocompleteTrigger?.onInputBlur(event) || true)) {\n            this.emitTagEnd();\n        }\n\n        this._tagList.stateChanges.next();\n    }\n\n    triggerValidation() {\n        if (!this.hasControl()) {\n            return;\n        }\n\n        (this.ngControl.statusChanges as EventEmitter<string | null>).emit(this.ngControl.status);\n    }\n\n    /** Checks to see if the (tagEnd) event needs to be emitted. */\n    emitTagEnd() {\n        if (!this.hasControl() || (this.hasControl() && !this.ngControl.invalid)) {\n            if (this.distinct && this.hasDuplicates) return;\n\n            this._tagList?.notifyPendingTagChange();\n            this.tagEnd.emit({ input: this.inputElement, value: this.trimValue(this.inputElement.value) });\n        }\n    }\n\n    get hasDuplicates(): boolean {\n        return this._tagList.tags\n            .map(({ value }) => value)\n            .some((tagValue) => tagValue === this.trimValue(this.inputElement.value));\n    }\n\n    onInput() {\n        // Let tag list know whenever the value changes.\n        this._tagList.stateChanges.next();\n    }\n\n    onPaste($event: ClipboardEvent) {\n        if (!$event.clipboardData) {\n            return;\n        }\n\n        const data = $event.clipboardData.getData('text');\n\n        if ((data && data.length === 0) || !this.addOnPaste) {\n            return;\n        }\n\n        const separatorsInString = this.getSeparatorsForString(data);\n\n        // prettier-ignore\n        const dividedString: string[] = separatorsInString.length > 0 ?\n            [...data.split(new RegExp(`${separatorsInString.join('|')}`))] :\n            [data];\n\n        let items: string[] = dividedString.map((item) => this.trimValue(item));\n\n        if (items.length === 0) {\n            items.push(data);\n        }\n\n        if (this.distinct) {\n            const tagValues: string[] = this._tagList.tags.map(({ value }) => value);\n\n            items = items.filter((item) => !tagValues.includes(item));\n        }\n\n        if (items.length) {\n            this._tagList?.notifyPendingTagChange();\n        }\n\n        items.forEach((item) => this.tagEnd.emit({ input: this.inputElement, value: item }));\n\n        $event.preventDefault();\n        $event.stopPropagation();\n    }\n\n    /**\n     * @docs-private\n     *\n     * @deprecated Unused. Will be removed in next major release.\n     */\n    updateInputWidth(): void {}\n\n    /** @docs-private */\n    onFocus(): void {\n        this.focused = true;\n        this._tagList.unselectAll();\n        this._tagList.stateChanges.next();\n    }\n\n    /** Focuses the input. */\n    focus(): void {\n        this.inputElement.focus();\n    }\n\n    private getSeparatorsForString(value: string): string[] {\n        return this.separators\n            .filter((separator) => value.search(separator.symbol) > -1)\n            .map((separator) => separator.symbol.source);\n    }\n\n    private trimValue(value) {\n        return this.trimDirective ? this.trimDirective.trim(value) : value;\n    }\n\n    private getSeparatorByKeyCode(keyCode: number): KbqTagSeparator | null {\n        const sep = this._separators[keyCode];\n\n        if (sep) {\n            return sep;\n        }\n\n        return null;\n    }\n\n    private hasControl(): boolean {\n        return !!this.ngControl;\n    }\n\n    /** Checks whether a keycode is one of the configured separators. */\n    private isSeparatorKey(event: KeyboardEvent) {\n        return this.separators.some((separator) => separator.key === event.key && !hasModifierKey(event));\n    }\n}\n","import { PlatformModule } from '@angular/cdk/platform';\nimport { NgModule } from '@angular/core';\nimport { ENTER } from '@koobiq/cdk/keycodes';\nimport { KBQ_TAGS_DEFAULT_OPTIONS, KbqTagsDefaultOptions } from './tag-default-options';\nimport { KbqTagInput } from './tag-input';\nimport { KbqTagList } from './tag-list.component';\nimport {\n    KbqTag,\n    KbqTagAvatar,\n    KbqTagEditInput,\n    KbqTagEditSubmit,\n    KbqTagRemove,\n    KbqTagTrailingIcon\n} from './tag.component';\n\nconst COMPONENTS = [\n    KbqTagEditSubmit,\n    KbqTagEditInput\n];\n\n@NgModule({\n    imports: [\n        PlatformModule,\n        ...COMPONENTS,\n        KbqTagList,\n        KbqTag,\n        KbqTagInput,\n        KbqTagTrailingIcon,\n        KbqTagAvatar,\n        KbqTagRemove\n    ],\n    exports: [\n        KbqTagList,\n        KbqTag,\n        KbqTagInput,\n        KbqTagTrailingIcon,\n        KbqTagAvatar,\n        KbqTagRemove,\n        ...COMPONENTS\n    ],\n    providers: [\n        {\n            provide: KBQ_TAGS_DEFAULT_OPTIONS,\n            useValue: { separatorKeyCodes: [ENTER] } as KbqTagsDefaultOptions\n        }\n    ]\n})\nexport class KbqTagsModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["nextUniqueId","i2","i4","ENTER","TAB","SPACE","i1","i3"],"mappings":"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"}