{"version":3,"file":"w2p-ui-kit-components-swipe-confirm.mjs","sources":["../../../projects/kit/components/swipe-confirm/swipe-confirm.ts","../../../projects/kit/components/swipe-confirm/swipe-confirm.html","../../../projects/kit/components/swipe-confirm/w2p-ui-kit-components-swipe-confirm.ts"],"sourcesContent":["import { Component, ElementRef, computed, input, output, signal, viewChild } from '@angular/core';\n\n@Component({\n  selector: 'w2p-swipe-confirm',\n  imports: [],\n  templateUrl: './swipe-confirm.html',\n  styleUrls: ['./swipe-confirm.scss'],\n})\nexport class W2pSwipeConfirm {\n  public readonly label = input<string>('Swipe to confirm');\n  public readonly loadingLabel = input<string>('Loading...');\n  public readonly disabled = input<boolean>(false);\n  public readonly loading = input<boolean>(false);\n  public readonly threshold = input<number>(0.8);\n\n  public readonly confirmed = output<void>();\n\n  public readonly track = viewChild<ElementRef<HTMLDivElement>>('trackRef');\n  public readonly handle = viewChild<ElementRef<HTMLDivElement>>('handleRef');\n\n  // settled — единственное состояние, которое реально нужно реактивно (влияет на классы/спиннер)\n  protected readonly settled = signal(false);\n\n  protected readonly isConfirmedVisual = computed(() => this.settled() || this.loading());\n  protected readonly pressed = signal(false);\n\n  private startX = 0;\n  private startTranslate = 0;\n  private maxTranslate = 0;\n  private currentTranslate = 0; // обычное поле, не сигнал — живёт только во время драга\n  private dragging = false;\n\n  onPointerDown(event: PointerEvent): void {\n    if (this.disabled() || this.loading() || this.settled()) return;\n\n    const trackEl = this.track()?.nativeElement;\n    const handleEl = this.handle()?.nativeElement;\n    if (!trackEl || !handleEl) return;\n\n    this.maxTranslate = trackEl.clientWidth - handleEl.clientWidth - 8;\n    this.startX = event.clientX;\n    this.startTranslate = this.currentTranslate;\n    this.dragging = true;\n    this.pressed.set(true);\n\n    handleEl.style.transition = 'none'; // на время драга без transition — иначе будет отставать\n    handleEl.setPointerCapture(event.pointerId);\n  }\n\n  onPointerMove(event: PointerEvent): void {\n    if (!this.dragging) return;\n\n    const handleEl = this.handle()?.nativeElement;\n    if (!handleEl) return;\n\n    const delta = event.clientX - this.startX;\n    const next = Math.min(Math.max(this.startTranslate + delta, 0), this.maxTranslate);\n    this.currentTranslate = next;\n\n    // прямая манипуляция DOM — минуя Angular change detection, для нулевой задержки\n    handleEl.style.transform = `translateX(${next}px)`;\n  }\n\n  onPointerUp(): void {\n    if (!this.dragging) return;\n    this.dragging = false;\n    this.pressed.set(false);\n\n    const handleEl = this.handle()?.nativeElement;\n    if (!handleEl) return;\n\n    handleEl.style.transition = 'transform 0.25s ease';\n\n    const reached =\n      this.maxTranslate > 0 && this.currentTranslate / this.maxTranslate >= this.threshold();\n\n    if (reached) {\n      handleEl.style.transform = `translateX(${this.maxTranslate}px)`;\n      this.currentTranslate = this.maxTranslate;\n      this.settled.set(true); // единственное место, где трогаем сигнал — уже после драга\n      this.confirmed.emit();\n    } else {\n      handleEl.style.transform = `translateX(0px)`;\n      this.currentTranslate = 0;\n    }\n  }\n\n  public reset(): void {\n    this.settled.set(false);\n    this.currentTranslate = 0;\n    const handleEl = this.handle()?.nativeElement;\n    if (handleEl) {\n      handleEl.style.transition = 'transform 0.25s ease';\n      handleEl.style.transform = 'translateX(0px)';\n    }\n  }\n}\n","<div\n  #trackRef\n  class=\"swipe-track\"\n  [class.disabled]=\"disabled()\"\n  [class.settled]=\"isConfirmedVisual()\"\n  [class.active]=\"pressed()\"\n>\n  <span class=\"swipe-label\">\n    {{ label() }}\n  </span>\n\n  <div\n    #handleRef\n    class=\"swipe-handle\"\n    [class.loading]=\"loading()\"\n    (pointerdown)=\"onPointerDown($event)\"\n    (pointermove)=\"onPointerMove($event)\"\n    (pointerup)=\"onPointerUp()\"\n    (pointercancel)=\"onPointerUp()\"\n    [class.active]=\"pressed()\"\n  >\n    @if (loading()) {\n      <svg class=\"spinner\" viewBox=\"0 0 24 24\" fill=\"none\">\n        <circle\n          cx=\"12\"\n          cy=\"12\"\n          r=\"9\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-dasharray=\"40\"\n          stroke-dashoffset=\"10\"\n        />\n      </svg>\n    } @else {\n      <svg viewBox=\"0 0 24 24\" fill=\"none\">\n        <path\n          d=\"M5 12h14m0 0l-6-6m6 6l-6 6\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n        />\n      </svg>\n    }\n  </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}