{"version":3,"file":"boussole.mjs","sources":["../../../src/angular/src/lib/boussole.service.ts","../../../src/angular/src/lib/directives/focus.directive.ts","../../../src/types/Direction.ts","../../../src/types/ElementRectangle.ts","../../../src/Core.ts","../../../src/types/Configuration.ts","../../../src/Compass.ts","../../../src/angular/src/lib/directives/focusSection.directive.ts","../../../src/angular/src/lib/boussole.module.ts","../../../src/angular/src/public-api.ts","../../../src/boussole.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class BoussoleService {\n\n  constructor() { }\n}\n","import { Directive, ElementRef, Input } from '@angular/core';\n\n\n@Directive({\n  selector: '[focus]'\n})\nexport class FocusDirective {\n  \n  private disableElement = (element: HTMLElement, focusable: any) => {\n    // eslint-disable-next-line no-unneeded-ternary\n    focusable = focusable === false ? false : true;\n    if (!element.dataset['focusable'] || element.dataset['focusable'] !== `${focusable}`) {\n      element.dataset['focusable'] = focusable;\n      if (focusable) element.tabIndex = -1;\n    }\n  };\n  \n  constructor(private el: ElementRef) {\n    el.nativeElement.dataset['focusable'] = true;\n    el.nativeElement.tabIndex = -1;\n  }\n}","/* eslint-disable no-shadow */\n/* eslint-disable no-unused-vars */\nexport enum Direction {\n  LEFT = 37,\n  UP = 38,\n  RIGHT = 39,\n  DOWN = 40\n}\n\nexport enum StringDirection {\n  LEFT = 'left',\n  UP = 'up',\n  RIGHT = 'right',\n  DOWN = 'down'\n}\n\nexport function getReverseDirection (direction: Direction): Direction {\n  if (direction === Direction.LEFT) {\n    return Direction.RIGHT;\n  } else if (direction === Direction.RIGHT) {\n    return Direction.LEFT;\n  } else if (direction === Direction.UP) {\n    return Direction.DOWN;\n  } else {\n    return Direction.UP;\n  }\n}\n\nexport function directiontoString (direction: Direction): string {\n  if (direction === Direction.LEFT) {\n    return 'left';\n  } else if (direction === Direction.RIGHT) {\n    return 'right';\n  } else if (direction === Direction.UP) {\n    return 'up';\n  } else {\n    return 'down';\n  }\n}\n","export interface Rectangle {\n  x: number,\n  y: number,\n  left: number,\n  top: number,\n  right: number,\n  bottom: number,\n  width: number,\n  height: number\n}\n\nexport interface ElementRectangle extends Rectangle {\n  element: HTMLElement\n\n  center: Rectangle\n}\n\nexport class ElementRectangleImpl implements ElementRectangle {\n  x: number;\n  y: number;\n  left: number;\n  top: number;\n  right: number;\n  bottom: number;\n  element: HTMLElement;\n  center: Rectangle;\n  width: number;\n  height: number;\n\n  constructor (rectangle: ElementRectangle) {\n    this.x = rectangle.x;\n    this.y = rectangle.y;\n    this.left = rectangle.left;\n    this.right = rectangle.right;\n    this.bottom = rectangle.bottom;\n    this.top = rectangle.top;\n    this.element = rectangle.element;\n    this.width = rectangle.width;\n    this.height = rectangle.height;\n    this.center = rectangle.center;\n  }\n\n  public nearPlumbLineIsBetter (rect: ElementRectangle, targetRect: ElementRectangle): number {\n    let distance: number;\n    if (rect.center.x < targetRect.center.x) {\n      distance = targetRect.center.x - rect.right;\n    } else {\n      distance = rect.left - targetRect.center.x;\n    }\n    return distance < 0 ? 0 : distance;\n  }\n\n  public nearHorizonIsBetter (rect: ElementRectangle, targetRect: ElementRectangle): number {\n    let distance: number;\n    if (rect.center.y < targetRect.center.y) {\n      distance = targetRect.center.y - rect.bottom;\n    } else {\n      distance = rect.top - targetRect.center.y;\n    }\n    return distance < 0 ? 0 : distance;\n  }\n\n  public nearTargetLeftIsBetter (rect: ElementRectangle, targetRect: ElementRectangle): number {\n    let distance: number;\n    if (rect.center.x < targetRect.center.x) {\n      distance = targetRect.left - rect.right;\n    } else {\n      distance = rect.left - targetRect.left;\n    }\n    return distance < 0 ? 0 : distance;\n  }\n\n  public nearTargetTopIsBetter (rect: ElementRectangle, targetRect: ElementRectangle): number {\n    let distance: number;\n    if (rect.center.y < targetRect.center.y) {\n      distance = targetRect.top - rect.bottom;\n    } else {\n      distance = rect.top - targetRect.top;\n    }\n    return distance < 0 ? 0 : distance;\n  }\n\n  public topIsBetter (rect: ElementRectangle): number {\n    return rect.top;\n  }\n\n  public bottomIsBetter (rect: ElementRectangle): number {\n    return -1 * rect.bottom;\n  }\n\n  public leftIsBetter (rect: ElementRectangle): number {\n    return rect.left;\n  }\n\n  public rightIsBetter (rect: ElementRectangle): number {\n    return -1 * rect.right;\n  }\n}\n","import { Direction } from './types/Direction';\nimport { Rectangle, ElementRectangle, ElementRectangleImpl } from './types/ElementRectangle';\nimport { Priority } from './types/Priority';\nimport { Section } from './types/Section';\n\nif (!Element.prototype.matches) {\n  Element.prototype.matches = (Element.prototype as any).matchesSelector\n    || (Element.prototype as any).mozMatchesSelector\n    || (Element.prototype as any).msMatchesSelector\n    || (Element.prototype as any).oMatchesSelector\n    || (Element.prototype as any).webkitMatchesSelector\n    || ((s) => {\n      if (this) {\n        const matches = ((this! as any).document || (this! as any).ownerDocument).querySelectorAll(s);\n        let i = matches.length;\n        while (--i >= 0 && matches.item(i) !== this) {}\n        return i > -1;\n      }\n      return false;\n    });\n}\n\nclass Core {\n  private static instance: Core;\n\n  public static getInstance (): Core {\n    if (!Core.instance) {\n      Core.instance = new Core();\n    }\n    return Core.instance;\n  }\n\n  /**\n   * Get element rectangle\n   * @param element element\n   * @returns element rectangle\n   */\n  private getRect (element: HTMLElement): ElementRectangle {\n    const cr: DOMRect = element.getBoundingClientRect();\n\n    const xCenter = cr.left + Math.floor(cr.width / 2);\n    const yCenter = cr.top + Math.floor(cr.height / 2);\n    const center: Rectangle = {\n      x: xCenter,\n      y: yCenter,\n      left: xCenter,\n      right: xCenter,\n      top: yCenter,\n      bottom: yCenter,\n      width: 0,\n      height: 0\n    };\n    return {\n      element,\n      x: cr.x,\n      y: cr.y,\n      left: cr.left,\n      top: cr.top,\n      right: cr.right,\n      bottom: cr.bottom,\n      width: cr.width,\n      height: cr.height,\n      center\n    };\n  }\n\n  /**\n   * Get the distribution of elements around a target element\n   * This function returns a two-dimensional array, we first dimension = 9 of element rectangle.\n   * Index of arrays corresponds to the position of elements.\n   * Link between index and position : (for threshold = 0)\n   *\n   *    _______  -  _______  -  _______\n   *   |       | - |       | - |       |\n   *   |   0   | - |   1   | - |   2   |\n   *   |_______| - |_______| - |_______|\n   * -------------------------------------\n   *    _______  -  _______  -  _______\n   *   |       | - |       | - |       |\n   *   |   3   | - | TARG. | - |   5   |\n   *   |_______| - |_______| - |_______|\n   *             -           -\n   * -------------------------------------\n   *    _______  -  _______  -  _______\n   *   |       | - |       | - |       |\n   *   |   6   | - |   7   | - |   8   |\n   *   |_______| - |_______| - |_______|\n   *             -           -\n   * @param rects rectangle of elements around the target\n   * @param targetRect rectangle of target element\n   * @param straightOverlapThreshold threshold\n   * @returns distribution of elements around a target element\n   */\n  private partition (rects: ElementRectangle[], targetRect: Rectangle, straightOverlapThreshold: number): ElementRectangle[][] {\n    const groups: ElementRectangle[][] = [[], [], [], [], [], [], [], [], []];\n\n    for (let i = 0; i < rects.length; i++) {\n      const rect = rects[i];\n      const center = rect.center;\n      let x, y;\n\n      if (center.x < targetRect.left) {\n        x = 0;\n      } else if (center.x <= targetRect.right) {\n        x = 1;\n      } else {\n        x = 2;\n      }\n\n      if (center.y < targetRect.top) {\n        y = 0;\n      } else if (center.y <= targetRect.bottom) {\n        y = 1;\n      } else {\n        y = 2;\n      }\n\n      const groupId = y * 3 + x;\n      groups[groupId].push(rect);\n\n      if ([0, 2, 6, 8].indexOf(groupId) !== -1) {\n        const threshold = straightOverlapThreshold;\n\n        if (rect.left <= targetRect.right - targetRect.width * threshold) {\n          if (groupId === 2) {\n            groups[1].push(rect);\n          } else if (groupId === 8) {\n            groups[7].push(rect);\n          }\n        }\n\n        if (rect.right >= targetRect.left + targetRect.width * threshold) {\n          if (groupId === 0) {\n            groups[1].push(rect);\n          } else if (groupId === 6) {\n            groups[7].push(rect);\n          }\n        }\n\n        if (rect.top <= targetRect.bottom - targetRect.height * threshold) {\n          if (groupId === 6) {\n            groups[3].push(rect);\n          } else if (groupId === 8) {\n            groups[5].push(rect);\n          }\n        }\n\n        if (rect.bottom >= targetRect.top + targetRect.height * threshold) {\n          if (groupId === 0) {\n            groups[3].push(rect);\n          } else if (groupId === 2) {\n            groups[5].push(rect);\n          }\n        }\n      }\n    }\n    return groups;\n  }\n\n  private prioritize (priorities: Priority[]): ElementRectangle[] | null {\n    let destPriority = null;\n    for (let i = 0; i < priorities.length; i++) {\n      if (priorities[i].group.length) {\n        destPriority = priorities[i];\n        break;\n      }\n    }\n\n    if (!destPriority) {\n      return null;\n    }\n\n    const destDistance = destPriority.distance;\n    const target = destPriority.target;\n    destPriority.group.sort((a: ElementRectangle, b: ElementRectangle) => {\n      for (let i = 0; i < destDistance.length; i++) {\n        const distance = destDistance[i];\n        const delta = distance(a, target) - distance(b, target);\n        if (delta) {\n          return delta;\n        }\n      }\n      return 0;\n    });\n    return destPriority.group;\n  }\n\n  /**\n   * Get next element to navigate to, from a target according to a direction\n   * @param target target element\n   * @param direction navigate to this direction\n   * @param candidates candidates elements around target\n   * @param section section of the target\n   * @returns next element to navigate to, null if no next element found\n   */\n  public navigate (target: HTMLElement, direction: Direction, candidates: HTMLElement[], section: Section): HTMLElement | null {\n    if (!target || !direction || !candidates || !candidates.length) {\n      return null;\n    }\n\n    const rects: ElementRectangle[] = [];\n    for (let i = 0; i < candidates.length; i++) {\n      const rect = this.getRect(candidates[i]);\n      if (rect) {\n        rects.push(rect);\n      }\n    }\n    if (!rects.length) return null;\n    const targetRect: ElementRectangle = this.getRect(target);\n\n    if (!targetRect) return null;\n    const targetRectImpl: ElementRectangleImpl = new ElementRectangleImpl(targetRect);\n\n    const groups = this.partition(rects, targetRect, section.configuration.straightOverlapThreshold!);\n    const internalGroups = this.partition(groups[4], targetRect.center, section.configuration.straightOverlapThreshold!);\n\n    let priorities: Priority[];\n\n    switch (direction) {\n      case Direction.LEFT:\n        priorities = [\n          {\n            group: internalGroups[0].concat(internalGroups[3])\n              .concat(internalGroups[6]),\n            distance: [\n              targetRectImpl.nearPlumbLineIsBetter,\n              targetRectImpl.topIsBetter\n            ],\n            target: targetRectImpl\n          },\n          {\n            group: groups[3],\n            distance: [\n              targetRectImpl.nearPlumbLineIsBetter,\n              targetRectImpl.topIsBetter\n            ],\n            target: targetRectImpl\n          },\n          {\n            group: groups[0].concat(groups[6]),\n            distance: [\n              targetRectImpl.nearHorizonIsBetter,\n              targetRectImpl.rightIsBetter,\n              targetRectImpl.nearTargetTopIsBetter\n            ],\n            target: targetRectImpl\n          }\n        ];\n        break;\n      case Direction.RIGHT:\n        priorities = [\n          {\n            group: internalGroups[2].concat(internalGroups[5])\n              .concat(internalGroups[8]),\n            distance: [\n              targetRectImpl.nearPlumbLineIsBetter,\n              targetRectImpl.topIsBetter\n            ],\n            target: targetRectImpl\n          },\n          {\n            group: groups[5],\n            distance: [\n              targetRectImpl.nearPlumbLineIsBetter,\n              targetRectImpl.topIsBetter\n            ],\n            target: targetRectImpl\n          },\n          {\n            group: groups[2].concat(groups[8]),\n            distance: [\n              targetRectImpl.nearHorizonIsBetter,\n              targetRectImpl.leftIsBetter,\n              targetRectImpl.nearTargetTopIsBetter\n            ],\n            target: targetRectImpl\n          }\n        ];\n        break;\n      case Direction.UP:\n        priorities = [\n          {\n            group: internalGroups[0].concat(internalGroups[1])\n              .concat(internalGroups[2]),\n            distance: [\n              targetRectImpl.nearHorizonIsBetter,\n              targetRectImpl.leftIsBetter\n            ],\n            target: targetRectImpl\n          },\n          {\n            group: groups[1],\n            distance: [\n              targetRectImpl.nearHorizonIsBetter,\n              targetRectImpl.leftIsBetter\n            ],\n            target: targetRectImpl\n          },\n          {\n            group: groups[0].concat(groups[2]),\n            distance: [\n              targetRectImpl.nearPlumbLineIsBetter,\n              targetRectImpl.bottomIsBetter,\n              targetRectImpl.nearTargetLeftIsBetter\n            ],\n            target: targetRectImpl\n          }\n        ];\n        break;\n      case Direction.DOWN:\n        priorities = [\n          {\n            group: internalGroups[6].concat(internalGroups[7])\n              .concat(internalGroups[8]),\n            distance: [\n              targetRectImpl.nearHorizonIsBetter,\n              targetRectImpl.leftIsBetter\n            ],\n            target: targetRectImpl\n          },\n          {\n            group: groups[7],\n            distance: [\n              targetRectImpl.nearHorizonIsBetter,\n              targetRectImpl.leftIsBetter\n            ],\n            target: targetRectImpl\n          },\n          {\n            group: groups[6].concat(groups[8]),\n            distance: [\n              targetRectImpl.nearPlumbLineIsBetter,\n              targetRectImpl.topIsBetter,\n              targetRectImpl.nearTargetLeftIsBetter\n            ],\n            target: targetRectImpl\n          }\n        ];\n        break;\n      default:\n        return null;\n    }\n\n    if (section.configuration.straightOnly) {\n      priorities.pop();\n    }\n\n    const destGroup = this.prioritize(priorities);\n    if (!destGroup) {\n      return null;\n    }\n\n    let dest: HTMLElement | undefined = undefined;\n    if (section.configuration.rememberSource\n        && section.previous\n        && section.previous.destination === target\n        && section.previous.reverse === direction) {\n      for (let j = 0; j < destGroup.length; j++) {\n        if (destGroup[j].element === section.previous.target) {\n          dest = destGroup[j].element;\n          break;\n        }\n      }\n    }\n    if (!dest) dest = destGroup[0].element;\n    return dest;\n  }\n\n  /**\n   * Parse selector\n   * @param selector\n   * @returns nodes\n   */\n  public parseSelector (selector: string): never[] {\n    // TO DO handle selector\n    const result = [].slice.call(document.querySelectorAll(selector));\n    return result;\n  }\n\n  /**\n   * Check if an element match a selector\n   */\n  public matchSelector (element: HTMLElement, selector: string): boolean {\n    // TO DO selector as object N\n    return element.matches(selector);\n  }\n}\n\nconst core = Core.getInstance();\nexport { Core, core };\n","/**\n * Configuration interface, allows to configure Spatial Navigation behavior in a global or restricted way.\n */\ninterface Configuration {\n  element?: HTMLElement,\n  selector?: string,\n  straightOnly?: boolean,\n  straightOverlapThreshold?: number,\n  rememberSource?: boolean,\n  disabled?: boolean,\n  defaultElement?: string,\n  enterTo?: string, // '', 'last-focused', 'default-element'\n  leaveFor?: {\n    left?: string,\n    right?: string,\n    down?: string,\n    up?: string\n  },\n  restrict?: string, // 'self-first', 'self-only', 'none'\n  tabIndexIgnoreList?: string,\n  navigableFilter?: null | Function,\n  scrollOptions?: ScrollIntoViewOptions | string,\n  scrollOptionsIntoSection?: ScrollIntoViewOptions | string,\n  throttle?: number\n}\n\nconst defaultConfiguration: Configuration = {\n  selector: '[data-focusable=true]',\n  straightOnly: false,\n  straightOverlapThreshold: 0.5,\n  rememberSource: false,\n  disabled: false,\n  defaultElement: '',\n  enterTo: '',\n  leaveFor: {\n    left: undefined,\n    right: undefined,\n    down: undefined,\n    up: undefined\n  },\n  restrict: 'self-first',\n  tabIndexIgnoreList: 'a, input, select, textarea, button, iframe, [contentEditable=true]',\n  navigableFilter: null,\n  scrollOptions: {\n    behavior: 'smooth',\n    block: 'center',\n    inline: 'nearest'\n  },\n  scrollOptionsIntoSection: {\n    behavior: 'smooth',\n    block: 'center',\n    inline: 'nearest'\n  },\n  throttle: 0\n};\n\nexport { Configuration, defaultConfiguration };\n","import { Core, core } from './Core';\nimport { Configuration, defaultConfiguration } from './types/Configuration';\nimport { Direction, directiontoString, getReverseDirection } from './types/Direction';\nimport { Section } from './types/Section';\n\nclass Compass {\n  private static instance: Compass;\n  private _ready: boolean = false;\n  private _idPool: number = 0;\n  private _sections: { [key: string]: Section; } = {};\n  private _sectionCount: number = 0;\n  private _defaultSectionId: string = '';\n  private _lastSectionId: string = '';\n  private _duringFocusChange: boolean = false;\n  private globalConfiguration: Configuration = defaultConfiguration;\n  private _pause: boolean = false;\n  private core: Core = core;\n  private readonly ID_POOL_PREFIX = 'section-';\n  private readonly EVENT_PREFIX = 'sn:';\n  private _throttle: number | null = null;\n\n\n\n  public static getInstance (): Compass {\n    if (!Compass.instance) {\n      Compass.instance = new Compass();\n    }\n    return Compass.instance;\n  }\n\n  // #region PUBLIC FUNCTIONS\n\n  /**\n   * Init global listeners to listen for key, focus and blur events.\n   */\n  public init (): void {\n    if (!this._ready) {\n      window.addEventListener('keydown', this.onKeyDown.bind(this));\n      window.addEventListener('keyup', this.onKeyUp.bind(this));\n      window.addEventListener('focus', this.onFocus.bind(this), true);\n      window.addEventListener('blur', this.onBlur.bind(this), true);\n      // document.body.addEventListener('click', onBodyClick);\n      this._ready = true;\n    }\n  }\n\n  /**\n   * Remove global listeners, reset Compass context.\n   */\n  public uninit(): void {\n    window.removeEventListener('blur', this.onBlur, true);\n    window.removeEventListener('focus', this.onFocus, true);\n    window.removeEventListener('keyup', this.onKeyUp);\n    window.removeEventListener('keydown', this.onKeyDown);\n    this.clear();\n    this._idPool = 0;\n    this._ready = false;\n  }\n\n  /**\n   * Clear Compass context.\n   */\n  public clear (): void {\n    this._sections = {};\n    this._sectionCount = 0;\n    this._defaultSectionId = '';\n    this._lastSectionId = '';\n    this._duringFocusChange = false;\n  }\n\n  /**\n   * Reset the last focused element and previous element of a section.\n   * @param sectionId - section to reset\n   */\n  public reset (sectionId: string): void {\n    if (sectionId) {\n      this._sections[sectionId].lastFocusedElement = undefined;\n      this._sections[sectionId].previous = undefined;\n    } else {\n      for (const id in this._sections) {\n        const section = this._sections[id];\n        section.lastFocusedElement = undefined;\n        section.previous = undefined;\n      }\n    }\n  }\n\n  /**\n   * Set the configuration of a section.\n   * @param sectionId - section to configure.\n   * @param config - configuration\n   */\n  public set (sectionId: string | undefined, config: Configuration): boolean | never {\n    const finalConfig = {};\n    Object.assign(finalConfig, this.globalConfiguration);\n    Object.assign(finalConfig, config);\n\n    if (sectionId !== undefined) {\n      if (!this._sections[sectionId]) {\n        throw new Error(`Section \"${sectionId}\" doesn't exist!`);\n      }\n      this._sections[sectionId].configuration = finalConfig as Configuration;\n    } else {\n      this.globalConfiguration = finalConfig as Configuration;\n    }\n    return true;\n  }\n\n  /**\n   * Add a section\n   * @param sectionId - section id to add\n   * @param config - configuration of the section\n   * @returns sectionId\n   */\n  public add (sectionId: string | undefined, config: Configuration): string | never {\n    if (!sectionId) {\n      // eslint-disable-next-line no-param-reassign\n      sectionId = this.generateId();\n    }\n    if (this._sections[sectionId]) {\n      throw new Error(`Section \"${sectionId}\" already exist!`);\n    } else {\n      this._sections[sectionId] = {\n        id: sectionId,\n        configuration: defaultConfiguration,\n        lastFocusedElement: undefined,\n        previous: undefined\n      };\n    }\n    if (this.set(sectionId, config)) {\n      this._sectionCount++;\n    }\n    return sectionId;\n  }\n\n  /**\n   * Remove a section\n   * @param sectionId id of the section to remove\n   * @returns true if section has been removed, false otherwise\n   */\n  public remove (sectionId: string): boolean {\n    if (this._sections[sectionId]) {\n      if (delete this._sections[sectionId]) {\n        this._sectionCount--;\n      }\n      if (this._lastSectionId === sectionId) {\n        this._lastSectionId = '';\n      }\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Disable navigation on a section\n   * @param sectionId - id of the section to disable\n   * @returns true if section has been disabled, false otherwise\n   */\n  public disable (sectionId: string): boolean {\n    if (this._sections[sectionId] && this._sections[sectionId].configuration) {\n      this._sections[sectionId].configuration.disabled = true;\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Enable navigation on a section\n   * @param sectionId - id of the section to enable\n   * @returns true if section has been enabled, false otherwise\n   */\n  public enable (sectionId: string): boolean {\n    if (this._sections[sectionId] && this._sections[sectionId].configuration) {\n      this._sections[sectionId].configuration.disabled = false;\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Pause navigation\n   */\n  public pause (): void {\n    this._pause = true;\n  }\n\n  /**\n   * Resume navigation\n   */\n  public resume (): void {\n    this._pause = false;\n  }\n\n  /**\n   * Focus an element\n   * @param element element to focus (section id or selector), (an element or a section)\n   * @param silent ?\n   * @param direction incoming direction\n   * @returns true if element has been focused, false otherwise\n   */\n  public focus (element: string, silent: boolean, direction: Direction): boolean {\n    let result = false;\n    const autoPause = !this._pause && silent;\n    if (autoPause) this.pause();\n\n    if (this.isSection(element)) {\n      result = this.focusSection(element, direction);\n    } else {\n      result = this.focusExtendedSelector(element, direction, false);\n    }\n\n    if (autoPause) this.resume();\n    return result;\n  }\n\n  /**\n   * Move to another element\n   * @param direction - incoming direction\n   * @param selector - target element selector\n   */\n  public move (direction: Direction, selector: string | undefined): boolean {\n    let element: HTMLElement | undefined = undefined;\n    if (selector) {\n      const elements = this.core.parseSelector(selector);\n      if (elements.length > 0) {\n        element = this.core.parseSelector(selector)[0] as HTMLElement;\n      }\n    } else {\n      element = this.getCurrentFocusedElement();\n    }\n\n    if (!element) {\n      return false;\n    }\n\n    const sectionId = this.getSectionId(element);\n    if (!sectionId) {\n      return false;\n    }\n\n    const willmoveProperties = {\n      direction,\n      sectionId,\n      cause: 'api'\n    };\n\n    if (!this.fireEvent(element, 'willmove', willmoveProperties, undefined)) {\n      return false;\n    }\n    return this.focusNext(direction, element, sectionId);\n  }\n\n  /**\n   * Make a section focusable (more precisely, all its focusable children are made focusable)\n   * @param sectionId id of the section to make focusable, undefined if you want to make all sections focusable\n   */\n  public makeFocusable (sectionId: string | undefined): void | never {\n    if (sectionId) {\n      if (this._sections[sectionId]) {\n        this.doMakeFocusable(this._sections[sectionId].configuration);\n      } else {\n        throw new Error(`Section \"${sectionId}\" doesn't exist!`);\n      }\n    } else {\n      for (const id in this._sections) {\n        this.doMakeFocusable(this._sections[id].configuration);\n      }\n    }\n  }\n\n  /**\n   * Set the default section\n   * @param sectionId id of the section to set as default\n   */\n  public setDefaultSection (sectionId: string): void | never {\n    if (this._sections[sectionId] !== undefined) {\n      this._defaultSectionId = sectionId;\n    } else {\n      throw new Error(`Section \"${sectionId}\" doesn't exist!`);\n    }\n  }\n\n  /**\n   * Focus an element\n   */\n  public focusElement (element: HTMLElement): boolean {\n    if (!element) return false;\n    const nextSectionId = this.getSectionId(element);\n    if (!nextSectionId) return false;\n    const currentFocusedElement = this.getCurrentFocusedElement();\n    let enterIntoNewSection = true;\n    if (currentFocusedElement) {\n      const currentSectionId = this.getSectionId(currentFocusedElement);\n      enterIntoNewSection = nextSectionId === currentSectionId;\n    }\n    if (this.isNavigable(element, nextSectionId, false)) {\n      return this._focusElement(element, nextSectionId, enterIntoNewSection, Direction.UP);\n    }\n    return false;\n  }\n  // #endregion\n\n  // #region PRIVATE FUNCTIONS\n\n  /**\n   * Generate a unique id for a section\n   * @returns new id section\n   */\n  private generateId (): string {\n    let id: string;\n    while (true) {\n      id = this.ID_POOL_PREFIX + String(++this._idPool);\n      if (!this._sections[id]) {\n        break;\n      }\n    }\n    return id;\n  }\n\n  private getCurrentFocusedElement (): HTMLElement | undefined {\n    const { activeElement } = document;\n    if (activeElement && activeElement !== document.body) {\n      return activeElement as HTMLElement;\n    }\n    return undefined;\n  }\n\n  private extend (out: any, ...args: any) {\n    out = out || {};\n    for (let i = 1; i < args.length; i++) {\n      if (!args[i]) {\n        continue;\n      }\n      for (const key in args[i]) {\n        if (args[i].hasOwnProperty(key) && args[i][key] !== undefined) {\n          out[key] = args[i][key];\n        }\n      }\n    }\n    return out;\n  }\n\n  private exclude (elemList: any, excludedElem: any) {\n    if (!Array.isArray(excludedElem)) {\n      excludedElem = [excludedElem];\n    }\n    for (let i = 0, index; i < excludedElem.length; i++) {\n      index = elemList.indexOf(excludedElem[i]);\n      if (index >= 0) {\n        elemList.splice(index, 1);\n      }\n    }\n    return elemList;\n  }\n\n  /**\n   * Check if an element is navigable\n   * @param elem element to check\n   * @param sectionId id of the element's section\n   * @param verifySectionSelector if true, check the section selector\n   * @returns true if element is navigable, false otherwise\n   */\n  private isNavigable (elem: HTMLElement, sectionId: string, verifySectionSelector: boolean): boolean {\n    if (!elem || !sectionId || !this._sections[sectionId] || this._sections[sectionId].configuration.disabled) {\n      return false;\n    }\n    if ((elem.offsetWidth <= 0 && elem.offsetHeight <= 0) || elem.hasAttribute('disabled')) {\n      return false;\n    }\n    if (verifySectionSelector && !this.core.matchSelector(elem, this._sections[sectionId].configuration.selector!)) {\n      return false;\n    }\n    if (this._sections[sectionId].configuration.navigableFilter !== null) {\n      if (this._sections[sectionId].configuration.navigableFilter!(elem, sectionId) === false) {\n        return false;\n      }\n    } else if (this.globalConfiguration.navigableFilter !== null) {\n      if (this.globalConfiguration.navigableFilter!(elem, sectionId) === false) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * Get the element's section id\n   * @param element element\n   * @returns the element's section id\n   */\n  private getSectionId (element: HTMLElement): string | undefined {\n    const sectionsElements: any = {};\n    for (const id in this._sections) {\n      if (!this._sections[id].configuration.disabled) {\n        const sectionElement = this._sections[id].configuration.element;\n        if (sectionElement) {\n          sectionsElements[id] = sectionElement;\n        } else {\n          if (this._sections[id].configuration.selector !== '' && this._sections[id].configuration.selector !== undefined) {\n            const elementWithSelector = this.core.parseSelector(`[data-section-id=\"${id}\"]`)[0]\n            if (elementWithSelector) {\n              sectionsElements[id] = elementWithSelector;\n            }\n          }\n        }\n      }\n    }\n\n    let parent: HTMLElement | null = element;\n    while (parent) {\n      if (Object.values(sectionsElements).indexOf(parent) > -1) {\n        return Object.keys(sectionsElements).find((key) => sectionsElements[key] === parent);\n      }\n      parent = parent.parentElement;\n    }\n    return undefined;\n  }\n\n  /**\n   * Get navigable elements into a section\n   * @param sectionId id of the section\n   */\n  private getSectionNavigableElements (sectionId: string): never[] {\n    return this.core.parseSelector(this._sections[sectionId].configuration.selector!)\n      .filter((element) => this.isNavigable(element, sectionId, false));\n  }\n\n  /**\n   * Get the default element of a section\n   * @param sectionId id of the section\n   * @returns the default element of a section, null if no default element found\n   */\n  private getSectionDefaultElement (sectionId: string): HTMLElement | null {\n    const { defaultElement } = this._sections[sectionId].configuration;\n    if (!defaultElement) {\n      return null;\n    }\n    const elements = this.core.parseSelector(defaultElement);\n    // check each element to see if it's navigable and stop when one has been found\n    for (const element of elements) {\n      if (this.isNavigable(element, sectionId, true)) {\n        return element as HTMLElement;\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Get the last focused element into a section\n   * @param sectionId id of the section\n   * @returns the last focused element, null if no element found\n   */\n  private getSectionLastFocusedElement (sectionId: any): HTMLElement | null {\n    const { lastFocusedElement } = this._sections[sectionId];\n    if (lastFocusedElement) {\n      if (!this.isNavigable(lastFocusedElement, sectionId, true)) {\n        return null;\n      }\n      return lastFocusedElement;\n    }\n    return null;\n  }\n\n  /**\n   * fire an event\n   * @param element element source\n   * @param type type of event\n   * @param details ?\n   * @param cancelable true if cancelable, false otherwise\n   * @returns true if event has been successfully dispatched\n   */\n  private fireEvent (element: HTMLElement, type: string, details: any, cancelable?: boolean): boolean {\n    if (arguments.length < 4) {\n      cancelable = true;\n    }\n    const evt = document.createEvent('CustomEvent');\n    evt.initCustomEvent(this.EVENT_PREFIX + type, true, cancelable, details);\n    return element.dispatchEvent(evt);\n  }\n\n  /**\n   * focus and scroll on element\n   * @param element element to focus\n   * @param sectionId id of the section containing the element\n   * @param enterIntoNewSection true if we enter into the section, false otherwise\n   */\n  private focusNScroll (element: HTMLElement, sectionId: string, enterIntoNewSection: boolean): void {\n    let scrollOptions = enterIntoNewSection ? this._sections[sectionId].configuration.scrollOptions\n      : this._sections[sectionId].configuration.scrollOptionsIntoSection;\n    // if no-scroll given as scrollOptions, then focus without scrolling\n    if (scrollOptions === 'no-scroll') {\n      element.focus({ preventScroll: true });\n    } else if (scrollOptions !== undefined && scrollOptions !== '' && !(scrollOptions instanceof String)) {\n      element.focus({ preventScroll: true });\n      element.scrollIntoView(scrollOptions as ScrollIntoViewOptions);\n    } else if (this.globalConfiguration) {\n      scrollOptions = enterIntoNewSection ? this.globalConfiguration.scrollOptions : this.globalConfiguration.scrollOptionsIntoSection;\n      if (scrollOptions !== undefined && scrollOptions !== '' && scrollOptions !== 'no-scroll') {\n        element.focus({ preventScroll: true });\n        element.scrollIntoView(scrollOptions as ScrollIntoViewOptions);\n      } else {\n        element.focus({ preventScroll: true });\n      }\n    } else {\n      element.focus();\n    }\n  }\n\n  /**\n   *\n   * @param elem\n   * @param sectionId\n   */\n  private focusChanged (element: HTMLElement, sectionId: string) {\n    let id: string | undefined = sectionId;\n    if (!id) {\n      id = this.getSectionId(element);\n    }\n    if (id) {\n      this._sections[sectionId].lastFocusedElement = element;\n      this._lastSectionId = sectionId;\n    }\n  }\n\n  private silentFocus (element: HTMLElement, sectionId: string, scrollIntoNewSection: boolean) {\n    const currentFocusedElement: HTMLElement | undefined = this.getCurrentFocusedElement();\n    if (currentFocusedElement) {\n      currentFocusedElement.blur();\n    }\n    this.focusNScroll(element, sectionId, scrollIntoNewSection);\n    this.focusChanged(element, sectionId);\n  }\n\n  /**\n   * Focus an element\n   * @param elem element to focus\n   * @param sectionId id of the element's section\n   * @param enterIntoNewSection true if new section is focused, false otherwise\n   * @param direction source direction\n   */\n  private _focusElement (element: HTMLElement, sectionId: string, enterIntoNewSection: boolean, direction?: Direction) {\n    if (!element) {\n      return false;\n    }\n    const currentFocusedElement: HTMLElement | undefined = this.getCurrentFocusedElement();\n\n    if (this._duringFocusChange) {\n      this.silentFocus(element, sectionId, enterIntoNewSection);\n      return true;\n    }\n\n    this._duringFocusChange = true;\n\n    if (this._pause) {\n      this.silentFocus(element, sectionId, enterIntoNewSection);\n      this._duringFocusChange = false;\n      return true;\n    }\n\n    if (currentFocusedElement) {\n      const unfocusProperties = {\n        nextElement: element,\n        nextSectionId: sectionId,\n        direction,\n        native: false\n      };\n      if (!this.fireEvent(currentFocusedElement, 'willunfocus', unfocusProperties, undefined)) {\n        this._duringFocusChange = false;\n        return false;\n      }\n      currentFocusedElement.blur();\n      this.fireEvent(currentFocusedElement, 'unfocused', unfocusProperties, false);\n    }\n\n    const focusProperties = {\n      previousElement: currentFocusedElement,\n      sectionId,\n      direction,\n      native: false\n    };\n    if (!this.fireEvent(element, 'willfocus', focusProperties)) {\n      this._duringFocusChange = false;\n      return false;\n    }\n    this.focusNScroll(element, sectionId, enterIntoNewSection);\n    this.fireEvent(element, 'focused', focusProperties, false);\n\n    this._duringFocusChange = false;\n\n    this.focusChanged(element, sectionId);\n    return true;\n  }\n  private focusExtendedSelector (selector: string, direction: Direction, enterIntoNewSection: boolean): boolean {\n    if (selector.charAt(0) === '@') {\n      if (selector.length === 1) {\n        return this.focusSection(undefined, direction);\n      }\n      const sectionId = selector.substr(1);\n      return this.focusSection(sectionId, direction);\n    }\n    const next = this.core.parseSelector(selector)[0];\n    if (next) {\n      const nextSectionId = this.getSectionId(next);\n      if (nextSectionId) {\n        if (this.isNavigable(next, nextSectionId, false)) {\n          return this._focusElement(next, nextSectionId, enterIntoNewSection, direction);\n        }\n      } else {\n        return false;\n      }\n    }\n    return false;\n  }\n\n  private addRange (id: string, range: string []) {\n    if (id && range.indexOf(id) < 0 && this._sections[id] && !this._sections[id].configuration.disabled) {\n      range.push(id);\n    }\n  }\n\n  /**\n   * Focus a section\n   * @param sectionId id of the section\n   * @param direction direction\n   * @returns true if section has been focused\n   */\n  private focusSection (sectionId: string | undefined, direction: Direction): boolean {\n    const range: string [] = [];\n\n    if (sectionId) {\n      this.addRange(sectionId, range);\n    } else {\n      this.addRange(this._defaultSectionId, range);\n      this.addRange(this._lastSectionId, range);\n      for (const section in this._sections) {\n        this.addRange(section, range);\n      }\n    }\n\n    for (let i = 0; i < range.length; i++) {\n      const id = range[i];\n      let next;\n\n      if (this._sections[id].configuration.enterTo === 'last-focused') {\n        next = this.getSectionLastFocusedElement(id)\n               || this.getSectionDefaultElement(id)\n               || this.getSectionNavigableElements(id)[0];\n      } else {\n        next = this.getSectionDefaultElement(id)\n               || this.getSectionLastFocusedElement(id)\n               || this.getSectionNavigableElements(id)[0];\n      }\n\n      if (next) {\n        return this._focusElement(next, id, true, direction);\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Fire event when navigate has failed\n   * @param element element source\n   * @param direction direction source\n   * @returns true if event has been successfully raised\n   */\n  private fireNavigateFailed (element: HTMLElement, direction: Direction) {\n    return this.fireEvent(element, 'navigatefailed', {\n      direction\n    }, false);\n  }\n\n  private goToLeaveFor (sectionId: string, direction: Direction) {\n    if (this._sections[sectionId].configuration.leaveFor\n      && (this._sections[sectionId].configuration.leaveFor as any)[directiontoString(direction)] !== undefined) {\n      const next = (this._sections[sectionId].configuration.leaveFor as any)[directiontoString(direction)];\n      if (next === '' || next === 'nowhere') {\n        return null;\n      }\n      return this.focusExtendedSelector(next, direction, true);\n    }\n    return false;\n  }\n\n  /**\n   * Focus next element\n   * @param direction source direction\n   * @param currentFocusedElement current focused element\n   * @param currentSectionId current section id\n   * @returns true if next has been focused successfully\n   */\n  private focusNext (direction: Direction, currentFocusedElement: HTMLElement, currentSectionId: string): boolean {\n    const extSelector = currentFocusedElement.getAttribute(`data-sn-${direction}`);\n\n    // TO DO remove typeof\n    if (typeof extSelector === 'string') {\n      if (extSelector === ''\n          || !this.focusExtendedSelector(extSelector, direction, false)) { // whhich value for enterIntoNewSection ? true or false ???\n        this.fireNavigateFailed(currentFocusedElement, direction);\n        return false;\n      }\n      return true;\n    }\n\n    const sectionNavigableElements: any = {};\n    let allNavigableElements: any = [];\n    for (const id in this._sections) {\n      sectionNavigableElements[id] = this.getSectionNavigableElements(id) as HTMLElement[];\n      allNavigableElements = allNavigableElements.concat(sectionNavigableElements[id]);\n    }\n\n    // const config: Configuration = this.extend({}, this.globalConfiguration, this._sections[currentSectionId].configuration);\n    let next: HTMLElement | null;\n    const currentSection = this._sections[currentSectionId];\n\n    if (currentSection.configuration.restrict === 'self-only' || currentSection.configuration.restrict === 'self-first') {\n      const currentSectionNavigableElements = sectionNavigableElements[currentSectionId];\n\n      next = this.core.navigate(\n        currentFocusedElement,\n        direction,\n        this.exclude(currentSectionNavigableElements, currentFocusedElement),\n        currentSection\n      );\n\n      if (!next && currentSection.configuration.restrict === 'self-first') {\n        next = this.core.navigate(\n          currentFocusedElement,\n          direction,\n          this.exclude(allNavigableElements, currentSectionNavigableElements),\n          currentSection\n        );\n      }\n    } else {\n      next = this.core.navigate(\n        currentFocusedElement,\n        direction,\n        this.exclude(allNavigableElements, currentFocusedElement),\n        currentSection\n      );\n    }\n\n    if (next) {\n      currentSection.previous = {\n        target: currentFocusedElement,\n        destination: next,\n        reverse: getReverseDirection(direction)\n      };\n\n      const nextSectionId: string | undefined = this.getSectionId(next);\n      let enterIntoNewSection = false;\n      if (currentSectionId !== nextSectionId && nextSectionId !== undefined) {\n        // We enter into another section\n        enterIntoNewSection = true;\n        const result: boolean | null = this.goToLeaveFor(currentSectionId, direction);\n        if (result) {\n          return true;\n        }\n        if (result === null) {\n          this.fireNavigateFailed(currentFocusedElement, direction);\n          return false;\n        }\n\n        let enterToElement: HTMLElement | null = null;\n        switch (this._sections[nextSectionId].configuration.enterTo) {\n          case 'last-focused':\n            enterToElement = this.getSectionLastFocusedElement(nextSectionId)\n                             || this.getSectionDefaultElement(nextSectionId);\n            break;\n          case 'default-element':\n            enterToElement = this.getSectionDefaultElement(nextSectionId);\n            break;\n          default:\n            break;\n        }\n        if (enterToElement) {\n          next = enterToElement;\n        }\n      }\n\n      if (nextSectionId) {\n        return this._focusElement(next, nextSectionId, enterIntoNewSection, direction);\n      }\n      return false;\n    }\n    if (this.goToLeaveFor(currentSectionId, direction)) {\n      return true;\n    }\n    this.fireNavigateFailed(currentFocusedElement, direction);\n    return false;\n  }\n\n  private preventDefault (evt: Event): boolean {\n    evt.preventDefault();\n    evt.stopPropagation();\n    return false;\n  }\n\n  private onKeyDown (evt: KeyboardEvent): boolean {\n    if (this._throttle) {\n      this.preventDefault(evt);\n      return false;\n    }\n\n    this._throttle = window.setTimeout(() => {\n      this._throttle = null;\n    }, this.globalConfiguration.throttle);\n\n    if (!this._sectionCount || this._pause\n      || evt.altKey || evt.ctrlKey || evt.metaKey || evt.shiftKey) {\n      return false;\n    }\n\n    let currentFocusedElement: HTMLElement | null | undefined;\n\n    const direction: Direction = evt.keyCode as unknown as Direction;\n    if (!direction) {\n      if (evt.keyCode === 13) {\n        currentFocusedElement = this.getCurrentFocusedElement();\n        if (currentFocusedElement && this.getSectionId(currentFocusedElement)) {\n          if (!this.fireEvent(currentFocusedElement, 'enter-down', undefined, undefined)) {\n            return this.preventDefault(evt);\n          }\n        }\n      }\n      return false;\n    }\n\n    currentFocusedElement = this.getCurrentFocusedElement();\n\n    if (!currentFocusedElement) {\n      if (this._lastSectionId) {\n        currentFocusedElement = this.getSectionLastFocusedElement(this._lastSectionId);\n      }\n      if (!currentFocusedElement) {\n        this.focusSection(undefined, direction);\n        return this.preventDefault(evt);\n      }\n    }\n\n    const currentSectionId = this.getSectionId(currentFocusedElement);\n    if (!currentSectionId) {\n      return false;\n    }\n\n    const willmoveProperties = {\n      direction,\n      sectionId: currentSectionId,\n      cause: 'keydown'\n    };\n\n    if (this.fireEvent(currentFocusedElement, 'willmove', willmoveProperties)) {\n      this.focusNext(direction, currentFocusedElement, currentSectionId);\n    }\n\n    return this.preventDefault(evt);\n  }\n\n  private onKeyUp (evt: KeyboardEvent): void {\n    if (evt.altKey || evt.ctrlKey || evt.metaKey || evt.shiftKey) {\n      return;\n    }\n    if (!this._pause && this._sectionCount && evt.keyCode === 13) {\n      const currentFocusedElement = this.getCurrentFocusedElement();\n      if (currentFocusedElement && this.getSectionId(currentFocusedElement)) {\n        if (!this.fireEvent(currentFocusedElement, 'enter-up', undefined, undefined)) {\n          evt.preventDefault();\n          evt.stopPropagation();\n        }\n      }\n    }\n  }\n\n  private onFocus (evt: Event): void {\n    const { target } = evt;\n    const htmlTarget: HTMLElement = target as HTMLElement;\n    if (target !== window && target !== document\n      && this._sectionCount && !this._duringFocusChange && target) {\n      const sectionId = this.getSectionId(htmlTarget);\n      if (sectionId) {\n        if (this._pause) {\n          this.focusChanged(htmlTarget, sectionId);\n          return;\n        }\n\n        const focusProperties = {\n          sectionId,\n          native: true\n        };\n\n        if (!this.fireEvent(htmlTarget, 'willfocus', focusProperties)) {\n          this._duringFocusChange = true;\n          htmlTarget.blur();\n          this._duringFocusChange = false;\n        } else {\n          this.fireEvent(htmlTarget, 'focused', focusProperties, false);\n          this.focusChanged(htmlTarget, sectionId);\n        }\n      }\n    }\n  }\n\n  private onBlur (evt: Event): void {\n    const target: EventTarget | null = evt.target;\n    const htmlTarget: HTMLElement = target as HTMLElement;\n    if (target !== window && target !== document && !this._pause\n      && this._sectionCount && !this._duringFocusChange && this.getSectionId(htmlTarget)) {\n      const unfocusProperties = {\n        native: true\n      };\n      if (!this.fireEvent(htmlTarget, 'willunfocus', unfocusProperties)) {\n        this._duringFocusChange = true;\n        setTimeout(() => {\n          htmlTarget.focus();\n          this._duringFocusChange = false;\n        });\n      } else {\n        this.fireEvent(htmlTarget, 'unfocused', unfocusProperties, false);\n      }\n    }\n  }\n\n  private isSection (sectionId: string | undefined): boolean {\n    if (sectionId) {\n      return sectionId in this._sections;\n    }\n    return false;\n  }\n  // TO REMOVE ???\n  private onBodyClick () {\n    if (this._sections[this._lastSectionId]) {\n      const lastFocusedElement = this._sections[this._lastSectionId].lastFocusedElement;\n      if (document.activeElement === document.body && this._lastSectionId\n        && lastFocusedElement) {\n        this._focusElement(lastFocusedElement, this._lastSectionId, true, undefined);\n      }\n    }\n  }\n\n  /**\n   * Make focusable elements of a section.\n   * @param configuration configuration of the section to male focusable ?\n   */\n  private doMakeFocusable (configuration: Configuration): void {\n    let tabIndexIgnoreList: string;\n    if (configuration.tabIndexIgnoreList !== undefined) {\n      tabIndexIgnoreList = configuration.tabIndexIgnoreList;\n    } else {\n      tabIndexIgnoreList = this.globalConfiguration.tabIndexIgnoreList!;\n    }\n\n    this.core.parseSelector(configuration.selector!).forEach((element: HTMLElement) => {\n      if (!this.core.matchSelector(element, tabIndexIgnoreList)) {\n        const htmlElement = element as HTMLElement;\n        if (!htmlElement.getAttribute('tabindex')) {\n          // set the tabindex with a negative value. https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex\n          htmlElement.setAttribute('tabindex', '-1');\n        }\n      }\n    });\n  }\n  // #endregion\n}\n\nconst sn = Compass.getInstance();\nexport { Compass, sn };\n","import { Directive, ElementRef, Input } from '@angular/core';\nimport { sn } from '../../../../Compass'\nimport { Configuration, defaultConfiguration } from '../../../../types/Configuration'\n\ninterface SectionDirective {\n  id?: string;\n  conf?: Configuration\n}\n@Directive({\n  selector: '[focusSection]'\n})\nexport class FocusSectionDirective {\n  element: HTMLElement | undefined = undefined;\n  @Input() focusSection: SectionDirective = {};\n\n  private assignConfig = (sectionId: string | undefined, config: Configuration): Configuration => {\n    const globalConfig = defaultConfiguration; // TO DO : integrate app.globalConfig given by developer\n    const sectionConfig = ({ ...globalConfig }) as Configuration;\n    if (config) {\n      Object.assign(sectionConfig, config);\n    }\n    sectionConfig.selector = `[data-section-id=\"${sectionId}\"] [data-focusable=true]`;\n    return sectionConfig;\n  };\n  \n\n  constructor(private el: ElementRef) {\n    this.element = el.nativeElement;\n  }\n\n  ngOnInit() {\n    let sectionId = null;\n\n    if (this.focusSection && this.focusSection.id && this.focusSection.conf) {\n      sectionId = this.focusSection.id;\n      const config = this.focusSection.conf as Configuration;\n      config.element = this.el.nativeElement;\n      try {\n        sn.add(sectionId, config);\n      } catch (error) {}\n    } else {\n      sectionId = sn.add(undefined, defaultConfiguration);\n    }\n\n    // set sectionid to data set for removing when unbinding\n    this.el.nativeElement.dataset.sectionId = sectionId;\n    if (this.focusSection.conf) {\n      sn.set(sectionId, this.assignConfig(sectionId, this.focusSection.conf));\n    }\n    // set default section\n    // if (this.focusSection.modifiers.default) {\n    // sn.setDefaultSection(sectionId);\n    //   }\n  }\n}","import { NgModule } from '@angular/core';\nimport { FocusDirective } from './directives/focus.directive';\nimport { FocusSectionDirective } from './directives/focusSection.directive';\nimport { Configuration, defaultConfiguration } from '../../../types/Configuration';\nimport { sn } from '../../../Compass'\n\n\n@NgModule({\n  declarations: [\n    FocusDirective,\n    FocusSectionDirective\n  ],\n  imports: [\n  ],\n  exports: [\n    FocusDirective,\n    FocusSectionDirective\n  ]\n})\nexport class BoussoleModule {\n\n  constructor() {\n    const globalConfig = defaultConfiguration;\n    sn.init();\n    sn.set(undefined, globalConfig as Configuration);\n  }\n\n }\n","/*\n * Public API Surface of boussole\n */\n\nexport * from './lib/index';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './boussole-angular';\n"],"names":["this"],"mappings":"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"}