{"version":3,"file":"taiga-ui-editor-components-toolbar-host.mjs","sources":["../../../projects/editor/components/toolbar-host/toolbar-navigation-manager.directive.ts","../../../projects/editor/components/toolbar-host/toolbar-host.component.ts","../../../projects/editor/components/toolbar-host/toolbar-host.component.html","../../../projects/editor/components/toolbar-host/taiga-ui-editor-components-toolbar-host.ts"],"sourcesContent":["import {Directive, ElementRef, inject} from '@angular/core';\nimport {\n    tuiClamp,\n    tuiGetClosestFocusable,\n    tuiIsFocusedIn,\n    tuiIsNativeMouseFocusable,\n} from '@taiga-ui/cdk';\n\n@Directive({\n    standalone: true,\n    selector: '[tuiToolbarNavigationManager]',\n    host: {\n        '(keydown.arrowRight.prevent)': 'onHorizontalNavigation(false)',\n        '(keydown.arrowLeft.prevent)': 'onHorizontalNavigation(true)',\n    },\n})\nexport class TuiToolbarNavigationManager {\n    private readonly el: HTMLElement = inject(ElementRef).nativeElement;\n\n    public findFirstFocusableTool(reversed = false): HTMLElement | null {\n        const tools = reversed\n            ? this.toolsContainers.slice().reverse()\n            : this.toolsContainers;\n\n        for (const el of tools) {\n            const focusableElement = tuiIsNativeMouseFocusable(el)\n                ? el\n                : tuiGetClosestFocusable({initial: el, root: el, keyboard: false});\n\n            if (focusableElement) {\n                return focusableElement;\n            }\n        }\n\n        return null;\n    }\n\n    protected onHorizontalNavigation(toPrevious: boolean): void {\n        const {toolsContainers} = this;\n        const focusedToolIndex = toolsContainers.findIndex(tuiIsFocusedIn);\n\n        const targetToolIndex = tuiClamp(\n            focusedToolIndex + (toPrevious ? -1 : 1),\n            0,\n            toolsContainers.length - 1,\n        );\n        const targetToolWrapper = toolsContainers[targetToolIndex];\n        const targetTool = toPrevious\n            ? this.findPreviousTool(targetToolWrapper)\n            : this.findNextTool(targetToolWrapper);\n\n        if (targetTool) {\n            targetTool.focus();\n        }\n    }\n\n    private get toolsContainers(): readonly HTMLElement[] {\n        return Array.from(this.el.querySelectorAll<HTMLElement>('[tuiItem]'));\n    }\n\n    private findPreviousTool(wrapper?: HTMLElement | null): HTMLElement | null {\n        if (!wrapper || tuiIsNativeMouseFocusable(wrapper)) {\n            return wrapper ?? null;\n        }\n\n        const lookedInside = tuiGetClosestFocusable({\n            initial: wrapper,\n            root: wrapper,\n            keyboard: false,\n        });\n\n        return (\n            lookedInside ||\n            tuiGetClosestFocusable({\n                initial: wrapper,\n                root: this.el,\n                previous: true,\n                keyboard: false,\n            })\n        );\n    }\n\n    private findNextTool(wrapper?: HTMLElement | null): HTMLElement | null {\n        return !wrapper || tuiIsNativeMouseFocusable(wrapper)\n            ? (wrapper ?? null)\n            : tuiGetClosestFocusable({\n                  initial: wrapper,\n                  root: this.el,\n                  keyboard: false,\n              });\n    }\n}\n","import {AsyncPipe, NgIf} from '@angular/common';\nimport {\n    ChangeDetectionStrategy,\n    Component,\n    ElementRef,\n    inject,\n    Input,\n    type QueryList,\n    ViewChild,\n    ViewChildren,\n    ViewEncapsulation,\n} from '@angular/core';\nimport {EMPTY_QUERY, tuiIsFocusedIn} from '@taiga-ui/cdk';\nimport {tuiHintOptionsProvider} from '@taiga-ui/core';\nimport {type AbstractTuiEditor} from '@taiga-ui/editor/common';\nimport {TuiTiptapEditorService} from '@taiga-ui/editor/directives/tiptap-editor';\n\nimport {TuiToolbarNavigationManager} from './toolbar-navigation-manager.directive';\n\n@Component({\n    standalone: true,\n    selector: 'tui-toolbar-host',\n    imports: [AsyncPipe, NgIf, TuiToolbarNavigationManager],\n    templateUrl: './toolbar-host.component.html',\n    styleUrls: ['./toolbar-host.style.less'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [tuiHintOptionsProvider({direction: ['top-left', 'top', 'right']})],\n    host: {\n        role: 'toolbar',\n        tuiToolbarHost: '',\n        '[class._disabled]': 'disabled',\n        '(mousedown)': 'onMouseDown($event, $event.target)',\n    },\n})\nexport class TuiToolbarHost {\n    @ViewChild(TuiToolbarNavigationManager)\n    private readonly navigationManager?: TuiToolbarNavigationManager;\n\n    @ViewChildren('dropdown', {read: ElementRef})\n    private readonly dropdowns: QueryList<ElementRef<HTMLElement>> = EMPTY_QUERY;\n\n    protected readonly injectionEditor = inject(TuiTiptapEditorService, {optional: true});\n\n    @Input('editor')\n    public inputEditor: AbstractTuiEditor | null = null;\n\n    @Input()\n    public disabled = false;\n\n    public readonly el: HTMLElement | null =\n        inject(ElementRef, {optional: true})?.nativeElement ?? null;\n\n    protected get editor(): AbstractTuiEditor | null {\n        return this.injectionEditor ?? this.inputEditor;\n    }\n\n    protected get focused(): boolean {\n        return (\n            tuiIsFocusedIn(this.el) ||\n            !!this.dropdowns.find(({nativeElement}) => tuiIsFocusedIn(nativeElement))\n        );\n    }\n\n    protected get focusable(): boolean {\n        return !this.focused && !this.disabled;\n    }\n\n    protected onTopFocus(): void {\n        this.focusFirst();\n    }\n\n    protected onBottomFocus(): void {\n        this.focusLast();\n    }\n\n    protected onMouseDown(event: MouseEvent, target: HTMLElement): void {\n        if (target.closest('button')) {\n            return;\n        }\n\n        event.preventDefault();\n        this.editor?.focus();\n    }\n\n    private focusFirst(): void {\n        this.navigationManager?.findFirstFocusableTool()?.focus();\n    }\n\n    private focusLast(): void {\n        this.navigationManager?.findFirstFocusableTool(true)?.focus();\n    }\n}\n\nexport {\n    /**\n     * @deprecated use {@link TuiToolbarHost}\n     */\n    TuiToolbarHost as TuiToolbarHostComponent,\n};\n","<ng-container *ngIf=\"!disabled\">\n    <button\n        type=\"button\"\n        [style.display]=\"'none'\"\n    >\n        <!-- @note: this is a html hack to avoid autofocus, if the parent element is a label  -->\n    </button>\n    <div\n        [tabIndex]=\"focusable ? 0 : -1\"\n        (focus)=\"onTopFocus()\"\n    ></div>\n    <div\n        [tabIndex]=\"focusable ? 0 : -1\"\n        (focus)=\"onBottomFocus()\"\n    ></div>\n</ng-container>\n<ng-container *ngIf=\"editor?.valueChange$ | async\" />\n<fieldset\n    tuiToolbarNavigationManager\n    [disabled]=\"disabled\"\n>\n    <ng-content />\n</fieldset>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}