{"version":3,"file":"edsis-component-popover.mjs","sources":["../../../library/component/popover/popover-content.directive.ts","../../../library/component/popover/popover-trigger.directive.ts","../../../library/component/popover/edsis-component-popover.ts"],"sourcesContent":["import { Directive, TemplateRef, inject } from '@angular/core';\n\n@Directive({\n  selector: 'ng-template[PopoverContent]',\n  exportAs: 'PopoverContent',\n})\nexport class PopoverContentDirective {\n  readonly template = inject<TemplateRef<unknown>>(TemplateRef);\n}\n","import { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport {\n  booleanAttribute,\n  DestroyRef,\n  Directive,\n  ElementRef,\n  InjectionToken,\n  ViewContainerRef,\n  inject,\n  input,\n  output,\n  signal,\n  type Signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { uniqueId } from '@edsis/component/id';\nimport {\n  connectedPositionFor,\n  oppositeSide,\n  overlayDismissals,\n  type OverlayAlign,\n  type OverlaySide,\n} from '@edsis/component/overlay';\nimport type { PopoverContentDirective } from './popover-content.directive';\n\nexport type PopoverSide = OverlaySide;\nexport type PopoverAlign = OverlayAlign;\n\nexport interface PopoverTriggerDefaults {\n  readonly side?: Signal<PopoverSide>;\n  readonly align?: Signal<PopoverAlign>;\n  readonly sideOffset?: Signal<number>;\n}\n\nexport const POPOVER_TRIGGER_DEFAULTS = new InjectionToken<PopoverTriggerDefaults>(\n  'POPOVER_TRIGGER_DEFAULTS',\n);\n\n@Directive({\n  selector: '[PopoverTrigger]',\n  exportAs: 'PopoverTrigger',\n  host: {\n    '[attr.aria-expanded]': 'isOpen()',\n    '[attr.aria-haspopup]': '\"dialog\"',\n    '(click)': 'toggle()',\n    '(keydown.enter)': 'onKeyboardToggle($event)',\n    '(keydown.space)': 'onKeyboardToggle($event)',\n    '(keydown.escape)': 'close()',\n  },\n})\nexport class PopoverTriggerDirective {\n  private readonly overlay = inject(Overlay);\n  private readonly vcr = inject(ViewContainerRef);\n  private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly defaults = inject(POPOVER_TRIGGER_DEFAULTS, { optional: true });\n\n  readonly PopoverTrigger = input.required<PopoverContentDirective>();\n  readonly side = input<PopoverSide | undefined>(undefined);\n  readonly align = input<PopoverAlign | undefined>(undefined);\n  readonly sideOffset = input<number | undefined>(undefined);\n  readonly disabled = input(false, { transform: booleanAttribute });\n\n  readonly openedChange = output<boolean>();\n\n  private overlayRef: OverlayRef | null = null;\n  readonly isOpen = signal(false);\n\n  constructor() {\n    this.destroyRef.onDestroy(() => this.close(false));\n  }\n\n  toggle(): void {\n    if (this.disabled()) return;\n    this.isOpen() ? this.close() : this.open();\n  }\n\n  onKeyboardToggle(event: Event): void {\n    if (this.disabled() || this.usesNativeKeyboardActivation()) {\n      return;\n    }\n\n    event.preventDefault();\n    this.toggle();\n  }\n\n  open(): void {\n    if (this.isOpen() || this.disabled()) return;\n\n    const side = this.side() ?? this.defaults?.side?.() ?? 'bottom';\n    const align = this.align() ?? this.defaults?.align?.() ?? 'center';\n    const sideOffset = this.sideOffset() ?? this.defaults?.sideOffset?.() ?? 8;\n\n    const primary = connectedPositionFor(side, align, sideOffset);\n    const fallback = connectedPositionFor(oppositeSide(side), align, sideOffset);\n\n    const positionStrategy = this.overlay\n      .position()\n      .flexibleConnectedTo(this.el)\n      .withPositions([primary, fallback])\n      .withPush(false)\n      .withFlexibleDimensions(false);\n\n    this.overlayRef = this.overlay.create({\n      positionStrategy,\n      scrollStrategy: this.overlay.scrollStrategies.reposition(),\n      hasBackdrop: false,\n      panelClass: 'popover-panel',\n    });\n\n    const portal = new TemplatePortal(this.PopoverTrigger().template, this.vcr);\n    this.overlayRef.attach(portal);\n    this.applyDialogSemantics(this.overlayRef.overlayElement);\n\n    overlayDismissals(this.overlayRef, this.el.nativeElement)\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(() => this.close());\n\n    this.isOpen.set(true);\n    this.openedChange.emit(true);\n  }\n\n  close(emitOpenedChange = true): void {\n    if (!this.isOpen()) return;\n\n    const overlayRef = this.overlayRef;\n    this.overlayRef = null;\n    this.isOpen.set(false);\n    overlayRef?.dispose();\n\n    if (emitOpenedChange) {\n      this.openedChange.emit(false);\n    }\n  }\n\n  /**\n   * The trigger advertises `aria-haspopup=\"dialog\"`, so the opened pane must be\n   * a dialog: non-modal, labelled by its trigger so screen readers announce\n   * which control the content belongs to.\n   */\n  private applyDialogSemantics(pane: HTMLElement): void {\n    const trigger = this.el.nativeElement;\n    if (!trigger.id) {\n      trigger.id = uniqueId('popover-trigger');\n    }\n\n    pane.setAttribute('role', 'dialog');\n    pane.setAttribute('aria-modal', 'false');\n    pane.setAttribute('aria-labelledby', trigger.id);\n  }\n\n  private usesNativeKeyboardActivation(): boolean {\n    const host = this.el.nativeElement;\n    const tagName = host.tagName;\n\n    return (\n      tagName === 'BUTTON' ||\n      tagName === 'INPUT' ||\n      tagName === 'SELECT' ||\n      tagName === 'TEXTAREA' ||\n      tagName === 'SUMMARY' ||\n      (tagName === 'A' && host.hasAttribute('href'))\n    );\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}