{"version":3,"file":"rdlabo-ionic-angular-photo-editor.mjs","sources":["../../../projects/photo-editor/src/lib/filter-preset.ts","../../../projects/photo-editor/src/lib/ion-components.ts","../../../projects/photo-editor/src/lib/dictionaries.ts","../../../projects/photo-editor/src/lib/pages/util.ts","../../../projects/photo-editor/src/lib/pages/photo-editor/photo-editor.page.ts","../../../projects/photo-editor/src/lib/pages/photo-editor/photo-editor.page.html","../../../projects/photo-editor/src/lib/pages/photo-viewer/photo-viewer.page.ts","../../../projects/photo-editor/src/lib/pages/photo-viewer/photo-viewer.page.html","../../../projects/photo-editor/src/lib/photoEditorErrors.ts","../../../projects/photo-editor/src/lib/services/photo-file.service.ts","../../../projects/photo-editor/src/public-api.ts","../../../projects/photo-editor/src/rdlabo-ionic-angular-photo-editor.ts"],"sourcesContent":["import { IDictionaryForEditor, IFilterPreset } from './types';\n\nexport const filterPreset = (dictionary: IDictionaryForEditor): IFilterPreset[] => [\n  {\n    name: dictionary.original,\n    type: 'Default',\n    option: null,\n  },\n  // {\n  //   name: dictionary.invert,\n  //   type: 'Invert',\n  //   option: null,\n  // },\n  {\n    name: dictionary.sepia,\n    type: 'Sepia',\n    option: null,\n  },\n  {\n    name: dictionary.vintage,\n    type: 'vintage',\n    option: null,\n  },\n  {\n    name: 'ぼかし',\n    type: 'Blur',\n    option: { blur: 0.1 },\n  },\n  {\n    name: dictionary.grayscale,\n    type: 'Grayscale',\n    option: null,\n  },\n  // {\n  //   name: dictionary.sharpen,\n  //   type: 'Sharpen',\n  //   option: null,\n  // },\n  // {\n  //   name: dictionary.emboss,\n  //   type: 'Emboss',\n  //   option: null,\n  // },\n];\n","import { IonButton, IonButtons, IonContent, IonFooter, IonHeader, IonIcon, IonRange, IonText, IonToolbar } from '@ionic/angular/standalone';\n\nexport const ionComponents = [IonHeader, IonToolbar, IonButtons, IonButton, IonIcon, IonContent, IonFooter, IonText, IonRange];\n","import { IDictionaryForEditor, IDictionaryForService, IDictionaryForViewer } from './types';\n\nexport const dictionaryForEditor = (): IDictionaryForEditor => ({\n  // UI labels\n  save: '保存',\n  crop: '切り抜き・回転',\n  filter: 'フィルター',\n  brightness: '明るさ',\n\n  // Filter labels\n  original: 'オリジナル',\n  invert: '反転',\n  sepia: 'セピア',\n  vintage: 'ヴィンテージ',\n  blur: 'ぼかし',\n  grayscale: 'グレースケール',\n  sharpen: '輪郭',\n  emboss: 'エンボス',\n});\n\nexport const dictionaryForViewer = (): IDictionaryForViewer => ({\n  // UI labels\n  delete: '削除',\n});\n\nexport const dictionaryForService = (): IDictionaryForService => ({\n  // UI labels\n  camera: 'カメラ撮影',\n  album: 'アルバムから選択',\n  cancel: 'キャンセル',\n});\n","import { addIcons } from 'ionicons';\nimport {\n  checkmarkOutline,\n  closeOutline,\n  colorFilterOutline,\n  cropOutline,\n  expandOutline,\n  refreshOutline,\n  removeOutline,\n  send,\n  squareOutline,\n  sunnyOutline,\n  tabletLandscapeOutline,\n} from 'ionicons/icons';\n\nexport const initializeViewerIcons = (): void => {\n  addIcons({\n    closeOutline,\n    removeOutline,\n  });\n};\n\nexport const initializeEditorIcons = (): void => {\n  addIcons({\n    closeOutline,\n    send,\n    cropOutline,\n    colorFilterOutline,\n    sunnyOutline,\n    expandOutline,\n    tabletLandscapeOutline,\n    squareOutline,\n    refreshOutline,\n    checkmarkOutline,\n  });\n};\n\nexport const waitToFindDom = (nativeElement: HTMLElement, selector: string): Promise<void> => {\n  return new Promise<void>((resolve) => {\n    const interval = setInterval(() => {\n      const find = nativeElement.querySelector(selector);\n      if (find) {\n        clearInterval(interval);\n        resolve();\n      }\n    });\n  });\n};\n","import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  effect,\n  ElementRef,\n  inject,\n  input,\n  OnDestroy,\n  OnInit,\n  signal,\n  viewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { IonContent, ModalController, RangeCustomEvent, ViewDidEnter, ViewDidLeave } from '@ionic/angular/standalone';\nimport ImageEditor from 'tui-image-editor';\nimport { filterPreset } from '../../filter-preset';\nimport { Subscription } from 'rxjs';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { IDictionaryForEditor, IFilter, IPhotoEditorDismiss, ISize } from '../../types';\nimport { ionComponents } from '../../ion-components';\nimport { dictionaryForEditor } from '../../dictionaries';\nimport { initializeEditorIcons, waitToFindDom } from '../util';\n\n@Component({\n  selector: 'app-editor-image',\n  templateUrl: './photo-editor.page.html',\n  styleUrls: ['../core.scss', './photo-editor.page.scss'],\n  imports: [CommonModule, FormsModule, ...ionComponents],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PhotoEditorPage implements OnInit, OnDestroy, ViewDidEnter, ViewDidLeave {\n  readonly modalCtrl = inject(ModalController);\n\n  protected readonly dictionary = signal<IDictionaryForEditor>(dictionaryForEditor());\n\n  readonly requireSquare = input<boolean, BooleanInput>(false, {\n    transform: coerceBooleanProperty,\n  });\n  readonly labels = input<Partial<IDictionaryForEditor> | undefined>(undefined);\n  readonly setLabels = effect(() => {\n    if (this.labels()) {\n      this.dictionary.update((value) => ({ ...value, ...this.labels() }));\n    }\n  });\n  readonly value = input.required<string>();\n\n  readonly editorRef = viewChild.required<ElementRef>('imageEditor');\n  readonly ionContent = viewChild.required(IonContent, { read: ElementRef });\n\n  readonly filters = signal<IFilter[]>([]);\n  readonly footerMenu = signal<'filter' | 'menu' | 'crop' | 'brightness'>('menu');\n  readonly currentCrop = signal<'cover' | '16/9' | '1' | 'auto'>('cover');\n  readonly currentRotate = signal<number>(0);\n  readonly photoCrop = signal<ISize>({\n    width: 0,\n    height: 0,\n  });\n  readonly isCropped = signal<boolean>(false);\n  private readonly adoptFilter = signal<IFilter | undefined>(undefined);\n  protected readonly filterPreset = computed(() => filterPreset(this.dictionary()));\n\n  private readonly footerMenu$ = toObservable(this.footerMenu);\n\n  private readonly initSubscription$: Subscription[] = [];\n  private readonly filterImageSize = 240;\n  private editorInstance!: ImageEditor;\n\n  private canvasContainerObserver: MutationObserver = new MutationObserver((mutationsList: MutationRecord[]) => {\n    if (mutationsList.find((mutation) => mutation.type === 'attributes' && mutation.attributeName === 'style')) {\n      // Cover the image editor with the parent element\n      const editorRef = this.editorRef();\n      editorRef.nativeElement.style.minWidth = mutationsList[0].target.parentElement!.style.maxWidth;\n      editorRef.nativeElement.style.minHeight = mutationsList[0].target.parentElement!.style.maxHeight;\n\n      this.photoCrop.set({\n        width: mutationsList[0].target.parentElement!.querySelector('canvas')!.width,\n        height: mutationsList[0].target.parentElement!.querySelector('canvas')!.height,\n      });\n    }\n  });\n\n  constructor() {\n    initializeEditorIcons();\n  }\n\n  ngOnInit() {\n    this.initSubscription$.push(\n      this.footerMenu$.subscribe((value) => {\n        if (value === 'filter') {\n          this.initializeFilterMenu().then();\n        }\n        if (value === 'crop') {\n          this.editorInstance.startDrawingMode('CROPPER');\n          this.changeCrop(this.requireSquare() ? '1' : 'cover');\n        }\n      }),\n    );\n  }\n\n  ngOnDestroy() {\n    this.initSubscription$.forEach((subscription) => subscription.unsubscribe());\n  }\n\n  async ionViewDidEnter() {\n    this.editorInstance = new ImageEditor(this.editorRef().nativeElement, {\n      cssMaxWidth: this.ionContent().nativeElement.clientWidth - 32,\n      cssMaxHeight: this.ionContent().nativeElement.clientHeight - 32,\n    });\n    waitToFindDom(this.editorRef().nativeElement, '.tui-image-editor-canvas-container').then(() => {\n      this.canvasContainerObserver.observe(this.editorRef().nativeElement.querySelector('.tui-image-editor-canvas-container'), {\n        attributes: true,\n        childList: false,\n        subtree: true,\n      });\n    });\n    const blob = await fetch(this.value()).then((res) => res.blob());\n    await this.editorInstance.loadImageFromFile(new File([blob], 'data.png', { type: blob.type }));\n    this.footerMenu.set(this.requireSquare() ? 'crop' : 'menu');\n  }\n\n  ionViewDidLeave() {\n    this.editorInstance.destroy();\n    this.canvasContainerObserver.disconnect();\n  }\n\n  changeCrop(crop: 'cover' | '16/9' | '1' | 'auto') {\n    const rect = crop === 'cover' ? this.photoCrop().width / this.photoCrop().height : crop === '16/9' ? 16 / 9 : 1;\n    this.editorInstance.setCropzoneRect(crop !== 'auto' ? rect : undefined);\n    this.currentCrop.set(crop);\n  }\n\n  async rotate() {\n    this.editorInstance.stopDrawingMode();\n    await this.editorInstance.rotate(90);\n    this.currentRotate.update((value) => value + 90);\n    this.editorInstance.startDrawingMode('CROPPER');\n    requestAnimationFrame(() => this.changeCrop(this.currentCrop()));\n  }\n\n  async closeCrop(type: 'cancel' | 'apply') {\n    if (this.footerMenu() === 'crop') {\n      if (type === 'cancel') {\n        await this.editorInstance.rotate(this.currentRotate() * -1);\n      } else {\n        await this.editorInstance.crop(this.editorInstance.getCropzoneRect());\n        this.isCropped.set(true);\n      }\n      this.currentRotate.set(0);\n      this.currentCrop.set('cover');\n      this.editorInstance.stopDrawingMode();\n    } else if (this.footerMenu() === 'brightness') {\n      if (type === 'cancel' && this.editorInstance.hasFilter('brightness')) {\n        await this.editorInstance.removeFilter('brightness');\n      }\n    }\n    this.footerMenu.set('menu');\n  }\n\n  async changeRange(event: RangeCustomEvent) {\n    if (this.editorInstance.hasFilter('brightness')) {\n      await this.editorInstance.removeFilter('brightness');\n    }\n    await this.editorInstance.applyFilter('brightness', {\n      brightness: Number(event.detail.value) / 255,\n    });\n  }\n\n  imageSave() {\n    const value = this.editorInstance.toDataURL();\n    this.modalCtrl.dismiss({ value } as IPhotoEditorDismiss);\n  }\n\n  private async initializeFilterMenu() {\n    const filters: IFilter[] = [];\n\n    const defaultInstance = new ImageEditor(document.createElement('div'), {\n      cssMaxWidth: this.filterImageSize,\n      cssMaxHeight: (this.photoCrop().height * this.filterImageSize) / this.photoCrop().width,\n    });\n    const blob = await fetch(\n      this.editorInstance.toDataURL({\n        multiplier: this.filterImageSize / this.photoCrop().width,\n      }),\n    ).then((res) => res.blob());\n    await defaultInstance.loadImageFromFile(new File([blob], 'defaultInstance.png', { type: blob.type }));\n\n    for (const filter of this.filterPreset()) {\n      if (filter.type !== 'Default') {\n        await defaultInstance.applyFilter(filter.type, filter.option);\n      }\n      filters.push({\n        name: filter.name,\n        type: filter.type,\n        option: filter.option,\n        data: defaultInstance.toDataURL(),\n        width: this.filterImageSize,\n        height: (this.photoCrop().height * this.filterImageSize) / this.photoCrop().width,\n      });\n      if (filter.type !== 'Default') {\n        await defaultInstance.removeFilter(filter.type);\n      }\n    }\n    this.filters.set(filters);\n    defaultInstance.destroy();\n  }\n\n  async filterImage(filter: IFilter) {\n    if (this.adoptFilter()) {\n      await this.editorInstance.removeFilter(this.adoptFilter()!.type);\n    }\n    if (filter.type === 'Default') {\n      this.adoptFilter.set(undefined);\n      return;\n    }\n    await this.editorInstance.applyFilter(filter.type, filter.option);\n    this.adoptFilter.set(filter);\n  }\n}\n","<ion-header>\n  <ion-toolbar>\n    <ion-buttons slot=\"start\"\n      ><ion-button (click)=\"modalCtrl.dismiss()\"><ion-icon name=\"close-outline\" slot=\"icon-only\"></ion-icon></ion-button\n    ></ion-buttons>\n    <ion-buttons slot=\"end\">\n      <ion-button color=\"photo-editor-primary\" fill=\"solid\" type=\"submit\" [disabled]=\"!['menu', 'filter'].includes(footerMenu())\" (click)=\"imageSave()\">\n        {{ dictionary().save }}\n      </ion-button>\n    </ion-buttons>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\" [scrollY]=\"false\">\n  <div #imageEditor></div>\n</ion-content>\n<ion-footer>\n  <ion-toolbar>\n    @if (this.footerMenu() === 'menu') {\n      <aside class=\"ion-justify-content-center\">\n        <button (click)=\"footerMenu.set('crop')\">\n          <ion-text>{{ dictionary().crop }}</ion-text>\n          <ion-icon name=\"crop-outline\" size=\"large\"></ion-icon>\n        </button>\n        <button (click)=\"footerMenu.set('filter')\">\n          <ion-text>{{ dictionary().filter }}</ion-text>\n          <ion-icon name=\"color-filter-outline\" size=\"large\"></ion-icon>\n        </button>\n        <button (click)=\"footerMenu.set('brightness')\">\n          <ion-text>{{ dictionary().brightness }}</ion-text>\n          <ion-icon name=\"sunny-outline\" size=\"large\"></ion-icon>\n        </button>\n      </aside>\n    }\n\n    @if (this.footerMenu() === 'filter') {\n      <aside>\n        @for (item of filters(); track item) {\n          <button (click)=\"filterImage(item)\">\n            <ion-text>{{ item.name }}</ion-text>\n            <span class=\"image-filter-box\" [style.background-image]=\"'url(' + item.data + ')'\"></span>\n          </button>\n        }\n      </aside>\n    }\n\n    @if (this.footerMenu() === 'crop' && !requireSquare()) {\n      <ion-buttons class=\"ion-justify-content-center submenu-icon-buttons\">\n        <ion-button (click)=\"changeCrop('cover')\" [color]=\"currentCrop() === 'cover' ? 'success' : undefined\">\n          <ion-icon name=\"expand-outline\" slot=\"icon-only\"></ion-icon>\n        </ion-button>\n        <ion-button (click)=\"changeCrop('16/9')\" [color]=\"currentCrop() === '16/9' ? 'success' : undefined\">\n          <ion-icon name=\"tablet-landscape-outline\" slot=\"icon-only\" style=\"transform: scale(1, 0.8)\"></ion-icon>\n        </ion-button>\n        <ion-button (click)=\"changeCrop('1')\" [color]=\"currentCrop() === '1' ? 'success' : undefined\">\n          <ion-icon name=\"square-outline\" slot=\"icon-only\"></ion-icon>\n        </ion-button>\n        <ion-button (click)=\"changeCrop('auto')\" [color]=\"currentCrop() === 'auto' ? 'success' : undefined\">\n          <ion-icon name=\"crop-outline\" slot=\"icon-only\"></ion-icon>\n        </ion-button>\n        <ion-button (click)=\"rotate()\"><ion-icon name=\"refresh-outline\" slot=\"icon-only\"></ion-icon></ion-button>\n      </ion-buttons>\n    }\n\n    @if (['brightness'].includes(this.footerMenu())) {\n      <div class=\"ion-padding ion-margin\">\n        <ion-range [pin]=\"true\" [min]=\"-100\" [max]=\"100\" (ionChange)=\"changeRange($any($event))\"></ion-range>\n      </div>\n    }\n  </ion-toolbar>\n  @if (this.footerMenu() !== 'menu') {\n    <ion-toolbar mode=\"md\">\n      @if (this.footerMenu() === 'filter') {\n        <ion-buttons class=\"ion-justify-content-center\" style=\"margin: 0 8px\">\n          <ion-button fill=\"outline\" shape=\"round\" (click)=\"this.footerMenu.set('menu')\">戻る</ion-button>\n        </ion-buttons>\n      } @else {\n        <ion-buttons slot=\"start\" style=\"min-width: 60px\">\n          @if (!requireSquare() || isCropped()) {\n            <ion-button (click)=\"closeCrop('cancel')\"><ion-icon name=\"close-outline\" slot=\"icon-only\"></ion-icon></ion-button>\n          }</ion-buttons\n        ><ion-text class=\"footer-title\">\n          @if (footerMenu() === 'crop') {\n            {{ dictionary().crop }}\n          } @else if (footerMenu() === 'brightness') {\n            {{ dictionary().brightness }}\n          }</ion-text\n        ><ion-buttons slot=\"end\"\n          ><ion-button (click)=\"closeCrop('apply')\"\n            ><ion-icon name=\"checkmark-outline\" color=\"photo-editor-success\" slot=\"icon-only\"></ion-icon></ion-button\n        ></ion-buttons>\n      }\n    </ion-toolbar>\n  }\n</ion-footer>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  CUSTOM_ELEMENTS_SCHEMA,\n  effect,\n  ElementRef,\n  inject,\n  input,\n  OnDestroy,\n  OnInit,\n  signal,\n  viewChild,\n} from '@angular/core';\nimport { IonicSlides, ModalController } from '@ionic/angular/standalone';\nimport { Navigation, Zoom } from 'swiper/modules';\nimport { fromEvent, Subscription, throttleTime, withLatestFrom, zipWith } from 'rxjs';\nimport { SwiperContainer } from 'swiper/element';\nimport { ionComponents } from '../../ion-components';\nimport { IDictionaryForViewer, IPhotoViewerDismiss } from '../../types';\nimport { register } from 'swiper/element/bundle';\nimport { dictionaryForViewer } from '../../dictionaries';\nimport { BooleanInput, coerceBooleanProperty, coerceNumberProperty, NumberInput } from '@angular/cdk/coercion';\nimport { initializeViewerIcons, waitToFindDom } from '../util';\n\n@Component({\n  selector: 'app-photo-image',\n  templateUrl: './photo-viewer.page.html',\n  styleUrls: ['../core.scss', './photo-viewer.page.scss'],\n  imports: [...ionComponents],\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PhotoViewerPage implements OnInit, OnDestroy {\n  readonly imageUrls = input.required<string[]>();\n  readonly index = input<number, NumberInput>(0, {\n    transform: coerceNumberProperty,\n  });\n  readonly isCircle = input<boolean, BooleanInput>(false, {\n    transform: coerceBooleanProperty,\n  });\n  readonly enableDelete = input<boolean, BooleanInput>(false, {\n    transform: coerceBooleanProperty,\n  });\n  readonly enableFooterSafeArea = input<boolean, BooleanInput>(false, {\n    transform: coerceBooleanProperty,\n  });\n  readonly labels = input<Partial<IDictionaryForViewer>>();\n  readonly setLabels = effect(() => {\n    if (this.labels()) {\n      this.dictionary.update((value) => ({ ...value, ...this.labels() }));\n    }\n  });\n\n  readonly swiper = viewChild.required<ElementRef<SwiperContainer>>('swiper');\n  protected readonly dictionary = signal<IDictionaryForViewer>(dictionaryForViewer());\n\n  readonly watchSwipe$ = new Subscription();\n  readonly modalCtrl = inject(ModalController);\n  private readonly el = inject(ElementRef);\n\n  constructor() {\n    register();\n    initializeViewerIcons();\n  }\n\n  async ngOnInit() {\n    waitToFindDom(this.el.nativeElement, 'swiper-container').then(() => {\n      const index = this.index();\n      const swiper = this.swiper();\n      Object.assign(swiper.nativeElement, {\n        modules: [Navigation, Zoom, IonicSlides],\n        initialSlide: index,\n        slidesPerView: 1,\n        pagination: {\n          enabled: true,\n          clickable: true,\n        },\n        zoom: true,\n      });\n      swiper.nativeElement.initialize();\n      swiper.nativeElement.swiper.zoom.enable();\n\n      swiper.nativeElement.swiper.activeIndex = index;\n      swiper.nativeElement.swiper.update();\n    });\n\n    this.watchSwipe$.add(\n      fromEvent<TouchEvent>(this.el.nativeElement, 'touchstart')\n        .pipe(\n          zipWith(\n            fromEvent<TouchEvent>(this.el.nativeElement, 'touchend').pipe(\n              withLatestFrom(fromEvent<TouchEvent>(this.el.nativeElement, 'touchmove')),\n            ),\n          ),\n          throttleTime(1),\n        )\n        .subscribe(([touchstart, [_, touchmove]]) => {\n          const touchstartClientX = touchstart.touches ? touchstart.touches[0].clientX : (touchstart as any).detail[1].clientX;\n          const touchmoveClientX = touchmove.touches ? touchmove.touches[0].clientX : (touchmove as any).detail[1].clientX;\n\n          const touchstartClientY = touchstart.touches ? touchstart.touches[0].clientY : (touchstart as any).detail[1].clientY;\n          const touchmoveClientY = touchmove.touches ? touchmove.touches[0].clientY : (touchmove as any).detail[1].clientY;\n\n          const xDiff = touchstartClientX - touchmoveClientX;\n          const yDiff = touchstartClientY - touchmoveClientY;\n\n          const slides = (this.swiper() as any).nativeElement.querySelectorAll('swiper-slide') as HTMLElement[];\n          const isZoomed = Array.from(slides).find((slide: HTMLElement) => {\n            return ['swiper-slide-zoomed', 'swiper-slide-active'].every((c) => slide.classList.contains(c));\n          });\n\n          const threshold = touchmove.touches ? -50 : -5;\n\n          if (!isZoomed && Math.abs(xDiff) < Math.abs(threshold) && yDiff < threshold && touchstart.timeStamp <= touchmove.timeStamp) {\n            this.watchSwipe$.unsubscribe();\n            this.modalCtrl.dismiss();\n          }\n        }),\n    );\n  }\n\n  ngOnDestroy() {\n    this.watchSwipe$.unsubscribe();\n  }\n\n  remove() {\n    this.modalCtrl.dismiss({\n      delete: {\n        index: this.swiper().nativeElement.swiper.activeIndex,\n        value: this.imageUrls()[this.swiper().nativeElement.swiper.activeIndex],\n      },\n    } as IPhotoViewerDismiss);\n  }\n}\n","<ion-header [translucent]=\"true\">\n  <ion-toolbar>\n    <ion-buttons slot=\"start\">\n      <ion-button (click)=\"modalCtrl.dismiss()\" class=\"viewer-close-button\">\n        <ion-icon name=\"close-outline\" slot=\"icon-only\"></ion-icon>\n      </ion-button>\n    </ion-buttons>\n    @if (enableDelete()) {\n      <ion-buttons slot=\"end\">\n        <ion-button color=\"photo-editor-danger\" fill=\"solid\" type=\"submit\" (click)=\"remove()\">{{ dictionary().delete }}</ion-button>\n      </ion-buttons>\n    }\n  </ion-toolbar>\n</ion-header>\n\n<ion-content [fullscreen]=\"true\">\n  <swiper-container #swiper>\n    @for (url of imageUrls(); track url) {\n      <swiper-slide>\n        <div class=\"swiper-zoom-container\"><img [src]=\"url\" alt=\"\" [class.circle]=\"isCircle()\" /></div>\n      </swiper-slide>\n    }\n  </swiper-container>\n</ion-content>\n\n@if (enableFooterSafeArea()) {\n  <!-- use for safe area-->\n  <ion-footer>\n    <ion-toolbar style=\"--border-width: 0; --min-height: 0\"></ion-toolbar>\n  </ion-footer>\n}\n","export enum PhotoEditorErrors {\n  initialize = 'input dom is not found',\n  cancel = 'user canceled',\n  type = 'upload file is not image.',\n}\n","import { inject, Injectable, signal } from '@angular/core';\nimport { ActionSheetController, Platform } from '@ionic/angular/standalone';\nimport { Camera, CameraResultType, CameraSource, ImageOptions } from '@capacitor/camera';\nimport ImageEditor from 'tui-image-editor';\nimport { PhotoEditorErrors } from '../photoEditorErrors';\nimport { dictionaryForService } from '../dictionaries';\nimport { IDictionaryForService } from '../types';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class PhotoFileService {\n  private readonly $photoMaxSize = signal<number>(1000);\n  private readonly actionSheetCtrl = inject(ActionSheetController);\n  private readonly platform = inject(Platform);\n  private readonly dictionary = signal<IDictionaryForService>(dictionaryForService());\n\n  set photoMaxSize(value: number) {\n    this.$photoMaxSize.set(value);\n  }\n\n  set labels(d: IDictionaryForService) {\n    this.dictionary.update((value) => ({ ...value, ...d }));\n  }\n\n  async loadPhoto(limit: number): Promise<string[]> {\n    /**\n     * Using Input for browser\n     */\n    if (!this.platform.is('capacitor')) {\n      return this.getPictureFromBrowser();\n    }\n\n    const actionSheet = await this.actionSheetCtrl.create({\n      buttons: [\n        {\n          text: this.dictionary().camera,\n          handler: () => {\n            actionSheet.dismiss('camera');\n          },\n        },\n        {\n          text: this.dictionary().album,\n          handler: () => {\n            actionSheet.dismiss('album');\n          },\n        },\n        {\n          text: this.dictionary().cancel,\n          role: 'cancel',\n        },\n      ],\n    });\n    await actionSheet.present();\n    const { data } = await actionSheet.onDidDismiss<'camera' | 'album'>();\n    if (!data) {\n      return Promise.reject(PhotoEditorErrors.cancel);\n    }\n\n    if (data === 'camera') {\n      const defaultCamera: ImageOptions = {\n        quality: 100,\n        width: this.$photoMaxSize(),\n        allowEditing: false,\n        resultType: CameraResultType.DataUrl,\n        source: CameraSource.Camera,\n        presentationStyle: 'popover',\n      };\n      const image = await Camera.getPhoto(defaultCamera).catch(() => undefined);\n      if (!image?.dataUrl) {\n        return Promise.reject(PhotoEditorErrors.cancel);\n      }\n\n      if (!image.dataUrl.includes('capacitor://localhost')) {\n        return [image.dataUrl];\n      }\n      return Promise.all([image.dataUrl].map(async (image) => await this.loadPhotoFromFilePath(image)));\n    }\n\n    if (data === 'album') {\n      const images = await Camera.pickImages({\n        quality: 100,\n        width: this.$photoMaxSize(),\n        limit,\n        presentationStyle: 'popover',\n      }).catch(() => undefined);\n\n      if (!images) {\n        return Promise.reject(PhotoEditorErrors.cancel);\n      }\n\n      return Promise.all(images.photos.map(async (image) => await this.loadPhotoFromFilePath(image.webPath)));\n    }\n\n    // Not run on this line. This is for lint\n    return [];\n  }\n\n  private getPictureFromBrowser(): Promise<string[]> {\n    const inputFile: HTMLInputElement | null = document.querySelector('input#browserPhotoUploader');\n\n    if (!inputFile) {\n      return Promise.reject(PhotoEditorErrors.initialize);\n    }\n\n    return new Promise((resolve, reject) => {\n      const cancelMethod = () => {\n        inputFile!.removeEventListener('cancel', cancelMethod, false);\n        inputFile!.removeEventListener('change', changeMethod, false);\n\n        reject(PhotoEditorErrors.cancel);\n      };\n      const changeMethod = (e: Event) => {\n        inputFile!.removeEventListener('cancel', cancelMethod, false);\n        inputFile!.removeEventListener('change', changeMethod, false);\n\n        if (!(e.target as HTMLInputElement).files || !(e.target as HTMLInputElement).files![0]) {\n          reject(PhotoEditorErrors.cancel);\n        }\n        const file = (e.target as HTMLInputElement).files![0];\n        const reader = new FileReader();\n\n        reader.onload = (() => {\n          if (file.type.indexOf('image') < 0) {\n            reject(PhotoEditorErrors.type);\n          }\n\n          return async (event) => {\n            inputFile.value = '';\n            const result = event.target!.result as string;\n            const data = await this.loadPhotoFromFilePath(result);\n            resolve([data]);\n          };\n        })();\n\n        reader.readAsDataURL(file);\n      };\n\n      inputFile!.addEventListener('cancel', cancelMethod, false);\n      inputFile!.addEventListener('change', changeMethod, false);\n      inputFile.click();\n    });\n  }\n\n  private async loadPhotoFromFilePath(filePath: string): Promise<string> {\n    const defaultInstance = new ImageEditor(document.createElement('div'), {\n      cssMaxWidth: this.$photoMaxSize(),\n      cssMaxHeight: this.$photoMaxSize(),\n    });\n    const blob = await fetch(filePath).then((res) => res.blob());\n    const loaded = await defaultInstance.loadImageFromFile(new File([blob], 'data.png', { type: blob.type }));\n\n    const maxSize = Math.max(loaded.newWidth, loaded.newHeight);\n    const dataUrl = defaultInstance.toDataURL({\n      multiplier: this.$photoMaxSize() / maxSize,\n    });\n    defaultInstance.destroy();\n\n    return dataUrl;\n  }\n}\n","/*\n * Public API Surface of photo-editor\n */\n\nexport * from './lib/pages/photo-editor/photo-editor.page';\nexport * from './lib/pages/photo-viewer/photo-viewer.page';\nexport * from './lib/services/photo-file.service';\nexport * from './lib/types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}