{"version":3,"file":"ng-doc-app-components-search-dialog.mjs","sources":["../../../../libs/app/components/search-dialog/search-dialog.component.ts","../../../../libs/app/components/search-dialog/search-dialog.component.html","../../../../libs/app/components/search-dialog/ng-doc-app-components-search-dialog.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  ElementRef,\n  forwardRef,\n  inject,\n  ViewChild,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { RouterLink } from '@angular/router';\nimport { NgDocSearchResult } from '@ng-doc/app/interfaces';\nimport { NgDocSanitizeHtmlPipe } from '@ng-doc/app/pipes';\nimport {\n  NG_DOC_DIALOG_DATA,\n  NgDocAutofocusDirective,\n  NgDocDataListComponent,\n  NgDocExecutePipe,\n  NgDocHighlighterPipe,\n  NgDocHighlightPosition,\n  NgDocIconComponent,\n  NgDocInputStringDirective,\n  NgDocInputWrapperComponent,\n  NgDocSpinnerComponent,\n  NgDocTagComponent,\n  NgDocTextComponent,\n  StatedObservable,\n} from '@ng-doc/ui-kit';\nimport { NgDocListHost, NgDocOverlayRef } from '@ng-doc/ui-kit/classes';\n\nexport interface NgDocSearchDialogData {\n  term: string;\n  search: (query: string) => void;\n  searchResults: StatedObservable<NgDocSearchResult[]>;\n}\n\n@Component({\n  selector: 'ng-doc-search-dialog',\n  imports: [\n    CommonModule,\n    NgDocInputWrapperComponent,\n    NgDocInputStringDirective,\n    NgDocAutofocusDirective,\n    NgDocIconComponent,\n    NgDocDataListComponent,\n    RouterLink,\n    NgDocTagComponent,\n    NgDocTextComponent,\n    NgDocHighlighterPipe,\n    NgDocSanitizeHtmlPipe,\n    NgDocSpinnerComponent,\n    NgDocExecutePipe,\n    FormsModule,\n  ],\n  templateUrl: './search-dialog.component.html',\n  styleUrl: './search-dialog.component.scss',\n  providers: [\n    {\n      provide: NgDocListHost,\n      useExisting: forwardRef(() => NgDocSearchDialogComponent),\n    },\n  ],\n  host: {\n    'animate.enter': 'ng-doc-enter-animation',\n  },\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgDocSearchDialogComponent implements NgDocListHost {\n  @ViewChild('inputElement', { read: ElementRef })\n  inputElement!: ElementRef<HTMLElement>;\n\n  @ViewChild('resultContent', { read: ElementRef })\n  resultContent?: ElementRef<HTMLElement>;\n\n  protected searchTerm: string = '';\n  protected readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n  protected readonly overlayRef = inject(NgDocOverlayRef);\n  protected readonly data = inject<NgDocSearchDialogData>(NG_DOC_DIALOG_DATA);\n\n  constructor() {\n    this.searchTerm = this.data.term;\n  }\n\n  search(query: string): void {\n    this.data.search(query);\n\n    if (this.resultContent) {\n      this.resultContent.nativeElement.scrollTop = 0;\n    }\n  }\n\n  getPositions<T extends NgDocSearchResult, K extends keyof T['positions']>(\n    key: K,\n    item: T,\n  ): NgDocHighlightPosition[] {\n    return item.positions[key] ?? [];\n  }\n\n  get listHostOrigin(): ElementRef<HTMLElement> {\n    return this.inputElement ?? this.elementRef;\n  }\n}\n","<div class=\"ng-doc-search-dialog-container\">\n  <ng-doc-input-wrapper>\n    <ng-doc-icon icon=\"search\" ngDocInputWrapperLeft></ng-doc-icon>\n    <input\n      ngDocInputString\n      ngDocAutofocus\n      [selectAll]=\"true\"\n      placeholder=\"Find or ask anything...\"\n      [(ngModel)]=\"searchTerm\"\n      (ngModelChange)=\"search($event)\"\n      #inputElement />\n  </ng-doc-input-wrapper>\n\n  @if (data.searchResults | async; as state) {\n    <div class=\"ng-doc-search-result-content\" #resultContent>\n      <ng-doc-data-list\n        [items]=\"state?.result ?? []\"\n        [itemContent]=\"itemContent\"\n        [emptyContent]=\"emptyContent\">\n        <ng-template let-item #itemContent>\n          <a\n            class=\"ng-doc-search-option\"\n            [routerLink]=\"item.index.route\"\n            [fragment]=\"item.index.fragment\"\n            (click)=\"overlayRef.close()\">\n            <div class=\"ng-doc-search-option-header\">\n              <ng-doc-tag size=\"small\" [attr.data-ng-doc-page-type]=\"item.index.pageType\">\n                {{ item.index.pageType }}\n              </ng-doc-tag>\n              <span class=\"ng-doc-search-option-breadcrumbs\" ng-doc-text>\n                @for (breadcrum of item.index.breadcrumbs; track breadcrum; let i = $index) {\n                  <span>{{ breadcrum }}</span>\n                  @if (i !== item.index.breadcrumbs.length - 1) {\n                    <span class=\"ng-doc-search-option-breadcrumb-divider\"><b>•</b></span>\n                  }\n                }\n              </span>\n            </div>\n            <h5\n              class=\"ng-doc-search-section-title\"\n              ng-doc-text\n              [innerHTML]=\"\n                (item.index.section\n                  | ngDocHighlighterPipe: (getPositions | execute: 'section' : item)\n                  | ngDocSanitizeHtml) || item.index.title\n              \"></h5>\n            @if (item.index.content) {\n              <div\n                class=\"ng-doc-search-content\"\n                [innerHTML]=\"\n                  item.index.content\n                    | ngDocHighlighterPipe: (getPositions | execute: 'content' : item)\n                    | ngDocSanitizeHtml\n                \"\n                ng-doc-text></div>\n            }\n          </a>\n        </ng-template>\n        <ng-template #emptyContent>\n          @if (!state?.pending) {\n            <div class=\"ng-doc-search-empty\">\n              @if (searchTerm.length) {\n                Nothing found\n              }\n              @if (!searchTerm.length) {\n                Please enter your search query\n              }\n            </div>\n          }\n          @if (state?.pending) {\n            <div class=\"ng-doc-search-progress\">\n              <ng-doc-spinner size=\"small\"></ng-doc-spinner>\n              Searching...\n            </div>\n          }\n        </ng-template>\n      </ng-doc-data-list>\n    </div>\n  }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}