{"version":3,"file":"shival99-z-ui-components-z-chat.mjs","sources":["../../../../libs/core-ui/components/z-chat/z-chat.variants.ts","../../../../libs/core-ui/components/z-chat/z-chat.component.ts","../../../../libs/core-ui/components/z-chat/z-chat.component.html","../../../../libs/core-ui/components/z-chat/shival99-z-ui-components-z-chat.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\n\nexport const zChatWrapperVariants = cva('z-chat fixed z-[95] pointer-events-none', {\n  variants: {\n    zPosition: {\n      'bottom-right': '',\n      'bottom-left': '',\n    },\n  },\n  defaultVariants: {\n    zPosition: 'bottom-right',\n  },\n});\n\nexport const zChatPanelVariants = cva(\n  'absolute bottom-16 flex flex-col overflow-hidden rounded-2xl shadow-2xl transition-all duration-200',\n  {\n    variants: {\n      zPosition: {\n        'bottom-right': 'right-0 origin-bottom-right',\n        'bottom-left': 'left-0 origin-bottom-left',\n      },\n      zSize: {\n        sm: 'h-[28rem] w-[20rem]',\n        default: 'h-[35rem] w-[25rem]',\n        lg: 'h-[39rem] w-[29rem]',\n      },\n      zOpen: {\n        true: 'pointer-events-auto visible translate-y-0 scale-100 opacity-100',\n        false: 'pointer-events-none invisible translate-y-3 scale-95 opacity-0',\n      },\n    },\n    defaultVariants: {\n      zPosition: 'bottom-right',\n      zSize: 'default',\n      zOpen: false,\n    },\n  }\n);\n\nexport const zChatFabVariants = cva(\n  'relative inline-flex size-14 items-center justify-center rounded-full shadow-lg ring-1 ring-black/5 transition-all duration-200 hover:scale-[1.03] active:scale-95',\n  {\n    variants: {\n      zOpen: {\n        true: 'bg-background text-foreground border border-border shadow-xl dark:border-white/15 dark:bg-[#2b2b2b] dark:text-white',\n        false: 'from-primary via-primary to-primary/75 bg-gradient-to-br text-white shadow-xl',\n      },\n    },\n    defaultVariants: {\n      zOpen: false,\n    },\n  }\n);\n\nexport type ZChatVariants = VariantProps<typeof zChatPanelVariants>;\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  ElementRef,\n  input,\n  model,\n  OnDestroy,\n  output,\n  signal,\n  viewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ZIconComponent, type ZIcon } from '@shival99/z-ui/components/z-icon';\nimport { ZModalComponent } from '@shival99/z-ui/components/z-modal';\nimport { zMergeClasses, zTransform, zUuid } from '@shival99/z-ui/utils';\nimport type { ClassValue } from 'clsx';\nimport { NgScrollbar } from 'ngx-scrollbar';\nimport type {\n  ZChatAttachment,\n  ZChatMessage,\n  ZChatOffset,\n  ZChatPosition,\n  ZChatSendEvent,\n  ZChatSize,\n  ZChatSuggestion,\n} from './z-chat.types';\nimport { zChatFabVariants, zChatPanelVariants, zChatWrapperVariants } from './z-chat.variants';\n\nconst DEFAULT_SUGGESTIONS: ZChatSuggestion[] = [\n  {\n    label: 'i18n_z_ui_chat_ai_suggestion_1',\n    prompt: 'Create release notes from recent commits',\n    icon: 'lucideSparkles',\n  },\n  {\n    label: 'i18n_z_ui_chat_ai_suggestion_2',\n    prompt: 'Suggest test cases for a new feature',\n    icon: 'lucideFlaskConical',\n  },\n  { label: 'i18n_z_ui_chat_ai_suggestion_3', prompt: 'Generate a concise PR summary', icon: 'lucideGitPullRequest' },\n];\n\n@Component({\n  selector: 'z-chat',\n  imports: [FormsModule, TranslatePipe, ZIconComponent, ZModalComponent, NgScrollbar],\n  standalone: true,\n  templateUrl: './z-chat.component.html',\n  styleUrl: './z-chat.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  host: {\n    class: 'z-chat block',\n    '(document:keydown.escape)': 'onEscapeKey()',\n  },\n  exportAs: 'zChat',\n})\nexport class ZChatComponent implements OnDestroy {\n  public readonly class = input<ClassValue>('');\n  public readonly zOpen = model(false);\n  public readonly zMessages = model<ZChatMessage[]>([]);\n  public readonly zTitle = input('i18n_z_ui_chat_ai_title');\n  public readonly zSubtitle = input('i18n_z_ui_chat_ai_subtitle');\n  public readonly zPlaceholder = input('i18n_z_ui_chat_ai_placeholder');\n  public readonly zPosition = input<ZChatPosition>('bottom-right');\n  public readonly zOffset = input<ZChatOffset>({});\n  public readonly zSize = input<ZChatSize>('default');\n  public readonly zSuggestions = input<ZChatSuggestion[]>(DEFAULT_SUGGESTIONS);\n  public readonly zShowSuggestions = input(true, { transform: zTransform });\n  public readonly zShowPulse = input(true, { transform: zTransform });\n  public readonly zDisabled = input(false, { transform: zTransform });\n  public readonly zLoading = input(false, { transform: zTransform });\n  public readonly zAllowAttachments = input(true, { transform: zTransform });\n  public readonly zAcceptedFiles = input('image/*,.pdf,.doc,.docx,.txt,.csv,.xlsx');\n  public readonly zAutoReply = input(true, { transform: zTransform });\n  public readonly zAutoReplyDelay = input(1200);\n  public readonly zFabIcon = input<ZIcon>('lucideMessageSquareDot');\n  public readonly zBotIcon = input<ZIcon>('lucideBot');\n  public readonly zSendIcon = input<ZIcon>('lucideArrowUp');\n\n  public readonly zSend = output<ZChatSendEvent>();\n  public readonly zResponse = output<ZChatMessage>();\n  public readonly zToggle = output<boolean>();\n  public readonly zClear = output<void>();\n\n  protected readonly draftMessage = signal('');\n  protected readonly showRipple = signal(false);\n  protected readonly attachments = signal<ZChatAttachment[]>([]);\n  protected readonly isComposerExpanded = signal(false);\n  protected readonly isComposerOverflowing = signal(false);\n  protected readonly isPreviewVisible = signal(false);\n  protected readonly previewImage = signal<{ url: string; name: string; size: number } | null>(null);\n\n  private readonly _mockTyping = signal(false);\n  private readonly _messagesScrollbarRef = viewChild<NgScrollbar>('messagesScrollbar');\n  private readonly _chatInputRef = viewChild<ElementRef<HTMLTextAreaElement>>('chatInput');\n  private readonly _fileInputRef = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n\n  private _mockReplyTimer: ReturnType<typeof setTimeout> | null = null;\n  private _rippleTimer: ReturnType<typeof setTimeout> | null = null;\n  private _scrollTimer: ReturnType<typeof setTimeout> | null = null;\n\n  protected readonly wrapperClasses = computed(() =>\n    zMergeClasses(zChatWrapperVariants({ zPosition: this.zPosition() }), this.class())\n  );\n\n  protected readonly wrapperTop = computed(() => this._resolveOffsetValue('top'));\n  protected readonly wrapperRight = computed(() => this._resolveOffsetValue('right'));\n  protected readonly wrapperBottom = computed(() => this._resolveOffsetValue('bottom'));\n  protected readonly wrapperLeft = computed(() => this._resolveOffsetValue('left'));\n\n  protected readonly panelClasses = computed(() =>\n    zChatPanelVariants({\n      zPosition: this.zPosition(),\n      zSize: this.zSize(),\n      zOpen: this.zOpen(),\n    })\n  );\n\n  protected readonly fabClasses = computed(() =>\n    zChatFabVariants({\n      zOpen: this.zOpen(),\n    })\n  );\n\n  protected readonly isTyping = computed(() => this.zLoading() || this._mockTyping());\n  protected readonly canSend = computed(\n    () => (!!this.draftMessage().trim() || this.attachments().length > 0) && !this.zDisabled() && !this.isTyping()\n  );\n\n  protected readonly hasMessages = computed(() => this.zMessages().length > 0);\n  protected readonly showEmptyState = computed(() => !this.hasMessages() && this.zShowSuggestions());\n  protected readonly previewImageSizeLabel = computed(() => {\n    const preview = this.previewImage();\n    return preview ? this.formatFileSize(preview.size) : '';\n  });\n\n  public ngOnDestroy(): void {\n    if (this._mockReplyTimer) {\n      clearTimeout(this._mockReplyTimer);\n    }\n    if (this._rippleTimer) {\n      clearTimeout(this._rippleTimer);\n    }\n    if (this._scrollTimer) {\n      clearTimeout(this._scrollTimer);\n    }\n    const filesInMessages = this.zMessages().flatMap(item => item.files ?? []);\n    this._releaseAttachmentUrls(filesInMessages);\n    this._releaseAttachmentUrls(this.attachments());\n  }\n\n  public open(): void {\n    if (this.zOpen()) {\n      return;\n    }\n    this._toggle(true);\n  }\n\n  public close(): void {\n    if (!this.zOpen()) {\n      return;\n    }\n    this._toggle(false);\n  }\n\n  public clearMessages(): void {\n    const filesInMessages = this.zMessages().flatMap(item => item.files ?? []);\n    this._releaseAttachmentUrls(filesInMessages);\n    this.zMessages.set([]);\n    this.zClear.emit();\n  }\n\n  protected onToggle(): void {\n    this._toggle(!this.zOpen());\n  }\n\n  protected onSuggestionSelect(item: ZChatSuggestion): void {\n    this.draftMessage.set((item.prompt ?? item.label).trim());\n    this.onSendMessage();\n  }\n\n  protected onClickAttach(): void {\n    this._fileInputRef()?.nativeElement.click();\n  }\n\n  protected onFileChange(event: Event): void {\n    const inputEl = event.target as HTMLInputElement;\n    const { files } = inputEl;\n    if (!files || files.length === 0) {\n      return;\n    }\n\n    this._appendFiles(Array.from(files));\n    inputEl.value = '';\n  }\n\n  protected onTextareaPaste(event: ClipboardEvent): void {\n    if (!this.zAllowAttachments()) {\n      return;\n    }\n    const items = event.clipboardData?.items;\n    if (!items || items.length === 0) {\n      return;\n    }\n\n    const files: File[] = [];\n    Array.from(items).forEach(item => {\n      if (item.kind === 'file') {\n        const file = item.getAsFile();\n        if (file) {\n          files.push(file);\n        }\n      }\n    });\n\n    if (files.length > 0) {\n      event.preventDefault();\n      this._appendFiles(files);\n    }\n  }\n\n  protected removeAttachment(id: string): void {\n    const target = this.attachments().find(item => item.id === id);\n    if (target?.previewUrl) {\n      URL.revokeObjectURL(target.previewUrl);\n    }\n    this.attachments.update(files => files.filter(item => item.id !== id));\n  }\n\n  protected formatFileSize(size: number): string {\n    if (size < 1024) {\n      return `${size} B`;\n    }\n    if (size < 1024 * 1024) {\n      return `${(size / 1024).toFixed(1)} KB`;\n    }\n    if (size < 1024 * 1024 * 1024) {\n      return `${(size / (1024 * 1024)).toFixed(1)} MB`;\n    }\n    return `${(size / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n  }\n\n  protected isImageAttachment(file: ZChatAttachment): boolean {\n    return file.type.startsWith('image/');\n  }\n\n  protected openImagePreview(file: ZChatAttachment): void {\n    if (!file.previewUrl || !this.isImageAttachment(file)) {\n      return;\n    }\n    this.previewImage.set({\n      url: file.previewUrl,\n      name: file.name,\n      size: file.size,\n    });\n    this.isPreviewVisible.set(true);\n  }\n\n  protected closeImagePreview(): void {\n    setTimeout(() => {\n      this.isPreviewVisible.set(false);\n      this.previewImage.set(null);\n    }, 300);\n  }\n\n  protected onInputKeydown(event: KeyboardEvent): void {\n    if (event.key === 'Enter' && !event.shiftKey) {\n      event.preventDefault();\n      this.onSendMessage();\n    }\n  }\n\n  protected onTextareaInput(event: Event): void {\n    const textarea = event.target as HTMLTextAreaElement;\n    textarea.style.height = 'auto';\n    const nextHeight = Math.min(textarea.scrollHeight, 66);\n    textarea.style.height = `${nextHeight}px`;\n    textarea.style.overflowY = textarea.scrollHeight > 66 ? 'auto' : 'hidden';\n    this.isComposerExpanded.set(nextHeight > 44 || textarea.value.includes('\\n'));\n    this.isComposerOverflowing.set(textarea.scrollHeight > nextHeight + 1);\n  }\n\n  protected onSendMessage(): void {\n    const message = this.draftMessage().trim();\n    if (!message && this.attachments().length === 0) {\n      return;\n    }\n    if (!this.canSend()) {\n      return;\n    }\n\n    const attachedFiles = this.attachments().map(file => ({\n      ...file,\n      // Keep message preview URLs alive after composer files are cleared.\n      previewUrl: this._createMessagePreviewUrl(file),\n      file: undefined,\n    }));\n    const messageContent = message || `Attached ${attachedFiles.length} file(s).`;\n    const userMessage = this._createMessage('user', messageContent, attachedFiles);\n    const nextMessages = [...this.zMessages(), userMessage];\n    this.zMessages.set(nextMessages);\n    this._ensureBottomVisible();\n    this.draftMessage.set('');\n    this._releaseAttachmentUrls(this.attachments());\n    this.attachments.set([]);\n    const inputEl = this._chatInputRef()?.nativeElement;\n    if (inputEl) {\n      inputEl.style.height = '66px';\n      inputEl.style.overflowY = 'hidden';\n    }\n    this.isComposerExpanded.set(false);\n    this.isComposerOverflowing.set(false);\n    this.zSend.emit({ message: messageContent, files: attachedFiles, messages: nextMessages });\n\n    if (this.zAutoReply()) {\n      this._simulateReply(messageContent, attachedFiles.length);\n    }\n\n    this._focusInputSoon();\n  }\n\n  private _toggle(isOpen: boolean): void {\n    this.zOpen.set(isOpen);\n    this.zToggle.emit(isOpen);\n    this._triggerRipple();\n\n    if (isOpen) {\n      this._focusInputSoon();\n      requestAnimationFrame(() => {\n        this._scheduleScrollToBottom(250);\n      });\n    }\n  }\n\n  private _createMessage(role: ZChatMessage['role'], content: string, files?: ZChatAttachment[]): ZChatMessage {\n    return {\n      id: zUuid(),\n      role,\n      content,\n      files,\n      createdAt: Date.now(),\n    };\n  }\n\n  private _simulateReply(userMessage: string, fileCount: number): void {\n    if (this._mockReplyTimer) {\n      clearTimeout(this._mockReplyTimer);\n    }\n    this._mockTyping.set(true);\n    const delay = Math.max(200, this.zAutoReplyDelay());\n\n    this._mockReplyTimer = setTimeout(() => {\n      this._mockTyping.set(false);\n      const botMessage = this._createMessage('assistant', this._buildMockReply(userMessage, fileCount));\n      this.zMessages.update(messages => [...messages, botMessage]);\n      this.zResponse.emit(botMessage);\n      this._ensureBottomVisible();\n    }, delay);\n  }\n\n  private _buildMockReply(message: string, fileCount: number): string {\n    const normalized = message.toLowerCase();\n\n    if (fileCount > 0) {\n      return `Received ${fileCount} attachment(s). I can summarize, extract key points, or draft a reply from these files.`;\n    }\n    if (normalized.includes('deploy') || normalized.includes('release')) {\n      return 'Deployment checklist: run lint, build artifact, smoke test staging, then promote to production.';\n    }\n    if (normalized.includes('bug') || normalized.includes('error')) {\n      return 'Please share logs, repro steps, expected behavior, and current environment so I can triage precisely.';\n    }\n    if (normalized.includes('test')) {\n      return 'I suggest coverage for happy path, validation failures, edge cases, and retry/error handling.';\n    }\n    return 'Got it. I can help you break this task into actionable steps and propose code changes.';\n  }\n\n  private _triggerRipple(): void {\n    this.showRipple.set(true);\n    if (this._rippleTimer) {\n      clearTimeout(this._rippleTimer);\n    }\n    this._rippleTimer = setTimeout(() => this.showRipple.set(false), 350);\n  }\n\n  protected onMessagesScrollbarInit(): void {\n    this._ensureBottomVisible();\n  }\n\n  protected onEscapeKey(): void {\n    if (this.previewImage()) {\n      this.closeImagePreview();\n    }\n  }\n\n  private _scheduleScrollToBottom(delay = 0, duration = 300): void {\n    if (this._scrollTimer) {\n      clearTimeout(this._scrollTimer);\n    }\n    this._scrollTimer = setTimeout(() => {\n      this._scrollToBottom(duration);\n    }, delay);\n  }\n\n  private _ensureBottomVisible(): void {\n    this._scrollToBottom(0);\n    requestAnimationFrame(() => {\n      this._scrollToBottom(0);\n      this._scheduleScrollToBottom(90, 0);\n    });\n  }\n\n  private _scrollToBottom(duration = 300): void {\n    const scrollbar = this._messagesScrollbarRef();\n    if (!scrollbar) {\n      return;\n    }\n    void scrollbar.scrollTo({\n      bottom: 0,\n      duration,\n      easing: { x1: 0.25, y1: 0.1, x2: 0.25, y2: 1 },\n    });\n  }\n\n  private _focusInputSoon(): void {\n    setTimeout(() => this._chatInputRef()?.nativeElement.focus(), 50);\n  }\n\n  private _releaseAttachmentUrls(files: ZChatAttachment[]): void {\n    files.forEach(file => {\n      if (file.previewUrl) {\n        URL.revokeObjectURL(file.previewUrl);\n      }\n    });\n  }\n\n  private _appendFiles(files: File[]): void {\n    const nextFiles: ZChatAttachment[] = files.map(file => ({\n      id: zUuid(),\n      name: file.name,\n      size: file.size,\n      type: file.type,\n      previewUrl: file.type.startsWith('image/') ? URL.createObjectURL(file) : undefined,\n      file,\n    }));\n\n    this.attachments.update(current => [...current, ...nextFiles]);\n  }\n\n  private _createMessagePreviewUrl(file: ZChatAttachment): string | undefined {\n    if (!this.isImageAttachment(file)) {\n      return undefined;\n    }\n    if (file.file) {\n      return URL.createObjectURL(file.file);\n    }\n    return file.previewUrl;\n  }\n\n  private _resolveOffsetValue(side: keyof ZChatOffset): string | null {\n    const override = this.zOffset()[side];\n    if (override !== undefined && override !== null && override !== '') {\n      return typeof override === 'number' ? `${override}px` : String(override);\n    }\n\n    const defaults =\n      this.zPosition() === 'bottom-left'\n        ? { top: null, right: null, bottom: '1.25rem', left: '1.5rem' }\n        : { top: null, right: '1.5rem', bottom: '1.25rem', left: null };\n\n    return defaults[side];\n  }\n}\n","<div\n  [class]=\"wrapperClasses()\"\n  [style.top]=\"wrapperTop()\"\n  [style.right]=\"wrapperRight()\"\n  [style.bottom]=\"wrapperBottom()\"\n  [style.left]=\"wrapperLeft()\">\n  <div class=\"relative\">\n    <section class=\"z-chat-panel-shell\" [class]=\"panelClasses()\">\n      <header class=\"from-primary/95 to-primary/75 text-primary-foreground bg-gradient-to-r px-4 py-3.5\">\n        <div class=\"flex items-start justify-between gap-3\">\n          <div class=\"min-w-0\">\n            <div class=\"flex items-center gap-2\">\n              <span\n                class=\"bg-primary-foreground/15 relative inline-flex size-8 shrink-0 items-center justify-center rounded-full\">\n                <z-icon [zType]=\"zBotIcon()\" zSize=\"16\" class=\"text-primary-foreground\" />\n                <span\n                  class=\"ring-primary inline-block size-2.5 rounded-full bg-emerald-300 ring-2\"\n                  style=\"position: absolute; right: -0.0625rem; bottom: -0.0625rem\"></span>\n              </span>\n              <h3 class=\"truncate text-sm font-semibold\">{{ zTitle() | translate }}</h3>\n            </div>\n          </div>\n          <div class=\"flex items-center gap-1\">\n            <button\n              type=\"button\"\n              class=\"text-primary-foreground/90 hover:bg-primary-foreground/15 inline-flex size-8 cursor-pointer items-center justify-center rounded-md transition\"\n              (click)=\"clearMessages()\"\n              title=\"{{ 'i18n_z_ui_chat_ai_new_chat' | translate }}\">\n              <z-icon zType=\"lucideRefreshCcw\" zSize=\"17\" />\n            </button>\n            <button\n              type=\"button\"\n              class=\"text-primary-foreground/90 hover:bg-primary-foreground/15 inline-flex size-8 cursor-pointer items-center justify-center rounded-md transition\"\n              (click)=\"close()\"\n              title=\"{{ 'i18n_z_ui_chat_ai_close' | translate }}\">\n              <z-icon zType=\"lucideChevronDown\" zSize=\"18\" />\n            </button>\n          </div>\n        </div>\n      </header>\n\n      <div class=\"z-chat-lower-shell\">\n        <ng-scrollbar\n          #messagesScrollbar\n          (afterInit)=\"onMessagesScrollbarInit()\"\n          class=\"z-chat-scrollbar z-chat-content-surface flex-1 overflow-x-hidden\"\n          track=\"vertical\"\n          orientation=\"vertical\"\n          appearance=\"compact\"\n          visibility=\"hover\">\n          <div class=\"z-chat-messages\">\n            @if (hasMessages()) {\n              @for (item of zMessages(); track item.id) {\n                <div\n                  class=\"z-chat-message z-chat-message--enter\"\n                  [class.justify-end]=\"item.role === 'user'\"\n                  [class.justify-start]=\"item.role === 'assistant'\">\n                  <div\n                    class=\"z-chat-message-bubble max-w-[88%] min-w-0 rounded-2xl px-3 py-2.5 text-sm leading-5 [overflow-wrap:anywhere] break-all shadow-xs\"\n                    [class.bg-primary]=\"item.role === 'user'\"\n                    [class.text-primary-foreground]=\"item.role === 'user'\"\n                    [class.rounded-br-md]=\"item.role === 'user'\"\n                    [class.bg-background]=\"item.role === 'assistant'\"\n                    [class.border-border/60]=\"item.role === 'assistant'\"\n                    [class.text-foreground]=\"item.role === 'assistant'\"\n                    [class.rounded-bl-md]=\"item.role === 'assistant'\"\n                    [class.border]=\"item.role === 'assistant'\">\n                    @if (item.files && item.files.length > 0) {\n                      <div class=\"mb-2 flex flex-col gap-1.5\">\n                        @for (file of item.files; track file.id) {\n                          <div\n                            class=\"flex items-center gap-2 rounded-[0.5rem] px-2 py-1.5 text-xs\"\n                            [class.bg-white/15]=\"item.role === 'user'\"\n                            [class.bg-muted/40]=\"item.role === 'assistant'\">\n                            @if (isImageAttachment(file) && file.previewUrl) {\n                              <img\n                                [src]=\"file.previewUrl\"\n                                [alt]=\"file.name\"\n                                class=\"size-8 cursor-pointer rounded-[0.5rem] object-cover\"\n                                (click)=\"openImagePreview(file)\"\n                                title=\"Click to preview\" />\n                            } @else {\n                              <span\n                                class=\"bg-background/80 text-muted-foreground inline-flex size-8 items-center justify-center rounded-[0.5rem]\"\n                                [class.bg-white/20]=\"item.role === 'user'\"\n                                [class.text-white]=\"item.role === 'user'\">\n                                <z-icon zType=\"lucideFileText\" zSize=\"14\" />\n                              </span>\n                            }\n                            <div class=\"min-w-0 flex-1\">\n                              <p class=\"truncate text-[0.6875rem] font-medium\">{{ file.name }}</p>\n                              <p class=\"truncate text-[0.625rem] opacity-80\">{{ formatFileSize(file.size) }}</p>\n                            </div>\n                          </div>\n                        }\n                      </div>\n                    }\n                    {{ item.content }}\n                  </div>\n                </div>\n              }\n            } @else if (showEmptyState()) {\n              <div class=\"flex h-full min-h-60 flex-col items-center justify-center px-2 text-center\">\n                <div\n                  class=\"from-primary/20 to-primary/5 mb-3 inline-flex size-14 items-center justify-center rounded-full bg-gradient-to-br\">\n                  <z-icon zType=\"lucideBot\" zSize=\"28\" class=\"text-primary\" />\n                </div>\n                <h4 class=\"text-foreground text-sm font-semibold\">{{ 'i18n_z_ui_chat_ai_empty_title' | translate }}</h4>\n                <p class=\"text-muted-foreground mt-1 text-xs\">{{ 'i18n_z_ui_chat_ai_empty_desc' | translate }}</p>\n\n                @if (zSuggestions().length > 0) {\n                  <div class=\"mt-4 flex w-full flex-col gap-2\">\n                    @for (item of zSuggestions(); track item.label) {\n                      <button\n                        type=\"button\"\n                        class=\"z-chat-suggestion-item bg-background/95 hover:bg-background border-border/60 text-foreground flex w-full cursor-pointer items-center gap-2 rounded-xl border px-3 py-2 text-left text-xs transition hover:shadow-sm\"\n                        [style.animation-delay.ms]=\"$index * 70\"\n                        (click)=\"onSuggestionSelect(item)\">\n                        @if (item.icon) {\n                          <z-icon [zType]=\"item.icon!\" zSize=\"14\" class=\"text-primary shrink-0\" />\n                        }\n                        <span class=\"line-clamp-2\">{{ item.label | translate }}</span>\n                      </button>\n                    }\n                  </div>\n                }\n              </div>\n            }\n\n            @if (isTyping()) {\n              <div class=\"z-chat-message z-chat-message--enter justify-start\">\n                <div class=\"bg-background border-border/60 rounded-2xl rounded-bl-md border px-3 py-2\">\n                  <div class=\"flex items-center gap-1\">\n                    <span class=\"bg-muted-foreground/60 inline-block size-1.5 animate-bounce rounded-full\"></span>\n                    <span\n                      class=\"bg-muted-foreground/60 inline-block size-1.5 animate-bounce rounded-full\"\n                      style=\"animation-delay: 0.15s\"></span>\n                    <span\n                      class=\"bg-muted-foreground/60 inline-block size-1.5 animate-bounce rounded-full\"\n                      style=\"animation-delay: 0.3s\"></span>\n                  </div>\n                </div>\n              </div>\n            }\n          </div>\n        </ng-scrollbar>\n\n        <footer class=\"z-chat-footer-surface p-3\">\n          @if (attachments().length > 0) {\n            <div class=\"mb-2 flex max-h-32 flex-col gap-2 overflow-y-auto pr-1\">\n              @for (file of attachments(); track file.id) {\n                <div\n                  class=\"bg-muted/45 border-border/55 relative flex w-full items-center gap-2 rounded-[0.5rem] border px-2 py-1.5\">\n                  @if (isImageAttachment(file) && file.previewUrl) {\n                    <img\n                      [src]=\"file.previewUrl\"\n                      [alt]=\"file.name\"\n                      class=\"size-8 shrink-0 cursor-pointer rounded-[0.5rem] object-cover\"\n                      (click)=\"openImagePreview(file)\"\n                      title=\"Click to preview\" />\n                  } @else {\n                    <span\n                      class=\"bg-background text-muted-foreground inline-flex size-8 shrink-0 items-center justify-center rounded-[0.5rem]\">\n                      <z-icon zType=\"lucideFileText\" zSize=\"14\" />\n                    </span>\n                  }\n                  <div class=\"min-w-0 flex-1\">\n                    <p class=\"truncate text-[0.6875rem] font-medium\">{{ file.name }}</p>\n                    <p class=\"text-muted-foreground truncate text-[0.625rem]\">{{ formatFileSize(file.size) }}</p>\n                  </div>\n                  <button\n                    type=\"button\"\n                    class=\"bg-background/80 hover:bg-background text-muted-foreground inline-flex size-5 cursor-pointer items-center justify-center rounded-full transition\"\n                    (click)=\"removeAttachment(file.id)\">\n                    <z-icon zType=\"lucideX\" zSize=\"12\" />\n                  </button>\n                </div>\n              }\n            </div>\n          }\n\n          <div class=\"z-chat-composer-shell\">\n            <div class=\"z-chat-composer-main\" [class.z-chat-composer__field--overflow]=\"isComposerOverflowing()\">\n              <textarea\n                #chatInput\n                class=\"z-chat-composer-textarea\"\n                [placeholder]=\"zPlaceholder() | translate\"\n                [disabled]=\"zDisabled()\"\n                [ngModel]=\"draftMessage()\"\n                (ngModelChange)=\"draftMessage.set($event)\"\n                (input)=\"onTextareaInput($event)\"\n                (paste)=\"onTextareaPaste($event)\"\n                (keydown)=\"onInputKeydown($event)\"\n                rows=\"3\"></textarea>\n            </div>\n\n            <div class=\"z-chat-composer-toolbar\">\n              <div class=\"z-chat-composer-toolbar-left\">\n                @if (zAllowAttachments()) {\n                  <input\n                    #fileInput\n                    type=\"file\"\n                    class=\"hidden\"\n                    [attr.accept]=\"zAcceptedFiles()\"\n                    multiple\n                    (change)=\"onFileChange($event)\" />\n                  <button\n                    type=\"button\"\n                    class=\"z-chat-composer-tool-btn\"\n                    [disabled]=\"zDisabled()\"\n                    (click)=\"onClickAttach()\"\n                    title=\"{{ 'i18n_z_ui_chat_ai_attach' | translate }}\">\n                    <z-icon zType=\"lucidePlus\" zSize=\"18\" />\n                  </button>\n                }\n              </div>\n\n              <div class=\"z-chat-composer-toolbar-right\">\n                <button\n                  type=\"button\"\n                  class=\"z-chat-composer-send-btn\"\n                  [disabled]=\"!canSend()\"\n                  (click)=\"onSendMessage()\"\n                  title=\"{{ 'i18n_z_ui_chat_ai_send' | translate }}\">\n                  <z-icon\n                    [zType]=\"isTyping() ? 'lucideLoaderCircle' : zSendIcon()\"\n                    zSize=\"16\"\n                    [class]=\"isTyping() ? 'animate-spin' : ''\" />\n                </button>\n              </div>\n            </div>\n          </div>\n        </footer>\n      </div>\n\n      <z-modal\n        [zVisible]=\"isPreviewVisible()\"\n        [zTitle]=\"previewImage()?.name\"\n        [zDescription]=\"previewImageSizeLabel()\"\n        zWidth=\"min(92vw, 720px)\"\n        [zHideFooter]=\"true\"\n        [zMaskClosable]=\"true\"\n        zOverlay=\"blur\"\n        (zCancel)=\"closeImagePreview()\">\n        <div class=\"z-chat-preview-modal-body\">\n          <img [src]=\"previewImage()?.url\" [alt]=\"previewImage()?.name\" class=\"z-chat-preview-image\" />\n        </div>\n      </z-modal>\n    </section>\n\n    <button\n      type=\"button\"\n      class=\"pointer-events-auto cursor-pointer\"\n      [class]=\"fabClasses()\"\n      (click)=\"onToggle()\"\n      [attr.aria-expanded]=\"zOpen()\"\n      [attr.aria-label]=\"'i18n_z_ui_chat_ai_toggle' | translate\"\n      title=\"{{ 'i18n_z_ui_chat_ai_toggle' | translate }}\">\n      @if (zShowPulse() && !zOpen()) {\n        <span class=\"bg-primary/30 absolute inset-0 animate-ping rounded-full\"></span>\n      }\n\n      @if (showRipple()) {\n        <span class=\"bg-primary-foreground/30 absolute inset-0 animate-ping rounded-full\"></span>\n      }\n\n      <z-icon\n        [zType]=\"zOpen() ? 'lucideX' : zFabIcon()\"\n        zSize=\"24\"\n        class=\"relative z-1 transition-transform duration-200\"\n        [class.rotate-180]=\"zOpen()\" />\n    </button>\n  </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}