{"version":3,"file":"ng-nest-ui-image.mjs","sources":["../../../../lib/ng-nest/ui/image/image.property.ts","../../../../lib/ng-nest/ui/image/image-preview.component.ts","../../../../lib/ng-nest/ui/image/image-preview.component.html","../../../../lib/ng-nest/ui/image/image-group.token.ts","../../../../lib/ng-nest/ui/image/image.component.ts","../../../../lib/ng-nest/ui/image/image.component.html","../../../../lib/ng-nest/ui/image/image-group.component.ts","../../../../lib/ng-nest/ui/image/image-group.component.html","../../../../lib/ng-nest/ui/image/image.module.ts","../../../../lib/ng-nest/ui/image/ng-nest-ui-image.ts"],"sourcesContent":["import { Component, input, InputSignal, output } from '@angular/core';\r\nimport { XProperty, XPropertyFunction, XToCssPixelValue } from '@ng-nest/ui/core';\r\nimport type { XNumber, XTemplate } from '@ng-nest/ui/core';\r\n\r\n/**\r\n * Image\r\n * @selector x-image\r\n * @decorator component\r\n */\r\nexport const XImagePrefix = 'x-image';\r\nconst X_IMAGE_CONFIG_NAME = 'image';\r\n\r\n/**\r\n * Image Property\r\n */\r\n@Component({ selector: `${XImagePrefix}-property`, template: '' })\r\nexport class XImageProperty extends XPropertyFunction(X_IMAGE_CONFIG_NAME) {\r\n  /**\r\n   * @zh_CN 图片显示地址\r\n   * @en_US Picture display address\r\n   * @example\r\n   *\r\n   * ```html\r\n   * <x-image\r\n   *   width=\"100px\"\r\n   *   height=\"100px\"\r\n   *   src=\"https://ngnest.com/static/docs/course/rbac/1-introduction/demo/1__ng-nest-admin/light.png\"\r\n   * ></x-image>\r\n   * ```\r\n   *\r\n   */\r\n  readonly src = input<string>();\r\n  /**\r\n   * @zh_CN 图片宽度\r\n   * @en_US Picture width\r\n   * @example\r\n   *\r\n   * ```html\r\n   * <x-image\r\n   *   width=\"100px\"\r\n   *   height=\"100px\"\r\n   *   src=\"https://ngnest.com/static/docs/course/rbac/1-introduction/demo/1__ng-nest-admin/light.png\"\r\n   * ></x-image>\r\n   * ```\r\n   *\r\n   */\r\n  readonly width = input<string, XNumber>('', { transform: XToCssPixelValue });\r\n  /**\r\n   * @zh_CN 图片高度\r\n   * @en_US Picture height\r\n   * @example\r\n   *\r\n   * ```html\r\n   * <x-image\r\n   *   width=\"100px\"\r\n   *   height=\"100px\"\r\n   *   src=\"https://ngnest.com/static/docs/course/rbac/1-introduction/demo/1__ng-nest-admin/light.png\"\r\n   * ></x-image>\r\n   * ```\r\n   *\r\n   */\r\n  readonly height = input<string, XNumber>('', { transform: XToCssPixelValue });\r\n  /**\r\n   * @zh_CN 图像描述\r\n   * @en_US Image description\r\n   * @example\r\n   *\r\n   * ```html\r\n   * <x-image\r\n   *   alt=\"ng-nest-admin-light\"\r\n   *   width=\"100px\"\r\n   *   height=\"100px\"\r\n   *   src=\"https://ngnest.com/static/docs/course/rbac/1-introduction/demo/1__ng-nest-admin/light.png\"\r\n   * ></x-image>\r\n   * ```\r\n   *\r\n   */\r\n  readonly alt = input<string>();\r\n  /**\r\n   * @zh_CN 加载失败显示的地址\r\n   * @en_US Load fault tolerance address\r\n   * @example\r\n   *\r\n   * ```html\r\n   * <x-image\r\n   *   width=\"100px\"\r\n   *   height=\"100px\"\r\n   *   src=\"error\"\r\n   *   fallback=\"data:image/png;base64,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\"\r\n   * ></x-image>\r\n   * ```\r\n   *\r\n   */\r\n  readonly fallback = input<string>();\r\n  /**\r\n   * @zh_CN 预览文字\r\n   * @en_US Preview text\r\n   * @default '预览'\r\n   * @example\r\n   *\r\n   * ```html\r\n   * <x-image\r\n   *   width=\"100px\"\r\n   *   height=\"100px\"\r\n   *   src=\"https://ngnest.com/static/docs/course/rbac/1-introduction/demo/1__ng-nest-admin/light.png\"\r\n   *   previewText=\"查看\"\r\n   * ></x-image>\r\n   * ```\r\n   *\r\n   */\r\n  readonly previewText = input<string>(this.config?.previewText!);\r\n  /**\r\n   * @zh_CN 渐进加载显示的图片地址\r\n   * @en_US Progressive loading image addresses\r\n   */\r\n  readonly placeholder = input<string>();\r\n  /**\r\n   * @zh_CN 自定义预览操作\r\n   * @en_US Custom preview operation\r\n   */\r\n  readonly previewTpl = input<XTemplate>();\r\n  /**\r\n   * @zh_CN 图片加载错误\r\n   * @en_US Picture load failed\r\n   * @example\r\n   *\r\n   * ```html\r\n   * <x-image\r\n   *   width=\"100px\"\r\n   *   height=\"100px\"\r\n   *   src=\"error\"\r\n   *   (error)=\"onError($event)\"\r\n   * ></x-image>\r\n   * ```\r\n   *\r\n   * ```typescript\r\n   * onError(event: ErrorEvent) {\r\n   *   console.log(event)\r\n   * }\r\n   * ```\r\n   *\r\n   */\r\n  readonly error = output<ErrorEvent>();\r\n  /**\r\n   * @zh_CN 图片加载完成\r\n   * @en_US Picture loading complete\r\n   * @example\r\n   *\r\n   * ```html\r\n   * <x-image\r\n   *   width=\"100px\"\r\n   *   height=\"100px\"\r\n   *   src=\"https://ngnest.com/static/docs/course/rbac/1-introduction/demo/1__ng-nest-admin/light.png\"\r\n   *   (load)=\"onLoad($event)\"\r\n   * ></x-image>\r\n   * ```\r\n   *\r\n   * ```typescript\r\n   * onLoad(event: Event) {\r\n   *   console.log(event)\r\n   * }\r\n   * ```\r\n   *\r\n   */\r\n  readonly load = output<Event>();\r\n}\r\n\r\n/**\r\n * @zh_CN 图片节点数据\r\n * @en_US Image node data\r\n */\r\nexport interface XImageNode {\r\n  /**\r\n   * @zh_CN 图片显示地址\r\n   * @en_US Picture display address\r\n   */\r\n  src?: string;\r\n  /**\r\n   * @zh_CN 图像描述\r\n   * @en_US Image description\r\n   */\r\n  alt?: string;\r\n  /**\r\n   * @zh_CN 加载失败显示的地址\r\n   * @en_US Load fault tolerance address\r\n   */\r\n  fallback?: string;\r\n  /**\r\n   * @zh_CN 当前激活的图片\r\n   * @en_US Current activated pictures\r\n   */\r\n  activated?: boolean;\r\n}\r\n\r\n/**\r\n * Image Preview\r\n * @selector x-image-preview\r\n * @decorator component\r\n */\r\nexport const XImagePreviewPrefix = 'x-image-preview';\r\n\r\n/**\r\n * Image Preview Property\r\n */\r\n@Component({ selector: `${XImagePreviewPrefix}-property`, template: '' })\r\nexport class XImagePreviewProperty extends XProperty {}\r\n\r\n/**\r\n * Image Group\r\n * @selector x-image-group\r\n * @decorator component\r\n */\r\nexport const XImageGroupPrefix = 'x-image-group';\r\n\r\n/**\r\n * @zh_CN 图片组件定义\r\n * @en_US Image component definition\r\n */\r\nexport interface XImageHandle {\r\n  src: InputSignal<string | undefined>;\r\n  alt: InputSignal<string | undefined>;\r\n  fallback: InputSignal<string | undefined>;\r\n}\r\n","import {\r\n  Component,\r\n  ViewEncapsulation,\r\n  ElementRef,\r\n  ChangeDetectionStrategy,\r\n  inject,\r\n  OnInit,\r\n  signal,\r\n  computed,\r\n  viewChild\r\n} from '@angular/core';\r\nimport { XImageNode, XImagePreviewPrefix, XImagePreviewProperty } from './image.property';\r\nimport { XDialogCloseDirective, X_DIALOG_DATA } from '@ng-nest/ui/dialog';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { XIconComponent } from '@ng-nest/ui/icon';\r\nimport { DragDropModule } from '@angular/cdk/drag-drop';\r\n\r\n@Component({\r\n  selector: `${XImagePreviewPrefix}`,\r\n  imports: [XIconComponent, DragDropModule, XDialogCloseDirective],\r\n  templateUrl: './image-preview.component.html',\r\n  styleUrls: ['./image-preview.component.scss'],\r\n  encapsulation: ViewEncapsulation.None,\r\n  changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class XImagePreviewComponent extends XImagePreviewProperty implements OnInit {\r\n  imgScale3d = signal({\r\n    x: 1,\r\n    y: 1,\r\n    z: 1\r\n  });\r\n  rotate = signal(0);\r\n\r\n  position = signal({\r\n    x: 0,\r\n    y: 0\r\n  });\r\n\r\n  activated = signal<XImageNode | undefined>(undefined);\r\n  total = signal(1);\r\n  current = signal(1);\r\n\r\n  private document = inject(DOCUMENT);\r\n\r\n  wrapperTransform = computed(() => {\r\n    return `translate3d(${this.position().x}px, ${this.position().y}px, 0)`;\r\n  });\r\n  imgTransform = computed(() => {\r\n    return `scale3d(${this.imgScale3d().x}, ${this.imgScale3d().y}, ${this.imgScale3d().z}) rotate(${this.rotate()}deg)`;\r\n  });\r\n\r\n  imageRef = viewChild.required<ElementRef<HTMLImageElement>>('imageRef');\r\n\r\n  data = inject<XImageNode[]>(X_DIALOG_DATA);\r\n\r\n  ngOnInit() {\r\n    this.setActivated();\r\n  }\r\n\r\n  initialization() {\r\n    this.imgScale3d.set({\r\n      x: 1,\r\n      y: 1,\r\n      z: 1\r\n    });\r\n    this.rotate.set(0);\r\n    this.position.set({\r\n      x: 0,\r\n      y: 0\r\n    });\r\n  }\r\n\r\n  setActivated() {\r\n    if (!this.data) return;\r\n    if (this.data.length === 1) {\r\n      this.activated.set(this.data[0]);\r\n      this.total.set(1);\r\n      this.current.set(1);\r\n    } else {\r\n      this.total.set(this.data.length);\r\n      this.activated.set(\r\n        this.data.find((x, index) => {\r\n          if (x.activated) {\r\n            this.current.set(index + 1);\r\n            return true;\r\n          }\r\n          return false;\r\n        })\r\n      );\r\n    }\r\n  }\r\n\r\n  onCurrentChange(num: number) {\r\n    this.current.update((x) => x + num);\r\n    this.activated.set(this.data[this.current() - 1]);\r\n    this.initialization();\r\n  }\r\n\r\n  onRotate(deg: number) {\r\n    this.rotate.update((x) => x + deg);\r\n  }\r\n\r\n  onScale(zoom: number) {\r\n    const currentScale = this.imgScale3d().x;\r\n    let newScale: number;\r\n    \r\n    if (zoom > 0) {\r\n      // �Ŵ�ʹ��ָ�����������������ֵ\r\n      newScale = Math.min(currentScale * 1.2, 5);\r\n    } else {\r\n      // ��С��ʹ��ָ�����٣���������Сֵ\r\n      newScale = Math.max(currentScale / 1.2, 0.1);\r\n    }\r\n    \r\n    if (newScale !== currentScale) {\r\n      this.imgScale3d.update((item) => {\r\n        item.x = newScale;\r\n        item.y = newScale;\r\n        return { ...item };\r\n      });\r\n      // ���ź����¼���λ�ã���ֹͼƬ�����߽�\r\n      setTimeout(() => this.adjustPosition(), 0);\r\n    }\r\n  }\r\n\r\n  onWheel(event: WheelEvent) {\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n    \r\n    const delta = event.deltaY > 0 ? -1 : 1;\r\n    this.onScale(delta);\r\n  }\r\n\r\n  onDragReleased() {\r\n    this.adjustPosition();\r\n  }\r\n\r\n  private adjustPosition() {\r\n    const img = this.imageRef().nativeElement;\r\n    const scale = this.imgScale3d().x;\r\n    const rotation = this.rotate() % 360;\r\n    \r\n    // ��ȡͼƬ��ԭʼ�ߴ�\r\n    const imgWidth = img.naturalWidth || img.offsetWidth;\r\n    const imgHeight = img.naturalHeight || img.offsetHeight;\r\n    \r\n    // �������ź�ĳߴ�\r\n    let scaledWidth = imgWidth * scale;\r\n    let scaledHeight = imgHeight * scale;\r\n    \r\n    // ���ͼƬ��ת��90�Ȼ�270�ȣ���������\r\n    const isRotated = Math.abs(rotation) === 90 || Math.abs(rotation) === 270;\r\n    if (isRotated) {\r\n      [scaledWidth, scaledHeight] = [scaledHeight, scaledWidth];\r\n    }\r\n    \r\n    // ��ȡ�����ߴ�\r\n    const containerWidth = this.document.documentElement.clientWidth;\r\n    const containerHeight = this.document.documentElement.clientHeight;\r\n    \r\n    // ��ȡ��ǰͼƬ��λ��\r\n    const rect = img.getBoundingClientRect();\r\n    const currentX = this.position().x;\r\n    const currentY = this.position().y;\r\n    \r\n    // ����ͼƬ���ĵ�������������ĵ�ƫ��\r\n    const imgCenterX = rect.left + rect.width / 2;\r\n    const imgCenterY = rect.top + rect.height / 2;\r\n    const containerCenterX = containerWidth / 2;\r\n    const containerCenterY = containerHeight / 2;\r\n    \r\n    let newX = currentX;\r\n    let newY = currentY;\r\n    \r\n    // ���ͼƬ��������������ק��Χ\r\n    if (scaledWidth > containerWidth) {\r\n      const maxOffsetX = (scaledWidth - containerWidth) / 2;\r\n      const offsetX = imgCenterX - containerCenterX;\r\n      \r\n      if (offsetX > maxOffsetX) {\r\n        newX = currentX - (offsetX - maxOffsetX);\r\n      } else if (offsetX < -maxOffsetX) {\r\n        newX = currentX - (offsetX + maxOffsetX);\r\n      }\r\n    } else {\r\n      // ���ͼƬ������С��������ʾ\r\n      newX = 0;\r\n    }\r\n    \r\n    if (scaledHeight > containerHeight) {\r\n      const maxOffsetY = (scaledHeight - containerHeight) / 2;\r\n      const offsetY = imgCenterY - containerCenterY;\r\n      \r\n      if (offsetY > maxOffsetY) {\r\n        newY = currentY - (offsetY - maxOffsetY);\r\n      } else if (offsetY < -maxOffsetY) {\r\n        newY = currentY - (offsetY + maxOffsetY);\r\n      }\r\n    } else {\r\n      // ���ͼƬ������С��������ʾ\r\n      newY = 0;\r\n    }\r\n    \r\n    this.position.set({ x: newX, y: newY });\r\n  }\r\n}\r\n","<div class=\"x-image-preview\">\r\n  <div class=\"x-image-preview-header\">\r\n    <div class=\"x-image-preview-header-left\">\r\n      @if (total() != 1) {\r\n        <span class=\"x-image-preview-current\">{{ current() }} / {{ total() }}</span>\r\n      }\r\n    </div>\r\n    <div class=\"x-image-preview-header-center\">\r\n      <x-icon type=\"fto-corner-up-left\" (click)=\"onRotate(-90)\"></x-icon>\r\n      <x-icon type=\"fto-corner-up-right\" (click)=\"onRotate(90)\"></x-icon>\r\n      <x-icon\r\n        type=\"fto-zoom-out\"\r\n        [class.x-image-preview-disabled]=\"imgScale3d().x <= 0.1\"\r\n        (click)=\"imgScale3d().x > 0.1 && onScale(-1)\"\r\n      ></x-icon>\r\n      <x-icon type=\"fto-zoom-in\" [class.x-image-preview-disabled]=\"imgScale3d().x >= 5\" (click)=\"imgScale3d().x < 5 && onScale(1)\"></x-icon>\r\n    </div>\r\n    <div class=\"x-image-preview-header-right\">\r\n      <x-icon type=\"fto-x\" x-dialog-close></x-icon>\r\n    </div>\r\n  </div>\r\n  <div\r\n    class=\"x-image-preview-wrapper\"\r\n    cdkDrag\r\n    [style.transform]=\"wrapperTransform()\"\r\n    [cdkDragFreeDragPosition]=\"position()\"\r\n    (cdkDragReleased)=\"onDragReleased()\"\r\n    (wheel)=\"onWheel($event)\"\r\n  >\r\n    <img\r\n      #imageRef\r\n      [src]=\"activated()?.src!\"\r\n      [attr.alt]=\"activated()?.alt!\"\r\n      cdkDragHandle\r\n      [style.transform]=\"imgTransform()\"\r\n    />\r\n  </div>\r\n  @if (data && data.length > 1) {\r\n    <div\r\n      [class.x-image-preview-disabled]=\"current() === 1\"\r\n      class=\"x-image-preview-left\"\r\n      (click)=\"current() > 1 && onCurrentChange(-1)\"\r\n    >\r\n      <x-icon type=\"fto-chevron-left\"></x-icon>\r\n    </div>\r\n    <div\r\n      [class.x-image-preview-disabled]=\"current() === total()\"\r\n      class=\"x-image-preview-right\"\r\n      (click)=\"current() != total() && onCurrentChange(1)\"\r\n    >\r\n      <x-icon type=\"fto-chevron-right\"></x-icon>\r\n    </div>\r\n  }\r\n</div>\r\n","import { InjectionToken, WritableSignal } from '@angular/core';\r\nimport type { XImageHandle } from './image.property';\r\n\r\nexport interface XImageGroupContext {\r\n  images: WritableSignal<XImageHandle[]>;\r\n  addImage(image: XImageHandle): void;\r\n  removeImage(image: XImageHandle): void;\r\n}\r\n\r\nexport const X_IMAGE_GROUP_CONTEXT = new InjectionToken<XImageGroupContext>('X_IMAGE_GROUP_CONTEXT');\r\n","import {\r\n  Component,\r\n  ViewEncapsulation,\r\n  ChangeDetectionStrategy,\r\n  OnInit,\r\n  inject,\r\n  computed,\r\n  signal,\r\n  OnDestroy,\r\n  effect\r\n} from '@angular/core';\r\nimport { XImageHandle, XImageNode, XImagePrefix, XImageProperty } from './image.property';\r\nimport { XConfigService } from '@ng-nest/ui/core';\r\nimport { XDialogService } from '@ng-nest/ui/dialog';\r\nimport { XImagePreviewComponent } from './image-preview.component';\r\nimport { XI18nService, zh_CN } from '@ng-nest/ui/i18n';\r\nimport { map } from 'rxjs';\r\nimport { XIconComponent } from '@ng-nest/ui/icon';\r\nimport { XOutletDirective } from '@ng-nest/ui/outlet';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { X_IMAGE_GROUP_CONTEXT } from './image-group.token';\r\n\r\n@Component({\r\n  selector: `${XImagePrefix}`,\r\n  imports: [XIconComponent, XOutletDirective],\r\n  templateUrl: './image.component.html',\r\n  styleUrls: ['./image.component.scss'],\r\n  encapsulation: ViewEncapsulation.None,\r\n  changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class XImageComponent extends XImageProperty implements OnInit, OnDestroy, XImageHandle {\r\n  private dialog = inject(XDialogService);\r\n  private i18n = inject(XI18nService);\r\n  private group = inject(X_IMAGE_GROUP_CONTEXT, { optional: true });\r\n  configService = inject(XConfigService);\r\n  isError = signal(false);\r\n  isLoaded = signal(false);\r\n\r\n  locale = toSignal(this.i18n.localeChange.pipe(map((x) => x.image!)), { initialValue: zh_CN.image });\r\n\r\n  previewTextSignal = computed(() => {\r\n    return this.previewText() || this.locale().previewText;\r\n  });\r\n\r\n  constructor() {\r\n    super();\r\n    effect(() => {\r\n      this.src();\r\n      this.isLoaded.set(false);\r\n    });\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    this.group && this.group.addImage(this);\r\n  }\r\n\r\n  ngOnDestroy() {\r\n    this.group && this.group.removeImage(this);\r\n  }\r\n\r\n  onPreview() {\r\n    let data: XImageNode[] = [];\r\n    if (this.group) {\r\n      const activatedIndex = this.group.images().indexOf(this);\r\n      data = this.group.images().map((x, index) => ({\r\n        src: x.src(),\r\n        alt: x.alt(),\r\n        fallback: x.fallback(),\r\n        activated: index === activatedIndex\r\n      }));\r\n    } else {\r\n      data = [{ src: this.src(), alt: this.alt(), fallback: this.fallback() }];\r\n    }\r\n    this.dialog.create(XImagePreviewComponent, {\r\n      width: '100%',\r\n      height: '100%',\r\n      className: 'x-image-preview-portal',\r\n      data\r\n    });\r\n  }\r\n\r\n  onError(event: ErrorEvent) {\r\n    this.isError.set(true);\r\n    this.error.emit(event);\r\n  }\r\n\r\n  onLoad(event: Event) {\r\n    this.isLoaded.set(true);\r\n    this.isError.set(false);\r\n    this.load.emit(event);\r\n  }\r\n}\r\n","<div class=\"x-image\">\r\n  <img\r\n    [hidden]=\"(placeholder() && !isLoaded()) || isError()\"\r\n    class=\"x-image-img\"\r\n    [src]=\"src()\"\r\n    [style.width]=\"width()\"\r\n    [style.height]=\"height()\"\r\n    [attr.alt]=\"alt()\"\r\n    (error)=\"onError($event)\"\r\n    (load)=\"onLoad($event)\"\r\n  />\r\n  @if (placeholder() && !isLoaded()) {\r\n    <img class=\"x-image-img\" [src]=\"placeholder()\" [style.width]=\"width()\" [style.height]=\"height()\" />\r\n  }\r\n  @if (isError() && fallback()) {\r\n    <img class=\"x-image-img x-image-fallback\" [src]=\"fallback()\" [style.width]=\"width()\" [style.height]=\"height()\" />\r\n  }\r\n  @if (isError() && !fallback()) {\r\n    <div class=\"x-image-error-icon\" [style.width]=\"width()\" [style.height]=\"height()\">\r\n      <x-icon type=\"fto-image\"></x-icon>\r\n    </div>\r\n  }\r\n  @if (previewTpl()) {\r\n    <div class=\"x-image-overlay\">\r\n      <ng-container *xOutlet=\"previewTpl(); context: { $image: this }\"> </ng-container>\r\n    </div>\r\n  } @else {\r\n    @if (!isError()) {\r\n      <div class=\"x-image-overlay\" (click)=\"onPreview()\">\r\n        <div class=\"x-image-text\">\r\n          <x-icon type=\"fto-eye\"></x-icon>\r\n          <span>{{ previewTextSignal() }}</span>\r\n        </div>\r\n      </div>\r\n    }\r\n  }\r\n</div>\r\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy, signal } from '@angular/core';\r\nimport { XImageGroupPrefix, XImageHandle } from './image.property';\r\nimport { X_IMAGE_GROUP_CONTEXT, XImageGroupContext } from './image-group.token';\r\n\r\n@Component({\r\n  selector: `${XImageGroupPrefix}`,\r\n  templateUrl: './image-group.component.html',\r\n  styleUrls: ['./image-group.component.scss'],\r\n  encapsulation: ViewEncapsulation.None,\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  providers: [\r\n    {\r\n      provide: X_IMAGE_GROUP_CONTEXT,\r\n      useExisting: XImageGroupComponent\r\n    }\r\n  ]\r\n})\r\nexport class XImageGroupComponent implements XImageGroupContext {\r\n  images = signal<XImageHandle[]>([]);\r\n\r\n  addImage(image: XImageHandle): void {\r\n    this.images.update((x) => {\r\n      x.push(image);\r\n      return [...x];\r\n    });\r\n  }\r\n\r\n  removeImage(image: XImageHandle): void {\r\n    this.images.update((x) => {\r\n      x.splice(x.indexOf(image), 1);\r\n      return [...x];\r\n    });\r\n  }\r\n}\r\n","<ng-content></ng-content>\r\n","import { NgModule } from '@angular/core';\r\nimport { XImageComponent } from './image.component';\r\nimport { XImagePreviewComponent } from './image-preview.component';\r\nimport { XImageGroupComponent } from './image-group.component';\r\n\r\n@NgModule({\r\n  exports: [XImageComponent, XImagePreviewComponent, XImageGroupComponent],\r\n  imports: [XImageComponent, XImagePreviewComponent, XImageGroupComponent]\r\n})\r\nexport class XImageModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}