{"version":3,"file":"medha-analytics-onevoice.mjs","sources":["../../../projects/onevoice/src/lib/onevoice.tokens.ts","../../../projects/onevoice/src/lib/services/onevoice.service.ts","../../../projects/onevoice/src/lib/onevoice.module.ts","../../../projects/onevoice/src/lib/components/feedback-form/feedback-form.component.ts","../../../projects/onevoice/src/lib/components/feedback-form/feedback-form.component.html","../../../projects/onevoice/src/lib/components/feedback-button/feedback-button.component.ts","../../../projects/onevoice/src/lib/components/feedback-button/feedback-button.component.html","../../../projects/onevoice/src/public-api.ts","../../../projects/onevoice/src/medha-analytics-onevoice.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { OneVoiceConfig } from './models/onevoice-config.interface';\n\n/**\n * Injection token for OneVoice configuration\n */\nexport const ONEVOICE_CONFIG = new InjectionToken<OneVoiceConfig>('ONEVOICE_CONFIG');\n","import { Injectable, Inject, Optional } from '@angular/core';\nimport { HttpClient, HttpParams } from '@angular/common/http';\nimport { Observable, Subject } from 'rxjs';\nimport { OneVoiceConfig, OpenFeedbackOptions, FeedbackPayload } from '../models/onevoice-config.interface';\nimport { ONEVOICE_CONFIG } from '../onevoice.tokens';\n\n/**\n * OneVoice Service - Core service for programmatic feedback submission\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class OneVoiceService {\n  private feedbackFormSubject = new Subject<OpenFeedbackOptions>();\n  public feedbackFormOpen$ = this.feedbackFormSubject.asObservable();\n\n  constructor(\n    @Inject(ONEVOICE_CONFIG) private config: OneVoiceConfig,\n    private http: HttpClient\n  ) {}\n\n  /**\n   * Get the current configuration\n   */\n  getConfig(): OneVoiceConfig {\n    return this.config;\n  }\n\n  /**\n   * Open feedback form programmatically\n   * @param options Options for opening the feedback form\n   */\n  openFeedbackForm(options: OpenFeedbackOptions = {}): void {\n    // Set defaults\n    const defaultOptions: OpenFeedbackOptions = {\n      mode: 'modal',\n      autoCapture: false,\n      autoSubmit: false,\n      lockedFields: [],\n      prefillData: {}\n    };\n\n    const finalOptions = { ...defaultOptions, ...options };\n    this.feedbackFormSubject.next(finalOptions);\n  }\n\n  /**\n   * Submit feedback to backend\n   * @param payload Feedback payload\n   * @returns Observable with response\n   */\n  submitFeedback(payload: FeedbackPayload): Observable<any> {\n    const url = `${this.config.backendUrl}/feedback/add`;\n    return this.http.post(url, payload);\n  }\n\n  /**\n   * Upload files for a feedback\n   * @param feedbackId Feedback ID\n   * @param files Files to upload\n   * @returns Promise with response\n   */\n  async uploadFiles(feedbackId: number, files: File[]): Promise<any> {\n    const formData = new FormData();\n    files.forEach(file => {\n      formData.append('files', file);\n    });\n\n    const userId = this.config.getUserId?.() || 'anonymous';\n    const params = new HttpParams().set('user_id', userId);\n\n    const url = `${this.config.backendUrl}/feedback/upload-files/${feedbackId}`;\n    return this.http.post(url, formData, { params }).toPromise();\n  }\n\n  /**\n   * Get current user ID from config\n   */\n  getUserId(): string {\n    return this.config.getUserId?.() || 'anonymous@medha.com';\n  }\n\n  /**\n   * Get auth token from config\n   */\n  getAuthToken(): string | null {\n    return this.config.getAuthToken?.() || null;\n  }\n\n  /**\n   * Create feedback payload from form data\n   */\n  createFeedbackPayload(data: {\n    title: string;\n    application: string;\n    category: string;\n    description: string;\n  }): FeedbackPayload {\n    const userId = this.getUserId();\n    const tenant = this.config.tenant || 'medha-analytics';\n\n    return {\n      tenant,\n      userId,\n      artifact: data.application,\n      feedback: `${data.title}\\n\\nCategory: ${data.category || 'Other'}\\n\\n${data.description}`,\n      attachments: '',\n      issueRaisedDate: new Date().toISOString().split('T')[0],\n      status: 'Open',\n      assignee: 'Unassigned',\n      priority: 'Medium',\n      resolution: ''\n    };\n  }\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { HttpClientModule } from '@angular/common/http';\nimport { OneVoiceConfig } from './models/onevoice-config.interface';\nimport { ONEVOICE_CONFIG } from './onevoice.tokens';\nimport { OneVoiceService } from './services/onevoice.service';\n\n/**\n * OneVoice Module\n *\n * Usage:\n * ```typescript\n * OneVoiceModule.forRoot({\n *   backendUrl: 'http://localhost:9099',\n *   applicationName: 'AIRO',\n *   fields: {\n *     application: { prefill: 'AIRO', locked: true }\n *   },\n *   getUserId: () => localStorage.getItem('userId') || 'anonymous'\n * })\n * ```\n */\n@NgModule({\n  imports: [\n    CommonModule,\n    FormsModule,\n    HttpClientModule\n  ],\n  exports: []\n})\nexport class OneVoiceModule {\n  /**\n   * Configure OneVoice module with application-specific settings\n   * @param config OneVoice configuration\n   * @returns Module with providers\n   */\n  static forRoot(config: OneVoiceConfig): ModuleWithProviders<OneVoiceModule> {\n    return {\n      ngModule: OneVoiceModule,\n      providers: [\n        {\n          provide: ONEVOICE_CONFIG,\n          useValue: config\n        },\n        OneVoiceService\n      ]\n    };\n  }\n}\n","import { Component, OnInit, Input, Output, EventEmitter, Inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { OneVoiceService } from '../../services/onevoice.service';\nimport { OneVoiceConfig, FeedbackData } from '../../models/onevoice-config.interface';\nimport { ONEVOICE_CONFIG } from '../../onevoice.tokens';\n\n@Component({\n  selector: 'onevoice-feedback-form',\n  standalone: true,\n  imports: [CommonModule, FormsModule],\n  templateUrl: './feedback-form.component.html',\n  styleUrls: ['./feedback-form.component.scss']\n})\nexport class FeedbackFormComponent implements OnInit {\n  @Input() prefillData?: Partial<FeedbackData>;\n  @Input() lockedFields: string[] = [];\n  @Input() showTitle: boolean = true;\n  @Input() standalone: boolean = true; // Whether to show as standalone form or embedded\n\n  @Output() onSubmitSuccess = new EventEmitter<any>();\n  @Output() onSubmitError = new EventEmitter<any>();\n  @Output() onCancel = new EventEmitter<void>();\n\n  formData: FeedbackData = {\n    title: '',\n    application: '',\n    category: '',\n    description: '',\n    attachments: []\n  };\n\n  categories: string[] = [\n    'Bug Report',\n    'Feature Request',\n    'Performance Issue',\n    'UI/UX Improvement',\n    'Documentation',\n    'Other'\n  ];\n\n  isDragging: boolean = false;\n  isSubmitting: boolean = false;\n\n  constructor(\n    @Inject(ONEVOICE_CONFIG) public config: OneVoiceConfig,\n    private oneVoiceService: OneVoiceService\n  ) {}\n\n  async ngOnInit(): Promise<void> {\n    // Apply configuration defaults\n    this.applyConfigDefaults();\n\n    // Apply global config prefills FIRST\n    await this.applyConfigPrefills();\n\n    // Apply prefill data LAST (so it takes precedence over config)\n    if (this.prefillData) {\n      await this.applyPrefillData(this.prefillData);\n    }\n\n    // Override categories if configured\n    if (this.config.fields?.category?.options) {\n      this.categories = this.config.fields.category.options;\n    }\n  }\n\n  private applyConfigDefaults(): void {\n    // Set application from config\n    if (this.config.applicationName) {\n      this.formData.application = this.config.applicationName;\n    }\n  }\n\n  private async applyPrefillData(data: Partial<FeedbackData>): Promise<void> {\n    if (data.title) this.formData.title = data.title;\n    if (data.application) this.formData.application = data.application;\n    if (data.category) this.formData.category = data.category;\n    if (data.description) this.formData.description = data.description;\n    if (data.attachments && data.attachments.length > 0) {\n      this.formData.attachments = [...data.attachments];\n    }\n  }\n\n  private async applyConfigPrefills(): Promise<void> {\n    const fields = this.config.fields;\n    if (!fields) return;\n\n    // Title prefill\n    if (fields.title?.prefill) {\n      this.formData.title = await this.resolvePrefill(fields.title.prefill);\n    }\n\n    // Application prefill\n    if (fields.application?.prefill) {\n      this.formData.application = await this.resolvePrefill(fields.application.prefill);\n    }\n\n    // Category prefill\n    if (fields.category?.prefill) {\n      this.formData.category = await this.resolvePrefill(fields.category.prefill);\n    }\n\n    // Description prefill\n    if (fields.description?.prefill) {\n      this.formData.description = await this.resolvePrefill(fields.description.prefill);\n    }\n\n    // Attachments prefill\n    if (fields.attachments?.prefill) {\n      const prefill = fields.attachments.prefill;\n      if (typeof prefill === 'function') {\n        this.formData.attachments = await prefill();\n      } else if (Array.isArray(prefill)) {\n        this.formData.attachments = [...prefill];\n      }\n    }\n  }\n\n  private async resolvePrefill(prefill: string | (() => string | Promise<string>)): Promise<string> {\n    if (typeof prefill === 'function') {\n      const result = prefill();\n      return result instanceof Promise ? await result : result;\n    }\n    return prefill;\n  }\n\n  isFieldLocked(fieldName: string): boolean {\n    // Check if field is in lockedFields array\n    if (this.lockedFields.includes(fieldName)) {\n      return true;\n    }\n\n    // Check if field is locked in config\n    const field = (this.config.fields as any)?.[fieldName];\n    return field?.locked === true;\n  }\n\n  isFieldVisible(fieldName: string): boolean {\n    const field = (this.config.fields as any)?.[fieldName];\n    return field?.visible !== false;\n  }\n\n  getFieldLabel(fieldName: string, defaultLabel: string): string {\n    const field = (this.config.fields as any)?.[fieldName];\n    return field?.label || defaultLabel;\n  }\n\n  getFieldPlaceholder(fieldName: string, defaultPlaceholder: string): string {\n    const field = (this.config.fields as any)?.[fieldName];\n    return field?.placeholder || defaultPlaceholder;\n  }\n\n  isFieldRequired(fieldName: string): boolean {\n    const field = (this.config.fields as any)?.[fieldName];\n    return field?.required === true;\n  }\n\n  // File handling methods\n  onDragOver(event: DragEvent): void {\n    if (this.isFieldLocked('attachments')) return;\n    event.preventDefault();\n    event.stopPropagation();\n    this.isDragging = true;\n  }\n\n  onDragLeave(event: DragEvent): void {\n    event.preventDefault();\n    event.stopPropagation();\n    this.isDragging = false;\n  }\n\n  onDrop(event: DragEvent): void {\n    if (this.isFieldLocked('attachments')) return;\n    event.preventDefault();\n    event.stopPropagation();\n    this.isDragging = false;\n\n    const files = event.dataTransfer?.files;\n    if (files) {\n      this.handleFiles(files);\n    }\n  }\n\n  onFileSelect(event: Event): void {\n    if (this.isFieldLocked('attachments')) return;\n    const input = event.target as HTMLInputElement;\n    if (input.files) {\n      this.handleFiles(input.files);\n    }\n  }\n\n  handleFiles(files: FileList): void {\n    const maxSize = this.config.fields?.attachments?.maxSize || (10 * 1024 * 1024); // 10MB default\n    const allowedTypes = this.config.fields?.attachments?.allowedTypes || ['image/png', 'image/jpeg', 'image/gif'];\n\n    for (let i = 0; i < files.length; i++) {\n      const file = files[i];\n\n      if (!allowedTypes.includes(file.type)) {\n        this.showError(`${file.name} is not a supported format. Only ${allowedTypes.join(', ')} are allowed.`);\n        continue;\n      }\n\n      if (file.size > maxSize) {\n        this.showError(`${file.name} exceeds the ${(maxSize / 1024 / 1024).toFixed(0)}MB size limit.`);\n        continue;\n      }\n\n      this.formData.attachments.push(file);\n    }\n  }\n\n  removeFile(index: number): void {\n    if (this.isFieldLocked('attachments')) return;\n    this.formData.attachments.splice(index, 1);\n  }\n\n  browseFiles(): void {\n    if (this.isFieldLocked('attachments')) return;\n    const input = document.createElement('input');\n    input.type = 'file';\n    input.multiple = true;\n    const allowedTypes = this.config.fields?.attachments?.allowedTypes || ['image/png', 'image/jpeg', 'image/gif'];\n    input.accept = allowedTypes.join(',');\n    input.onchange = (e) => this.onFileSelect(e);\n    input.click();\n  }\n\n  onPaste(event: ClipboardEvent): void {\n    if (this.isFieldLocked('attachments')) return;\n    const items = event.clipboardData?.items;\n    if (!items) return;\n\n    for (let i = 0; i < items.length; i++) {\n      const item = items[i];\n      if (item.type.indexOf('image') !== -1) {\n        const file = item.getAsFile();\n        if (file) {\n          this.formData.attachments.push(file);\n        }\n      }\n    }\n  }\n\n  clearForm(): void {\n    this.formData = {\n      title: '',\n      application: this.config.applicationName || '',\n      category: '',\n      description: '',\n      attachments: []\n    };\n  }\n\n  async submitFeedback(): Promise<void> {\n    // Validation\n    if (!this.formData.title.trim()) {\n      this.showError('Please enter a feedback title');\n      return;\n    }\n\n    if (!this.formData.application) {\n      this.showError('Please select an application');\n      return;\n    }\n\n    if (!this.formData.description.trim()) {\n      this.showError('Please enter a description');\n      return;\n    }\n\n    try {\n      this.isSubmitting = true;\n\n      // Create payload\n      const payload = this.oneVoiceService.createFeedbackPayload({\n        title: this.formData.title,\n        application: this.formData.application,\n        category: this.formData.category,\n        description: this.formData.description\n      });\n\n      // Submit to backend\n      this.oneVoiceService.submitFeedback(payload).subscribe({\n        next: async (response: any) => {\n          // Upload files if any\n          if (this.formData.attachments.length > 0) {\n            try {\n              await this.oneVoiceService.uploadFiles(response.id, this.formData.attachments);\n              this.showSuccess('Feedback and attachments submitted successfully!');\n            } catch (uploadError) {\n              console.error('Error uploading files:', uploadError);\n              this.showError('Feedback submitted but some attachments failed to upload');\n            }\n          } else {\n            this.showSuccess('Feedback submitted successfully!');\n          }\n\n          this.onSubmitSuccess.emit(response);\n          this.clearForm();\n          this.isSubmitting = false;\n        },\n        error: (error) => {\n          console.error('Error submitting feedback:', error);\n          this.showError('Failed to submit feedback. Please try again.');\n          this.onSubmitError.emit(error);\n          this.isSubmitting = false;\n        }\n      });\n    } catch (error) {\n      console.error('Error:', error);\n      this.showError('An unexpected error occurred.');\n      this.isSubmitting = false;\n    }\n  }\n\n  cancel(): void {\n    this.onCancel.emit();\n  }\n\n  private showError(message: string): void {\n    // You can integrate with ngx-toastr or similar here\n    // For now, just use console.error and alert\n    console.error(message);\n    alert(message);\n  }\n\n  private showSuccess(message: string): void {\n    // You can integrate with ngx-toastr or similar here\n    // For now, just use console.log and alert\n    console.log(message);\n    alert(message);\n  }\n\n  getFileSizeKB(file: File): string {\n    return (file.size / 1024).toFixed(1);\n  }\n}\n","<div class=\"onevoice-feedback-form\" [class.standalone]=\"standalone\">\n  <div class=\"feedback-form-card\">\n    <h1 class=\"form-title\" *ngIf=\"showTitle\">\n      Share Feedback <span class=\"subtitle\">—Help Us Improve</span>\n    </h1>\n\n    <form (ngSubmit)=\"submitFeedback()\" (paste)=\"onPaste($event)\">\n      <!-- Feedback Title -->\n      <div class=\"form-group\" *ngIf=\"isFieldVisible('title')\">\n        <label [for]=\"'feedbackTitle'\">\n          {{ getFieldLabel('title', 'Feedback Title') }}\n          <span class=\"required\" *ngIf=\"isFieldRequired('title')\">*</span>\n          <span class=\"lock-icon\" *ngIf=\"isFieldLocked('title')\">🔒</span>\n        </label>\n        <input\n          type=\"text\"\n          id=\"feedbackTitle\"\n          class=\"form-control\"\n          [class.locked]=\"isFieldLocked('title')\"\n          [placeholder]=\"getFieldPlaceholder('title', 'Brief summary of your feedback')\"\n          [(ngModel)]=\"formData.title\"\n          name=\"feedbackTitle\"\n          [disabled]=\"isFieldLocked('title')\"\n          [required]=\"isFieldRequired('title')\"\n        />\n      </div>\n\n      <!-- Application -->\n      <div class=\"form-group\" *ngIf=\"isFieldVisible('application')\">\n        <label [for]=\"'application'\">\n          {{ getFieldLabel('application', 'Application') }}\n          <span class=\"required\">*</span>\n          <span class=\"lock-icon\" *ngIf=\"isFieldLocked('application')\">🔒</span>\n        </label>\n        <input\n          type=\"text\"\n          id=\"application\"\n          class=\"form-control\"\n          [class.locked]=\"isFieldLocked('application')\"\n          [(ngModel)]=\"formData.application\"\n          name=\"application\"\n          [disabled]=\"isFieldLocked('application')\"\n          required\n          readonly\n        />\n      </div>\n\n      <!-- Category -->\n      <div class=\"form-group\" *ngIf=\"isFieldVisible('category')\">\n        <label [for]=\"'category'\">\n          {{ getFieldLabel('category', 'Category') }}\n          <span class=\"lock-icon\" *ngIf=\"isFieldLocked('category')\">🔒</span>\n        </label>\n        <select\n          id=\"category\"\n          class=\"form-control\"\n          [class.locked]=\"isFieldLocked('category')\"\n          [(ngModel)]=\"formData.category\"\n          name=\"category\"\n          [disabled]=\"isFieldLocked('category')\"\n        >\n          <option value=\"\" disabled selected>{{ getFieldPlaceholder('category', 'Select category') }}</option>\n          <option *ngFor=\"let cat of categories\" [value]=\"cat\">{{ cat }}</option>\n        </select>\n      </div>\n\n      <!-- Description -->\n      <div class=\"form-group\" *ngIf=\"isFieldVisible('description')\">\n        <label [for]=\"'description'\">\n          {{ getFieldLabel('description', 'Description') }}\n          <span class=\"required\">*</span>\n          <span class=\"lock-icon\" *ngIf=\"isFieldLocked('description')\">🔒</span>\n        </label>\n        <textarea\n          id=\"description\"\n          class=\"form-control\"\n          [class.locked]=\"isFieldLocked('description')\"\n          rows=\"6\"\n          [placeholder]=\"getFieldPlaceholder('description', 'Please describe your feedback in detail...')\"\n          [(ngModel)]=\"formData.description\"\n          name=\"description\"\n          [disabled]=\"isFieldLocked('description')\"\n          required\n        ></textarea>\n      </div>\n\n      <!-- Screenshots / Attachments -->\n      <div class=\"form-group\" *ngIf=\"isFieldVisible('attachments')\">\n        <label>\n          {{ getFieldLabel('attachments', 'Screenshots / Attachments') }}\n          <span class=\"lock-icon\" *ngIf=\"isFieldLocked('attachments')\">🔒</span>\n        </label>\n\n        <!-- Upload area (only if not locked) -->\n        <div\n          *ngIf=\"!isFieldLocked('attachments')\"\n          class=\"upload-area\"\n          [class.dragging]=\"isDragging\"\n          (dragover)=\"onDragOver($event)\"\n          (dragleave)=\"onDragLeave($event)\"\n          (drop)=\"onDrop($event)\"\n          (click)=\"browseFiles()\"\n        >\n          <div class=\"upload-icon\">\n            <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n              <path d=\"M12 15V3M12 3L8 7M12 3L16 7\" stroke=\"#666\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n              <path d=\"M2 17L2 19C2 20.1046 2.89543 21 4 21L20 21C21.1046 21 22 20.1046 22 19V17\" stroke=\"#666\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n            </svg>\n          </div>\n          <p class=\"upload-text\">\n            Drop files here or <span class=\"browse-link\">browse</span>\n          </p>\n          <p class=\"upload-hint\">\n            You can also paste screenshots using Ctrl+V (Cmd+V on Mac)\n          </p>\n          <p class=\"upload-info\">Supports: PNG, JPG, GIF (max 10MB per file)</p>\n        </div>\n\n        <!-- Selected Files List -->\n        <div class=\"selected-files\" *ngIf=\"formData.attachments.length > 0\">\n          <div class=\"file-item\" *ngFor=\"let file of formData.attachments; let i = index\">\n            <div class=\"file-info\">\n              <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                <path d=\"M14 10V12.6667C14 13.0203 13.8595 13.3594 13.6095 13.6095C13.3594 13.8595 13.0203 14 12.6667 14H3.33333C2.97971 14 2.64057 13.8595 2.39052 13.6095C2.14048 13.3594 2 13.0203 2 12.6667V10\" stroke=\"#0162DD\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                <path d=\"M11.3333 5.33333L8 2L4.66667 5.33333\" stroke=\"#0162DD\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                <path d=\"M8 2V10\" stroke=\"#0162DD\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n              </svg>\n              <span class=\"file-name\">{{ file.name }}</span>\n              <span class=\"file-size\">({{ getFileSizeKB(file) }} KB)</span>\n            </div>\n            <button\n              *ngIf=\"!isFieldLocked('attachments')\"\n              type=\"button\"\n              class=\"remove-file\"\n              (click)=\"removeFile(i)\"\n            >\n              <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                <path d=\"M12 4L4 12M4 4L12 12\" stroke=\"#999\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n              </svg>\n            </button>\n          </div>\n        </div>\n      </div>\n\n      <!-- Form Actions -->\n      <div class=\"form-actions\">\n        <button\n          type=\"button\"\n          class=\"btn btn-secondary\"\n          (click)=\"standalone ? clearForm() : cancel()\"\n          [disabled]=\"isSubmitting\"\n        >\n          {{ standalone ? 'Clear Form' : 'Cancel' }}\n        </button>\n        <button\n          type=\"submit\"\n          class=\"btn btn-primary\"\n          [disabled]=\"isSubmitting\"\n        >\n          {{ isSubmitting ? 'Submitting...' : 'Submit Feedback' }}\n        </button>\n      </div>\n    </form>\n  </div>\n</div>\n","import { Component, Input, Inject, OnInit, OnDestroy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { OneVoiceService } from '../../services/onevoice.service';\nimport { FeedbackFormComponent } from '../feedback-form/feedback-form.component';\nimport { OneVoiceConfig } from '../../models/onevoice-config.interface';\nimport { ONEVOICE_CONFIG } from '../../onevoice.tokens';\nimport { Subscription } from 'rxjs';\n\n@Component({\n  selector: 'onevoice-feedback-button',\n  standalone: true,\n  imports: [CommonModule, FeedbackFormComponent],\n  templateUrl: './feedback-button.component.html',\n  styleUrls: ['./feedback-button.component.scss']\n})\nexport class FeedbackButtonComponent implements OnInit, OnDestroy {\n  @Input() position: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left' = 'bottom-right';\n  @Input() label: string = 'Send Feedback';\n  @Input() icon?: string;\n  @Input() backgroundColor?: string;\n  @Input() autoCapture: boolean = false;\n\n  showModal: boolean = false;\n  private subscription?: Subscription;\n\n  constructor(\n    @Inject(ONEVOICE_CONFIG) private config: OneVoiceConfig,\n    private oneVoiceService: OneVoiceService\n  ) {}\n\n  ngOnInit(): void {\n    // Override with config if available\n    if (this.config.ui?.floatingButton) {\n      const btnConfig = this.config.ui.floatingButton;\n      if (btnConfig.position) this.position = btnConfig.position;\n      if (btnConfig.label) this.label = btnConfig.label;\n      if (btnConfig.icon) this.icon = btnConfig.icon;\n      if (btnConfig.backgroundColor) this.backgroundColor = btnConfig.backgroundColor;\n    }\n\n    // Listen for programmatic form opens\n    this.subscription = this.oneVoiceService.feedbackFormOpen$.subscribe(() => {\n      this.openModal();\n    });\n  }\n\n  ngOnDestroy(): void {\n    if (this.subscription) {\n      this.subscription.unsubscribe();\n    }\n  }\n\n  async openModal(): Promise<void> {\n    this.showModal = true;\n\n    // Auto-capture screenshot if enabled\n    if (this.autoCapture) {\n      // TODO: Implement screenshot capture\n      console.log('Auto-capture screenshot feature coming soon');\n    }\n  }\n\n  closeModal(): void {\n    this.showModal = false;\n  }\n\n  onSubmitSuccess(event: any): void {\n    console.log('Feedback submitted successfully:', event);\n    this.closeModal();\n  }\n\n  onSubmitError(event: any): void {\n    console.error('Feedback submission error:', event);\n  }\n\n  onCancel(): void {\n    this.closeModal();\n  }\n\n  getPositionClass(): string {\n    return `position-${this.position}`;\n  }\n\n  getButtonStyle(): any {\n    const style: any = {};\n    if (this.backgroundColor) {\n      style.backgroundColor = this.backgroundColor;\n    }\n    return style;\n  }\n}\n","<!-- Floating Feedback Button -->\n<button\n  class=\"onevoice-floating-button\"\n  [ngClass]=\"getPositionClass()\"\n  [ngStyle]=\"getButtonStyle()\"\n  (click)=\"openModal()\"\n  [title]=\"label\"\n>\n  <svg\n    *ngIf=\"!icon\"\n    width=\"24\"\n    height=\"24\"\n    viewBox=\"0 0 24 24\"\n    fill=\"none\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n  >\n    <path\n      d=\"M21 11.5C21.0034 12.8199 20.6951 14.1219 20.1 15.3C19.3944 16.7118 18.3098 17.8992 16.9674 18.7293C15.6251 19.5594 14.0782 19.9994 12.5 20C11.1801 20.0035 9.87812 19.6951 8.7 19.1L3 21L4.9 15.3C4.30493 14.1219 3.99656 12.8199 4 11.5C4.00061 9.92179 4.44061 8.37488 5.27072 7.03258C6.10083 5.69028 7.28825 4.6056 8.7 3.90003C9.87812 3.30496 11.1801 2.99659 12.5 3.00003H13C15.0843 3.11502 17.053 3.99479 18.5291 5.47089C20.0052 6.94699 20.885 8.91568 21 11V11.5Z\"\n      stroke=\"white\"\n      stroke-width=\"2\"\n      stroke-linecap=\"round\"\n      stroke-linejoin=\"round\"\n    />\n  </svg>\n  <img *ngIf=\"icon\" [src]=\"icon\" alt=\"Feedback\" class=\"custom-icon\" />\n  <span class=\"button-label\">{{ label }}</span>\n</button>\n\n<!-- Modal Overlay -->\n<div class=\"onevoice-modal-overlay\" *ngIf=\"showModal\" (click)=\"closeModal()\">\n  <div class=\"onevoice-modal-content\" (click)=\"$event.stopPropagation()\">\n    <button class=\"modal-close-button\" (click)=\"closeModal()\">\n      <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#666\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n      </svg>\n    </button>\n\n    <onevoice-feedback-form\n      [standalone]=\"false\"\n      [showTitle]=\"true\"\n      (onSubmitSuccess)=\"onSubmitSuccess($event)\"\n      (onSubmitError)=\"onSubmitError($event)\"\n      (onCancel)=\"onCancel()\"\n    ></onevoice-feedback-form>\n  </div>\n</div>\n","/*\n * Public API Surface of onevoice\n */\n\n// Module\nexport * from './lib/onevoice.module';\n\n// Components\nexport * from './lib/components/feedback-form/feedback-form.component';\nexport * from './lib/components/feedback-button/feedback-button.component';\n\n// Services\nexport * from './lib/services/onevoice.service';\n\n// Models & Interfaces\nexport * from './lib/models/onevoice-config.interface';\n\n// Tokens\nexport * from './lib/onevoice.tokens';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.OneVoiceService"],"mappings":"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"}