{"version":3,"file":"881.js","mappings":"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","sources":["./src/app/components/product-card/product-card.component.html","./src/app/components/product-card/product-card.component.ts","./src/app/layout/common/category-page.abstract.ts","./src/app/shared/directives/scroll-list/scroll-item.directive.ts","./src/app/shared/directives/scroll-list/scroll-list.directive.ts","./src/app/layout/default/default-category-page/default-category-page.component.html","./src/app/layout/default/default-category-page/default-category-page.component.ts","./src/app/layout/fresh/fresh-category-page/fresh-category-page.component.html","./src/app/layout/fresh/fresh-category-page/fresh-category-page.component.ts","./src/app/pages/category/category.component.html","./src/app/pages/category/category.routes.ts","./src/app/pages/category/category.component.ts","./node_modules/@angular/cdk/fesm2022/collections.mjs"],"sourcesContent":["<a (click)=\"onOpenCard(data.balance && data.balance < 0 ? null : data.slug)\" class=\"product-card link\" *ngIf=\"data\"\n   [ngClass]=\"{'is-disable': data.balance === 0}\">\n  <div class=\"product-card__photo\" *ngIf=\"currentSize.buttonImage['src']\">\n    <picture class=\"cover-picture\">\n      <source srcset=\"{{ currentSize.buttonImage['500x250x100.webp'] }}\">\n      <img ngSrc=\"{{ currentSize.buttonImage['src'] }}\" loading=\"auto\" [alt]=\"data.name\" alt=\"\" width=\"200\" height=\"100\" appPictureFallback>\n    </picture>\n  </div>\n  <div class=\"product-card__body\">\n    <div class=\"product-card__head\">\n      <div class=\"product-card__title h3\">\n        {{ data.name }}\n        <span class=\"allergen-icon\" *ngIf=\"data.allergens && !!data.allergens.length\"><b>A</b></span>\n      </div>\n\n      <ng-container *ngIf=\"currentSize && defaultPrice$ | async as defaultPrice\">\n        <div class=\"product-card__price h3\">\n          <app-price [price]=\"defaultPrice\"></app-price>\n        </div>\n      </ng-container>\n    </div>\n\n    <div class=\"product-card__caption\" *ngIf=\"data.description\">{{ data.description }}</div>\n\n    <ng-container *ngIf=\"data.itemSizes\">\n      <div class=\"product-card__bottom\">\n        <div class=\"product-card__portion\">\n          <ng-container *ngIf=\"energy\">\n            {{ energy | number: '1.0-0' }} <span i18n=\"@@EnergyUnit\">kcal</span> |\n          </ng-container>\n          <ng-container *ngIf=\"currentSize.portionWeightGrams\">\n            {{ currentSize.portionWeightGrams | number: '1.0-0' }}\n\n            <ng-container [ngSwitch]=\"currentSize.measureUnitType\">\n              <span *ngSwitchCase=\"'GRAM'\" i18n=\"@@WeightGramUnit\">g</span>\n              <span *ngSwitchCase=\"'MILLILITER'\" i18n=\"@@WeightMlUnit\">ml</span>\n              <span *ngSwitchCase=\"'KILOGRAM'\" i18n=\"@@WeightKgUnit\">kg</span>\n              <span *ngSwitchCase=\"'LITER'\" i18n=\"@@WeightLUnit\">l</span>\n            </ng-container>\n          </ng-container>\n        </div>\n\n        <div class=\"product-card__tags\" *ngIf=\"data.labels && !!data.labels.length\">\n          <div class=\"tag-list\">\n            <div class=\"tag\" *ngFor=\"let label of data.labels\">{{ label.name }}</div>\n          </div>\n        </div>\n      </div>\n    </ng-container>\n  </div>\n</a>\n","import {\n  CommonModule,\n  NgOptimizedImage,\n} from '@angular/common';\nimport { Component, inject, Input, OnChanges } from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { MenuItemSizeDto } from '../../api/v1/models/menu-item-size-dto';\nimport { CurrencyComponent } from '../../shared/components/price/currency.component';\nimport { MenuListRepository } from '../../shared/repositories/menu-list.repository';\nimport { UIMenuItemDto } from 'src/app/shared/interfaces/ui-menu-item-dto.interface';\nimport { Observable } from 'rxjs';\n\n@Component({\n  selector: 'app-product-card',\n  templateUrl: './product-card.component.html',\n  standalone: true,\n  imports: [\n    CommonModule,\n    NgOptimizedImage,\n    CurrencyComponent,\n  ]\n})\nexport class ProductCardComponent implements OnChanges {\n  @Input() data: UIMenuItemDto;\n\n  public energy: number;\n  public currentSize!: MenuItemSizeDto;\n  public defaultPrice$: Observable<number | null>;\n\n  private menuListRepository = inject(MenuListRepository);\n  private router = inject(Router);\n\n  ngOnChanges(): void {\n    this.prepareData();\n  }\n\n  private prepareData(): void {\n    if (this.data) {\n      this.currentSize = this.menuListRepository.getDefaultSize(this.data);\n      this.defaultPrice$ = this.menuListRepository.getDefaultPriceObservable(this.currentSize);\n      const energy = this.currentSize.nutritionPerHundredGrams?.energy ?? 0;\n      const weight = this.currentSize.portionWeightGrams ?? 0;\n      this.energy = weight * energy / 100;\n    }\n  }\n\n  onOpenCard(slug: string | null): void {\n    if (!slug) { return }\n    void this.router.navigate([`/category/${this.data.categorySlug}/${slug}`]);\n  }\n}\n","import { AfterViewInit, Directive, inject, Input } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { combineLatestWith, map, Observable, shareReplay, tap } from 'rxjs';\nimport { MenuScheduleDto } from 'src/app/api/v1/models';\nimport { ScrollListService } from 'src/app/services/scroll-list.sevice';\nimport { MenuListRepository } from 'src/app/shared/repositories/menu-list.repository';\nimport { SessionRepository } from 'src/app/shared/repositories/session.repository';\n\n@UntilDestroy()\n@Directive()\nexport abstract class CategoryPageAbstract implements AfterViewInit {\n  protected menuListRepository = inject(MenuListRepository);\n  private scrollListService = inject(ScrollListService);\n  private router = inject(Router);\n  private sessionRepository = inject(SessionRepository)\n\n  intersectionOptions = { rootMargin: '80px 0px 0px 0px', threshold: 0.3 };\n\n  @Input() slug: string;\n\n  schedule$: Observable<MenuScheduleDto | null> = this.menuListRepository.activeCategorySchedule$;\n  categories$ = this.menuListRepository.menuNavCategories$.pipe(\n    map(categories => categories?.filter(c => !c.isScheduleAvailable))\n  );\n  items$ = this.menuListRepository.showItems$.pipe(\n    combineLatestWith(\n      this.sessionRepository.activeLabelFilter$,\n      this.sessionRepository.activeAllergenFilter$\n    ),\n    map(([items, activeLabelFilter, activeAllergenFilter]) =>\n      items?.filter(i =>\n        !activeLabelFilter?.length && !activeAllergenFilter?.length ||\n        activeLabelFilter?.length && i.labels.some(l => activeLabelFilter.includes(l.name)) ||\n        activeAllergenFilter?.length && i.allergens.some(a => activeAllergenFilter.includes(a.name))\n      )\n    ),\n    map(items => items?.reduce(\n      (arr, item) => arr.set(item.categoryId, (arr.get(item.categoryId) ?? []).concat([item])),\n      new Map()\n    )),\n    shareReplay(1),\n  );\n  activeCategoryIndex$: Observable<number> = this.scrollListService.activeIndexItem$;\n  isSearching$: Observable<boolean> = this.menuListRepository.searchString$.pipe(map(str => !!str));\n\n  ngAfterViewInit() {\n    this.categories$.pipe(\n      tap(categories => {\n        const activeCategorySlug = categories?.find(c => c.id === this.menuListRepository.activeCategoryId)?.slug;\n        const currentCategoryId = categories?.find(c => c.slug === this.slug)?.id;\n        if (activeCategorySlug !== this.slug && currentCategoryId) {\n          this.menuListRepository.setActiveCategory(currentCategoryId);\n        }\n      }),\n      map(categories => categories?.map((x, i) => x.slug === this.slug ? i : 0).filter(x => !!x)[0] ?? 0),\n      tap(i => setTimeout(() => this.scrollListService.setActiveIndex(i), 300)),\n      untilDestroyed(this)\n    ).subscribe();\n  }\n\n  leaveEnd(slug: string, isSearching: boolean | null) {\n    if (isSearching || /\\/category\\/([\\w|-]+)\\/([\\w|-]+)/.test(this.router.url)) { return; }\n    this.menuListRepository.setActiveCategoryBySlug(slug);\n  }\n}\n","import { Directive, ElementRef } from '@angular/core';\n\n@Directive({\n  selector: '[appScrollItem]',\n  standalone: true\n})\nexport class ScrollItemDirective {\n  constructor(private elRef: ElementRef) { }\n\n  setActive(): void {\n    window.scrollTo({ left: 0, top: this.elRef.nativeElement.offsetTop, behavior: 'instant' });\n  }\n}\n","import { ContentChildren, Directive, Input, OnChanges, QueryList, SimpleChanges } from '@angular/core';\nimport { ScrollItemDirective } from './scroll-item.directive';\n\n@Directive({\n  selector: '[appScrollList]',\n  standalone: true\n})\nexport class ScrollListDirective implements OnChanges {\n  constructor() { }\n\n  @Input() activeIndex: number = 0;\n  @ContentChildren(ScrollItemDirective, { descendants: true }) scrollButtons: QueryList<ScrollItemDirective>;\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['activeIndex'] && !changes['activeIndex'].firstChange) {\n      this.scrollButtons.get(this.activeIndex)?.setActive();\n    }\n  }\n}\n","<div appScrollList [activeIndex]=\"(activeCategoryIndex$ | async) ?? 0\">\n  <div \n    class=\"menu-section\"\n    appObserver\n    [intersectionOptions]=\"intersectionOptions\"\n    (leaveEnd)=\"leaveEnd(category.slug, false)\"\n    appScrollItem\n    *ngFor=\"let category of categories$ | async\" \n    [attr.data-category-slug]=\"category.slug\"\n  >\n    <div class=\"menu-section__head\">\n      <div class=\"menu-section__title h1\"> {{ category.name }}</div>\n          <div class=\"menu-section__right\" *ngIf=\"schedule$ | async as schedule\">\n            <div class=\"menu-section__caption\">\n              <span i18n=\"@@AvailableFrom\">Available from</span> {{ schedule.from }} <span i18n=\"@@To\">to</span> {{ schedule.to }}\n            </div>\n          </div>\n    </div>\n    <div class=\"menu-section__list\">\n      <div class=\"menu-section__item\" *ngFor=\"let item of (items$ | async)!.get(category.id)\">\n        <app-product-card [data]=\"item\"></app-product-card>\n      </div>\n    </div>\n  </div>\n</div>\n\n<router-outlet></router-outlet>\n","import { Component } from '@angular/core';\nimport { AsyncPipe, NgFor, NgIf } from '@angular/common';\nimport { ProductCardComponent } from '../../../components/product-card/product-card.component';\nimport { RouterOutlet } from '@angular/router';\nimport { CategoryPageAbstract } from '../../common/category-page.abstract';\nimport { ObserverDirective } from 'src/app/shared/directives/observer/observer.directive';\nimport { ScrollListDirective } from 'src/app/shared/directives/scroll-list/scroll-list.directive';\nimport { ScrollItemDirective } from 'src/app/shared/directives/scroll-list/scroll-item.directive';\n\n@Component({\n  selector: 'app-default-category-page',\n  templateUrl: './default-category-page.component.html',\n  styleUrls: ['./default-category-page.component.scss'],\n  standalone: true,\n  imports: [\n    NgIf,\n    NgFor,\n    AsyncPipe,\n    RouterOutlet,\n    ProductCardComponent,\n    ObserverDirective,\n    ScrollListDirective,\n    ScrollItemDirective\n  ]\n})\nexport class DefaultCategoryPageComponent extends CategoryPageAbstract { }\n","<div \n  appScrollList \n  [activeIndex]=\"(activeCategoryIndex$ | async) ?? 0\" \n  *ngIf=\"{\n    isSearching: isSearching$ | async,\n    items: items$ | async\n  } as data\"\n>\n  <div \n    class=\"menu-section\" \n    appObserver\n    [intersectionOptions]=\"intersectionOptions\"\n    (leaveEnd)=\"leaveEnd(category.slug, data.isSearching)\"\n    appScrollItem\n    *ngFor=\"let category of categories$ | async\" \n    [attr.data-category-slug]=\"category.slug\"\n  >\n    <ng-container *ngIf=\"data.items!.get(category.id)\">\n      <div class=\"menu-section__head\">\n        <div class=\"menu-section__title h1\">{{ category.name }}</div>\n          <div class=\"menu-section__right\" *ngIf=\"schedule$ | async as schedule\">\n            <div class=\"menu-section__caption\">\n              <span i18n=\"@@AvailableFrom\">Available from</span> {{ schedule.from }} <span i18n=\"@@To\">to</span> {{ schedule.to }}\n            </div>\n          </div>\n      </div>\n      <div class=\"menu-section__list\">\n        <div class=\"menu-section__item\" *ngFor=\"let item of data.items!.get(category.id)\">\n          <app-product-card [data]=\"item\"></app-product-card>\n        </div>\n      </div>\n    </ng-container>\n  </div>\n</div>\n\n<router-outlet></router-outlet>\n","import { Component } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { AsyncPipe, NgFor, NgIf } from '@angular/common';\nimport { RouterOutlet } from '@angular/router';\nimport { ProductCardComponent } from '../components/product-card/product-card.component';\nimport { CategoryPageAbstract } from '../../common/category-page.abstract';\nimport { ObserverDirective } from 'src/app/shared/directives/observer/observer.directive';\nimport { ScrollListDirective } from 'src/app/shared/directives/scroll-list/scroll-list.directive';\nimport { ScrollItemDirective } from 'src/app/shared/directives/scroll-list/scroll-item.directive';\n\n@Component({\n  selector: 'app-fresh-category-page',\n  templateUrl: './fresh-category-page.component.html',\n  styleUrls: ['./fresh-category-page.component.scss'],\n  standalone: true,\n  imports: [\n    NgIf,\n    NgFor,\n    AsyncPipe,\n    RouterOutlet,\n    ProductCardComponent,\n    ObserverDirective,\n    ScrollListDirective,\n    ScrollItemDirective\n  ]\n})\nexport class FreshCategoryPageComponent extends CategoryPageAbstract {\n  searchString$: Observable<string | null> = this.menuListRepository.searchString$;\n}\n","<ng-container [ngSwitch]=\"layout$ | async\">\n  <app-default-category-page *ngSwitchCase=\"layouts.Default\" [slug]=\"slug\"></app-default-category-page>\n  <app-fresh-category-page *ngSwitchCase=\"layouts.Fresh\" [slug]=\"slug\"></app-fresh-category-page>\n</ng-container>\n","import { Routes } from '@angular/router';\n\nimport { CategoryComponent } from './category.component';\n\nexport const routes: Routes = [\n  {\n    path: '',\n    component: CategoryComponent,\n    children: [\n      {\n        path: ':slug',\n        loadComponent: () => import('../product-info/product-info.component')\n      },\n    ]\n  },\n]\n","import { AsyncPipe, NgSwitch, NgSwitchCase } from '@angular/common';\nimport { Component, Input } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { Layout } from 'src/app/api/v1/models';\nimport { ConfigRepository } from '../../shared/repositories/config.repository';\nimport {\n  DefaultCategoryPageComponent\n} from '../../layout/default/default-category-page/default-category-page.component';\nimport { FreshCategoryPageComponent } from '../../layout/fresh/fresh-category-page/fresh-category-page.component';\n\n@Component({\n  selector: 'app-category',\n  templateUrl: './category.component.html',\n  standalone: true,\n  imports: [\n    AsyncPipe,\n    NgSwitch,\n    NgSwitchCase,\n    DefaultCategoryPageComponent,\n    FreshCategoryPageComponent,\n  ]\n})\nexport class CategoryComponent{\n  constructor(\n    private config: ConfigRepository,\n  ) {}\n  @Input() slug: string;\n\n  layout$: Observable<Layout> = this.config.layout$;\n  layouts = Layout;\n}\n","import { ConnectableObservable, isObservable, of, Subject } from 'rxjs';\nimport * as i0 from '@angular/core';\nimport { Injectable, InjectionToken } from '@angular/core';\n\nclass DataSource {\n}\n/** Checks whether an object is a data source. */\nfunction isDataSource(value) {\n    // Check if the value is a DataSource by observing if it has a connect function. Cannot\n    // be checked as an `instanceof DataSource` since people could create their own sources\n    // that match the interface, but don't extend DataSource. We also can't use `isObservable`\n    // here, because of some internal apps.\n    return value && typeof value.connect === 'function' && !(value instanceof ConnectableObservable);\n}\n\n/** DataSource wrapper for a native array. */\nclass ArrayDataSource extends DataSource {\n    constructor(_data) {\n        super();\n        this._data = _data;\n    }\n    connect() {\n        return isObservable(this._data) ? this._data : of(this._data);\n    }\n    disconnect() { }\n}\n\n/**\n * A repeater that destroys views when they are removed from a\n * {@link ViewContainerRef}. When new items are inserted into the container,\n * the repeater will always construct a new embedded view for each item.\n *\n * @template T The type for the embedded view's $implicit property.\n * @template R The type for the item in each IterableDiffer change record.\n * @template C The type for the context passed to each embedded view.\n */\nclass _DisposeViewRepeaterStrategy {\n    applyChanges(changes, viewContainerRef, itemContextFactory, itemValueResolver, itemViewChanged) {\n        changes.forEachOperation((record, adjustedPreviousIndex, currentIndex) => {\n            let view;\n            let operation;\n            if (record.previousIndex == null) {\n                const insertContext = itemContextFactory(record, adjustedPreviousIndex, currentIndex);\n                view = viewContainerRef.createEmbeddedView(insertContext.templateRef, insertContext.context, insertContext.index);\n                operation = 1 /* _ViewRepeaterOperation.INSERTED */;\n            }\n            else if (currentIndex == null) {\n                viewContainerRef.remove(adjustedPreviousIndex);\n                operation = 3 /* _ViewRepeaterOperation.REMOVED */;\n            }\n            else {\n                view = viewContainerRef.get(adjustedPreviousIndex);\n                viewContainerRef.move(view, currentIndex);\n                operation = 2 /* _ViewRepeaterOperation.MOVED */;\n            }\n            if (itemViewChanged) {\n                itemViewChanged({\n                    context: view?.context,\n                    operation,\n                    record,\n                });\n            }\n        });\n    }\n    detach() { }\n}\n\n/**\n * A repeater that caches views when they are removed from a\n * {@link ViewContainerRef}. When new items are inserted into the container,\n * the repeater will reuse one of the cached views instead of creating a new\n * embedded view. Recycling cached views reduces the quantity of expensive DOM\n * inserts.\n *\n * @template T The type for the embedded view's $implicit property.\n * @template R The type for the item in each IterableDiffer change record.\n * @template C The type for the context passed to each embedded view.\n */\nclass _RecycleViewRepeaterStrategy {\n    constructor() {\n        /**\n         * The size of the cache used to store unused views.\n         * Setting the cache size to `0` will disable caching. Defaults to 20 views.\n         */\n        this.viewCacheSize = 20;\n        /**\n         * View cache that stores embedded view instances that have been previously stamped out,\n         * but don't are not currently rendered. The view repeater will reuse these views rather than\n         * creating brand new ones.\n         *\n         * TODO(michaeljamesparsons) Investigate whether using a linked list would improve performance.\n         */\n        this._viewCache = [];\n    }\n    /** Apply changes to the DOM. */\n    applyChanges(changes, viewContainerRef, itemContextFactory, itemValueResolver, itemViewChanged) {\n        // Rearrange the views to put them in the right location.\n        changes.forEachOperation((record, adjustedPreviousIndex, currentIndex) => {\n            let view;\n            let operation;\n            if (record.previousIndex == null) {\n                // Item added.\n                const viewArgsFactory = () => itemContextFactory(record, adjustedPreviousIndex, currentIndex);\n                view = this._insertView(viewArgsFactory, currentIndex, viewContainerRef, itemValueResolver(record));\n                operation = view ? 1 /* _ViewRepeaterOperation.INSERTED */ : 0 /* _ViewRepeaterOperation.REPLACED */;\n            }\n            else if (currentIndex == null) {\n                // Item removed.\n                this._detachAndCacheView(adjustedPreviousIndex, viewContainerRef);\n                operation = 3 /* _ViewRepeaterOperation.REMOVED */;\n            }\n            else {\n                // Item moved.\n                view = this._moveView(adjustedPreviousIndex, currentIndex, viewContainerRef, itemValueResolver(record));\n                operation = 2 /* _ViewRepeaterOperation.MOVED */;\n            }\n            if (itemViewChanged) {\n                itemViewChanged({\n                    context: view?.context,\n                    operation,\n                    record,\n                });\n            }\n        });\n    }\n    detach() {\n        for (const view of this._viewCache) {\n            view.destroy();\n        }\n        this._viewCache = [];\n    }\n    /**\n     * Inserts a view for a new item, either from the cache or by creating a new\n     * one. Returns `undefined` if the item was inserted into a cached view.\n     */\n    _insertView(viewArgsFactory, currentIndex, viewContainerRef, value) {\n        const cachedView = this._insertViewFromCache(currentIndex, viewContainerRef);\n        if (cachedView) {\n            cachedView.context.$implicit = value;\n            return undefined;\n        }\n        const viewArgs = viewArgsFactory();\n        return viewContainerRef.createEmbeddedView(viewArgs.templateRef, viewArgs.context, viewArgs.index);\n    }\n    /** Detaches the view at the given index and inserts into the view cache. */\n    _detachAndCacheView(index, viewContainerRef) {\n        const detachedView = viewContainerRef.detach(index);\n        this._maybeCacheView(detachedView, viewContainerRef);\n    }\n    /** Moves view at the previous index to the current index. */\n    _moveView(adjustedPreviousIndex, currentIndex, viewContainerRef, value) {\n        const view = viewContainerRef.get(adjustedPreviousIndex);\n        viewContainerRef.move(view, currentIndex);\n        view.context.$implicit = value;\n        return view;\n    }\n    /**\n     * Cache the given detached view. If the cache is full, the view will be\n     * destroyed.\n     */\n    _maybeCacheView(view, viewContainerRef) {\n        if (this._viewCache.length < this.viewCacheSize) {\n            this._viewCache.push(view);\n        }\n        else {\n            const index = viewContainerRef.indexOf(view);\n            // The host component could remove views from the container outside of\n            // the view repeater. It's unlikely this will occur, but just in case,\n            // destroy the view on its own, otherwise destroy it through the\n            // container to ensure that all the references are removed.\n            if (index === -1) {\n                view.destroy();\n            }\n            else {\n                viewContainerRef.remove(index);\n            }\n        }\n    }\n    /** Inserts a recycled view from the cache at the given index. */\n    _insertViewFromCache(index, viewContainerRef) {\n        const cachedView = this._viewCache.pop();\n        if (cachedView) {\n            viewContainerRef.insert(cachedView, index);\n        }\n        return cachedView || null;\n    }\n}\n\n/**\n * Class to be used to power selecting one or more options from a list.\n */\nclass SelectionModel {\n    /** Selected values. */\n    get selected() {\n        if (!this._selected) {\n            this._selected = Array.from(this._selection.values());\n        }\n        return this._selected;\n    }\n    constructor(_multiple = false, initiallySelectedValues, _emitChanges = true, compareWith) {\n        this._multiple = _multiple;\n        this._emitChanges = _emitChanges;\n        this.compareWith = compareWith;\n        /** Currently-selected values. */\n        this._selection = new Set();\n        /** Keeps track of the deselected options that haven't been emitted by the change event. */\n        this._deselectedToEmit = [];\n        /** Keeps track of the selected options that haven't been emitted by the change event. */\n        this._selectedToEmit = [];\n        /** Event emitted when the value has changed. */\n        this.changed = new Subject();\n        if (initiallySelectedValues && initiallySelectedValues.length) {\n            if (_multiple) {\n                initiallySelectedValues.forEach(value => this._markSelected(value));\n            }\n            else {\n                this._markSelected(initiallySelectedValues[0]);\n            }\n            // Clear the array in order to avoid firing the change event for preselected values.\n            this._selectedToEmit.length = 0;\n        }\n    }\n    /**\n     * Selects a value or an array of values.\n     * @param values The values to select\n     * @return Whether the selection changed as a result of this call\n     * @breaking-change 16.0.0 make return type boolean\n     */\n    select(...values) {\n        this._verifyValueAssignment(values);\n        values.forEach(value => this._markSelected(value));\n        const changed = this._hasQueuedChanges();\n        this._emitChangeEvent();\n        return changed;\n    }\n    /**\n     * Deselects a value or an array of values.\n     * @param values The values to deselect\n     * @return Whether the selection changed as a result of this call\n     * @breaking-change 16.0.0 make return type boolean\n     */\n    deselect(...values) {\n        this._verifyValueAssignment(values);\n        values.forEach(value => this._unmarkSelected(value));\n        const changed = this._hasQueuedChanges();\n        this._emitChangeEvent();\n        return changed;\n    }\n    /**\n     * Sets the selected values\n     * @param values The new selected values\n     * @return Whether the selection changed as a result of this call\n     * @breaking-change 16.0.0 make return type boolean\n     */\n    setSelection(...values) {\n        this._verifyValueAssignment(values);\n        const oldValues = this.selected;\n        const newSelectedSet = new Set(values);\n        values.forEach(value => this._markSelected(value));\n        oldValues\n            .filter(value => !newSelectedSet.has(value))\n            .forEach(value => this._unmarkSelected(value));\n        const changed = this._hasQueuedChanges();\n        this._emitChangeEvent();\n        return changed;\n    }\n    /**\n     * Toggles a value between selected and deselected.\n     * @param value The value to toggle\n     * @return Whether the selection changed as a result of this call\n     * @breaking-change 16.0.0 make return type boolean\n     */\n    toggle(value) {\n        return this.isSelected(value) ? this.deselect(value) : this.select(value);\n    }\n    /**\n     * Clears all of the selected values.\n     * @param flushEvent Whether to flush the changes in an event.\n     *   If false, the changes to the selection will be flushed along with the next event.\n     * @return Whether the selection changed as a result of this call\n     * @breaking-change 16.0.0 make return type boolean\n     */\n    clear(flushEvent = true) {\n        this._unmarkAll();\n        const changed = this._hasQueuedChanges();\n        if (flushEvent) {\n            this._emitChangeEvent();\n        }\n        return changed;\n    }\n    /**\n     * Determines whether a value is selected.\n     */\n    isSelected(value) {\n        return this._selection.has(this._getConcreteValue(value));\n    }\n    /**\n     * Determines whether the model does not have a value.\n     */\n    isEmpty() {\n        return this._selection.size === 0;\n    }\n    /**\n     * Determines whether the model has a value.\n     */\n    hasValue() {\n        return !this.isEmpty();\n    }\n    /**\n     * Sorts the selected values based on a predicate function.\n     */\n    sort(predicate) {\n        if (this._multiple && this.selected) {\n            this._selected.sort(predicate);\n        }\n    }\n    /**\n     * Gets whether multiple values can be selected.\n     */\n    isMultipleSelection() {\n        return this._multiple;\n    }\n    /** Emits a change event and clears the records of selected and deselected values. */\n    _emitChangeEvent() {\n        // Clear the selected values so they can be re-cached.\n        this._selected = null;\n        if (this._selectedToEmit.length || this._deselectedToEmit.length) {\n            this.changed.next({\n                source: this,\n                added: this._selectedToEmit,\n                removed: this._deselectedToEmit,\n            });\n            this._deselectedToEmit = [];\n            this._selectedToEmit = [];\n        }\n    }\n    /** Selects a value. */\n    _markSelected(value) {\n        value = this._getConcreteValue(value);\n        if (!this.isSelected(value)) {\n            if (!this._multiple) {\n                this._unmarkAll();\n            }\n            if (!this.isSelected(value)) {\n                this._selection.add(value);\n            }\n            if (this._emitChanges) {\n                this._selectedToEmit.push(value);\n            }\n        }\n    }\n    /** Deselects a value. */\n    _unmarkSelected(value) {\n        value = this._getConcreteValue(value);\n        if (this.isSelected(value)) {\n            this._selection.delete(value);\n            if (this._emitChanges) {\n                this._deselectedToEmit.push(value);\n            }\n        }\n    }\n    /** Clears out the selected values. */\n    _unmarkAll() {\n        if (!this.isEmpty()) {\n            this._selection.forEach(value => this._unmarkSelected(value));\n        }\n    }\n    /**\n     * Verifies the value assignment and throws an error if the specified value array is\n     * including multiple values while the selection model is not supporting multiple values.\n     */\n    _verifyValueAssignment(values) {\n        if (values.length > 1 && !this._multiple && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n            throw getMultipleValuesInSingleSelectionError();\n        }\n    }\n    /** Whether there are queued up change to be emitted. */\n    _hasQueuedChanges() {\n        return !!(this._deselectedToEmit.length || this._selectedToEmit.length);\n    }\n    /** Returns a value that is comparable to inputValue by applying compareWith function, returns the same inputValue otherwise. */\n    _getConcreteValue(inputValue) {\n        if (!this.compareWith) {\n            return inputValue;\n        }\n        else {\n            for (let selectedValue of this._selection) {\n                if (this.compareWith(inputValue, selectedValue)) {\n                    return selectedValue;\n                }\n            }\n            return inputValue;\n        }\n    }\n}\n/**\n * Returns an error that reports that multiple values are passed into a selection model\n * with a single value.\n * @docs-private\n */\nfunction getMultipleValuesInSingleSelectionError() {\n    return Error('Cannot pass multiple values into SelectionModel with single-value mode.');\n}\n\n/**\n * Class to coordinate unique selection based on name.\n * Intended to be consumed as an Angular service.\n * This service is needed because native radio change events are only fired on the item currently\n * being selected, and we still need to uncheck the previous selection.\n *\n * This service does not *store* any IDs and names because they may change at any time, so it is\n * less error-prone if they are simply passed through when the events occur.\n */\nclass UniqueSelectionDispatcher {\n    constructor() {\n        this._listeners = [];\n    }\n    /**\n     * Notify other items that selection for the given name has been set.\n     * @param id ID of the item.\n     * @param name Name of the item.\n     */\n    notify(id, name) {\n        for (let listener of this._listeners) {\n            listener(id, name);\n        }\n    }\n    /**\n     * Listen for future changes to item selection.\n     * @return Function used to deregister listener\n     */\n    listen(listener) {\n        this._listeners.push(listener);\n        return () => {\n            this._listeners = this._listeners.filter((registered) => {\n                return listener !== registered;\n            });\n        };\n    }\n    ngOnDestroy() {\n        this._listeners = [];\n    }\n    static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"16.1.1\", ngImport: i0, type: UniqueSelectionDispatcher, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }\n    static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"16.1.1\", ngImport: i0, type: UniqueSelectionDispatcher, providedIn: 'root' }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"16.1.1\", ngImport: i0, type: UniqueSelectionDispatcher, decorators: [{\n            type: Injectable,\n            args: [{ providedIn: 'root' }]\n        }] });\n\n/**\n * Injection token for {@link _ViewRepeater}. This token is for use by Angular Material only.\n * @docs-private\n */\nconst _VIEW_REPEATER_STRATEGY = new InjectionToken('_ViewRepeater');\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { ArrayDataSource, DataSource, SelectionModel, UniqueSelectionDispatcher, _DisposeViewRepeaterStrategy, _RecycleViewRepeaterStrategy, _VIEW_REPEATER_STRATEGY, getMultipleValuesInSingleSelectionError, isDataSource };\n"],"names":["i0","ctx_r1","currentSize","buttonImage","src","data","name","defaultPrice_r6","ctx_r4","description","ctx_r7","energy","ProductCardComponent_a_0_ng_container_10_ng_container_4_span_4_Template","ProductCardComponent_a_0_ng_container_10_ng_container_4_span_5_Template","ProductCardComponent_a_0_ng_container_10_ng_container_4_span_6_Template","ProductCardComponent_a_0_ng_container_10_ng_container_4_span_7_Template","ctx_r8","portionWeightGrams","measureUnitType","label_r15","ProductCardComponent_a_0_ng_container_10_div_5_div_2_Template","ctx_r9","labels","ProductCardComponent_a_0_ng_container_10_ng_container_3_Template","ProductCardComponent_a_0_ng_container_10_ng_container_4_Template","ProductCardComponent_a_0_ng_container_10_div_5_Template","ctx_r5","length","_r17","ctx_r16","onOpenCard","balance","slug","ProductCardComponent_a_0_div_1_Template","ProductCardComponent_a_0_span_6_Template","ProductCardComponent_a_0_ng_container_7_Template","ProductCardComponent_a_0_div_9_Template","ProductCardComponent_a_0_ng_container_10_Template","_c10","ctx_r0","allergens","defaultPrice$","itemSizes","ProductCardComponent","constructor","this","menuListRepository","inject","MenuListRepository","router","Router","ngOnChanges","prepareData","getDefaultSize","getDefaultPriceObservable","nutritionPerHundredGrams","navigate","categorySlug","static","t","core","Xpm","selectors","inputs","standalone","features","decls","vars","consts","i18n_0","$localize","ProductCardComponent_a_0_Template","ctx","CommonModule","i1","NgOptimizedImage","CurrencyComponent","encapsulation","CategoryPageAbstract","scrollListService","ScrollListService","sessionRepository","SessionRepository","intersectionOptions","rootMargin","threshold","schedule$","activeCategorySchedule$","categories$","menuNavCategories$","pipe","map","categories","filter","c","isScheduleAvailable","items$","showItems$","combineLatestWith","activeLabelFilter$","activeAllergenFilter$","items","activeLabelFilter","activeAllergenFilter","i","some","l","includes","a","reduce","arr","item","set","categoryId","get","concat","Map","shareReplay","activeCategoryIndex$","activeIndexItem$","isSearching$","searchString$","str","ngAfterViewInit","tap","activeCategorySlug","find","id","activeCategoryId","currentCategoryId","setActiveCategory","x","setTimeout","setActiveIndex","untilDestroyed","subscribe","leaveEnd","isSearching","test","url","setActiveCategoryBySlug","lG2","__decorate","UntilDestroy","ScrollItemDirective","elRef","setActive","window","scrollTo","left","top","nativeElement","offsetTop","behavior","ScrollListDirective","activeIndex","changes","firstChange","scrollButtons","contentQueries","rf","dirIndex","schedule_r4","from","to","item_r5","category_r1","_r7","$implicit","ctx_r6","DefaultCategoryPageComponent_div_2_div_4_Template","DefaultCategoryPageComponent_div_2_div_7_Template","DefaultCategoryPageComponent","DefaultCategoryPageComponent_div_2_Template","tmp_0_0","undefined","NgIf","NgFor","AsyncPipe","RouterOutlet","ObserverDirective","schedule_r7","item_r8","FreshCategoryPageComponent_div_0_div_2_ng_container_1_div_4_Template","FreshCategoryPageComponent_div_0_div_2_ng_container_1_div_7_Template","category_r3","data_r1","_r12","ngIf","ctx_r11","FreshCategoryPageComponent_div_0_div_2_ng_container_1_Template","ctx_r2","FreshCategoryPageComponent_div_0_div_2_Template","FreshCategoryPageComponent","FreshCategoryPageComponent_div_0_Template","_c4","routes","path","component","CategoryComponent","config","layout$","layouts","Layout","template","CategoryComponent_app_default_category_page_2_Template","CategoryComponent_app_fresh_category_page_3_Template","Default","Fresh","NgSwitch","NgSwitchCase","children","loadComponent","__webpack_require__","e","then","bind","DataSource","isDataSource","value","connect","ConnectableObservable","ArrayDataSource","_data","super","isObservable","of","disconnect","_RecycleViewRepeaterStrategy","viewCacheSize","_viewCache","applyChanges","viewContainerRef","itemContextFactory","itemValueResolver","itemViewChanged","forEachOperation","record","adjustedPreviousIndex","currentIndex","view","operation","previousIndex","_insertView","viewArgsFactory","_detachAndCacheView","_moveView","context","detach","destroy","cachedView","_insertViewFromCache","viewArgs","createEmbeddedView","templateRef","index","detachedView","_maybeCacheView","move","push","indexOf","remove","pop","insert","SelectionModel","selected","_selected","Array","_selection","values","_multiple","initiallySelectedValues","_emitChanges","compareWith","Set","_deselectedToEmit","_selectedToEmit","changed","Subject","forEach","_markSelected","select","_verifyValueAssignment","_hasQueuedChanges","_emitChangeEvent","deselect","_unmarkSelected","setSelection","oldValues","newSelectedSet","has","toggle","isSelected","clear","flushEvent","_unmarkAll","_getConcreteValue","isEmpty","size","hasValue","sort","predicate","isMultipleSelection","next","source","added","removed","add","delete","inputValue","selectedValue","UniqueSelectionDispatcher","_listeners","notify","listener","listen","registered","ngOnDestroy","ɵfac","ɵprov","token","factory","providedIn","_VIEW_REPEATER_STRATEGY","InjectionToken"],"sourceRoot":"webpack:///"}