{"version":3,"file":"koobiq-components-resizer.mjs","sources":["../../../packages/components/resizer/resizer.ts","../../../packages/components/resizer/module.ts","../../../packages/components/resizer/koobiq-components-resizer.ts"],"sourcesContent":["import { coerceCssPixelValue } from '@angular/cdk/coercion';\nimport { DOCUMENT } from '@angular/common';\nimport {\n    afterNextRender,\n    computed,\n    DestroyRef,\n    Directive,\n    inject,\n    input,\n    NgZone,\n    output,\n    Renderer2\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { kbqInjectNativeElement } from '@koobiq/components/core';\nimport { fromEvent } from 'rxjs';\n\n/**\n * Directions for resizing.\n *\n * Horizontal direction (x):\n * - Left: -1\n * - None: 0\n * - Right: 1\n *\n * Vertical direction (y):\n * - Up: -1\n * - None: 0\n * - Down: 1\n */\nexport type KbqResizerDirection = [x: -1 | 0 | 1, y: -1 | 0 | 1];\n\n/**\n * Event emitted when the size of the resizable element changes.\n */\nexport type KbqResizerSizeChangeEvent = {\n    width: number;\n    height: number;\n};\n\n/**\n * Directive (container) sets whether the element is resizable.\n *\n * @example\n *\n * ```html\n * <div kbqResizable>\n *     <div [kbqResizer]=\"[-1, 0]\"></div>\n * </div>\n * ```\n */\n@Directive({\n    selector: '[kbqResizable]',\n    exportAs: 'kbqResizable',\n    host: {\n        class: 'kbq-resizable'\n    }\n})\nexport class KbqResizable {\n    /**\n     * @docs-private\n     */\n    readonly element = kbqInjectNativeElement();\n}\n\n/**\n * Directive which defines element resizing direction.\n */\n@Directive({\n    selector: '[kbqResizer]',\n    exportAs: 'kbqResizer',\n    host: {\n        class: 'kbq-resizer',\n        '[style.cursor]': 'cursor()'\n    }\n})\nexport class KbqResizer {\n    private readonly element = kbqInjectNativeElement();\n    private readonly resizable = inject(KbqResizable);\n    private readonly zone = inject(NgZone);\n    private readonly document = inject<Document>(DOCUMENT);\n    private readonly destroyRef = inject(DestroyRef);\n    private readonly renderer = inject(Renderer2);\n\n    private x = NaN;\n    private y = NaN;\n\n    private width = 0;\n    private height = 0;\n\n    /**\n     * Direction of element resizing.\n     */\n    readonly direction = input.required<KbqResizerDirection>({ alias: 'kbqResizer' });\n\n    /**\n     * Emits the new size of the element after resizing.\n     */\n    readonly sizeChange = output<KbqResizerSizeChangeEvent>();\n\n    /**\n     * @docs-private\n     */\n    protected readonly cursor = computed(() => {\n        const [x, y] = this.direction();\n\n        if (x === 0 && y === 0) return 'default';\n        if (!x) return 'ns-resize';\n        if (!y) return 'ew-resize';\n        if (x * y > 0) return 'nwse-resize';\n\n        return 'nesw-resize';\n    });\n\n    constructor() {\n        afterNextRender(() => {\n            this.zone.runOutsideAngular(() => {\n                fromEvent<PointerEvent>(this.element, 'pointerdown')\n                    .pipe(takeUntilDestroyed(this.destroyRef))\n                    .subscribe((event) => this.handleElementPointerDown(event));\n\n                fromEvent<PointerEvent>(this.document, 'pointermove')\n                    .pipe(takeUntilDestroyed(this.destroyRef))\n                    .subscribe((event) => this.handleDocumentPointerMove(event));\n\n                fromEvent<PointerEvent>(this.document, 'pointerup')\n                    .pipe(takeUntilDestroyed(this.destroyRef))\n                    .subscribe((event) => this.handleDocumentPointerUp(event));\n            });\n        });\n    }\n\n    private handleElementPointerDown(event: PointerEvent): void {\n        event.preventDefault();\n\n        this.x = event.x;\n        this.y = event.y;\n\n        const { clientWidth, clientHeight } = this.resizable.element;\n\n        this.width = clientWidth;\n        this.height = clientHeight;\n    }\n\n    private handleDocumentPointerMove(event: PointerEvent): void {\n        if (!event.buttons) return this.handleDocumentPointerUp(event);\n\n        this.updateSize(event);\n    }\n\n    private handleDocumentPointerUp(_event: PointerEvent): void {\n        this.x = NaN;\n    }\n\n    private updateSize({ x, y }: PointerEvent): void {\n        if (Number.isNaN(this.x)) return;\n\n        const [directionX, directionY] = this.direction();\n        const width = this.width + directionX * (x - this.x);\n        const height = this.height + directionY * (y - this.y);\n\n        if (directionX) this.renderer.setStyle(this.resizable.element, 'width', coerceCssPixelValue(width));\n        if (directionY) this.renderer.setStyle(this.resizable.element, 'height', coerceCssPixelValue(height));\n\n        this.sizeChange.emit({ width, height });\n    }\n}\n","import { NgModule } from '@angular/core';\nimport { KbqResizable, KbqResizer } from './resizer';\n\nconst COMPONENTS = [KbqResizable, KbqResizer];\n\n@NgModule({\n    imports: COMPONENTS,\n    exports: COMPONENTS\n})\nexport class KbqResizerModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}