{"version":3,"file":"angular-shepherd.mjs","sources":["../../../projects/shepherd/src/lib/utils/dom.ts","../../../projects/shepherd/src/lib/utils/buttons.ts","../../../projects/shepherd/src/lib/shepherd.service.ts","../../../projects/shepherd/src/public_api.ts","../../../projects/shepherd/src/angular-shepherd.ts"],"sourcesContent":["/**\n * Helper method to check if element is hidden, since we cannot use :visible without jQuery\n * @param element The element to check for visibility\n * @returns true if element is hidden\n */\nexport function elementIsHidden(element: HTMLElement): boolean {\n  return element.offsetWidth === 0 && element.offsetHeight === 0;\n}\n","import type { StepOptionsButton } from 'shepherd.js';\nimport type { ShepherdService } from '../shepherd.service';\n\nexport type AngularShepherdButton = StepOptionsButton & {\n  type?: 'back' | 'cancel' | 'next';\n};\n\n/**\n * Creates a button of the specified type, with the given classes and text\n *\n * @param button.type The type of button cancel, back, or next\n * @param button.classes Classes to apply to the button\n * @param button.text The text for the button\n * @param button.action The action to call\n */\nexport function makeButton(\n  this: ShepherdService,\n  button: AngularShepherdButton\n) {\n  const { classes, disabled, label, secondary, type, text } = button;\n  const builtInButtonTypes = ['back', 'cancel', 'next'];\n\n  if (!type) {\n    return button;\n  }\n\n  if (builtInButtonTypes.indexOf(type) === -1) {\n    throw new Error(\n      `'type' property must be one of 'back', 'cancel', or 'next'`\n    );\n  }\n\n  return {\n    action: this[type].bind(this),\n    classes,\n    disabled,\n    label,\n    secondary,\n    text\n  };\n}\n","import { Injectable } from '@angular/core';\nimport Shepherd, {\n  type TourOptions,\n  type StepOptions,\n  type Tour\n} from 'shepherd.js';\nimport { elementIsHidden } from './utils/dom';\nimport { makeButton } from './utils/buttons';\n\ninterface RequiredElement {\n  message: string;\n  selector: string;\n  title: string;\n}\n@Injectable({\n  providedIn: 'root'\n})\nexport class ShepherdService {\n  confirmCancel: TourOptions['confirmCancel'] = false;\n  confirmCancelMessage?: TourOptions['confirmCancelMessage'];\n  defaultStepOptions: StepOptions = {};\n  errorTitle?: string;\n  exitOnEsc: TourOptions['exitOnEsc'] = true;\n  isActive = false;\n  keyboardNavigation: TourOptions['keyboardNavigation'] = true;\n  messageForUser: string | null = null;\n  modal = false;\n  requiredElements: Array<RequiredElement> = [];\n  tourName: TourOptions['tourName'] = undefined;\n  tourObject: Tour | null = null;\n\n  constructor() {}\n\n  /**\n   * Get the tour object and call back\n   */\n  back() {\n    this.tourObject?.back();\n  }\n\n  /**\n   * Cancel the tour\n   */\n  cancel() {\n    this.tourObject?.cancel();\n  }\n\n  /**\n   * Complete the tour\n   */\n  complete() {\n    this.tourObject?.complete();\n  }\n\n  /**\n   * Hides the current step\n   */\n  hide() {\n    this.tourObject?.hide();\n  }\n\n  /**\n   * Advance the tour to the next step\n   */\n  next() {\n    this.tourObject?.next();\n  }\n\n  /**\n   * Show a specific step, by passing its id\n   * @param id The id of the step you want to show\n   */\n  show(id: string | number) {\n    this.tourObject?.show(id);\n  }\n\n  /**\n   * Start the tour\n   */\n  start() {\n    this.isActive = true;\n    this.tourObject?.start();\n  }\n\n  /**\n   * This function is called when a tour is completed or cancelled to initiate cleanup.\n   * @param completeOrCancel 'complete' or 'cancel'\n   */\n  onTourFinish(completeOrCancel: string) {\n    this.isActive = false;\n  }\n\n  /**\n   * Take a set of steps and create a tour object based on the current configuration\n   * @param steps An array of steps\n   */\n  addSteps(steps: Array<StepOptions>) {\n    this._initialize();\n    const tour = this.tourObject;\n\n    // Return nothing if there are no steps or if somehow there is no tour.\n    if (!tour || !steps || !Array.isArray(steps) || steps.length === 0) {\n      return;\n    }\n\n    if (!this.requiredElementsPresent()) {\n      tour.addStep({\n        buttons: [\n          {\n            text: 'Exit',\n            action: tour.cancel\n          }\n        ],\n        id: 'error',\n        title: this.errorTitle,\n        text: [this.messageForUser as string]\n      });\n      return;\n    }\n\n    steps.forEach((step) => {\n      if (step.buttons) {\n        step.buttons = step.buttons.map(makeButton.bind(this), this);\n      }\n\n      tour.addStep(step);\n    });\n  }\n\n  /**\n   * Observes the array of requiredElements, which are the elements that must be present at the start of the tour,\n   * and determines if they exist, and are visible, if either is false, it will stop the tour from executing.\n   */\n  private requiredElementsPresent() {\n    let allElementsPresent = true;\n\n    /* istanbul ignore next: also can't test this due to things attached to root blowing up tests */\n    this.requiredElements.forEach((element) => {\n      const selectedElement = document.querySelector(element.selector);\n\n      if (\n        allElementsPresent &&\n        (!selectedElement || elementIsHidden(selectedElement as HTMLElement))\n      ) {\n        allElementsPresent = false;\n        this.errorTitle = element.title;\n        this.messageForUser = element.message;\n      }\n    });\n\n    return allElementsPresent;\n  }\n\n  /**\n   * Initializes the tour, creates a new Shepherd.Tour. sets options, and binds events\n   */\n  private _initialize() {\n    const tourObject = new Shepherd.Tour({\n      confirmCancel: this.confirmCancel,\n      confirmCancelMessage: this.confirmCancelMessage,\n      defaultStepOptions: this.defaultStepOptions,\n      keyboardNavigation: this.keyboardNavigation,\n      tourName: this.tourName,\n      useModalOverlay: this.modal,\n      exitOnEsc: this.exitOnEsc\n    });\n\n    tourObject.on('complete', this.onTourFinish.bind(this, 'complete'));\n    tourObject.on('cancel', this.onTourFinish.bind(this, 'cancel'));\n\n    this.tourObject = tourObject;\n  }\n}\n","/*\n * Public API Surface of shepherd\n */\n\nexport * from './lib/shepherd.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}