{ "version": 3, "sources": ["src/app/features/trips/components/trips-itinerary-gallery-item/trips-itinerary-gallery-item.component.ts", "src/app/features/trips/components/trips-itinerary-gallery-item/trips-itinerary-gallery-item.component.html", "src/app/features/trips/components/trips-itinerary-gallery/trips-itinerary-gallery.component.ts", "src/app/features/trips/components/trips-itinerary-gallery/trips-itinerary-gallery.component.html", "src/app/features/trips/components/trips-itinerary-exclusion-item/trips-itinerary-exclusion-item.component.ts", "src/app/features/trips/components/trips-itinerary-exclusion-item/trips-itinerary-exclusion-item.component.html", "src/app/features/trips/components/trips-itinerary-inclusion-item/trips-itinerary-inclusion-item.component.ts", "src/app/features/trips/components/trips-itinerary-inclusion-item/trips-itinerary-inclusion-item.component.html", "src/app/features/trips/trips-inclusions-exclusions-section/trips-inclusions-exclusions-section.component.ts", "src/app/features/trips/trips-inclusions-exclusions-section/trips-inclusions-exclusions-section.component.html", "src/app/features/trips/components/trips-itinerary-accommodation-item/trips-itinerary-accommodation-item.component.ts", "src/app/features/trips/components/trips-itinerary-accommodation-item/trips-itinerary-accommodation-item.component.html", "src/app/features/trips/components/trips-itinerary-accommodation/trips-itinerary-accommodation.component.ts", "src/app/features/trips/components/trips-itinerary-accommodation/trips-itinerary-accommodation.component.html", "src/app/features/trips/components/trips-itinerary-breadcrumbs/trips-itinerary-breadcrumbs.component.ts", "src/app/features/trips/components/trips-itinerary-breadcrumbs/trips-itinerary-breadcrumbs.component.html", "src/app/features/trips/components/trips-itinerary-day/trips-itinerary-day.component.ts", "src/app/features/trips/components/trips-itinerary-day/trips-itinerary-day.component.html", "src/app/features/trips/components/trips-itinerary-navigation/trips-itinerary-navigation.component.ts", "src/app/features/trips/components/trips-itinerary-navigation/trips-itinerary-navigation.component.html", "src/app/features/trips/components/trips-itinerary-detail/trips-itinerary-detail.component.ts", "src/app/features/trips/components/trips-itinerary-detail/trips-itinerary-detail.component.html", "src/app/pages/trips-pages/trip-variation-detail-page/trip-variation-detail-page.component.ts", "src/app/pages/trips-pages/trip-variation-detail-page/trip-variation-detail-page.component.html"], "sourcesContent": ["import { Component, Input, OnInit } from '@angular/core';\nimport {\n Configurations,\n Stops,\n} from '@features/lazy-image/components/lazy-picture/lazy-picture.component';\nimport { ImageOrientation } from '@features/trips/components/trips-trip-other-trips-item/trips-trip-other-trips-item.component';\nimport { Asset } from '@generated/graphql';\nimport { LazyPictureComponent } from '../../../lazy-image/components/lazy-picture/lazy-picture.component';\n\n@Component({\n selector: 'app-trips-itinerary-gallery-item',\n templateUrl: './trips-itinerary-gallery-item.component.html',\n\n standalone: true,\n imports: [LazyPictureComponent],\n})\nexport class TripsItineraryGalleryItemComponent implements OnInit {\n @Input() orientation: ImageOrientation;\n @Input() asset: Asset;\n featuredImageConfiguration: Configurations;\n constructor() {}\n\n ngOnInit(): void {\n this.featuredImageConfiguration = {\n [Stops.FALLBACK]: {\n image: this.asset,\n ratioHeight: 9,\n ratioWidth: 16,\n width: 800,\n width2x: 1200,\n width3x: 1600,\n },\n [Stops.BASE]: {\n image: this.asset,\n ratioHeight: 1,\n ratioWidth: 1,\n width: 800,\n width2x: 1200,\n width3x: 1600,\n },\n [Stops.SM]: {\n image: this.asset,\n ratioHeight: 1,\n ratioWidth: 1,\n width: 800,\n width2x: 1200,\n width3x: 1600,\n },\n [Stops.MD]: {\n image: this.asset,\n ratioHeight: 1,\n ratioWidth: this.orientation === 'square' ? 1 : 2,\n width: this.orientation === 'square' ? 800 : 1200,\n width2x: this.orientation === 'square' ? 1000 : 1400,\n width3x: this.orientation === 'square' ? 1200 : 1600,\n },\n [Stops.LG]: {\n image: this.asset,\n ratioHeight: 1,\n ratioWidth: this.orientation === 'square' ? 1 : 2,\n width: this.orientation === 'square' ? 800 : 1200,\n width2x: this.orientation === 'square' ? 1000 : 1400,\n width3x: this.orientation === 'square' ? 1200 : 1600,\n },\n [Stops.XL]: {\n image: this.asset,\n ratioHeight: 1,\n ratioWidth: this.orientation === 'square' ? 1 : 2,\n width: this.orientation === 'square' ? 800 : 1400,\n width2x: this.orientation === 'square' ? 1000 : 1600,\n width3x: this.orientation === 'square' ? 1200 : 1800,\n },\n [Stops.XXL]: {\n image: this.asset,\n ratioHeight: 1,\n ratioWidth: this.orientation === 'square' ? 1 : 2,\n width: this.orientation === 'square' ? 800 : 1400,\n width2x: this.orientation === 'square' ? 1000 : 1600,\n width3x: this.orientation === 'square' ? 1200 : 1800,\n },\n };\n }\n}\n", "
\n \n
\n", "import { NgClass } from '@angular/common';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { ImageOrientation } from '@features/trips/components/trips-trip-other-trips-item/trips-trip-other-trips-item.component';\nimport { Asset } from '@generated/graphql';\nimport { TripsItineraryGalleryItemComponent } from '../trips-itinerary-gallery-item/trips-itinerary-gallery-item.component';\n\n@Component({\n selector: 'app-trips-itinerary-gallery',\n templateUrl: './trips-itinerary-gallery.component.html',\n\n standalone: true,\n imports: [NgClass, TripsItineraryGalleryItemComponent],\n})\nexport class TripsItineraryGalleryComponent implements OnInit {\n @Input() assets: Asset[] = [];\n styles: [string, ImageOrientation][] = [\n ['md:aspect-w-16 md:aspect-h-9 md:col-span-2 md:row-span-2', 'square'],\n ['md:aspect-w-2 md:aspect-h-1 md:col-span-2', 'horizontal'],\n ['md:aspect-w-1 md:aspect-h-1', 'square'],\n ['md:aspect-w-1 md:aspect-h-1', 'square'],\n [\n 'md:aspect-w-2 md:aspect-h-1 md:col-span-4 md:row-span-2',\n 'horizontal',\n ],\n ];\n constructor() {}\n\n ngOnInit(): void {\n if (this.assets.length === 3) {\n this.styles[2] = [\n 'md:aspect-w-2 md:aspect-h-1 md:col-span-2',\n 'horizontal',\n ];\n }\n if (this.assets.length === 2) {\n this.styles[1] = [\n 'md:aspect-w-1 md:aspect-h-1 md:col-span-2 md:row-span-2 w-full',\n 'square',\n ];\n }\n }\n}\n", "
\n @for (asset of assets; track asset?.sys?.id || index; let index = $index) {\n
\n \n \n
\n }\n
\n", "import { Component, Input, OnInit } from '@angular/core';\n\n@Component({\n selector: 'app-trips-itinerary-exclusion-item',\n templateUrl: './trips-itinerary-exclusion-item.component.html',\n\n standalone: true,\n})\nexport class TripsItineraryExclusionItemComponent implements OnInit {\n @Input() exclusion: string;\n constructor() {}\n\n ngOnInit(): void {}\n}\n", "
\n \n \n \n

\n {{ exclusion }}\n

\n
\n", "import { Component, Input, OnInit } from '@angular/core';\n\n@Component({\n selector: 'app-trips-itinerary-inclusion-item',\n templateUrl: './trips-itinerary-inclusion-item.component.html',\n\n standalone: true,\n})\nexport class TripsItineraryInclusionItemComponent implements OnInit {\n @Input() inclusion: string;\n constructor() {}\n\n ngOnInit(): void {}\n}\n", "
\n \n \n \n

\n {{ inclusion }}\n

\n
\n", "import { Component, Input } from '@angular/core';\nimport { Itinerary } from '@generated/graphql';\nimport { TripsItineraryExclusionItemComponent } from '../components/trips-itinerary-exclusion-item/trips-itinerary-exclusion-item.component';\nimport { TripsItineraryInclusionItemComponent } from '../components/trips-itinerary-inclusion-item/trips-itinerary-inclusion-item.component';\n\n@Component({\n selector: 'app-trips-inclusions-exclusions-section',\n standalone: true,\n imports: [\n TripsItineraryInclusionItemComponent,\n TripsItineraryExclusionItemComponent,\n ],\n templateUrl: './trips-inclusions-exclusions-section.component.html',\n styles: [],\n})\nexport class TripsInclusionsExclusionsSectionComponent {\n @Input() itinerary: Itinerary;\n readonly defaultNoOfExclusionsDisplayed = 6;\n readonly defaultNoOfInclusionsDisplayed = 6;\n\n noOfExclusionsDisplayed = this.defaultNoOfExclusionsDisplayed;\n noOfInclusionsDisplayed = this.defaultNoOfInclusionsDisplayed;\n\n toggleInclusionsDisplayed = (inclusions: string[]) => {\n if (\n this.noOfInclusionsDisplayed === this.defaultNoOfInclusionsDisplayed\n ) {\n this.noOfInclusionsDisplayed = inclusions.length;\n } else {\n this.noOfInclusionsDisplayed = this.defaultNoOfInclusionsDisplayed;\n }\n };\n\n toggleExclusionsDisplayed = (exclusions: string[]) => {\n if (\n this.noOfExclusionsDisplayed === this.defaultNoOfExclusionsDisplayed\n ) {\n this.noOfExclusionsDisplayed = exclusions.length;\n } else {\n this.noOfExclusionsDisplayed = this.defaultNoOfExclusionsDisplayed;\n }\n };\n}\n", "@if (itinerary?.inclusions?.length || itinerary?.exclusions?.length) {\n \n

Inclusions

\n
\n
\n

Price Includes

\n
\n @for (\n inclusion of itinerary?.inclusions.slice(\n 0,\n noOfInclusionsDisplayed\n );\n track inclusion\n ) {\n \n }\n
\n @if (\n itinerary?.inclusions.length >\n defaultNoOfInclusionsDisplayed\n ) {\n \n See\n {{\n noOfInclusionsDisplayed ===\n defaultNoOfInclusionsDisplayed\n ? 'all'\n : 'fewer'\n }}\n inclusions\n \n }\n
\n
\n

\n Price Does Not Include\n

\n
\n @for (\n exclusion of itinerary?.exclusions.slice(\n 0,\n noOfExclusionsDisplayed\n );\n track exclusion\n ) {\n \n }\n
\n @if (\n itinerary?.exclusions.length >\n defaultNoOfExclusionsDisplayed\n ) {\n \n See\n {{\n noOfExclusionsDisplayed ===\n defaultNoOfExclusionsDisplayed\n ? 'all'\n : 'fewer'\n }}\n exclusions\n \n }\n
\n
\n \n}\n", "import { Component, Input, OnInit } from '@angular/core';\nimport { AssetImageConfiguration } from '@features/lazy-image/components/lazy-asset-lazy/lazy-asset-lazy.component';\nimport { Accommodation } from '@generated/graphql';\nimport { RichTextDocumentComponent } from '../../../contentful-dynamic/rich-text/rich-text-document/rich-text-document.component';\nimport { LazyAssetComponent } from '../../../lazy-image/components/lazy-asset/lazy-asset.component';\n\n@Component({\n selector: 'app-trips-itinerary-accommodation-item',\n templateUrl: './trips-itinerary-accommodation-item.component.html',\n\n standalone: true,\n imports: [LazyAssetComponent, RichTextDocumentComponent],\n})\nexport class TripsItineraryAccommodationItemComponent implements OnInit {\n @Input() accommodation: Accommodation;\n featuredImageConfiguration: AssetImageConfiguration;\n constructor() {}\n\n ngOnInit(): void {\n this.featuredImageConfiguration = {\n image: this.accommodation?.featuredImage,\n ratioHeight: 1,\n ratioWidth: 1,\n width: 400,\n width2x: 800,\n };\n }\n}\n", "
\n
\n \n
\n
\n

{{ accommodation?.title }}

\n \n
\n
\n", "import { Component, Input, OnInit } from '@angular/core';\nimport { Accommodation } from '@generated/graphql';\nimport { TripsItineraryAccommodationItemComponent } from '../trips-itinerary-accommodation-item/trips-itinerary-accommodation-item.component';\n\n@Component({\n selector: 'app-trips-itinerary-accommodation',\n templateUrl: './trips-itinerary-accommodation.component.html',\n\n standalone: true,\n imports: [TripsItineraryAccommodationItemComponent],\n})\nexport class TripsItineraryAccommodationComponent implements OnInit {\n @Input() accommodations: Accommodation[];\n\n constructor() {}\n\n ngOnInit(): void {}\n}\n", "
\n

Where you'll stay

\n
\n @for (accommodation of accommodations; track accommodation.sys.id) {\n
\n \n
\n }\n
\n
\n", "import { Component, Input, OnInit } from '@angular/core';\nimport { EnvironmentService } from '@core/services/environment.service';\nimport { SeoService } from '@core/services/seo.service';\nimport { Itinerary } from '@generated/graphql';\nimport { BreadcrumbList, WithContext } from 'schema-dts';\n\nimport { JsonLdComponent } from '@features/seo/json-ld/json-ld.component';\nimport { LinkComponent } from '../../../../shared/link/link.component';\n\n@Component({\n selector: 'app-trips-itinerary-breadcrumbs',\n templateUrl: './trips-itinerary-breadcrumbs.component.html',\n\n standalone: true,\n imports: [LinkComponent, JsonLdComponent],\n})\nexport class TripsItineraryBreadcrumbsComponent implements OnInit {\n @Input() itinerary: Itinerary;\n\n seoBreadCrumbs: WithContext;\n\n constructor(\n private seoService: SeoService,\n private environmentService: EnvironmentService\n ) {}\n\n ngOnInit(): void {\n this.seoBreadCrumbs = this.seoService.generateBreadCrumbs([\n {\n name: 'Adventure Trips',\n url: `${this.environmentService.hostName()}/adventure-trips`,\n },\n {\n name: this.itinerary?.trip?.title,\n url: `${this.environmentService.hostName()}/adventure-trips/${\n this.itinerary?.trip?.urlSlug\n }`,\n },\n {\n name: this.itinerary?.title,\n url: `${this.environmentService.hostName()}/adventure-trips/${\n this.itinerary?.trip?.urlSlug\n }/${this.itinerary?.urlSlug}`,\n },\n ]);\n }\n}\n", "\n Trips\n\n/\n\n {{ itinerary?.trip?.title }}\n\n\n", "import { CommonModule, NgClass } from '@angular/common';\nimport { Component, Input, OnInit } from '@angular/core';\nimport {\n Configurations,\n CropFocus,\n Stops,\n} from '@features/lazy-image/components/lazy-picture/lazy-picture.component';\nimport { ItineraryDay } from '@generated/graphql';\nimport { RichTextDocumentComponent } from '../../../contentful-dynamic/rich-text/rich-text-document/rich-text-document.component';\nimport { LazyPictureComponent } from '../../../lazy-image/components/lazy-picture/lazy-picture.component';\n\n@Component({\n selector: 'app-trips-itinerary-day',\n templateUrl: './trips-itinerary-day.component.html',\n\n standalone: true,\n imports: [\n NgClass,\n RichTextDocumentComponent,\n LazyPictureComponent,\n CommonModule,\n ],\n host: { ngSkipHydration: 'true' },\n})\nexport class TripsItineraryDayComponent implements OnInit {\n @Input() day: ItineraryDay;\n @Input() dayNumber: number;\n featuredImageConfiguration: Configurations;\n constructor() {}\n\n ngOnInit(): void {\n this.featuredImageConfiguration = {\n [Stops.FALLBACK]: {\n image: this.day?.featuredImage,\n ratioHeight: 1,\n ratioWidth: 1,\n widthLqip: 32,\n width: 1200,\n width2x: 1200,\n focus:\n (this.day?.featuredImageCropFocus as CropFocus) || 'center',\n },\n [Stops.BASE]: {\n image: this.day?.featuredImage,\n ratioHeight: 1,\n ratioWidth: 1,\n widthLqip: 32,\n width: 800,\n width2x: 1200,\n width3x: 1600,\n focus:\n (this.day?.featuredImageCropFocus as CropFocus) || 'center',\n },\n [Stops.MD]: {\n image: this.day?.featuredImage,\n ratioHeight: 9,\n ratioWidth: 16,\n widthLqip: 32,\n width: 400,\n width2x: 800,\n focus:\n (this.day?.featuredImageCropFocus as CropFocus) || 'center',\n },\n [Stops.LG]: {\n image: this.day?.featuredImage,\n ratioHeight: 9,\n ratioWidth: 16,\n widthLqip: 32,\n width: 800,\n width2x: 1200,\n focus:\n (this.day?.featuredImageCropFocus as CropFocus) || 'center',\n },\n [Stops.XL]: {\n image: this.day?.featuredImage,\n ratioHeight: 9,\n ratioWidth: 16,\n widthLqip: 32,\n width: 800,\n width2x: 1600,\n focus:\n (this.day?.featuredImageCropFocus as CropFocus) || 'center',\n },\n [Stops.XXL]: {\n image: this.day?.featuredImage,\n ratioHeight: 9,\n ratioWidth: 16,\n widthLqip: 32,\n width: 800,\n width2x: 1600,\n focus:\n (this.day?.featuredImageCropFocus as CropFocus) || 'center',\n },\n };\n }\n}\n", "
\n \n

Day {{ dayNumber }}: {{ day?.title }}

\n

\n \n

\n \n
\n
\n @if (day?.featuredImage?.url) {\n \n }\n
\n
\n
\n", "import { AsyncPipe, CurrencyPipe, NgClass } from '@angular/common';\nimport {\n ChangeDetectorRef,\n Component,\n ElementRef,\n Inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n SimpleChanges,\n} from '@angular/core';\nimport { DjangoService, Routes } from '@core/services/django.service';\nimport { EnvironmentService } from '@core/services/environment.service';\nimport { EventTrackerService } from '@core/services/event-tracker.service';\nimport { WINDOW } from '@core/services/window.service';\nimport { ANALYTICS_EVENTS } from '@core/utils/AnalyticsEvents';\nimport { ModalService } from '@features/modal/services/modal.service';\nimport { TripsItinerarySectionDirective } from '@features/trips/directives/trips-itinerary-section.directive';\nimport { TripsItineraryMenuService } from '@features/trips/services/trips-itinerary-menu.service';\nimport { Itinerary } from '@generated/graphql';\nimport { LeadRequestCreatePolymorphicTypes as LeadRequestType } from '@generated/openapi/model/leadRequestCreatePolymorphicTypes';\nimport { PublicDeparture } from '@generated/openapi/model/publicDeparture';\nimport { EnquireFormModalComponent } from '@shared/enquire-form-modal/enquire-form-modal.component';\nimport {\n BehaviorSubject,\n Observable,\n Subject,\n fromEvent,\n takeUntil,\n} from 'rxjs';\nimport { shareReplay } from 'rxjs/operators';\n@Component({\n selector: 'app-trips-itinerary-navigation',\n templateUrl: './trips-itinerary-navigation.component.html',\n standalone: true,\n imports: [NgClass, AsyncPipe, CurrencyPipe],\n})\nexport class TripsItineraryNavigationComponent\n implements OnInit, OnDestroy, OnChanges\n{\n @Input() itinerary: Itinerary;\n @Input() selfBookingDeparturesContainer: ElementRef;\n menuOpen: boolean = false;\n menuItems: Observable;\n activeMenuItem: Observable;\n departures: Observable;\n private destroy = new Subject();\n\n observerOptions: IntersectionObserverInit = {\n root: null,\n // remove 100px from top of the viewport container\n rootMargin: '-100px 0px 0px 0px',\n threshold: 0.0,\n };\n isVisible = new BehaviorSubject(false);\n private observer: IntersectionObserver;\n\n constructor(\n private eventTrackerService: EventTrackerService,\n private modalService: ModalService,\n private djangoService: DjangoService,\n private cd: ChangeDetectorRef,\n private tripsItineraryMenuService: TripsItineraryMenuService,\n private environmentService: EnvironmentService,\n @Inject(WINDOW) private window: Window\n ) {\n if (this.environmentService.isBrowser()) {\n const options = this.observerOptions;\n this.observer = new IntersectionObserver((entries, observer) => {\n const isVisible = entries\n .map(value => value.isIntersecting)\n .reduce(\n (previousValue, currentValue) =>\n previousValue && currentValue,\n true\n );\n this.isVisible.next(isVisible);\n }, options);\n }\n }\n\n ngOnDestroy(): void {\n this.destroy.next(null);\n if (this.environmentService.isBrowser()) {\n this.observer.disconnect();\n }\n }\n ngOnChanges(changes: SimpleChanges): void {\n if (\n this.environmentService.isBrowser() &&\n changes.selfBookingDeparturesContainer\n ) {\n const containerElement =\n changes.selfBookingDeparturesContainer?.currentValue\n ?.nativeElement;\n if (this.observer && containerElement) {\n this.observer.observe(containerElement);\n }\n }\n }\n ngOnInit(): void {\n this.menuItems = this.tripsItineraryMenuService.sections;\n this.activeMenuItem = this.tripsItineraryMenuService.activeMenuItem;\n\n this.departures = this.djangoService\n .drfList(Routes.publicDepartures, 'start_date', {\n itinerary: this.itinerary?.linkedVirtualOfficeItinerary,\n })\n .pipe(shareReplay(1));\n if (this.environmentService.isBrowser()) {\n fromEvent(this.window, 'click')\n .pipe(takeUntil(this.destroy))\n .subscribe(event => {\n if (this.menuOpen) {\n this.toggleMenu(event);\n }\n });\n }\n }\n\n navigate(menuItem: TripsItinerarySectionDirective) {\n menuItem.scrollIntoView();\n }\n\n showDatesModal() {\n this.selfBookingDeparturesContainer.nativeElement.scrollIntoView({\n behavior: 'smooth',\n block: 'start',\n });\n this.eventTrackerService.trackEvent(\n ANALYTICS_EVENTS.ITINERARY_GROUP_DEPARTURES_CTA,\n {\n trip: this.itinerary.trip.title,\n itinerary: this.itinerary.title,\n }\n );\n }\n showCustomModal() {\n this.modalService.show(\n EnquireFormModalComponent,\n {\n trip: this.itinerary.trip,\n typeOfEnquiry: LeadRequestType.CustomDepartureLeadRequest,\n itinerary: this.itinerary,\n analyticsEventSent:\n ANALYTICS_EVENTS.ITINERARY_CUSTOM_ENQUIRY_SENT,\n analyticsEventCompleted:\n ANALYTICS_EVENTS.ITINERARY_CUSTOM_ENQUIRY_COMPLETED,\n analyticsEventAbandoned:\n ANALYTICS_EVENTS.ITINERARY_CUSTOM_ENQUIRY_ABANDONED,\n analyticsEventData: {\n trip: this.itinerary.trip.title,\n itinerary: this.itinerary.title,\n },\n },\n false\n );\n this.eventTrackerService.trackEvent(\n ANALYTICS_EVENTS.ITINERARY_CUSTOM_TRIP_CTA,\n {\n trip: this.itinerary.trip.title,\n itinerary: this.itinerary.title,\n }\n );\n }\n\n toggleMenu(event: Event, stopPropagation: boolean = false) {\n this.menuOpen = !this.menuOpen;\n if (stopPropagation) {\n event.stopPropagation();\n }\n this.cd.detectChanges();\n }\n}\n", "\n
\n

\n From\n {{\n itinerary?.startingPrice | currency: 'USD' : 'code' : '1.0-0'\n }}\n

\n

per person

\n
\n \n
\n @if (!(isVisible | async)) {\n @if (\n itinerary?.trip?.showGroupDepartures &&\n (departures | async)?.length\n ) {\n \n \n {{\n itinerary?.groupDepartureCtaText ||\n itinerary?.trip?.groupDepartureCtaText ||\n 'Dates & Prices'\n }}\n \n }\n }\n
\n
\n @if (itinerary?.trip?.showCustomDeparture) {\n \n \n {{\n itinerary?.customDepartureCtaText ||\n itinerary?.trip?.customDepartureCtaText ||\n 'Propose Date'\n }}\n \n }\n
\n \n
\n \n

Jump to

\n \n \n \n
\n \n @for (menuItem of menuItems | async; track menuItem.title) {\n \n {{ menuItem.title }}\n @if (menuItem === (activeMenuItem | async)) {\n