{"version":3,"file":"shorterloop.mjs","sources":["../../../projects/ui/src/lib/evaluate-experiment-variants/evaluate-experiment-variants.component.ts","../../../projects/ui/src/lib/form-field/form-field.component.ts","../../../projects/ui/src/lib/image/image.config.ts","../../../projects/ui/src/lib/image/image.component.ts","../../../projects/ui/src/lib/image/image.component.html","../../../projects/ui/src/lib/image/image.module.ts","../../../projects/ui/src/lib/kanban/column-names.pipe.ts","../../../projects/ui/src/lib/kanban/is-empty-object.pipe.ts","../../../projects/ui/src/lib/kanban/kanban.component.ts","../../../projects/ui/src/lib/kanban/kanban.component.html","../../../projects/ui/src/lib/product-tours/services/tour.service.ts","../../../projects/ui/src/lib/product-tours/components/auto-tour-trigger/auto-tour-trigger.component.ts","../../../projects/ui/src/lib/product-tours/components/tour-modal/tour-modal.component.ts","../../../projects/ui/src/lib/product-tours/components/tour-modal/tour-modal.component.html","../../../projects/ui/src/lib/product-tours/components/tour-trigger/tour-trigger.component.ts","../../../projects/ui/src/lib/product-tours/product-tour.module.ts","../../../projects/ui/src/lib/product-tours/public-api.ts","../../../projects/ui/src/lib/progress/progress.component.ts","../../../projects/ui/src/lib/progress/progress.component.html","../../../projects/ui/src/lib/progress/progress.module.ts","../../../projects/ui/src/services/api-observer/api-call-observer.service.ts","../../../projects/ui/src/public-api.ts","../../../projects/ui/src/shorterloop.ts"],"sourcesContent":["import {\n  AfterContentInit,\n  Component,\n  ContentChildren,\n  EventEmitter,\n  forwardRef,\n  Output,\n  QueryList,\n} from '@angular/core';\nimport {\n  ControlValueAccessor,\n  NG_VALUE_ACCESSOR,\n  NgControl,\n} from '@angular/forms';\nimport { debounceTime, distinctUntilChanged, Subscription } from 'rxjs';\ninterface ComparisonFunction {\n  (a: any, b: any): any;\n}\n\nconst goalToComparisonFunction: { [key: string]: ComparisonFunction } = {\n  HIGHEST_RESULT: (a: any, b: any) =>\n    a.minValue > b.maxValue ? a : b.minValue > a.maxValue ? b : null,\n  LOWEST_RESULT: (a: any, b: any) =>\n    a.maxValue < b.minValue ? a : b.maxValue < a.minValue ? b : null,\n};\n@Component({\n  selector: 'shorterloop-evaluate-experiment-variants',\n  standalone: true,\n  imports: [],\n  template: `\n    <ng-content></ng-content>\n  `,\n  host: {\n    class: 'shorterloop-evaluate-experiments',\n  },\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => EvaluateExperimentVariantsComponent),\n      multi: true,\n    },\n  ],\n})\nexport class EvaluateExperimentVariantsComponent\n  implements ControlValueAccessor, AfterContentInit {\n  @Output() winnerVariantFound = new EventEmitter<any>();\n\n  @ContentChildren(NgControl, { descendants: true }) controlsArray!: QueryList<\n    NgControl\n  >;\n  onChange: any = () => { };\n  onTouched: any = () => { };\n\n  private subscriptions: Subscription[] = [];\n\n  ngAfterContentInit() {\n    this.handleControlChanges();\n\n    // Subscribe to changes in the QueryList\n    this.controlsArray.changes.subscribe(() => {\n      this.handleControlChanges();\n    });\n  }\n\n  /**\n * Handles changes to the controls in the form.\n * This method unsubscribes from any previous control subscriptions to prevent memory leaks,\n * then subscribes to value changes in each control to handle change detection, form validation,\n * and winner variant evaluation.\n *\n * @private\n */\n  private handleControlChanges() {\n    // Clear previous subscriptions to avoid memory leaks\n    this.subscriptions.forEach(sub => sub.unsubscribe());\n    this.subscriptions = [];\n\n    const controls = this.controlsArray.toArray();\n\n    controls.forEach((control: any) => {\n      if (control.control) {\n        const sub = control.valueChanges\n          ?.pipe(debounceTime(300), distinctUntilChanged())\n          .subscribe((value: any) => {\n            this.onChange(value);\n            this.onTouched();\n\n            const requiredControls = this.getRequiredControlNames(controls);\n            const data = this.extractControlValues(controls, requiredControls);\n            const winnerVariant = this.evaluateExperiment(\n              data?.variants,\n              data.goal,\n              data.threshold\n            );\n            if (winnerVariant) {\n              this.winnerVariantFound.emit(winnerVariant);\n            }\n          });\n\n        this.subscriptions.push(sub); // Keep track of all subscriptions\n      }\n    });\n  }\n\n  ngOnDestroy() {\n    // Unsubscribe from all subscriptions when the component is destroyed to prevent memory leaks\n    this.subscriptions.forEach(sub => sub.unsubscribe());\n  }\n\n  /**\n   * Retrieves the control names needed for extraction based on available fields.\n   *\n   * @param {Array} fields - The array of field objects.\n   * @returns {Array} - An array of unique control names from the fields.\n   */\n  getRequiredControlNames(fields: any) {\n    // Extract control names from fields and filter out undefined or null names\n    return Array.from(\n      new Set(\n        fields.map((control: any) => control?.name).filter((name: any) => name)\n      )\n    );\n  }\n\n  /**\n   * Extracts the values of the specified controls from the fields array.\n   *\n   * @param {Array} fields - The array of field objects.\n   * @param {Array} controlNames - The list of control names to extract values for.\n   * @returns {Object} - An object containing the extracted control values.\n   */\n  extractControlValues(fields: any, controlNames: any) {\n    const result: any = {};\n    const arrayOfResults: any[] = [];\n\n    // Temporarily store grouped controls for sampleSize, results, and resultSymbol\n    const groupedControls: { [key: string]: any[] } = {\n      sampleSize: [],\n      result: [],\n      resultSymbol: [],\n      id: [],\n    };\n\n    for (const control of fields) {\n      if (controlNames.includes(control?.name)) {\n        if (groupedControls.hasOwnProperty(control.name)) {\n          // Store the controls in the corresponding group using bracket notation\n          groupedControls[control.name].push(control.value);\n        } else {\n          result[control.name] = control.value;\n        }\n      }\n    }\n    // Combine the grouped controls into an array of objects\n    const numberOfGroups = groupedControls['sampleSize'].length;\n    for (let i = 0; i < numberOfGroups; i++) {\n      let resultValue = groupedControls['result'][i];\n      const resultSymbol = groupedControls['resultSymbol'][i];\n      const sampleSize = groupedControls['sampleSize'][i];\n\n      // Convert result to percentage if resultSymbol is '#'\n      if (resultSymbol === '#') {\n        resultValue = (resultValue / sampleSize) * 100;\n      }\n\n      arrayOfResults.push({\n        id: groupedControls['id'][i],\n        sampleSize: groupedControls['sampleSize'][i],\n        result: resultValue,\n        minValue: resultValue,\n        maxValue: resultValue,\n        resultSymbol: resultSymbol,\n      });\n    }\n\n    // Add the grouped results array to the result object\n    result['variants'] = arrayOfResults;\n\n    return result;\n  }\n\n  // Write a new value to the element.\n  writeValue(value: any): void {\n    const controls = this.controlsArray.toArray();\n\n    if (controls) {\n      controls.forEach(control => {\n        if (control.control) {\n          control.control.setValue(value, { emitEvent: false });\n        }\n      });\n    }\n  }\n\n  // Set the function to be called when the control receives a change event.\n  registerOnChange(fn: any): void {\n    this.onChange = fn;\n  }\n\n  // Set the function to be called when the control receives a touch event.\n  registerOnTouched(fn: any): void {\n    this.onTouched = fn;\n  }\n\n  /**\n   * This function evaluates the results of an experiment with multiple variants. It compares the results of the variants\n   * to determine the winner based on the specified goal (e.g., highest result, lowest result) and threshold. If a threshold\n   * is provided, the function will also evaluate whether the winner is clearly above or below the threshold.\n   *\n   * @param {*} variants\n   * @param {*} goal\n   * @param {*} threshold\n   * @returns {object} result\n   */\n\n  evaluateExperiment(variants: any, goal: any, threshold = null) {\n    if (\n      variants.length === 0 ||\n      variants[0] == null ||\n      (!threshold && variants.length === 1)\n    ) {\n      return { evaluation: 'INCONCLUSIVE', isInconclusive: true };\n    }\n\n    let comparisonFunction = goalToComparisonFunction[goal];\n    let result =\n      variants.length > 1\n        ? this.compareVariants(variants, comparisonFunction)\n        : { winner: variants[0], isInconclusive: false, evaluation: 'WINNER' };\n\n    if (result.evaluation === 'INCONCLUSIVE') {\n      if (!threshold) return result;\n      let thresholdComparison = this.compareVariants(\n        [this.createThresholdVariant(threshold), variants[0]],\n        comparisonFunction\n      );\n      return this.evaluateAgainstThreshold(thresholdComparison);\n    }\n\n    if (threshold) {\n      let thresholdComparison = this.compareVariants(\n        [this.createThresholdVariant(threshold), result.winner],\n        comparisonFunction\n      );\n      if (!thresholdComparison.winner)\n        return { evaluation: 'INCONCLUSIVE', isInconclusive: true };\n      if (\n        thresholdComparison === null ||\n        thresholdComparison.winner.id === 'THRESHOLD'\n      ) {\n        return {\n          ...thresholdComparison,\n          evaluation: 'CLEARLY_BELOW',\n          isInconclusive: false,\n        };\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * This function compares multiple variants to determine the winner based on the specified comparison function.\n   * It iterates over the variants and compares them pairwise to find the overall winner.\n   * @param {*} variants\n   * @param {*} comparisonFunction\n   * @returns An object containing the winner, whether the result is inconclusive, and the evaluation result\n   */\n  compareVariants(variants: any, comparisonFunction: any) {\n    if (variants.length < 2) {\n      return {\n        winner: variants[0],\n        isInconclusive: false,\n        evaluation: 'WINNER',\n      };\n    }\n\n    let winner = variants[0];\n    let isInconclusive = false;\n\n    for (let i = 1; i < variants.length; i++) {\n      let comparisonResult = this.compareTwo(\n        winner,\n        variants[i],\n        comparisonFunction\n      );\n\n      if (comparisonResult.isInconclusive) {\n        isInconclusive = true;\n        break;\n      }\n\n      if (comparisonResult.winner !== winner) {\n        winner = comparisonResult.winner;\n      }\n    }\n\n    return {\n      winner: isInconclusive ? null : winner,\n      isInconclusive: isInconclusive,\n      evaluation: isInconclusive ? 'INCONCLUSIVE' : 'WINNER',\n    };\n  }\n\n  /**\n   * This function compares two variants based on the specified comparison function. It returns the variant that is the winner\n   * @param {*} variantA\n   * @param {*} variantB\n   * @param {*} comparisonFunction\n   * @returns An object containing the winner, whether the result is inconclusive, and the evaluation result\n   */\n  compareTwo(variantA: any, variantB: any, comparisonFunction: any) {\n    if (!this.isValidVariant(variantA) || !this.isValidVariant(variantB)) {\n      return { isInconclusive: true };\n    }\n\n    let winner = comparisonFunction(variantA, variantB);\n\n    if (winner === null) {\n      return { isInconclusive: true };\n    }\n\n    return {\n      winner: winner,\n      isInconclusive: false,\n      evaluation: winner.id === 'THRESHOLD' ? 'CLEARLY_BELOW' : 'WINNER',\n    };\n  }\n\n  /**\n   * This function checks if a variant is valid. A valid variant must have numeric values for minValue, maxValue, and result.\n   *\n   * @param {*} variant\n   * @returns {boolean} True if the variant is valid, false otherwise\n   */\n  isValidVariant(variant: any) {\n    return (\n      variant &&\n      !isNaN(variant.minValue) &&\n      !isNaN(variant.maxValue) &&\n      !isNaN(variant.result)\n    );\n  }\n\n  /**\n   * This function creates a threshold variant with the specified threshold value.\n   * @param {*} threshold The threshold value to use\n   * @returns A threshold variant object\n   */\n  createThresholdVariant(threshold: any) {\n    return {\n      minValue: threshold,\n      maxValue: threshold,\n      resultPercentage: threshold,\n      result: threshold / 100,\n      id: 'THRESHOLD',\n    };\n  }\n\n  /**\n   * This function evaluates the comparison result against the threshold value.\n   * If the winner is the threshold variant, it returns \"CLEARLY_BELOW\".\n   * If the winner is not the threshold variant, it returns \"WINNER\".\n   * If there is no winner, it returns \"INCONCLUSIVE\".\n   * @param {*} comparison The comparison result object\n   * @returns An object containing the winner, the evaluation result, and whether the result is inconclusive\n   */\n  evaluateAgainstThreshold(comparison: any) {\n    if (!comparison.winner) {\n      return {\n        evaluation: 'INCONCLUSIVE',\n        isInconclusive: true,\n      };\n    }\n\n    if (comparison.winner.id === 'THRESHOLD') {\n      return {\n        winner: comparison.winner,\n        evaluation: 'CLEARLY_BELOW',\n        isInconclusive: false,\n      };\n    }\n\n    return {\n      winner: comparison.winner,\n      evaluation: 'WINNER',\n      isInconclusive: false,\n    };\n  }\n}\n","import { AfterContentInit, Component, ContentChildren, forwardRef, QueryList } from '@angular/core';\nimport { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR, NgControl } from '@angular/forms';\n\n@Component({\n  selector: 'shorterloop-sample-size-calculator',\n  template: `<ng-content></ng-content>`,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => SampleSizeCalculator),\n      multi: true\n    }\n  ],\n  standalone: true,\n  host: {\n    class: 'shorterloop-sample-size-calculator'\n  }\n})\nexport class SampleSizeCalculator implements ControlValueAccessor, AfterContentInit {\n  @ContentChildren(NgControl, { descendants: true }) controlsArray!: QueryList<NgControl>;\n\n  // Callbacks\n  onChange: any = () => { };\n  onTouched: any = () => { };\n\n  ngAfterContentInit() {\n    const controls = this.controlsArray.toArray();\n    //@ts-ignore\n    const recommendedSampleSizeControl = controls.find((control: any) => control.name === 'recommendedSampleSize') as FormControl;\n\n\n    controls.forEach((control: any) => {\n      if (control.control) {\n        control.valueChanges?.subscribe((value: any) => {\n          this.onChange(value);\n          this.onTouched();\n\n          if (recommendedSampleSizeControl) {\n            const requiredControls = this.getRequiredControlNames(controls);\n            const data = this.extractControlValues(controls, requiredControls);\n\n            const recommendedSampleSize = this.calculateSampleSize(data);\n\n            //@ts-ignore\n            recommendedSampleSizeControl.control.setValue(recommendedSampleSize, { emitEvent: false });\n          }\n        });\n      }\n    });\n  }\n\n\n  /**\n   * Retrieves the control names needed for extraction based on available fields.\n   *\n   * @param {Array} fields - The array of field objects.\n   * @returns {Array} - An array of unique control names from the fields.\n   */\n  getRequiredControlNames(fields: any) {\n    // Extract control names from fields and filter out undefined or null names\n    return Array.from(new Set(fields.map((control: any) => control?.name).filter((name: any) => name)));\n  }\n\n  /**\n * Extracts the values of the specified controls from the fields array.\n *\n * @param {Array} fields - The array of field objects.\n * @param {Array} controlNames - The list of control names to extract values for.\n * @returns {Object} - An object containing the extracted control values.\n */\n  extractControlValues(fields: any, controlNames: any) {\n    const result: any = {};\n\n    for (const control of fields) {\n      if (controlNames.includes(control?.name)) {\n        result[control.name] = control.value;\n      }\n    }\n\n    return result;\n  }\n\n  /**\n * This function calculates the sample size required for an experiment. It uses the formula:\n * n = (Z^2 * p * (1 - p)) / E^2\n * where:\n * - n is the sample size\n * - Z is the z-score for the desired confidence interval\n * - p is the proportion of the population that has the attribute being measured\n * - E is the desired margin of error\n * If the population size is known and less than 1,000,000, the formula is adjusted to:\n * n = (Z^2 * p * (1 - p)) / (E^2 / (N / (N - 1) + 1))\n * where N is the population size\n *\n * @param {*} params\n * @returns {number} sampleSize\n * @description Calculate the sample size required for an experiment\n * @example calculateSampleSize({ confidenceLevel: 0.95, populationSize: 1000, resultMaxValue: 0.6, resultMinValue: 0.4, targetMarginOfError: 0.05 }); // 384\n */\n  calculateSampleSize(params: any) {\n    let {\n      confidenceLevel,\n      populationSize,\n      resultMaxValue,\n      resultMinValue,\n      targetMarginOfError\n    } = params;\n    // if (!targetMarginOfError || !(resultMinValue && resultMaxValue)) return null;\n    let proportion = this.determineProportionForCalculation(resultMinValue / 100, resultMaxValue / 100);\n    let zScore = confidenceLevel;\n    if (zScore === undefined) {\n      throw new Error('Invalid confidence level provided');\n    }\n    let numerator = Math.pow(zScore, 2) * proportion * (1 - proportion) / Math.pow(targetMarginOfError, 2);\n    // Handle unknown population size\n    if (!populationSize || populationSize > 1000000) {\n      return Math.ceil(numerator);\n    } else {\n      return Math.round(numerator / (numerator / populationSize + 1));\n    }\n  }\n  /**\n * This function determines the proportion to use for the sample size calculation. It chooses the value that is further from 0.5\n * @param {*} minValue The minimum value of the proportion range (0-1)\n * @param {*} maxValue The maximum value of the proportion range (0-1)\n * @returns The proportion to use for the sample size calculation\n */\n  determineProportionForCalculation(minValue = 0, maxValue = 1) {\n    // If minValue is greater than 0.5 and less than 0.5, or\n    // if minValue is less than 0.5 and maxValue is greater than 0.5, or\n    // if maxValue is falsy (0, null, undefined, etc.), use 0.5\n    if ((minValue > 0.5 && minValue < 0.5) ||\n      (minValue < 0.5 && maxValue > 0.5) ||\n      !maxValue) {\n      return 0.5;\n    }\n    // Otherwise, use the value that's further from 0.5\n    return Math.abs(0.5 - minValue) < Math.abs(0.5 - maxValue) ? minValue : maxValue;\n  }\n\n\n  // Write a new value to the element.\n  writeValue(value: any): void {\n    const controls = this.controlsArray.toArray();\n\n    if (controls) {\n      controls.forEach(control => {\n        if (control.control) {\n          control.control.setValue(value, { emitEvent: false });\n        }\n      });\n    }\n  }\n\n  // Set the function to be called when the control receives a change event.\n  registerOnChange(fn: any): void {\n    this.onChange = fn;\n  }\n\n  // Set the function to be called when the control receives a touch event.\n  registerOnTouched(fn: any): void {\n    this.onTouched = fn;\n  }\n\n  // Optional: to handle disabled state\n  setDisabledState?(isDisabled: boolean): void {\n    const controls = this.controlsArray.toArray();\n\n    if (controls) {\n      controls.forEach(control => {\n        if (control.control) {\n          isDisabled ? control.control.disable() : control.control.enable();\n        }\n      });\n    }\n  }\n}\n","/**\n * Configurable parameters\n */\nexport const CONFIG = {\n  ImageMinWidth: 100,\n  ImageMinHeight: 100,\n  MaxImageSize: 5000000,\n  AcceptedType: ['image/png', 'image/jpeg'],\n};\nexport const DEFAULT_SRC = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIwJSIgeTE9IjAlIiB4Mj0iMTAwJSIgeTI9IjEwMCUiPjxzdG9wIG9mZnNldD0iMCUiIHN0eWxlPSJzdG9wLWNvbG9yOiM5NGEzYjg7c3RvcC1vcGFjaXR5OjEiLz48c3RvcCBvZmZzZXQ9IjEwMCUiIHN0eWxlPSJzdG9wLWNvbG9yOiM2NDc0OGI7c3RvcC1vcGFjaXR5OjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3R5bGU9InN0b3AtY29sb3I6I2ZmZjtzdG9wLW9wYWNpdHk6MSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3R5bGU9InN0b3AtY29sb3I6I2YxZjVmOTtzdG9wLW9wYWNpdHk6MSIvPjwvbGluZWFyR3JhZGllbnQ+PGNsaXBQYXRoIGlkPSJhIj48cmVjdCB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHJ4PSIxMiIgcnk9IjEyIi8+PC9jbGlwUGF0aD48L2RlZnM+PGcgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBmaWxsPSJ1cmwoI2IpIiBkPSJNMCAwaDY0djY0SDB6Ii8+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMS41IiBmaWxsPSIjNjQ3NDhiIiBvcGFjaXR5PSIuMTUiLz48Y2lyY2xlIGN4PSI1MiIgY3k9IjEyIiByPSIxLjUiIGZpbGw9IiM2NDc0OGIiIG9wYWNpdHk9Ii4xNSIvPjxjaXJjbGUgY3g9IjEyIiBjeT0iNTIiIHI9IjEuNSIgZmlsbD0iIzY0NzQ4YiIgb3BhY2l0eT0iLjE1Ii8+PGNpcmNsZSBjeD0iNTIiIGN5PSI1MiIgcj0iMS41IiBmaWxsPSIjNjQ3NDhiIiBvcGFjaXR5PSIuMTUiLz48Y2lyY2xlIGN4PSIzMiIgY3k9IjI0IiByPSI5LjUiIGZpbGw9InVybCgjYykiLz48cGF0aCBkPSJNMTggNTJzMS0xMCAxNC0xMCAxNCAxMCAxNCAxMCIgZmlsbD0idXJsKCNjKSIvPjxwYXRoIGZpbGw9IiNmZmYiIG9wYWNpdHk9Ii4wOCIgZD0iTTAgMGg2NHY2NEgweiIvPjwvZz48L3N2Zz4=';\nexport const DEFAULT_EDIT_ICON = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAACgSURBVHgB7ZNbDYQwEEWnZAWsg7WAhVUCDsABOEACOAAn4AAJ4GC4kCGUBhLa/hDCSW76mPRk5qNEj4SZQ6RGMvJFZANvlOQDBF+k5T35Wg8sRHNnhVJqxPGPdFr5RzYYY5ZGp/N96CrrD6TOslgEq7QgG0yZ3EVy9hrzlV0X5vI49ZEFJ/IES4UsvwK/oyNbtA7ZeUzw0faVUWucOrs9E1nWWwxpibaJAAAAAElFTkSuQmCC'\n","import { Component, EventEmitter, Input, OnInit, Output, SimpleChanges } from '@angular/core';\nimport { CONFIG, DEFAULT_SRC, DEFAULT_EDIT_ICON } from './image.config';\n\ninterface IRestrictions {\n  ImageMinWidth: number,\n  ImageMinHeight: number,\n  MaxImageSize: number,\n  AcceptedType: any,\n}\n@Component({\n  selector: 'shorterloop-image',\n  templateUrl: './image.component.html',\n  styleUrls: ['./image.component.scss']\n})\nexport class ImageComponent implements OnInit {\n  @Input() imageSrc: any = '';\n  @Input() editIcon = '';\n  @Input() restrictions: IRestrictions = CONFIG;\n  @Output() imageChanged = new EventEmitter();\n  @Output() error = new EventEmitter();\n  isImageUploaded = false;\n  uploadButtonText = 'Upload Image';\n  removeButtonText = 'Remove Image';\n  errorField: any = {};\n  constructor() { }\n\n  ngOnInit(): void {\n    if (!this.editIcon) {\n      this.editIcon = DEFAULT_EDIT_ICON;\n    }\n    if (!this.imageSrc) {\n      this.imageSrc = DEFAULT_SRC;\n    } else {\n      this.isImageUploaded = true;\n    }\n    this.restrictions = { ...this.restrictions, ...CONFIG };\n  }\n\n  ngOnChanges(change: SimpleChanges) {\n    const currentValue: any = change;\n\n    if (\n      currentValue &&\n      currentValue.restrictions &&\n      !currentValue.restrictions.firstChange &&\n      currentValue.restrictions.currentValue\n    ) {\n      this.restrictions = { ...this.restrictions, ...CONFIG };\n    }\n  }\n\n  /**\n * Handle the image upload query\n */\n  imageUpload($event: any, imageContainer: any) {\n    $event.preventDefault();\n    $event.stopImmediatePropagation();\n    const imgSrc: any = imageContainer.querySelector('shorterloop-image #imgSrc');\n    const file = $event.target.files[0];\n    this.getImageDetails(file).then(details => {\n      if (this.isImageValid(details) === true) {\n        imgSrc.src = window.URL.createObjectURL(file);\n        this.errorField = {\n          imageErrorShow: false,\n          imageErrorMessage: '',\n        };\n        this.isImageUploaded = true;\n        this.imageChanged.emit($event.target.files[0]);\n      } else {\n        this.error.emit(this.isImageValid(details) as string);\n      }\n    });\n  }\n\n  removeImage(imageContainer: any) {\n    const imgSrc: any = imageContainer.querySelector('#imgSrc');\n    imgSrc.src = DEFAULT_SRC;\n    this.imageChanged.emit('');\n    this.isImageUploaded = false;\n  }\n\n  getImageDetails(file: File): Promise<any> {\n    return new Promise(function (resolve, reject) {\n      if (!file) {\n        return reject();\n      }\n      const size = file.size;\n      const type = file.type;\n      const fr = new FileReader();\n      fr.onload = () => {\n        // when file has loaded\n        const img = new Image();\n\n        img.onload = () => {\n          resolve({ width: img.width, height: img.height, size, type });\n        };\n\n        img.src = fr.result as string; // This is the data URL\n      };\n\n      fr.readAsDataURL(file);\n    });\n  }\n\n  isImageValid(details: any) {\n    if (!this.restrictions.AcceptedType.includes(details.type)) {\n      return 'image-format';\n    }\n\n    if (this.restrictions.MaxImageSize < details.size) {\n      return 'image-max-size';\n    }\n\n    if (\n      details.width < this.restrictions.ImageMinWidth ||\n      details.height < this.restrictions.ImageMinHeight\n    ) {\n      return 'too-small-image';\n    }\n\n    return true;\n  }\n\n  handleImageError(imageContainer: any) {\n    const imgSrc: any = imageContainer.querySelector('#imgSrc');\n    imgSrc.src = DEFAULT_SRC;\n  }\n\n}\n","<div class=\"photo_wrap\" #imageContainer>\n  <!-- upload photo on hover -->\n  <a class=\"photo_overlay\" (click)=\"fileInput.click()\">\n    <img [src]=\"editIcon\" alt=\"edit\" />\n  </a>\n  <input\n    hidden\n    type=\"file\"\n    #fileInput\n    accept=\"image/png, image/jpeg, image/jpg\"\n    (change)=\"imageUpload($event, imageContainer)\"\n  />\n\n  <img\n    class=\"company_image\"\n    [src]=\"imageSrc\"\n    id=\"imgSrc\"\n    #imgSrc\n    (error)=\"handleImageError(imageContainer)\"\n  />\n</div>\n<div class=\"name_wrap\">\n  <!-- Upload photo -->\n  <div *ngIf=\"!isImageUploaded\" class=\"upload_photo_button upload_photo\">\n    <button (click)=\"fileInput.click()\" class=\"upload_btn\">\n      {{ uploadButtonText }}\n    </button>\n    <input\n      hidden\n      type=\"file\"\n      #fileInput\n      accept=\"image/png, image/jpeg, image/jpg\"\n      (change)=\"imageUpload($event, imageContainer)\"\n    />\n  </div>\n  <!-- Remove photo -->\n  <div *ngIf=\"isImageUploaded\" class=\"upload_photo_button remove_photo\">\n    <button (click)=\"removeImage(imageContainer)\" class=\"upload_btn\">\n      {{ removeButtonText }}\n    </button>\n    <input\n      hidden\n      type=\"file\"\n      #fileInput\n      accept=\"image/png, image/jpeg, image/jpg\"\n      (change)=\"imageUpload($event, imageContainer)\"\n    />\n  </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ImageComponent } from './image.component';\n\n@NgModule({\n  declarations: [\n    ImageComponent\n  ],\n  exports: [\n    ImageComponent\n  ],\n  imports: [\n    CommonModule\n  ]\n})\nexport class ImageModule { }\n","// column-names.pipe.ts\n\nimport { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n  name: 'columnNames',\n  standalone: true\n})\nexport class ColumnNamesPipe implements PipeTransform {\n\n  transform(data: any, allItems: any): string[] {\n    const columnNames: string[] = [];\n\n    // Iterate over each column in the swimlane\n    data.columns.forEach((column: any) => {\n      // Push the column heading into the columnNames array\n      columnNames.push(column);\n    });\n    this.toggleCollapseSwimlane(data, allItems);\n    return columnNames;\n  }\n\n  toggleCollapseSwimlane(column: any, allItems: any) {\n    allItems.forEach((data: any) => {\n      const idealWidth = 100 / data.columns.length;\n      data.columns.forEach((column: any) => {\n        column.idealWidth = idealWidth;\n\n        if (column.collapsed) {\n          column.idealWidth = 10;\n        }\n      })\n\n      // }\n    });\n  }\n\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n  name: 'isEmptyObject',\n  standalone: true\n})\nexport class IsEmptyObjectPipe implements PipeTransform {\n\n  transform(value: any): boolean {\n    return value && Object.keys(value).length === 0 && value.constructor === Object;\n  }\n\n}","import { AfterViewInit, Component, ElementRef, EventEmitter, Input, Output, QueryList, ViewChildren } from '@angular/core';\nimport { CdkDragDrop, moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';\nimport { CommonModule } from '@angular/common';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { ColumnNamesPipe } from './column-names.pipe';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { IsEmptyObjectPipe } from './is-empty-object.pipe';\n\n\ninterface LibraryItem {\n  type: 'link' | 'chip' | 'budget' | 'timeFrame' | 'avatar' | string; // Types for different items\n  label?: string; // Label for the item (optional depending on type)\n  value?: string | string[] | { value?: string; backgroundColor?: string; foregroundColor?: string; }[]; // Value for the item (optional depending on type)\n  url?: string; // URL for links (optional depending on type)\n  currency?: string; // Currency for budget (optional depending on type)\n  amount?: number; // Amount for budget (optional depending on type)\n  reference?: string; // Reference for links (optional depending on type)\n  author?: { // Author details (optional depending on type)\n    photo?: string;\n    name?: string;\n  };\n}\n\n\ninterface Task {\n  id: number;\n  header: LibraryItem[];\n  belongsTo: object;\n  body: {\n    description: string;\n    contenteditable?: boolean\n    action?: {\n      event: ($event: any, column: Column) => void;\n    };\n  };\n  footer: LibraryItem[];\n  borderColor?: string;\n  toggleColumn?: boolean;\n}\n\ninterface Column {\n  id: number;\n  heading: string;\n  tasks: Task[];\n  collapsed?: boolean;\n  action?:[ {\n    label: string;\n    event: ($event: any, column: Column) => void;\n  }, {\n    label: string;\n    event: ($event: any, column: Column) => void;\n  }]\n}\n\ninterface Swimlane {\n  id: number;\n  heading: string;\n  columns: Column[];\n}\n\ntype KanbanData = Column[] | Swimlane[] | any[];\n\n@Component({\n  selector: 'shorterloop-kanban',\n  standalone: true,\n  imports: [CommonModule, DragDropModule, MatIconModule, MatExpansionModule, MatMenuModule, IsEmptyObjectPipe, ColumnNamesPipe],\n  templateUrl: './kanban.component.html',\n  styleUrls: ['./kanban.component.css'],\n})\nexport class KanbanComponent implements AfterViewInit {\n  @Input() data: KanbanData = [];\n  @Input() type = '';\n  @Input() tableHeaders: any = [];\n  @Output() itemOrderChanged = new EventEmitter();\n  @Output() cardUpdated = new EventEmitter();\n\n  @ViewChildren('kanbanList') kanbanLists!: QueryList<ElementRef>;\n\n  constructor(public sanitizer: DomSanitizer) { }\n\n  drop(event: CdkDragDrop<Task[]>) {\n    let dropCard = {};\n    if (event.previousContainer === event.container) {\n      moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);\n      dropCard = event.container.data[event.currentIndex];\n    } else {\n      transferArrayItem(\n        event.previousContainer.data,\n        event.container.data,\n        event.previousIndex,\n        event.currentIndex\n      );\n      dropCard = event.container.data[event.currentIndex];\n    }\n\n    setTimeout((_: any) => {\n      this.adjustColumnHeights(event.container.id);\n      this.adjustColumnHeights(event.previousContainer.id);\n    });\n\n    this.itemOrderChanged.emit({\n      droppedInto: event.container.id,\n      dropCard,\n      data: event.container.data\n    });\n  }\n\n  ngAfterViewInit() {\n    this.adjustColumnHeights();\n    // this.setupMutationObserver();\n  }\n\n  private adjustColumnHeights(only = '') {\n    let listing: any = this.kanbanLists;\n\n    if (only) {\n      const swimlane: any = document.querySelector('#' + only);\n      const swimlaneRow = swimlane.getAttribute('customId');\n      //@ts-ignore\n      listing = this.kanbanLists._results.filter((list: any) => list.nativeElement.getAttribute('customId') === swimlaneRow)\n    }\n    if (listing) {\n      const columnHeights: any = listing.map((list: any) => {\n        const children = Array.from(list.nativeElement.children);\n        const totalHeight = children.reduce((height: any, child: any) => {\n          const childStyles = window.getComputedStyle(child);\n          const marginBottom = parseFloat(childStyles.marginBottom);\n          const paddingBottom = parseFloat(childStyles.paddingBottom);\n          return height + child.offsetHeight + marginBottom + paddingBottom;\n        }, 0);\n        return totalHeight;\n      });\n\n      const maxHeight = Math.max(...columnHeights);\n      listing.forEach((list: any) => {\n        (list.nativeElement as HTMLElement).style.height = `${maxHeight}px`;\n      });\n    }\n  }\n\n  addAction($event: any, column: any, columnType : any) {\n    const currentTarget = $event.currentTarget;\n    if (columnType) {\n      column.columnType = columnType\n    }\n    const isBody = currentTarget.classList.contains('task-body')\n    if (isBody && column?.body?.action && column?.body?.action?.event) {\n      column?.body?.action?.event($event, column);\n    } else if( columnType && columnType?.action ) {\n      columnType?.action?.event($event, column);\n    } else {\n      column?.action?.event($event, column);\n    }\n  }\n\n  saveCard(column: any, textContent: any) {\n    column.body.summary = textContent;\n    this.cardUpdated.emit(column);\n  }\n\n  toggleCollapse(column: Column) {\n    const collapsedColumns = this.data.filter((col: any) => col.collapsed);\n\n    const totalColumns = this.data.length;\n    const collapsedCount = collapsedColumns.length;\n    const remainingColumns = totalColumns - collapsedCount;\n\n    if ((remainingColumns > 1 && !column.collapsed) || (remainingColumns >= 1 && column.collapsed)) {\n      column.collapsed = !column.collapsed;\n    }\n  }\n\n  toggleCollapseSwimlane(column: any) {\n    // Toggle the collapsed state of the specified column\n    this.data.forEach((swimlane: any) => {\n      swimlane.columns.forEach((col: any) => {\n        if (col.id === column.id) {\n          col.collapsed = !col.collapsed;\n        }\n      });\n    });\n\n    // Calculate the number of collapsed columns and the remaining width\n    // @ts-ignore\n    const totalColumns = this.data[0].columns.length;\n    let collapsedColumns = this.data.flatMap((swimlane: any) => swimlane.columns).filter((col: any) => col.collapsed);\n    // Filter out duplicates by id\n    collapsedColumns = collapsedColumns.reduce((acc, current) => {\n      const x = acc.find((item: any) => item.id === current.id);\n      if (!x) {\n        return acc.concat([current]);\n      } else {\n        return acc;\n      }\n    }, []);\n\n    const collapsedCount = collapsedColumns.length;\n    const remainingColumns = totalColumns - collapsedCount;\n    const remainingWidth = 100 - (collapsedCount * 10);\n\n    // Update the idealWidth of each column based on its collapsed state\n    this.data.forEach((swimlane: any) => {\n      swimlane.columns.forEach((col: any) => {\n        if (col.collapsed) {\n          // There must be one column always expanded.\n\n          if (remainingColumns) {\n            col.idealWidth = 10;\n          } else {\n            if (col.id === column.id) {\n              col.idealWidth = 100 - ((totalColumns - 1) * 10);\n              col.collapsed = false;\n            }\n          }\n        } else {\n          col.idealWidth = remainingWidth / remainingColumns;\n        }\n      });\n    });\n  }\n\n  toggleCollapseForWorkFlow(column: any, columnNumber: number) {\n    const collapsedColumns = this.tableHeaders.filter((col: any) => col.collapsed);\n\n    const totalColumns = this.tableHeaders.length;\n    const collapsedCount = collapsedColumns.length;\n    const remainingColumns = totalColumns - collapsedCount;\n    if ((remainingColumns > 1 && !column.collapsed) || (remainingColumns >= 1 && column.collapsed)) {\n      column.collapsed = !column.collapsed;\n    }\n  }\n}\n","<!-- kanban.component.html -->\n<div class=\"kanban-board\" cdkDropListGroup *ngIf=\"!type\">\n  <ng-container *ngFor=\"let column of data\">\n    <div [style.width.%]=\"!column?.collapsed? (100 / data.length): 10\" class=\"kanban-column\">\n      <div class=\"kanban-column-header\">\n        <h2 [class.collapsed]=\"column?.collapsed\">\n          <span *ngIf=\"!column?.collapsed\">{{ column.heading }}</span>\n\n          <span class=\"expand-icon\" *ngIf=\"column?.toggleColumn\" [class.icon_center]=\"column?.collapsed\"\n            (click)=\"toggleCollapse(column)\">\n            <!-- Custom symbols for expand and collapse -->\n            <ng-container *ngIf=\"!column?.collapsed; else collapsedIcon\">\n              <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n                fill=\"#5f6368\">\n                <path d=\"M400-80 0-480l400-400 71 71-329 329 329 329-71 71Z\" />\n              </svg>\n            </ng-container>\n            <ng-template #collapsedIcon>\n              <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n                fill=\"#5f6368\">\n                <path d=\"m321-80-71-71 329-329-329-329 71-71 400 400L321-80Z\" />\n              </svg>\n            </ng-template>\n          </span>\n        </h2>\n      </div>\n\n      <div class=\"kanban-column-data\">\n        <div *ngIf=\"column?.collapsed\" class=\"vertical-writing\">\n          [{{column.tasks?.length}}] {{column.heading}}\n        </div>\n        <div cdkDropList [cdkDropListData]=\"column.tasks\" class=\"kanban-list\" #kanbanList\n          (cdkDropListDropped)=\"drop($event)\" *ngIf=\"!column?.collapsed\" [id]=\"column.key || column.heading\">\n          <div class=\"kanban-item\" *ngFor=\"let task of column.tasks\" cdkDrag [cdkDragDisabled]=\"column?.preventDrag\"\n            [style.borderLeft]=\"task?.borderColor ? '4px solid ' + task?.borderColor : ''\">\n            <div class=\"task-card\">\n              <!-- Header -->\n              <div class=\"task-header d-flex\" *ngIf=\"task.header?.length\">\n                <div class=\"header_core_items\">\n                  <ng-container *ngFor=\"let item of task.header\">\n                    <ng-container *ngIf=\"item.type === 'link'\">\n                      <span class=\"link item_external_key\">\n                        <a (click)=\"addAction($event, item)\">{{ item.label }}</a>\n                      </span>\n                    </ng-container>\n                    <ng-container *ngIf=\"item.type === 'chip'\">\n                      <span class=\"chip-container\">\n                        <span *ngFor=\"let chip of item.value\" class=\"chip\"\n                          [style.backgroundColor]=\"chip?.backgroundColor\" [style.color]=\"chip?.foregroundColor\">{{\n                          chip?.value\n                          }}</span>\n                      </span>\n                    </ng-container>\n                    <!-- Add more header types as needed -->\n                  </ng-container>\n                </div>\n\n                <button cdkDragHandle class=\"drag_handle cdk-drag-handle drag_icon btn_transparent\"\n                  style=\"touch-action: none; -webkit-user-drag: none; -webkit-tap-highlight-color: transparent; user-select: none;\">\n                  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                    <path\n                      d=\"M11 18C11 19.1 10.1 20 9 20C7.9 20 7 19.1 7 18C7 16.9 7.9 16 9 16C10.1 16 11 16.9 11 18ZM9 10C7.9 10 7 10.9 7 12C7 13.1 7.9 14 9 14C10.1 14 11 13.1 11 12C11 10.9 10.1 10 9 10ZM9 4C7.9 4 7 4.9 7 6C7 7.1 7.9 8 9 8C10.1 8 11 7.1 11 6C11 4.9 10.1 4 9 4ZM15 8C16.1 8 17 7.1 17 6C17 4.9 16.1 4 15 4C13.9 4 13 4.9 13 6C13 7.1 13.9 8 15 8ZM15 10C13.9 10 13 10.9 13 12C13 13.1 13.9 14 15 14C16.1 14 17 13.1 17 12C17 10.9 16.1 10 15 10ZM15 16C13.9 16 13 16.9 13 18C13 19.1 13.9 20 15 20C16.1 20 17 19.1 17 18C17 16.9 16.1 16 15 16Z\"\n                      fill=\"#E0E0E0\" />\n                  </svg>\n                </button>\n              </div>\n\n              <!-- Body -->\n              <div class=\"task-body\" (keydown.enter)=\"$event.target.blur()\"\n                (focusout)=\"saveCard(task, $event.target.textContent)\" [innerHTML]=\"task.body?.summary\"\n                [class.input_empty_state]=\"!task.body?.summary\" [class.content_editable]=\"task.body?.contenteditable\"\n                (mousedown)=\"task.body?.contenteditable? $event.stopPropagation(): null\"\n                [attr.contenteditable]=\"task.body?.contenteditable\"\n                (click)=\"task.body?.contenteditable? addAction($event, task): null\">\n              </div>\n\n              <ng-container *ngIf=\"task?.belongsTo && task?.belongsTo?.link\">\n                <div class=\"belongs_to\"><b>{{task?.belongsTo?.label}}</b>: <a [href]=\"task?.belongsTo?.link\"\n                    target=\"_blank\">{{\n                    task?.belongsTo?.value }}</a>\n                </div>\n              </ng-container>\n\n              <!-- Footer -->\n              <div class=\"task-footer\" *ngIf=\"task.footer?.length\">\n                <ng-container *ngFor=\"let item of task.footer\">\n                  <div class=\"avatar\" *ngIf=\"item.type === 'avatar'\">\n                    <img *ngIf=\"item?.photo\" [src]=\"item?.photo\" alt=\"{{ item.label }}\" />\n                    <span>{{ item.label }}</span>\n                  </div>\n                  <ng-container *ngIf=\"item.type === 'budget'\">\n                    <div>{{item?.label}} {{ item.value }}</div>\n                  </ng-container>\n                  <ng-container *ngIf=\"item.type === 'timeFrame'\">\n                    <div>{{item?.label}}: {{ item.value }}</div>\n                  </ng-container>\n                  <!-- Add more footer types as needed -->\n                </ng-container>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <ng-container *ngIf=\"!column?.action?.length\">\n          <div class=\"kanban-column-action\" *ngIf=\"column?.action && !column?.collapsed\">\n            <a class=\"add-button\" (click)=\"addAction($event, column)\">{{ column?.action?.label }}</a>\n          </div>\n        </ng-container>\n\n        <ng-container *ngIf=\"column?.action?.length\">\n          <div class=\"kanban_column_action_container\">\n            <ng-container *ngFor=\"let interval of column?.action\">\n              <div class=\"kanban-column-action\">\n                <a class=\"add-button\" (click)=\"addAction($event, column, interval)\">{{ interval?.label }}</a>\n              </div>\n            </ng-container>\n          </div>\n        </ng-container>\n\n      </div>\n    </div>\n  </ng-container>\n</div>\n\n<!-- Swimlane -->\n<ng-container *ngIf=\"type === 'swimlane'\">\n  <div class=\"kanban-board\">\n    <ng-container *ngFor=\"let column of data[0] | columnNames: data\">\n      <div [style.width.%]=\"column?.idealWidth\" class=\"kanban-column\">\n        <div class=\"kanban-column-header\">\n          <h2 [class.collapsed]=\"column?.collapsed\">\n            <span *ngIf=\"!column?.collapsed\">{{ column.heading }}</span>\n\n            <span class=\"expand-icon\" *ngIf=\"column?.toggleColumn\" [class.icon_center]=\"column?.collapsed\"\n              (click)=\"toggleCollapseSwimlane(column)\">\n              <!-- Custom symbols for expand and collapse -->\n              <ng-container *ngIf=\"!column?.collapsed; else collapsedIcon\">\n                <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n                  fill=\"#5f6368\">\n                  <path d=\"M400-80 0-480l400-400 71 71-329 329 329 329-71 71Z\" />\n                </svg>\n              </ng-container>\n              <ng-template #collapsedIcon>\n                <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n                  fill=\"#5f6368\">\n                  <path d=\"m321-80-71-71 329-329-329-329 71-71 400 400L321-80Z\" />\n                </svg>\n              </ng-template>\n            </span>\n          </h2>\n        </div>\n      </div>\n    </ng-container>\n  </div>\n\n  <section cdkDropListGroup class=\"swimlane-section\">\n    <details open *ngFor=\"let column of data\">\n      <summary>{{ column?.heading }}</summary>\n\n      <div class=\"kanban-board\">\n        <div class=\"kanban-column-data\" *ngFor=\"let dataColumn of column.columns\"\n          [style.width.%]=\"dataColumn?.idealWidth\" [class.padding_0]=\"dataColumn?.collapsed\">\n          <div *ngIf=\"dataColumn?.collapsed\" class=\"vertical-writing\">\n            [{{dataColumn.tasks?.length}}] {{dataColumn.heading}}\n          </div>\n\n          <div cdkDropList [cdkDropListData]=\"dataColumn.tasks\" class=\"kanban-list\" [id]=\"th?.label\"\n            attr.customId=\"swimlane_row_{{column?.id}}\" #kanbanList (cdkDropListDropped)=\"drop($event)\"\n            *ngIf=\"!dataColumn?.collapsed\">\n            <div class=\"kanban-item\" *ngFor=\"let task of dataColumn.tasks\" cdkDrag\n              [style.borderLeft]=\"task?.borderColor ? '4px solid ' + task?.borderColor : ''\">\n              <div class=\"task-card\">\n                <!-- Header -->\n                <div class=\"task-header\" *ngIf=\"task?.header?.length\">\n                  <ng-container *ngFor=\"let item of task.header\">\n                    <ng-container *ngIf=\"item.type === 'link'\">\n                      <span class=\"link\">\n                        <a (click)=\"addAction($event, item)\">{{ item.label }}</a>\n                      </span>\n                    </ng-container>\n                    <ng-container *ngIf=\"item.type === 'chip'\">\n                      <span class=\"chip-container\">\n                        <span *ngFor=\"let chip of item.value\" class=\"chip\"\n                          [style.backgroundColor]=\"chip?.backgroundColor\" [style.color]=\"chip?.foregroundColor\">{{\n                          chip?.value\n                          }}</span>\n                      </span>\n                    </ng-container>\n                    <!-- Add more header types as needed -->\n                  </ng-container>\n                </div>\n\n                <!-- Body -->\n                <div class=\"task-body\" (keydown.enter)=\"$event.target.blur()\"\n                  (focusout)=\"saveCard(task, $event.target.textContent)\" [innerHTML]=\"task.body?.summary\"\n                  [class.input_empty_state]=\"!task.body?.summary\" [class.content_editable]=\"task.body?.contenteditable\"\n                  (mousedown)=\"task.body?.contenteditable? $event.stopPropagation(): null\"\n                  [attr.contenteditable]=\"task.body?.contenteditable\"\n                  (click)=\"task.body?.contenteditable? addAction($event, task): null\">\n                </div>\n\n                <ng-container *ngIf=\"task?.belongsTo && task?.belongsTo?.link\">\n                  <div class=\"belongs_to\"><b>{{task?.belongsTo?.label}}</b>: <a [href]=\"task?.belongsTo?.link\"\n                      target=\"_blank\">{{\n                      task?.belongsTo?.value }}</a>\n                  </div>\n                </ng-container>\n\n                <!-- Footer -->\n                <div class=\"task-footer\" *ngIf=\"task.footer?.length\">\n                  <ng-container *ngFor=\"let item of task.footer\">\n                    <div class=\"avatar\" *ngIf=\"item.type === 'avatar'\">\n                      <img *ngIf=\"item?.photo\" [src]=\"item?.photo\" alt=\"{{ item.label }}\" />\n                      <span>{{ item.label }}</span>\n                    </div>\n                    <ng-container *ngIf=\"item.type === 'budget'\">\n                      <div>{{item?.label}}: {{ item.value }}</div>\n                    </ng-container>\n                    <ng-container *ngIf=\"item.type === 'timeFrame'\">\n                      <div>{{item?.label}}: {{ item.value }}</div>\n                    </ng-container>\n                    <!-- Add more footer types as needed -->\n                  </ng-container>\n                </div>\n              </div>\n            </div>\n          </div>\n\n          <div class=\"kanban-column-action\" *ngIf=\"column?.action && !column?.collapsed\">\n            <a class=\"add-button\" (click)=\"addAction($event, column)\">{{ column?.action?.label }}</a>\n          </div>\n        </div>\n      </div>\n    </details>\n  </section>\n</ng-container>\n\n<!-- Workflow  -->\n<ng-container *ngIf=\"type === 'workflow'\">\n  <table>\n    <thead>\n      <tr>\n        <th *ngFor=\"let th of tableHeaders; let i=index\" [style.width.%]=\"100 / tableHeaders.length\">\n          <span class=\"workflow-table-heading\">{{ th.label }}</span>\n\n          <span class=\"add_action_button add-next\" (click)=\"addAction($event, th, th?.type)\"\n            *ngIf=\"!th?.shouldNotAllowAdding\">\n            <svg class=\"add-next\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\n              xmlns=\"http://www.w3.org/2000/svg\">\n              <rect width=\"32\" height=\"32\" rx=\"4\" fill=\"#F8F6FE\" />\n              <path\n                d=\"M16 20.6664C15.8112 20.6664 15.6472 20.5971 15.508 20.4584C15.3694 20.3192 15.3 20.1552 15.3 19.9664V16.7H12.0336C11.8448 16.7 11.6808 16.6307 11.5416 16.492C11.403 16.3528 11.3336 16.1888 11.3336 16C11.3336 15.8112 11.403 15.6472 11.5416 15.508C11.6808 15.3693 11.8448 15.3 12.0336 15.3H15.3V12.0336C15.3 11.8448 15.3694 11.6808 15.508 11.5416C15.6472 11.4029 15.8112 11.3336 16 11.3336C16.1888 11.3336 16.3528 11.4029 16.492 11.5416C16.6307 11.6808 16.7 11.8448 16.7 12.0336V15.3H19.9664C20.1552 15.3 20.3192 15.3693 20.4584 15.508C20.5971 15.6472 20.6664 15.8112 20.6664 16C20.6664 16.1888 20.5971 16.3528 20.4584 16.492C20.3192 16.6307 20.1552 16.7 19.9664 16.7H16.7V19.9664C16.7 20.1552 16.6307 20.3192 16.492 20.4584C16.3528 20.5971 16.1888 20.6664 16 20.6664Z\"\n                fill=\"#c4501c\" />\n            </svg>\n          </span>\n        </th>\n      </tr>\n    </thead>\n    <tbody>\n      <ng-container *ngFor=\"let opportunity of data; let i = index\">\n        <tr>\n          <!-- First column for opportunity details -->\n          <td [attr.rowspan]=\"opportunity.solutions.length + 1\" class=\"odd-section\"\n            [style.borderLeft.px]=\"(data?.length === 2 && (opportunity.opportunity | isEmptyObject)) ? '1' : '0'\"\n            [style.height.px]=\"(data?.length === 2 && (opportunity.opportunity | isEmptyObject)) ? '0' : 'auto'\">\n            <div class=\"kanban-item\" *ngIf=\"!(opportunity.opportunity | isEmptyObject)\"\n              [style.borderLeft]=\"opportunity.opportunity?.borderColor ? '4px solid ' + opportunity.opportunity?.borderColor : ''\">\n              <div class=\"task-card\">\n                <!-- Header -->\n                <div class=\"task-header\" *ngIf=\"opportunity.opportunity?.header?.length\">\n                  <ng-container *ngFor=\"let item of opportunity.opportunity.header\">\n                    <ng-container *ngIf=\"item.type === 'link'\">\n                      <span class=\"link\">\n                        <a (click)=\"addAction($event, item)\">{{ item.label }}</a>\n                      </span>\n                    </ng-container>\n                    <ng-container *ngIf=\"item.type === 'chip'\">\n                      <span class=\"chip-container\">\n                        <span *ngFor=\"let chip of item.value\" class=\"chip\"\n                          [style.backgroundColor]=\"chip?.backgroundColor\" [style.color]=\"chip?.foregroundColor\">\n                          {{ chip?.value }}\n                        </span>\n                      </span>\n                    </ng-container>\n                    <!-- Add more header types as needed -->\n                  </ng-container>\n                </div>\n\n                <!-- Body -->\n                <div class=\"task-body\" (keydown.enter)=\"$event.target.blur()\"\n                  (focusout)=\"saveCard(opportunity.opportunity, $event.target.textContent)\"\n                  [class.input_empty_state]=\"!opportunity.opportunity?.body?.summary\"\n                  [class.content_editable]=\"opportunity.opportunity?.body?.contenteditable\"\n                  (mousedown)=\"opportunity.opportunity?.body?.contenteditable? $event.stopPropagation(): null\"\n                  [innerHTML]=\"opportunity.opportunity?.body?.summary\"\n                  [attr.contenteditable]=\"opportunity.opportunity?.body?.contenteditable\"\n                  (click)=\"!opportunity.opportunity?.contenteditable? addAction($event, opportunity.opportunity): null\">\n                </div>\n\n                <ng-container *ngIf=\"opportunity.opportunity?.belongsTo && opportunity.opportunity?.belongsTo?.link\">\n                  <div class=\"belongs_to\"><b>{{opportunity.opportunity?.belongsTo?.label}}</b>: <a\n                      [href]=\"opportunity.opportunity?.belongsTo?.link\" target=\"_blank\">{{\n                      opportunity.opportunity?.belongsTo?.value }}</a>\n                  </div>\n                </ng-container>\n\n                <!-- Footer -->\n                <div class=\"task-footer\" *ngIf=\"opportunity.opportunity?.footer?.length\">\n                  <ng-container *ngFor=\"let item of opportunity.opportunity?.footer\">\n                    <div class=\"avatar\" *ngIf=\"item.type === 'avatar'\">\n                      <img *ngIf=\"item?.photo\" [src]=\"item?.photo\" alt=\"{{ item.label }}\" />\n                      <span>{{ item.label }}</span>\n                    </div>\n                    <ng-container *ngIf=\"item.type === 'budget'\">\n                      <div>{{item?.label}}: {{ item.value }}</div>\n                    </ng-container>\n                    <ng-container *ngIf=\"item.type === 'timeFrame'\">\n                      <div>{{item?.label}}: {{ item.value }}</div>\n                    </ng-container>\n                    <!-- Add more footer types as needed -->\n                  </ng-container>\n                </div>\n              </div>\n            </div>\n            <div *ngIf=\"opportunity.opportunity?.action\" class=\"workflow-kanban-action\">\n              <a (click)=\"addAction($event, opportunity.opportunity, 'solutions')\" class=\"d-flex\">\n                <span *ngIf=\"opportunity.opportunity?.action?.icon\"\n                  [innerHTML]=\"sanitizer.bypassSecurityTrustHtml(opportunity.opportunity?.action?.icon)\"></span>\n                <span class=\"add_action_button add-next\">{{ opportunity.opportunity?.action?.label }}</span>\n              </a>\n            </div>\n          </td>\n          <td *ngIf=\"!opportunity.solutions?.length\"\n            [style.borderLeft.px]=\"(data?.length === 2 && (opportunity.opportunity | isEmptyObject)) ? '1' : '0'\"\n            [style.height.px]=\"(data?.length === 2 && (opportunity.opportunity | isEmptyObject)) ? '0' : 'auto'\"></td>\n          <td *ngIf=\"!opportunity.solutions?.length\" class=\"odd-section\"\n            [style.borderLeft.px]=\"(data?.length === 2 && (opportunity.opportunity | isEmptyObject)) ? '1' : '0'\"\n            [style.height.px]=\"(data?.length === 2 && (opportunity.opportunity | isEmptyObject)) ? '0' : 'auto'\"></td>\n        </tr>\n        <!-- Rows for each solution and its experiments -->\n        <ng-container *ngFor=\"let solution of opportunity.solutions; let j = index\">\n          <tr>\n            <!-- Solution column -->\n            <td>\n              <div class=\"kanban-item\" *ngIf=\"!(solution.solution | isEmptyObject)\"\n                [style.borderLeft]=\"solution.solution?.borderColor ? '4px solid ' + solution.solution?.borderColor : ''\">\n                <div class=\"task-card\">\n                  <!-- Header -->\n                  <div class=\"task-header\" *ngIf=\"solution.solution?.header?.length\">\n                    <ng-container *ngFor=\"let item of solution.solution?.header\">\n                      <ng-container *ngIf=\"item.type === 'link'\">\n                        <span class=\"link\">\n                          <a (click)=\"addAction($event, item)\">{{ item.label }}</a>\n                        </span>\n                      </ng-container>\n                      <ng-container *ngIf=\"item.type === 'chip'\">\n                        <span class=\"chip-container\">\n                          <span *ngFor=\"let chip of item.value\" class=\"chip\"\n                            [style.backgroundColor]=\"chip?.backgroundColor\" [style.color]=\"chip?.foregroundColor\">\n                            {{ chip?.value }}\n                          </span>\n                        </span>\n                      </ng-container>\n                      <!-- Add more header types as needed -->\n                    </ng-container>\n                  </div>\n\n                  <!-- Body -->\n                  <div class=\"task-body\" (keydown.enter)=\"$event.target.blur()\"\n                    (focusout)=\"saveCard(solution.solution, $event.target.textContent)\"\n                    [class.input_empty_state]=\"!solution.solution?.body?.summary\"\n                    [class.content_editable]=\"solution.solution?.body?.contenteditable\"\n                    (mousedown)=\"solution.solution?.body?.contenteditable? $event.stopPropagation(): null\"\n                    [innerHTML]=\"solution.solution?.body?.summary\"\n                    [attr.contenteditable]=\"solution.solution?.body?.contenteditable\"\n                    (click)=\"solution.solution?.body?.contenteditable? addAction($event, solution.solution): null\">\n                  </div>\n\n                  <ng-container *ngIf=\"solution.solution?.belongsTo && solution.solution?.belongsTo?.link\">\n                    <div class=\"belongs_to\"><b>{{solution.solution?.belongsTo?.label}}</b>: <a\n                        [href]=\"solution.solution?.belongsTo?.link\" target=\"_blank\">{{\n                        solution.solution?.belongsTo?.value }}</a>\n                    </div>\n                  </ng-container>\n\n                  <!-- Footer -->\n                  <div class=\"task-footer\" *ngIf=\"solution.solution?.footer?.length\">\n                    <ng-container *ngFor=\"let item of solution.solution?.footer\">\n                      <div class=\"avatar\" *ngIf=\"item.type === 'avatar'\">\n                        <img *ngIf=\"item?.photo\" [src]=\"item?.photo\" alt=\"{{ item.label }}\" />\n                        <span>{{ item.label }}</span>\n                      </div>\n                      <ng-container *ngIf=\"item.type === 'budget'\">\n                        <div>{{item?.label}}: {{ item.value }}</div>\n                      </ng-container>\n                      <ng-container *ngIf=\"item.type === 'timeFrame'\">\n                        <div>{{item?.label}}: {{ item.value }}</div>\n                      </ng-container>\n                      <ng-container *ngIf=\"item.type === 'belongsTo'\">\n                        <div>{{item?.label}}: {{ item.value }}</div>\n                      </ng-container>\n                      <!-- Add more footer types as needed -->\n                    </ng-container>\n                  </div>\n                </div>\n              </div>\n              <div *ngIf=\"solution.solution?.action\" class=\"workflow-kanban-action\">\n                <a (click)=\"addAction($event, solution.solution,'experiments')\" class=\"d-flex\">\n                  <span *ngIf=\"solution.solution?.action?.icon\"\n                    [innerHTML]=\"sanitizer.bypassSecurityTrustHtml(solution.solution?.action?.icon)\"></span>\n                  <span class=\"add_action_button add-next\">{{ solution.solution?.action?.label }}</span>\n                </a>\n              </div>\n            </td>\n\n            <!-- Experiments column -->\n            <td class=\"odd-section\">\n              <ng-container *ngFor=\"let experiment of solution.experiments\" class=\"kanban-list\">\n                <div class=\"kanban-item\"\n                  [style.borderLeft]=\"experiment?.borderColor ? '4px solid ' + experiment?.borderColor : ''\">\n                  <div class=\"task-card\">\n                    <!-- Header -->\n                    <div class=\"task-header\" *ngIf=\"experiment.header?.length\">\n                      <ng-container *ngFor=\"let item of experiment.header\">\n                        <ng-container *ngIf=\"item.type === 'link'\">\n                          <span class=\"link\">\n                            <a (click)=\"addAction($event, item)\">{{ item.label }}</a>\n                          </span>\n                        </ng-container>\n                        <ng-container *ngIf=\"item.type === 'chip'\">\n                          <span class=\"chip-container\">\n                            <span *ngFor=\"let chip of item.value\" class=\"chip\"\n                              [style.backgroundColor]=\"chip?.backgroundColor\" [style.color]=\"chip?.foregroundColor\">\n                              {{ chip?.value }}\n                            </span>\n                          </span>\n                        </ng-container>\n                        <!-- Add more header types as needed -->\n                      </ng-container>\n                    </div>\n\n                    <!-- Body -->\n                    <div class=\"task-body\" (keydown.enter)=\"$event.target.blur()\"\n                      (focusout)=\"saveCard(experiment, $event.target.textContent)\"\n                      [innerHTML]=\"experiment.body?.summary\" [class.input_empty_state]=\"!experiment.body?.summary\"\n                      [class.content_editable]=\"experiment.body?.contenteditable\"\n                      (mousedown)=\"experiment.body?.contenteditable? $event.stopPropagation(): null\"\n                      (click)=\"experiment.body?.contenteditable? addAction($event, experiment): null\"\n                      [attr.contenteditable]=\"experiment.body?.contenteditable\">\n                    </div>\n                    <ng-container *ngIf=\"experiment?.belongsTo && experiment?.belongsTo?.link\">\n                      <div class=\"belongs_to\"><b>{{experiment?.belongsTo?.label}}</b>: <a\n                          [href]=\"experiment?.belongsTo?.link\" target=\"_blank\">{{\n                          experiment?.belongsTo?.value }}</a>\n                      </div>\n                    </ng-container>\n                    <!-- Footer -->\n                    <div class=\"task-footer\" *ngIf=\"experiment.footer?.length\">\n                      <ng-container *ngFor=\"let item of experiment.footer\">\n                        <div class=\"avatar\" *ngIf=\"item.type === 'avatar'\">\n                          <img *ngIf=\"item?.photo\" [src]=\"item?.photo\" alt=\"{{ item.label }}\" />\n                          <span>{{ item.label }}</span>\n                        </div>\n                        <ng-container *ngIf=\"item.type === 'budget'\">\n                          <div>{{item?.label}}: {{ item.value }}</div>\n                        </ng-container>\n                        <ng-container *ngIf=\"item.type === 'timeFrame'\">\n                          <div>{{item?.label}}: {{ item.value }}</div>\n                        </ng-container>\n                        <!-- Add more footer types as needed -->\n                      </ng-container>\n                    </div>\n                  </div>\n                </div>\n              </ng-container>\n            </td>\n          </tr>\n        </ng-container>\n      </ng-container>\n    </tbody>\n  </table>\n</ng-container>","import { HttpClient } from '@angular/common/http';\nimport { ApplicationRef, ComponentFactoryResolver, ComponentRef, EmbeddedViewRef, Inject, Injectable, Injector, Optional } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { Tour, TourOptions, ToursConfig } from '../models/tour.model';\nimport { TourModalComponent } from '../public-api';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class ShorterLoopTourService {\n  private tours = new Map<string, Tour>();\n  private allToursConfig: ToursConfig | null = null;\n  private currentTourSubject = new BehaviorSubject<Tour | null>(null);\n  private currentStepSubject = new BehaviorSubject<number>(0);\n  private autoTriggeredTours = new Set<string>();\n\n  private readonly storageKey: string;\n  private readonly enableLocalStorage: boolean;\n\n  public currentTour$ = this.currentTourSubject.asObservable();\n  public currentStep$ = this.currentStepSubject.asObservable();\n  private modalRef: ComponentRef<TourModalComponent> | null = null;\n\n  constructor(\n    private http: HttpClient,\n    @Optional() @Inject('TOUR_OPTIONS') private options: TourOptions,\n    private injector: Injector,\n    private appRef: ApplicationRef,\n    private componentFactoryResolver: ComponentFactoryResolver\n  ) {\n    this.storageKey = this.options?.storageKey || 'shorterloop_auto_triggered_tours';\n    this.enableLocalStorage = this.options?.enableLocalStorage !== false;\n\n    // Load auto-triggered tours from localStorage (permanent storage)\n    if (this.enableLocalStorage && typeof window !== 'undefined') {\n      const stored = localStorage.getItem(this.storageKey);\n      if (stored) {\n        try {\n          this.autoTriggeredTours = new Set(JSON.parse(stored));\n        } catch (error) {\n          console.warn('Failed to parse stored tour data:', error);\n          this.autoTriggeredTours = new Set();\n        }\n      }\n    }\n  }\n\n  // Check if tour was auto-triggered permanently\n  wasAutoTriggered(tourId: string): boolean {\n    return this.autoTriggeredTours.has(tourId);\n  }\n\n  // Mark tour as auto-triggered permanently\n  markAsAutoTriggered(tourId: string): void {\n    this.autoTriggeredTours.add(tourId);\n    if (this.enableLocalStorage && typeof window !== 'undefined') {\n      try {\n        localStorage.setItem(this.storageKey, JSON.stringify([...this.autoTriggeredTours]));\n      } catch (error) {\n        console.warn('Failed to save tour data to localStorage:', error);\n      }\n    }\n  }\n\n  // Auto-trigger tour if not shown before (permanent check)\n  async autoTriggerTour(tourId: string): Promise<boolean> {\n    if (this.wasAutoTriggered(tourId)) {\n      console.log(`Tour ${tourId} was already auto-triggered before`);\n      return false; // Already auto-triggered permanently\n    }\n\n    const tour = await this.getTour(tourId);\n    if (tour) {\n      this.markAsAutoTriggered(tourId);\n      this.ensureModalCreated();\n      this.currentTourSubject.next(tour);\n      this.currentStepSubject.next(0);\n      console.log(`Auto-triggered tour: ${tourId} (will not auto-trigger again)`);\n      return true;\n    }\n    return false;\n  }\n\n  // Load tours from external source\n  async loadToursFromUrl(url: string): Promise<void> {\n    try {\n      //@ts-ignore\n      this.allToursConfig = await this.http.get<ToursConfig>(url).toPromise();\n      if (this.allToursConfig) {\n        Object.values(this.allToursConfig).forEach((tour) => {\n          this.tours.set(tour.tourId, tour);\n        });\n      }\n    } catch (error) {\n      console.error('Failed to load tours from URL:', url, error);\n    }\n  }\n\n  // Load tours from configuration object\n  loadToursFromConfig(config: ToursConfig): void {\n    this.allToursConfig = config;\n    Object.values(config).forEach((tour) => {\n      this.tours.set(tour.tourId, tour);\n    });\n  }\n\n  // Get tour by ID\n  async getTour(tourId: string): Promise<Tour | null> {\n    return this.tours.get(tourId) || null;\n  }\n\n  // Get all available tours\n  getAllTours(): Tour[] {\n    return Array.from(this.tours.values());\n  }\n\n  // Start a specific tour (manual trigger)\n  async startTour(tourId: string): Promise<void> {\n    const tour = await this.getTour(tourId);\n    if (tour) {\n      this.ensureModalCreated();\n      this.currentTourSubject.next(tour);\n      this.currentStepSubject.next(0);\n    }\n  }\n\n  // Stop current tour\n  stopTour(): void {\n    this.currentTourSubject.next(null);\n    this.currentStepSubject.next(0);\n\n    if (this.modalRef) {\n      this.appRef.detachView(this.modalRef.hostView);\n      this.modalRef.destroy();\n      this.modalRef = null;\n    }\n  }\n\n  // Navigate to next step\n  nextStep(): void {\n    const currentTour = this.currentTourSubject.value;\n    const currentStep = this.currentStepSubject.value;\n\n    if (currentTour && currentStep < currentTour.steps.length - 1) {\n      this.currentStepSubject.next(currentStep + 1);\n    } else {\n      this.stopTour();\n    }\n  }\n\n  // Navigate to previous step\n  prevStep(): void {\n    const currentStep = this.currentStepSubject.value;\n    if (currentStep > 0) {\n      this.currentStepSubject.next(currentStep - 1);\n    }\n  }\n\n  // Get current tour\n  getCurrentTour(): Tour | null {\n    return this.currentTourSubject.value;\n  }\n\n  // Get current step\n  getCurrentStep(): number {\n    return this.currentStepSubject.value;\n  }\n\n  // Check if tour is active\n  isTourActive(): boolean {\n    return this.currentTourSubject.value !== null;\n  }\n\n  // Reset auto-triggered tours (for testing or user preference)\n  resetAutoTriggeredTours(): void {\n    this.autoTriggeredTours.clear();\n    if (this.enableLocalStorage && typeof window !== 'undefined') {\n      localStorage.removeItem(this.storageKey);\n    }\n  }\n\n  // Get list of auto-triggered tours\n  getAutoTriggeredTours(): string[] {\n    return [...this.autoTriggeredTours];\n  }\n\n  private ensureModalCreated(): void {\n    if (this.modalRef) return;\n\n    const factory = this.componentFactoryResolver.resolveComponentFactory(TourModalComponent);\n    this.modalRef = factory.create(this.injector);\n\n    this.appRef.attachView(this.modalRef.hostView);\n    const domElem = (this.modalRef.hostView as EmbeddedViewRef<any>).rootNodes[0] as HTMLElement;\n    document.body.appendChild(domElem);\n  }\n\n\n  // Manually mark tour as auto-triggered (useful for migration)\n  setTourAsAutoTriggered(tourId: string): void {\n    this.markAsAutoTriggered(tourId);\n  }\n}\n","import { Component, Inject, Input, OnDestroy, OnInit, Optional } from '@angular/core';\nimport { BehaviorSubject, Subscription } from 'rxjs';\nimport { TourOptions } from '../../models/tour.model';\nimport { ShorterLoopTourService } from '../../services/tour.service';\n\n@Component({\n  selector: 'sl-auto-tour-trigger',\n  template: '', // No template needed - this is a logic-only component\n  styleUrls: []\n})\nexport class AutoTourTriggerComponent implements OnInit, OnDestroy {\n  @Input() tourId!: string;\n  @Input() delay?: number; // Delay in milliseconds before auto-triggering\n\n  private subscriptions = new Subscription();\n  private timeoutId?: number;\n  private readonly defaultDelay: number;\n\n  private currentTourSubject = new BehaviorSubject<any>(null); // You can strongly type this if needed\n\n  constructor(\n    private tourService: ShorterLoopTourService,\n    @Optional() @Inject('TOUR_OPTIONS') private options: TourOptions\n  ) {\n    this.defaultDelay = this.options?.autoTriggerDelay || 1500;\n  }\n\n  ngOnInit(): void {\n    const triggerDelay = this.delay ?? this.defaultDelay;\n\n    // Subscribe to currentTour$ and push into local BehaviorSubject\n    this.subscriptions.add(\n      this.tourService.currentTour$.subscribe(tour => {\n        this.currentTourSubject.next(tour);\n      })\n    );\n\n    // Subscribe to local BehaviorSubject and control auto-triggering\n    this.subscriptions.add(\n      this.currentTourSubject.subscribe(currentTour => {\n        console.log('[AutoTourTriggerComponent] currentTour emitted:', currentTour);\n        if (currentTour) return; // Tour already active\n\n        this.timeoutId = window.setTimeout(async () => {\n          const wasTriggered = await this.tourService.autoTriggerTour(this.tourId);\n          if (wasTriggered) {\n            console.log(`[AutoTourTriggerComponent] Auto-triggered tour: ${this.tourId}`);\n          }\n        }, triggerDelay);\n      })\n    );\n  }\n\n  ngOnDestroy(): void {\n    this.subscriptions.unsubscribe();\n    if (this.timeoutId) {\n      clearTimeout(this.timeoutId);\n    }\n  }\n}\n","import { AfterViewChecked, Component, ElementRef, Input, OnDestroy, OnInit, Renderer2, ViewChild } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { Tour, TourStep } from '../../models/tour.model';\nimport { ShorterLoopTourService } from '../../services/tour.service';\n\n@Component({\n  selector: 'sl-tour-modal',\n  templateUrl: './tour-modal.component.html',\n  styleUrls: ['./tour-modal.component.scss']\n})\nexport class TourModalComponent implements OnInit, OnDestroy, AfterViewChecked {\n  @Input() customClass = '';\n  @Input() showProgressCounter = true;\n  @Input() showProgressDots = true;\n  @Input() allowClickOutsideToClose = true;\n  @ViewChild('tourModal') modalElement!: ElementRef;\n  private styleElement: HTMLStyleElement;\n\n  currentTour: Tour | null = null;\n  currentStep = 0;\n  currentStepData: TourStep | null = null;\n  isActive = false;\n  isLastStep = false;\n  modalWidth = 360;\n  modalTop = 0;\n  modalLeft = 0;\n  showModal = false;\n  modalHeight = 'auto';\n  positionRecalculated = false;\n  modalArrowDirection = 'arrow-top';\n  private subscriptions = new Subscription();\n\n  constructor(\n    private tourService: ShorterLoopTourService,\n    private renderer: Renderer2\n  ) {\n    this.styleElement = this.renderer.createElement('style');\n    this.styleElement.textContent = `\n      .sl-tour-highlight {\n        background: #fff;\n  position: relative !important; \n  z-index: 10000 !important;\n      border: 2px solid #c4501c;\n  animation: sl-tour-pulse-white 1.5s infinite !important; /*\n      }\n\n@keyframes sl-tour-pulse-white { /* New keyframes for a white pulsing effect */\n  0% { box-shadow: 0 0 0 0 rgba(255, 255, 255, 0.4); } /* Start with a stronger white glow */\n  70% { box-shadow: 0 0 0 10px rgba(255, 255, 255, 0); } /* Expand and fade out */\n  100% { box-shadow: 0 0 0 0 rgba(255, 255, 255, 0); } /* Reset for infinite loop */\n}\n\n    `;\n    this.renderer.appendChild(document.head, this.styleElement);\n  }\n\n  ngOnInit(): void {\n    this.subscriptions.add(\n      this.tourService.currentTour$.subscribe(tour => {\n        this.currentTour = tour;\n        this.isActive = !!tour;\n        this.updateCurrentStep();\n      })\n    );\n\n    this.subscriptions.add(\n      this.tourService.currentStep$.subscribe(step => {\n        this.currentStep = step;\n        this.updateCurrentStep();\n        this.highlightTarget();\n      })\n    );\n  }\n\n  ngAfterViewChecked(): void {\n    if (this.showModal && !this.positionRecalculated && this.modalElement) {\n      this.recalculatePositionWithActualHeight();\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.subscriptions.unsubscribe();\n    this.removeHighlights();\n    this.renderer.removeChild(document.head, this.styleElement);\n  }\n\n  private updateCurrentStep(): void {\n    if (this.currentTour && this.currentTour.steps[this.currentStep]) {\n      this.currentStepData = this.currentTour.steps[this.currentStep];\n      this.isLastStep = this.currentStep === this.currentTour.steps.length - 1;\n    }\n  }\n\n  private getScrollOffsets(): { scrollX: number; scrollY: number } {\n    return {\n      scrollX: window.scrollX || document.documentElement.scrollLeft,\n      scrollY: window.scrollY || document.documentElement.scrollTop\n    };\n  }\n\n  private highlightTarget(): void {\n    this.removeHighlights();\n    this.showModal = false;\n    this.positionRecalculated = false;\n\n    if (!this.isActive || !this.currentStepData?.target) return;\n\n    const element = document.querySelector(this.currentStepData.target) as HTMLElement;\n    if (!element) return;\n\n    this.renderer.addClass(element, 'sl-tour-highlight');\n    element.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'nearest' });\n\n    // Wait for scroll to complete and DOM to update\n    this.calculateInitialPosition(element);\n  }\n\n  private calculateInitialPosition(element: HTMLElement): void {\n    const rect = element.getBoundingClientRect();\n    const scroll = this.getScrollOffsets();\n    const { modalWidth, gap } = this.calculateModalDimensions();\n\n    this.modalWidth = modalWidth;\n    const viewport = {\n      width: window.innerWidth,\n      height: window.innerHeight\n    };\n\n    // Calculate available space\n    const space = {\n      right: viewport.width - rect.right - gap,\n      left: rect.left - gap,\n      bottom: viewport.height - rect.bottom - gap,\n      top: rect.top - gap\n    };\n    // Position priority: right → left → bottom → top → center\n    if (space.right >= modalWidth) {\n      this.positionRight(rect, scroll, gap);\n    } else if (space.left >= modalWidth) {\n      this.positionLeft(rect, scroll, gap);\n    } else if (space.bottom >= 100) { // Minimum space for modal\n      this.positionBottom(rect, scroll, gap);\n    } else if (space.top >= 100) {\n      this.positionTop(rect, scroll, gap);\n    } else {\n      this.positionCenter(viewport, scroll);\n    }\n\n    this.showModal = true;\n  }\n\n  private recalculatePositionWithActualHeight(): void {\n    if (!this.modalElement) return;\n\n    const modalHeight = this.modalElement.nativeElement.offsetHeight;\n    if (modalHeight <= 0) return;\n\n    const element = document.querySelector(this.currentStepData?.target || '');\n    if (!element) return;\n\n    const rect = element.getBoundingClientRect();\n    const scroll = this.getScrollOffsets();\n    const gap = this.calculateModalDimensions().gap;\n\n    // Recalculate with actual height\n    if (this.modalLeft > rect.right + gap) {\n      // Right position\n      this.modalTop = this.clampVertical(rect, scroll.scrollY, modalHeight);\n    } else if (this.modalLeft < rect.left - gap) {\n      // Left position\n      this.modalTop = this.clampVertical(rect, scroll.scrollY, modalHeight);\n    } else if (this.modalTop > rect.bottom + gap) {\n      // Bottom position\n      this.modalTop = rect.bottom + gap + scroll.scrollY;\n    } else {\n      // Top position\n      this.modalTop = rect.top - modalHeight - gap + scroll.scrollY;\n    }\n\n    this.modalHeight = modalHeight;\n    this.positionRecalculated = true;\n  }\n\n  private calculateModalDimensions(): { modalWidth: number; modalHeight: number; gap: number } {\n    const screenWidth = window.innerWidth;\n\n    if (screenWidth < 480) {\n      return { modalWidth: 280, modalHeight: 240, gap: 10 };\n    } else if (screenWidth < 768) {\n      return { modalWidth: 320, modalHeight: 260, gap: 15 };\n    }\n    return { modalWidth: 360, modalHeight: 300, gap: 20 };\n  }\n\n  private positionRight(\n    rect: DOMRect,\n    scroll: { scrollX: number; scrollY: number },\n    gap: number\n  ): void {\n    this.modalLeft = rect.right + gap + scroll.scrollX - rect.width / 2 + 20;\n    this.modalArrowDirection = 'arrow-left';\n    this.modalTop = rect.top + scroll.scrollY - 20;\n  }\n\n  private positionLeft(\n    rect: DOMRect,\n    scroll: { scrollX: number; scrollY: number },\n    gap: number\n  ): void {\n    this.modalLeft = rect.left - this.modalWidth - gap + scroll.scrollX - rect.width / 2 - 20;\n    this.modalArrowDirection = 'arrow-right';\n    this.modalTop = rect.top + scroll.scrollY - 20;\n  }\n\n  private positionBottom(\n    rect: DOMRect,\n    scroll: { scrollX: number; scrollY: number },\n    gap: number\n  ): void {\n    this.modalTop = rect.bottom + gap + scroll.scrollY - rect.height / 2 - 20;\n    this.modalLeft = this.clampHorizontal(rect, scroll.scrollX);\n    this.modalArrowDirection = 'arrow-top';\n  }\n\n  private positionTop(\n    rect: DOMRect,\n    scroll: { scrollX: number; scrollY: number },\n    gap: number\n  ): void {\n    const { modalHeight } = this.calculateModalDimensions();\n    this.modalArrowDirection = 'arrow-bottom';\n    this.modalTop = rect.top - modalHeight - gap + scroll.scrollY - rect.height / 2 -  20;\n    this.modalLeft = this.clampHorizontal(rect, scroll.scrollX);\n  }\n\n  private positionCenter(\n    viewport: { width: number; height: number },\n    scroll: { scrollX: number; scrollY: number }\n  ): void {\n    this.modalLeft = scroll.scrollX + (viewport.width - this.modalWidth) / 2;\n    this.modalTop = scroll.scrollY + 100; // Will be adjusted later\n  }\n\n  private clampVertical(\n    rect: DOMRect,\n    scrollY: number,\n    modalHeight: number\n  ): number {\n    const viewportHeight = window.innerHeight;\n    const MIN_GAP = 8;\n\n    return Math.min(\n      Math.max(\n        rect.top + scrollY,\n        scrollY + MIN_GAP\n      ),\n      scrollY + viewportHeight - modalHeight - MIN_GAP\n    );\n  }\n\n  private clampHorizontal(\n    rect: DOMRect,\n    scrollX: number\n  ): number {\n    const viewportWidth = window.innerWidth;\n    const MIN_GAP = 8;\n    return Math.min(\n      Math.max(\n        rect.left + scrollX,\n        scrollX + MIN_GAP\n      ),\n      scrollX + viewportWidth - this.modalWidth - MIN_GAP\n    );\n  }\n\n  private removeHighlights(): void {\n    const highlightedElements = document.querySelectorAll('.sl-tour-highlight');\n    highlightedElements.forEach(el => {\n      this.renderer.removeClass(el, 'sl-tour-highlight');\n    });\n  }\n\n  onClose(): void {\n    this.tourService.stopTour();\n  }\n\n  onNext(): void {\n    this.tourService.nextStep();\n  }\n\n  onPrevious(): void {\n    this.tourService.prevStep();\n  }\n\n  onOverlayClick(): void {\n    if (this.allowClickOutsideToClose) {\n      this.onClose();\n    }\n  }\n\n  getProgressDots(): number[] {\n    return this.currentTour ? Array(this.currentTour.steps.length).fill(0).map((_, i) => i) : [];\n  }\n}\n","<div *ngIf=\"isActive && currentTour && currentStepData\" class=\"sl-tour-modal-container\" [class]=\"customClass\">\n  <!-- Overlay -->\n  <!-- <div class=\"sl-tour-overlay\" (click)=\"onOverlayClick()\"></div> -->\n\n  <!-- Modal -->\n  <div class=\"sl-tour-modal\" *ngIf=\"showModal\" #tourModal [ngClass]=\"modalArrowDirection\" [ngStyle]=\"{\n      position: 'absolute',\n      top: modalTop + 'px',\n      left: modalLeft + 'px',\n    }\" [style.width.px]=\"modalWidth\" [style.height.px]=\"modalHeight\">\n    <div class=\"sl-modal-header\">\n        <h2 class=\"sl-modal-title\">{{ currentStepData.title }}</h2>\n\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n        class=\"sl-btn sl-btn-ghost sl-close-btn\" (click)=\"onClose()\" aria-label=\"Close tour\">\n          <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n          <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n        </svg>\n    </div>\n\n    <div *ngIf=\"currentStepData.image\" class=\"sl-modal-image\">\n      <img [src]=\"currentStepData.image\" [alt]=\"currentStepData.title\" class=\"sl-rounded-lg\">\n    </div>\n\n    <p class=\"sl-modal-text\">{{ currentStepData.text }}</p>\n\n    <div class=\"sl-modal-footer\">\n      <div class=\"sl-progress-info\">\n        <div *ngIf=\"showProgressDots\" class=\"sl-progress-dots\">\n          <div *ngFor=\"let dot of getProgressDots(); let i = index\" class=\"sl-dot\"\n            [class.sl-active]=\"i === currentStep\">\n          </div>\n        </div>\n        <button (click)=\"onClose()\" class=\"skip-tour sl-btn sl-btn-outline\">\n          Skip Tour\n        </button>\n      </div>\n\n      <div class=\"sl-modal-actions\">\n        <button *ngIf=\"currentStep > 0\" class=\"sl-btn sl-btn-outline\" (click)=\"onPrevious()\">\n          Previous\n        </button>\n        <button class=\"sl-btn sl-btn-primary\" (click)=\"onNext()\">\n          {{ isLastStep ? 'Finish' : 'Next' }}\n        </button>\n      </div>\n    </div>\n  </div>\n</div>\n","import { Component, Input } from '@angular/core';\nimport { ShorterLoopTourService } from '../../services/tour.service';\n\n@Component({\n  selector: 'sl-tour-trigger',\n  template: `\n    <button\n      [class]=\"'sl-btn sl-btn-' + variant + (customClass ? ' ' + customClass : '')\"\n      (click)=\"startTour()\"\n      [disabled]=\"disabled\">\n      <ng-content></ng-content>\n    </button>\n  `,\n  styleUrls: ['./tour-trigger.component.scss']\n})\nexport class TourTriggerComponent {\n  @Input() tourId!: string;\n  @Input() variant: 'primary' | 'outline' | 'ghost' = 'outline';\n  @Input() customClass = '';\n  @Input() disabled = false;\n\n  constructor(private tourService: ShorterLoopTourService) { }\n\n  startTour(): void {\n    if (!this.disabled) {\n      this.tourService.startTour(this.tourId);\n    }\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { HttpClientModule } from '@angular/common/http';\nimport { NgModule } from '@angular/core';\n\nimport { AutoTourTriggerComponent } from './components/auto-tour-trigger/auto-tour-trigger.component';\nimport { TourModalComponent } from './components/tour-modal/tour-modal.component';\nimport { TourTriggerComponent } from './components/tour-trigger/tour-trigger.component';\n\n@NgModule({\n  declarations: [\n    TourModalComponent,\n    AutoTourTriggerComponent,\n    TourTriggerComponent\n  ],\n  imports: [\n    CommonModule,\n    HttpClientModule\n  ],\n  exports: [\n    TourModalComponent,\n    AutoTourTriggerComponent,\n    TourTriggerComponent\n  ],\n})\nexport class ShorterLoopProductTourModule { }\n","/*\n * Public API Surface of shorterloop-product-tour\n */\n\nexport * from './components/auto-tour-trigger/auto-tour-trigger.component';\nexport * from './components/tour-modal/tour-modal.component';\nexport * from './components/tour-trigger/tour-trigger.component';\nexport * from './models/tour.model';\nexport * from './product-tour.module';\nexport * from './services/tour.service';\n\n","import { Component, Input, OnInit, SimpleChanges } from '@angular/core';\n\n@Component({\n  selector: 'shorterloop-progress-bar',\n  templateUrl: './progress.component.html',\n  styleUrls: ['./progress.component.css']\n})\nexport class ProgressBarComponent implements OnInit {\n  @Input() percentage = 0;\n  percentageMarker = 0;\n\n  constructor() { }\n\n  ngOnInit(): void {\n    this.percentageMarker = Math.floor((this.percentage / 100) * 50);\n  }\n\n  ngOnChanges(change: SimpleChanges) {\n    const currentValue: any = change;\n\n    if (\n      currentValue &&\n      currentValue.percentage &&\n      !currentValue.percentage.firstChange &&\n      currentValue.percentage.currentValue\n    ) {\n      this.percentage = currentValue.percentage.currentValue;\n      this.percentageMarker = Math.floor((this.percentage / 100) * 50);\n    }\n  }\n\n}\n","<svg height=\"32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n    <path d=\"M2 0C0.8954 0 0 0.8954 0 2V30C0 31.1046 0.8954 32 2 32H3.5V0H2Z\" \n        [attr.fill]=\"percentageMarker >= 1? '#230F9F': '#DDDDDD' \" />\n    <path d=\"M10 0H6.5V32H10V0Z\" \n        [attr.fill]=\"percentageMarker >= 2? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M13 0H16.5V32H13V0Z\" \n    [attr.fill]=\"percentageMarker >= 3? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M23 0H19.5V32H23V0Z\" \n    [attr.fill]=\"percentageMarker >= 4? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M26 0H29.5V32H26V0Z\" [attr.fill]=\"percentageMarker >= 5? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M36 0H32.5V32H36V0Z\" [attr.fill]=\"percentageMarker >= 6? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M39 0H42.5V32H39V0Z\" [attr.fill]=\"percentageMarker >= 7? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M49 0H45.5V32H49V0Z\" [attr.fill]=\"percentageMarker >= 8? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M52 0H55.5V32H52V0Z\" [attr.fill]=\"percentageMarker >= 9? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M62 0H58.5V32H62V0Z\" [attr.fill]=\"percentageMarker >= 10? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M65 0H68.5V32H65V0Z\" [attr.fill]=\"percentageMarker >= 11? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M75 0H71.5V32H75V0Z\" [attr.fill]=\"percentageMarker >= 12? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M78 0H81.5V32H78V0Z\" [attr.fill]=\"percentageMarker >= 13? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M88 0H84.5V32H88V0Z\" [attr.fill]=\"percentageMarker >= 14? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M91 0H94.5V32H91V0Z\" [attr.fill]=\"percentageMarker >= 15? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M101 0H97.5V32H101V0Z\" [attr.fill]=\"percentageMarker >= 16? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M104 0H107.5V32H104V0Z\" [attr.fill]=\"percentageMarker >= 17? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M114 0H110.5V32H114V0Z\" [attr.fill]=\"percentageMarker >= 18? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M117 0H120.5V32H117V0Z\" [attr.fill]=\"percentageMarker >= 19? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M127 0H123.5V32H127V0Z\" [attr.fill]=\"percentageMarker >= 20? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M130 0H133.5V32H130V0Z\" [attr.fill]=\"percentageMarker >= 21? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M140 0H136.5V32H140V0Z\" [attr.fill]=\"percentageMarker >= 22? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M143 0H146.5V32H143V0Z\" [attr.fill]=\"percentageMarker >= 23? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M153 0H149.5V32H153V0Z\" [attr.fill]=\"percentageMarker >= 24? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M156 0H159.5V32H156V0Z\" [attr.fill]=\"percentageMarker >= 25? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M166 0H162.5V32H166V0Z\" [attr.fill]=\"percentageMarker >= 26? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M169 0H172.5V32H169V0Z\" [attr.fill]=\"percentageMarker >= 27? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M179 0H175.5V32H179V0Z\" [attr.fill]=\"percentageMarker >= 28? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M182 0H185.5V32H182V0Z\" [attr.fill]=\"percentageMarker >= 29? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M192 0H188.5V32H192V0Z\" [attr.fill]=\"percentageMarker >= 30? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M195 0H198.5V32H195V0Z\" [attr.fill]=\"percentageMarker >= 31? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M205 0H201.5V32H205V0Z\" [attr.fill]=\"percentageMarker >= 32? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M208 0H211.5V32H208V0Z\" [attr.fill]=\"percentageMarker >= 33? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M218 0H214.5V32H218V0Z\" [attr.fill]=\"percentageMarker >= 34? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M221 0H224.5V32H221V0Z\" [attr.fill]=\"percentageMarker >= 35? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M231 0H227.5V32H231V0Z\" [attr.fill]=\"percentageMarker >= 36? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M234 0H237.5V32H234V0Z\" [attr.fill]=\"percentageMarker >= 37? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M244 0H240.5V32H244V0Z\" [attr.fill]=\"percentageMarker >= 38? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M247 0H250.5V32H247V0Z\" [attr.fill]=\"percentageMarker >= 39? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M257 0H253.5V32H257V0Z\" [attr.fill]=\"percentageMarker >= 40? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M260 0H263.5V32H260V0Z\" [attr.fill]=\"percentageMarker >= 41? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M270 0H266.5V32H270V0Z\" [attr.fill]=\"percentageMarker >= 42? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M273 0H276.5V32H273V0Z\" [attr.fill]=\"percentageMarker >= 43? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M283 0H279.5V32H283V0Z\" [attr.fill]=\"percentageMarker >= 44? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M286 0H289.5V32H286V0Z\" [attr.fill]=\"percentageMarker >= 45? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M296 0H292.5V32H296V0Z\" [attr.fill]=\"percentageMarker >= 46? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M299 0H302.5V32H299V0Z\" [attr.fill]=\"percentageMarker >= 47? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M309 0H305.5V32H309V0Z\" [attr.fill]=\"percentageMarker >= 48? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M312 0H315.5V32H312V0Z\" [attr.fill]=\"percentageMarker >= 49? '#230F9F': '#DDDDDD' \"/>\n    <path d=\"M320 0H318.5V32H320C321.105 32 322 31.1046 322 30V2C322 0.8954 321.105 0 320 0Z\" \n        [attr.fill]=\"percentageMarker >= 50? '#230F9F': '#DDDDDD' \"/>\n    </svg>\n    \n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ProgressBarComponent } from './progress.component';\n\n\n@NgModule({\n  declarations: [\n    ProgressBarComponent\n  ],\n  imports: [\n    CommonModule,\n  ],\n  exports: [\n    ProgressBarComponent\n  ]\n})\nexport class ProgressModule { }\n","// import { ObserveApiStatus } from 'shorterloop';\nimport { Observable } from 'rxjs';\n\n/**\n * Interface defining options for customizing button behavior during API calls.\n */\ninterface ObserveApiOptions {\n  /**\n   * Optional text to display on the button while the API call is in progress.\n   * Defaults to disabling the button visually if not provided.\n   */\n  inProgress?: string;\n  hideLoader?: boolean\n}\n\n/**\n * RxJS operator that manages the state of a button element during asynchronous operations.\n *\n * @param target The DOM element (typically a button) to manage state for.\n * @param options Configuration options for button behavior.\n * @returns An operator function that can be piped into an Observable.\n */\nexport function ObserveApiStatus(target: any, options?: ObserveApiOptions) {\n  // Preserve the original button text for resetting later\n  const originalValue = target.textContent;\n  return <T>(source: Observable<T>): Observable<T> =>\n    new Observable<T>((observer) => {\n      // Handle inProgress behavior:\n      if (options && options.inProgress) {\n        target.textContent = options.inProgress;\n      }\n      // Disable the button when clicked\n      target.disabled = true;\n\n      let loadingSpan: any = document.createElement('span');\n\n      // Remove existing buttonProgressLoadingState if present\n      let existingLoadingSpan = target.querySelector('.buttonProgressLoadingState');\n      if (existingLoadingSpan) {\n        target.removeChild(existingLoadingSpan);\n      }\n\n      if (!options || (options && !options.hideLoader)) {\n        loadingSpan.className = 'buttonProgressLoadingState';\n        loadingSpan.textContent = ' ';\n        target.insertBefore(loadingSpan, target.firstChild);\n      }\n\n      const subscription = source.subscribe({\n        next: (value) => observer.next(value),\n        error: (error) => {\n          observer.error(error);\n          cleanup();\n        },\n        complete: () => {\n          observer.complete();\n          cleanup();\n        },\n      });\n\n      const cleanup = () => {\n        if (loadingSpan) {\n          loadingSpan.remove();\n          loadingSpan = null;\n        }\n        if (options && options.inProgress) {\n          target.textContent = originalValue;\n        }\n        target.disabled = false;\n      };\n\n      // Disable the button when clicked\n      return () => {\n        subscription.unsubscribe();\n        cleanup();\n      };\n    });\n}\n","/*\n * Public API Surface of ui\n */\nexport * from './lib/evaluate-experiment-variants/evaluate-experiment-variants.component';\nexport * from './lib/form-field/form-field.component';\nexport * from './lib/image/public-api';\nexport * from './lib/kanban/kanban.component';\nexport * from './lib/product-tours/public-api';\nexport * from './lib/progress/public-api';\nexport * from './services/api-observer/api-call-observer.service';\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.ShorterLoopTourService"],"mappings":"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"}