{"version":3,"file":"angular-container-media-query.mjs","sources":["../../src/lib/media-query-template-rules.ts","../../src/lib/observe-resize.service.ts","../../src/lib/media-query-decorator.ts","../../src/public-api.ts","../../src/angular-container-media-query.ts"],"sourcesContent":["export const MEDIA_QUERY_TEMPLATE_RULES: unique symbol = Symbol('__mediaQueryTemplateRules');\n","import {ChangeDetectorRef, ElementRef, Injectable, isDevMode, NgZone} from '@angular/core';\nimport {match} from 'css-mediaquery';\n\nimport {MEDIA_QUERY_TEMPLATE_RULES} from './media-query-template-rules';\nimport {Rule, Target} from './types';\n\n@Injectable({providedIn: 'root'})\nexport class ObserveResizeService {\n  private _targets: Target[] = [];\n  private _observedElements: Element[] = [];\n\n  constructor(private _ngZone: NgZone) {}\n\n  private _resizeObserver = this.windowResizeObserver((entries: any[]) => {\n    for (const entry of entries) {\n      const element = entry.target;\n\n      const {width, height} = this._entrySize(entry);\n\n      if (width === 0 && height === 0) {\n        this._remove(entry.target);\n        continue;\n      }\n\n      const instanceRules = this._getRulesForElement(element);\n      for (const instanceRule of instanceRules) {\n        const isMatch = match(instanceRule.rule?.query, {\n          width: width + 'px',\n          height: height + 'px',\n        });\n\n        if (instanceRule.target.instance[instanceRule.rule?.key] !== isMatch) {\n          this._ngZone.run(() => {\n            instanceRule.target.instance[instanceRule.rule?.key] = isMatch;\n            if (instanceRule.target.changeDetector) {\n              instanceRule.target.changeDetector.markForCheck();\n              instanceRule.target.changeDetector.detectChanges();\n            } else {\n              console.error(\n                `ContainerMediaQuery: changeDetector not registered for '${instanceRule.target.element.tagName.toLowerCase()}'`\n              );\n            }\n          });\n        }\n      }\n    }\n  });\n\n  private windowResizeObserver(func: (entries: any[]) => void) {\n    const _window = window as any;\n    if (_window?.ResizeObserver) {\n      return new _window.ResizeObserver(func);\n    }\n\n    return {\n      observe: () => {},\n      unobserve: () => {},\n    };\n  }\n\n  /**\n   * Registers the component on which media queries need to be calculated.\n   *\n   * ```ts\n   * @Component({ selector: 'app-parent', template: '<app-child></app-child>' })\n   * class ParentComponent {}\n   *\n   * @Component({ selector: 'app-child' })\n   * class ChildComponent {\n   *   @MediaQuery('app-parent:(max-width: 20rem)') @HostBinding('class.parentSmall') parentSmall = false;\n   *   @MediaQuery('(max-width: 20rem)') @HostBinding('class.childSmall') childSmall = false;\n   *\n   *   constructor(\n   *     resize: ObserveResizeService,\n   *     elementRef: ElementRef,\n   *     changeDetector: ChangeDetectorRef\n   *   ) {\n   *     resize.register(this, elementRef, changeDetector);\n   *   }\n   * }\n   * ```\n   *\n   * @param instance the current component instance (this)\n   * @param injector the Injector of the current component\n   */\n  register(instance: any, elementRef: ElementRef, changeDetector: ChangeDetectorRef) {\n    this._targets.push({\n      element: elementRef.nativeElement,\n      instance,\n      changeDetector,\n    });\n\n    const rules: Rule[] = Reflect.get(instance, MEDIA_QUERY_TEMPLATE_RULES);\n\n    for (const rule of rules) {\n      if (rule.selector) {\n        let parent;\n        if (rule.selector === '$parent') {\n          parent = elementRef.nativeElement.parentElement;\n        } else {\n          parent = elementRef.nativeElement.closest(rule.selector);\n        }\n\n        if (parent) {\n          this._observe(parent);\n        } else {\n          console.error(\n            `ContainerMediaQuery: unable to find parent '${\n              rule.selector\n            }' for '${elementRef.nativeElement?.tagName?.toLowerCase()}'`\n          );\n        }\n      } else {\n        this._observe(elementRef?.nativeElement);\n      }\n    }\n  }\n\n  private _remove(element: Element) {\n    const index = this._targets.findIndex((target) => target.element === element);\n    this._targets.splice(index, 1);\n    this._unobserve(element);\n    this._removeElementsWithoutListeners();\n  }\n\n  private _removeElementsWithoutListeners() {\n    for (const element of this._observedElements) {\n      let hasListeners = false;\n      for (const target of this._targets) {\n        const rules: Rule[] = Reflect.get(target.instance, MEDIA_QUERY_TEMPLATE_RULES);\n        for (const rule of rules) {\n          if (rule.selector) {\n            const parentElement = target.element.closest(rule.selector);\n            if (parentElement === element) {\n              hasListeners = true;\n              break;\n            }\n          } else if (element === target.element) {\n            hasListeners = true;\n            break;\n          }\n        }\n\n        if (hasListeners) {\n          break;\n        }\n      }\n\n      if (!hasListeners) {\n        this._unobserve(element);\n      }\n    }\n  }\n\n  private _getRulesForElement(element: Element): {target: Target; rule: Rule}[] {\n    const parentRules = [];\n    for (const target of this._targets) {\n      const rules: Rule[] = Reflect.get(target.instance, MEDIA_QUERY_TEMPLATE_RULES);\n\n      if (!rules) {\n        if (isDevMode()) {\n          console.warn(\n            `ContainerMediaQuery: '${target.element.tagName}' is registered but does not have a @MediaQuery`\n          );\n        }\n        continue;\n      }\n\n      for (const rule of rules) {\n        if (rule.selector) {\n          const parentElement = target.element.closest(rule.selector);\n          if (parentElement === element) {\n            parentRules.push({\n              target,\n              rule,\n            });\n          }\n        } else if (element === target.element) {\n          parentRules.push({\n            target,\n            rule,\n          });\n        }\n      }\n    }\n\n    return parentRules;\n  }\n\n  private _entrySize(entry: any) {\n    let width = entry.contentRect.width;\n    let height = entry.contentRect.height;\n    if ('borderBoxSize' in entry && entry.borderBoxSize.length > 0) {\n      width = entry.borderBoxSize[0].inlineSize;\n      height = entry.borderBoxSize[0].blockSize;\n    }\n    return {width, height};\n  }\n\n  private _unobserve(element: Element) {\n    const index = this._observedElements.findIndex((el) => el === element);\n    if (index >= 0) {\n      this._observedElements.splice(index, 1);\n    }\n\n    this._resizeObserver.unobserve(element);\n  }\n\n  private _observe(element: Element) {\n    const index = this._observedElements.findIndex((el) => el === element);\n    if (index < 0) {\n      this._observedElements.push(element);\n      this._resizeObserver.observe(element);\n    }\n  }\n}\n","import {MEDIA_QUERY_TEMPLATE_RULES} from './media-query-template-rules';\nimport {Rule} from './types';\n\n/**\n * MediaQuery Decorator\n *\n * ```ts\n * @Component({ ... })\n * class ChildComponent {\n *   @MediaQuery('app-parent:(max-width: 20rem)') @HostBinding('class.parentSmall') parentSmall = false;\n *   @MediaQuery('(max-width: 20rem)') @HostBinding('class.childSmall') childSmall = false;\n *\n *   constructor(\n *     resize: ObserveResizeService,\n *     elementRef: ElementRef,\n *     changeDetector: ChangeDetectorRef\n *   ) {\n *     resize.register(this, elementRef, changeDetector);\n *   }\n * }\n * ```\n * */\nexport function MediaQuery(rule: string) {\n  return (target: Object, key: string) => {\n    const rules: Rule[] = Reflect.get(target, MEDIA_QUERY_TEMPLATE_RULES) || [];\n\n    const queryStartIndex = rule.indexOf('(');\n    if (queryStartIndex >= 0) {\n      let selector = rule.substring(0, queryStartIndex);\n      selector = selector.trim();\n      selector = selector.substring(0, selector.length - 1);\n      const query = rule.substring(queryStartIndex);\n      rules.push({selector, query, key});\n    } else {\n      rules.push({query: rule, key});\n    }\n    Reflect.set(target, MEDIA_QUERY_TEMPLATE_RULES, rules);\n  };\n}\n","/*\n * Public API Surface of angular-container-media-query\n */\n\nexport * from './lib/observe-resize.service';\nexport * from './lib/media-query-decorator';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}