{"version":3,"file":"6826.e08018827506b854.js","mappings":"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","names":["i0","_r1","ctx_r1","handleClick","btnText","_r3","PAGE","PromoCardComponent","_PromoCardComponent","constructor","navCtrl","this","title","btnAction","btnActionUrl","smallCard","console","log","openPage","info","openStack","id","openProject","openChannel","name","params","navigateForward","i1","selectors","inputs","standalone","features","ngContentSelectors","_c0","decls","vars","consts","template","rf","ctx","PromoCardComponent_ion_button_4_Template","PromoCardComponent_ng_template_5_Template","smallerBtn_r4","IonButton","IonCard","NgIf","styles","list_r2","ngIf","ctx_r2","loadMoreStacks","layoutType","Carousel","stackList_r4","items$","nextToken","loading","label","DiscoverPage_div_7_app_stack_list_1_Template","isFeatured","list$","myProjects_r5","DiscoverPage_div_11_div_9_Template","numProjects$","toString","featuredProjects","tmp_6_0","myProjects","length","LIST_ID_STACKS_FEATURED","LIST_ID_STACKS_RECENT","LIST_ID_STACKS_MOST_VIEWED","LIST_ID_PROJECTS_FEATURED","LIST_ID_PROJECTS_MINE","DiscoverPage","_DiscoverPage","userService","stackService","projectService","activatedRoute","store","translate","returnUrl","segmentSelected","showProjects","SHOW_PROJECTS_IN_DISCOVER","stackLists","map","item","select","selectList","selectStackListItems","userId$","numStacks$","BehaviorSubject","selectProjectListItems","selectMyProjects","combineLatest","pipe","discoverLayoutId","topRightIndicator","INDICATOR_PROP","Role","LAYOUT_TYPE","itemType","ITEM_TYPE","isLoading","searchPlaceholder","didCreateLists","onDestroy$","Subject","ngOnInit","get","take","subscribe","res","list","index","queryParamMap","takeUntil","queryParams","searchChanged","searchText","filter","GLOBAL_QUERY_ID","q","dispatch","setFilter","stackActions","listId","filters","type","FilterEntityTypes","Featured","Recent","MostViewed","projectActions","scrollToTop","setTimeout","ngOnDestroy","next","complete","ionViewDidEnter","ionViewWillLeave","content","i2","i3","i4","i5","i6","i7","viewQuery","IonContent","DiscoverPage_fs_list_title_5_Template","DiscoverPage_div_7_Template","DiscoverPage_div_10_Template","DiscoverPage_div_11_Template","NgFor","CarouselGuidesComponent","ListTitleComponent","ProjectListComponent","StackListComponent","TopNavbarComponent","FooterComponent","IonHeader","AsyncPipe","TranslatePipe","$event","onClickItem","addNewProjectButtonClick","items","heading","itemTypes","Projects","layout","options","_ProjectListComponent","toaster","newProjectClick","EventEmitter","layoutTypes","searchFields","STACK_SEARCH_FIELDS","event","navWatchProject","emit","project","PROJECT_DETAIL_ROUTE","present","instant","outputs","ProjectListComponent_ng_container_1_Template","ProjectListComponent_ng_container_2_Template","ProjectListComponent_ng_container_3_Template","Grid","NgSwitch","NgSwitchCase","FsCarouselComponent","FsGridComponent","NgSwitchDefault","changeDetection","_FooterComponent","theme","copyrightYear","Date","getFullYear","FooterComponent_ng_container_4_Template","FooterComponent_ng_container_5_Template","RouterLink","headingWithDefault","_c1","stackList","_CarouselGuidesComponent","showListIfEmpty","labelWithDefault","shareReplay","projectId","GUIDES_PROJECT","CarouselGuidesComponent_ng_container_0_Template","tmp_0_0"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./src/app/shared/components/promo-card/promo-card.component.html","./src/app/shared/components/promo-card/promo-card.component.ts","./src/app/pages/discover/discover.page.html","./src/app/pages/discover/discover.page.ts","./src/app/projects/project-list/project-list.component.html","./src/app/projects/project-list/project-list.component.ts","./src/app/shared/components/footer/footer.component.html","./src/app/shared/components/footer/footer.component.ts","./src/app/stacks/carousels/carousel-guides/carousel-guides.component.html","./src/app/stacks/carousels/carousel-guides/carousel-guides.component.ts"],"sourcesContent":["\n<ion-card class=\"bg-orange promo-card\">\n    <div class=\"card-title\">{{title}}</div>\n\n    <!-- slot content goes here -->\n    <ng-content></ng-content>\n\n\t\t<ion-button  *ngIf=\"!smallCard; else smallerBtn;\" size=\"large\" shape=\"round\" color=\"primary\" class=\"promo-card-button\" (click)=\"handleClick()\">\n      {{btnText}}\n    </ion-button >\n    <ng-template #smallerBtn>\n      <ion-button shape=\"round\" color=\"primary\" class=\"promo-card-button smaller\" (click)=\"handleClick()\">\n        {{btnText}}\n      </ion-button >\n    </ng-template>\n</ion-card>\n","/** @format */\n\nimport { Component, Input } from '@angular/core';\nimport { NgIf } from '@angular/common';\nimport { NavController, IonCard, IonButton } from '@ionic/angular/standalone';\n\nconst PAGE = 'PromoCard';\n\n@Component({\n  selector: 'app-promo-card',\n  templateUrl: './promo-card.component.html',\n  styleUrls: ['./promo-card.component.scss'],\n  standalone: true,\n  imports: [IonButton, IonCard, NgIf],\n})\nexport class PromoCardComponent {\n  @Input() title: string = '';\n  @Input() btnText: string = 'Go!';\n  @Input() btnAction: string = 'openPage';\n  @Input() btnActionUrl: string = 'home';\n\n  @Input() smallCard: boolean = false;\n\n  constructor(private navCtrl: NavController) {}\n\n  handleClick = () => {\n    console.log(`[${PAGE}] click:`, this.btnAction, this.btnActionUrl);\n    switch (this.btnAction) {\n      case 'openPage':\n        this.openPage(this.btnActionUrl);\n        break;\n      default:\n        console.info(`[${PAGE}] click: UNHANDLED`, this.btnAction, this.btnActionUrl);\n    }\n  };\n\n  /*\n    NAV\n  */\n  openStack(id: string) {\n    this.openPage('stack', { id });\n  }\n  openProject(id: string) {\n    this.openPage('project', { id });\n  }\n  openChannel(id: string) {\n    this.openPage('channel', { id });\n  }\n\n  openPage(name: string, params: { id?: string } = {}) {\n    // push to the nav stack and get a back button\n    this.navCtrl.navigateForward([`/${name}`, params]);\n  }\n}\n","<ion-header>\n  <app-top-navbar \n    [title]=\"title\" \n    [backButtonReturnUrl]=\"returnUrl\"\n    [drawerEnabled]=\"true\"\n    [expandSearchIfQuery]=\"true\"\n  >\n    <!-- SLOT: anything added here will go below the ion-navbar -->\n\n    <div class=\"diet-limit-width\">\n      <!-- <ion-segment *ngIf=\"showTopSegmentSelect\" (ionChange)=\"segmentChanged($event)\" [value]=\"segmentSelected\" class=\"top-segment\">\n        <ion-segment-button value=\"stacks\" layout=\"icon-start\">\n          <ion-label>Stacks</ion-label>\n          <ion-icon name=\"layers-outline\" class=\"ion-hide-sm-down\"></ion-icon>\n        </ion-segment-button>\n        <ion-segment-button value=\"projects\" layout=\"icon-start\">\n          <ion-label>Projects</ion-label>\n          <ion-icon name=\"folder\" class=\"ion-hide-sm-down\"></ion-icon>\n        </ion-segment-button>\n        <ion-segment-button value=\"all\" layout=\"icon-start\">\n          <ion-label>All</ion-label>\n          <ion-icon name=\"layers-outline\" class=\"ion-hide-sm-down\"></ion-icon>\n          <ion-icon name=\"folder\" class=\"ion-hide-sm-down\"></ion-icon>\n        </ion-segment-button>\n      </ion-segment> -->\n\n      <!-- (MVP-699) -->\n      <!-- <div *ngIf=\"showFilterToolbar\" class=\"wrap-filter-toolbar\">\n        <app-filterable-toolbar\n          [options]=\"['Featured', 'Recent']\"\n          [selectedOption]=\"'Featured'\"\n          [searchPlaceholder]=\"searchPlaceholder\"\n          (onSearch)=\"onSearch($event)\"\n        ></app-filterable-toolbar>\n      </div> -->\n\n      <!--  keep for reference of filter implementation, for now  -->\n      <!-- <ion-grid *ngIf=\"showSearchFilters\">\n        <ion-row class=\"ion-justify-content-end\">\n          <ion-col>\n            <ion-item lines=\"none\" class=\"disc-search\">\n              <ion-input [placeholder]=\"searchPlaceholder\"></ion-input>\n              <ion-buttons slot=\"end\">\n                <ion-button>\n                  <ion-icon slot=\"icon-only\" name=\"search\"></ion-icon>\n                </ion-button>\n  \n                <ion-button fill=\"clear\" class=\"options-toggle\" (click)=\"toggleShowFilters()\">\n                  <ion-icon slot=\"icon-only\" name=\"filter\" color=\"tertiary\"></ion-icon>\n                </ion-button>\n              </ion-buttons>\n            </ion-item>\n          </ion-col>\n      </ion-row>\n        <ion-row class=\"collapsible ion-justify-content-end\" [style.max-height.px]=\"filtersShown ? 44 : 0\">\n            <ion-list class=\"top-filters ion-justify-content-end\">\n    \n                <ion-button *ngFor=\"let filter of filters; let i = index\" size=\"small\" fill=\"clear\" [color]=\"filter.active ? 'light' : 'medium'\" \n                  [class.selected]=\"filter.active\" (click)=\"onClickFilter(filter, i)\">\n                  {{ filter.name }}\n                  <ion-icon slot=\"end\" *ngIf=\"filter.active\" name=\"close\"></ion-icon>\n                </ion-button>\n              \n            </ion-list>\n        </ion-row>\n        <ion-row class=\"chips collapsible ion-justify-content-end\" [style.max-height.px]=\"filtersShown ? 44 : 0\">\n            <ion-chip *ngFor=\"let tag of tags; let i = index\" [class.selected]=\"tag.active\" (click)=\"onClickTag(tag, i)\">\n              <ion-label color=\"light\">\n                {{ tag.name }}\n                <ion-icon *ngIf=\"tag.active\" name=\"close\"></ion-icon>\n              </ion-label>\n            </ion-chip>\n        </ion-row>\n      </ion-grid> -->\n    </div>\n  </app-top-navbar>\n</ion-header>\n\n<ion-content class=\"ion-padding-vertical\">\n  <div\n    class=\"container\"\n    [hidden]=\"!(segmentSelected === 'all' || segmentSelected === 'stacks')\"\n  >\n    <fs-list-title *ngIf=\"showProjects\" icon=\"layers-outline\">\n      {{ 'COMMON.FILMSTACKS' | translate }}\n      <!-- [small]=\"numStacks$ | async\" -->\n    </fs-list-title>\n\n    <div class=\"layout-wrap\">\n      <div *ngFor=\"let stackList of stackLists\" class=\"list-wrap list-spacing\" [class.list-featured-stacks]=\"stackList.isFeatured\">\n        <!-- @todo add [filterId] of some stringified value of FilterEntity so we can use trackBy inside the carousel -->\n        <app-stack-list\n          *ngIf=\"stackList.list$ | async as list\"\n          [layout]=\"{\n            type: layoutType.Carousel\n          }\"\n          [items]=\"stackList.items$ | async\"\n          [canLoadMore]=\"!!list.nextToken\"\n          [isLoading]=\"list.loading\"\n          [heading]=\"stackList.label\"\n          (loadMore)=\"loadMoreStacks(list)\"\n        ></app-stack-list>\n      </div>\n\n      <fs-carousel-guides></fs-carousel-guides>\n\n      <!-- <div *ngIf=\"!stackLists || stackLists.length < 1\" class=\"ion-text-center\">\n        <ion-spinner name=\"crescent\"></ion-spinner>\n      </div> -->\n\n      <div class=\"load-more ion-text-center\">\n        <div *ngIf=\"isLoading;\" class=\"ion-padding ion-margin-top\">\n          Loading...\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"container\" *ngIf=\"showProjects\">\n    <fs-list-title\n      icon=\"folder-outline\"\n      [small]=\"(numProjects$ | async).toString()\"\n      >{{ 'COMMON.PROJECTS' | translate }}</fs-list-title\n    >\n\n    <div class=\"layout-wrap project-list\">\n      <app-project-list\n        [layout]=\"{\n          type: layoutType.Carousel\n        }\"\n        [heading]=\"'COMMON.FEATURED' | translate\"\n        [items]=\"featuredProjects.items$ | async\"\n      ></app-project-list>\n    </div>\n    <div *ngIf=\"(myProjects.items$ | async)?.length > 0 && myProjects.items$ | async as myProjects\" class=\"layout-wrap project-list\">\n      <app-project-list\n        [layout]=\"{\n          type: layoutType.Carousel\n        }\"\n        [heading]=\"'COMMON.MY_PROJECTS' | translate\"\n        [items]=\"myProjects\"\n      ></app-project-list>\n    </div>\n  </div>\n\n  <!-- TODO: https://ionicframework.com/docs/api/infinite-scroll -->\n\n  <app-promo-card\n    title=\"{{ 'DISCOVER.PROMO_CARD.TITLE' | translate }}\"\n    btnText=\"{{ 'DISCOVER.PROMO_CARD.BUTTON' | translate }}\"\n    btnAction=\"openPage\"\n    btnActionUrl=\"/stack/social\"\n    class=\"card\"\n  ></app-promo-card>\n\n  <div class=\"tab-bottom-spacer\"></div>\n\n  <app-footer></app-footer>\n</ion-content>\n","/** @format */\n\nimport { Component, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { NgIf, NgFor, AsyncPipe } from '@angular/common';\nimport { ActivatedRoute } from '@angular/router';\nimport { TranslateService, TranslatePipe } from '@ngx-translate/core';\nimport { IonContent, NavController, IonHeader } from '@ionic/angular/standalone';\nimport { BehaviorSubject, Observable, Subject, combineLatest } from 'rxjs';\nimport { map, take, takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { State } from '@store/reducers';\nimport { setFilter } from '@store/actions/viewstate.actions';\nimport * as projectActions from '@store/actions/projects.actions';\nimport * as stackActions from '@store/actions/stacks.actions';\nimport { List, selectList, selectProjectListItems, selectStackListItems } from '@store/selectors/lists.selectors';\nimport { selectMyProjects } from '@store/selectors/projects.selectors';\nimport { FilterEntity, FilterEntityTypes, GLOBAL_QUERY_ID } from '@store/selectors/viewstate.selectors';\nimport { SHOW_PROJECTS_IN_DISCOVER } from '@app/app.config';\nimport { StacksService } from '@app/core/services/stacks.service';\nimport { UserService } from '@app/core/services/user.service';\nimport { INDICATOR_PROP, ITEM_TYPE, LAYOUT_TYPE } from '@app/shared/models/layout.model';\nimport { ListTitleComponent } from '@app/shared/components/ui/list-title/list-title.component';\nimport { PromoCardComponent } from '@app/shared/components/promo-card/promo-card.component';\nimport { FooterComponent } from '@app/shared/components/footer/footer.component';\nimport { TopNavbarComponent } from '@app/shared/components/top-navbar/top-navbar.component';\nimport { ProjectListComponent } from '@app/projects/project-list/project-list.component';\nimport { ProjectService } from '@app/projects/shared/services/project.service';\nimport { CarouselGuidesComponent } from '@app/stacks/carousels/carousel-guides/carousel-guides.component';\nimport { StackListComponent } from '@app/stacks/shared/components/stack-list/stack-list.component';\n\nconst DEBUG_LOGS = false;\nconst LIST_ID_STACKS_FEATURED = 'discover_stacks_featured';\nconst LIST_ID_STACKS_RECENT = 'discover_stacks_recent';\n// const LIST_ID_STACKS_TRENDING = 'discover_stacks_trending';\nexport const LIST_ID_STACKS_MOST_VIEWED = 'discover_stacks_mostviewed';\nexport const LIST_ID_PROJECTS_FEATURED = 'featured_projects';\nexport const LIST_ID_PROJECTS_MINE = 'my_projects';\n\n@Component({\n  selector: 'app-discover',\n  templateUrl: './discover.page.html',\n  styleUrls: ['./discover.page.scss'],\n  standalone: true,\n  imports: [\n    NgIf,\n    NgFor,\n    CarouselGuidesComponent,\n    ListTitleComponent,\n    ProjectListComponent,\n    StackListComponent,\n    PromoCardComponent,\n    TopNavbarComponent,\n    FooterComponent,\n    IonHeader,\n    IonContent,\n    AsyncPipe,\n    TranslatePipe,\n  ],\n})\nexport class DiscoverPage implements OnInit, OnDestroy {\n  // showFilterToolbar = false; // @todo: enable this once it's working (MVP-699)\n\n  @ViewChild(IonContent) content: IonContent;\n\n  returnUrl = '';\n  segmentSelected: 'all' | 'projects' | 'stacks' = 'all';\n  showProjects = SHOW_PROJECTS_IN_DISCOVER;\n  title = 'Discover';\n  stackLists = [\n    {\n      id: LIST_ID_STACKS_FEATURED,\n      label: 'Featured', // will be translated OnInit\n      isFeatured: true,\n    },\n    {\n      id: LIST_ID_STACKS_MOST_VIEWED,\n      label: 'Most Viewed', // will be translated OnInit\n      // label: 'Trending', // will be translated OnInit\n    },\n    {\n      id: LIST_ID_STACKS_RECENT,\n      label: 'Recent', // will be translated OnInit\n    },\n  ].map((item) => ({\n    ...item,\n    /** MVP-970 ngrx deprecated selectorWithProps */\n    list$: this.store.select(selectList(item.id)), // loading, nextToken, ...\n    items$: this.store.select(selectStackListItems(item.id)), // array of stacks\n  }));\n\n  userId$ = this.userService.userId$;\n  numStacks$: BehaviorSubject<number> = new BehaviorSubject(0);\n  featuredProjects = {\n    id: LIST_ID_PROJECTS_FEATURED,\n    label: 'Featured', // will be translated OnInit\n    list$: this.store.select(selectList(LIST_ID_PROJECTS_FEATURED)),\n    items$: this.store.select(selectProjectListItems(LIST_ID_PROJECTS_FEATURED)),\n  };\n  myProjects = {\n    id: LIST_ID_PROJECTS_MINE,\n    label: 'My Projects', // will be translated in template\n    // list$: this.store.select(selectList(LIST_ID_MY_PROJECTS)),\n    items$: this.store.select(selectMyProjects),\n  };\n\n  /**\n   * Display the total num of projects in UI\n   * ((myProjects.items$ | async)?.length ?? 0) + ((featuredProjects.items$ | async)?.length ?? 0).toString()\n   */\n  numProjects$: Observable<number> = combineLatest([this.featuredProjects.items$, this.myProjects.items$]).pipe(\n    map(([featuredProjects = [], myProjects = []]) => (myProjects?.length ?? 0) + (featuredProjects?.length ?? 0))\n  );\n\n  discoverLayoutId = 'discover-page';\n  topRightIndicator = INDICATOR_PROP.Role;\n  layoutType = LAYOUT_TYPE;\n  itemType = ITEM_TYPE;\n\n  isLoading = true;\n  searchPlaceholder = 'Discover Filmstacks and Projects'; // will be translated OnInit\n\n  private searchText: string;\n  private didCreateLists = false;\n  private onDestroy$ = new Subject<void>();\n\n  constructor(\n    private userService: UserService,\n    private stackService: StacksService,\n    private projectService: ProjectService,\n    private navCtrl: NavController,\n    private activatedRoute: ActivatedRoute,\n    private store: Store<State>,\n    private translate: TranslateService\n  ) {}\n\n  ngOnInit() {\n    this.translate\n      .get([\n        'DISCOVER.SEARCH_PLACEHOLDER',\n        'COMMON.FEATURED',\n        'COMMON.RECENT',\n        'COMMON.MOST_VIEWED',\n        'COMMON.TRENDING',\n        'COMMON.MY_PROJECTS',\n      ])\n      .pipe(take(1))\n      .subscribe((res) => {\n        this.searchPlaceholder = res['DISCOVER.SEARCH_PLACEHOLDER'];\n        this.featuredProjects.label = res['COMMON.FEATURED'];\n        this.myProjects.label = res['COMMON.MY_PROJECTS'];\n        // const idx = this.stackLists.findIndex((list) => list?.id === LIST_ID_STACKS_FEATURED);\n        this.stackLists.map((list, index) => {\n          switch (list?.id) {\n            case LIST_ID_STACKS_FEATURED:\n              this.stackLists[index].label = res['COMMON.FEATURED'];\n              break;\n            case LIST_ID_STACKS_RECENT:\n              this.stackLists[index].label = res['COMMON.RECENT'];\n              break;\n            case LIST_ID_STACKS_MOST_VIEWED:\n              this.stackLists[index].label = res['COMMON.MOST_VIEWED'];\n              // this.stackLists[index].label = res['COMMON.TRENDING'];\n              break;\n          }\n          return list;\n        });\n      });\n\n    // listen to filter changes and dispatch actions according to them\n    this.activatedRoute.queryParamMap.pipe(takeUntil(this.onDestroy$)).subscribe((queryParams) => {\n      this.returnUrl = queryParams.get('returnUrl');\n      const searchChanged = this.searchText !== queryParams.get('q');\n      this.searchText = queryParams.get('q');\n      const filter: FilterEntity = {\n        id: GLOBAL_QUERY_ID,\n        q: this.searchText,\n      };\n      DEBUG_LOGS && console.log(`[Discover] setFilter:`, { searchText: this.searchText, searchChanged, filter });\n      // set filter for components to use\n      // if the user arrives on the discover page with query params, we need to set them, too\n      // later during runtime the components themselves will call setFilter\n      this.store.dispatch(setFilter({ filter }));\n      // dispatch actions that are the discover page\n\n      if (!this.didCreateLists || searchChanged) {\n        this.didCreateLists = true;\n        // dispatch featured stacks\n        this.store.dispatch(\n          stackActions.loadFilteredStacks({\n            listId: LIST_ID_STACKS_FEATURED,\n            filters: { type: FilterEntityTypes.Featured, ...filter },\n          })\n        );\n        // dispatch recent stacks\n        this.store.dispatch(\n          stackActions.loadFilteredStacks({\n            listId: LIST_ID_STACKS_RECENT,\n            filters: { type: FilterEntityTypes.Recent, ...filter },\n          })\n        );\n        // trending\n        this.store.dispatch(\n          stackActions.loadFilteredStacks({\n            listId: LIST_ID_STACKS_MOST_VIEWED,\n            filters: { type: FilterEntityTypes.MostViewed, ...filter },\n          })\n        );\n\n        // needed to display the amount of stacks in the title.\n        // @todo this needs to change to total_items from the paging response.\n        // this.stacks$ = combineLatest(this.stackLists.map((list) => list.items$)).pipe(\n        //   map((items) => [].concat(...items).filter(Boolean)),\n        // );\n\n        if (this.showProjects) {\n          // passing down filters anyway, so the api call can react to it or not\n          this.store.dispatch(\n            projectActions.loadFilteredProjects({\n              listId: LIST_ID_PROJECTS_FEATURED,\n              filters: { type: FilterEntityTypes.Featured, ...filter },\n            })\n          );\n        }\n      }\n\n      // when the query changes, scrollToTop\n      this.scrollToTop();\n    });\n\n    // wait a second before showing LoadMore\n    setTimeout(() => {\n      this.isLoading = false;\n      // this.canLoadMore = true;\n    }, 1500);\n  }\n\n  ngOnDestroy() {\n    this.onDestroy$.next();\n    this.onDestroy$.complete();\n  }\n\n  ionViewDidEnter() {\n    this.scrollToTop();\n  }\n  ionViewWillLeave() {\n    // reset any lingering topnav-drawer playlist actions\n    this.store.dispatch(stackActions.resetAddToStackPlaylist());\n  }\n\n  scrollToTop() {\n    if (this.content && typeof this.content.scrollToTop === 'function') {\n      this.content.scrollToTop(400);\n    }\n  }\n\n  loadMoreStacks(list: List) {\n    // console.log(\n    //   `listLoadMore (note that this gets called automatically if list is init'd with less items than one full scroll width... [jd's hypothesis why])`,\n    // );\n    this.store.dispatch(\n      stackActions.loadMoreFilteredStacks({\n        listId: list.id,\n        filters: list.filters,\n        nextToken: list.nextToken,\n      })\n    );\n  }\n}\n","<section [ngSwitch]=\"layout.type\">\n  <ng-container *ngSwitchCase=\"layoutTypes.Carousel\">\n    <fs-carousel\n      [items]=\"items\"\n      [heading]=\"heading\"\n      [canLoadMore]=\"false\"\n      [isLoadingMore]=\"false\"\n      [itemType]=\"itemTypes.Projects\"\n      [options]=\"layout.options\"\n      (itemClick)=\"onClickItem($event)\"\n      (newItemClick)=\"addNewProjectButtonClick()\"\n    ></fs-carousel>\n  </ng-container>\n  <ng-container *ngSwitchCase=\"layoutTypes.Grid\">\n    <fs-grid\n      [items]=\"items\"\n      [heading]=\"heading\"\n      [itemType]=\"itemTypes.Projects\"\n      [options]=\"layout.options\"\n      (itemClick)=\"onClickItem($event)\"\n    ></fs-grid>\n  </ng-container>\n  <ng-container *ngSwitchDefault>\n    Unknown Layout...\n  </ng-container>\n</section>\n","/** @format */\n\nimport { Component, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core';\nimport { NgSwitch, NgSwitchCase, NgSwitchDefault } from '@angular/common';\nimport { TranslateService } from '@ngx-translate/core';\nimport { NavController } from '@ionic/angular/standalone';\nimport { ToasterService } from '@app/core/services/toaster.service';\nimport { DiscoverCardClick } from '@app/shared/models/layout.model';\nimport { LAYOUT_TYPE, LAYOUT_SETTINGS } from '@app/shared/models/layout.model';\nimport { ITEM_TYPE } from '@app/shared/models/layout.model';\nimport { STACK_SEARCH_FIELDS } from '@app/shared/models/stack.model';\nimport { FsCarouselComponent } from '@app/shared/components/fs-carousel/fs-carousel.component';\nimport { FsGridComponent } from '@app/shared/components/fs-grid/fs-grid.component';\nimport { Project } from '@app/projects/shared/project.model';\nimport { PROJECT_DETAIL_ROUTE } from '@app/app.routes';\n\n@Component({\n  selector: 'app-project-list',\n  templateUrl: './project-list.component.html',\n  styleUrls: ['./project-list.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  standalone: true,\n  imports: [NgSwitch, NgSwitchCase, FsCarouselComponent, FsGridComponent, NgSwitchDefault],\n})\nexport class ProjectListComponent {\n  @Input() items: Project[];\n  @Input() heading: string;\n  @Input() layout: LAYOUT_SETTINGS;\n  @Output() newProjectClick = new EventEmitter<void>();\n\n  public itemTypes = ITEM_TYPE;\n  public layoutTypes = LAYOUT_TYPE;\n  public searchFields = STACK_SEARCH_FIELDS;\n\n  constructor(private navCtrl: NavController, private toaster: ToasterService, private translate: TranslateService) {}\n\n  onClickItem(event: DiscoverCardClick) {\n    this.navWatchProject(event);\n  }\n\n  addNewProjectButtonClick() {\n    this.newProjectClick.emit();\n  }\n\n  navWatchProject(event: DiscoverCardClick) {\n    const project: Project = event && event.item && (event.item as Project).id ? (event.item as Project) : null;\n    if (project) {\n      this.navCtrl.navigateForward([`/${PROJECT_DETAIL_ROUTE}`, project.id]);\n    } else {\n      this.toaster.present(this.translate.instant('ERRORS.OPENING_PROJECT'));\n    }\n  }\n}\n","<!-- @format -->\n\n<footer>\n  <div class=\"footer container\">\n    <div class=\"footer__side footer__side--left\">\n      <div [ngSwitch]=\"theme\">\n        <ng-container *ngSwitchCase=\"'light'\">\n          <!-- if light theme, use blue logo -->\n          <img class=\"logo\" src=\"/assets/images/logos/Filmstacker-logo-teal.png\" alt=\"Filmstacker\" />\n        </ng-container>\n        <ng-container *ngSwitchDefault>\n          <img class=\"logo\" src=\"/assets/images/filmstacker-logo.png\" alt=\"Filmstacker\" />\n        </ng-container>\n      </div>\n    </div>\n    <div class=\"footer__side\">\n      <div class=\"footer__side__item\">\n        <a routerLink=\"/about\">{{ 'COMMON.ABOUT' | translate }}</a>\n      </div>\n      <!-- <div class=\"footer__side__item\">\n        <a routerLink=\"/support\">{{ 'COMMON.SUPPORT' | translate }}</a>\n      </div> -->\n      <div class=\"footer__side__item\">\n        <a routerLink=\"/community-rules\">{{ 'COMMON.COMMUNITY_GUIDELINES' | translate }}</a>\n      </div>\n      <div class=\"footer__side__item\">\n        <a routerLink=\"/privacy\">{{ 'POLICIES.PRIVACY_POLICY' | translate }}</a>\n      </div>\n      <div class=\"footer__side__item\">\n        <a routerLink=\"/terms\">{{ 'POLICIES.TERMS_USE' | translate }}</a>\n      </div>\n      <div class=\"footer__side__item\">&copy;{{ copyrightYear }} Filmstacker Inc. {{ 'POLICIES.RIGHTS_RESERVED' | translate }}.</div>\n    </div>\n  </div>\n  <div class=\"tab-bottom-spacer\"></div>\n</footer>\n","/** @format */\n\nimport { Component, Input } from '@angular/core';\nimport { NgSwitch, NgSwitchCase, NgSwitchDefault } from '@angular/common';\nimport { RouterLink } from '@angular/router';\nimport { TranslatePipe } from '@ngx-translate/core';\n\n@Component({\n  selector: 'app-footer',\n  templateUrl: './footer.component.html',\n  styleUrls: ['./footer.component.scss'],\n  standalone: true,\n  imports: [NgSwitch, NgSwitchCase, NgSwitchDefault, RouterLink, TranslatePipe],\n})\nexport class FooterComponent {\n  /** manages which logo */\n  @Input() theme: 'light' | 'dark' = 'dark';\n\n  copyrightYear = new Date().getFullYear();\n}\n","<ng-container *ngIf=\"((stackList.items$ | async)?.length > 0 || showListIfEmpty) && (stackList.list$ | async) as list\">\n  <h3>{{ headingWithDefault }}</h3>\n  <app-stack-list \n    [layout]=\"{\n      type: layoutType.Carousel,\n      options: {\n        hasAddNewItemButton: false\n      }\n    }\"\n    [items]=\"stackList.items$ | async\"\n    [canLoadMore]=\"!!list.nextToken\"\n    [isLoading]=\"list.loading\"\n    [heading]=\"stackList.label\"\n    (loadMore)=\"loadMoreStacks(list)\"\n  ></app-stack-list>\n</ng-container>\n\n","/** @format */\n\nimport { Component, Input, OnInit } from '@angular/core';\nimport { NgIf, AsyncPipe } from '@angular/common';\nimport { shareReplay } from 'rxjs/operators';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Store } from '@ngrx/store';\nimport { State } from '@store/reducers';\nimport * as stackActions from '@store/actions/stacks.actions';\nimport { List, selectList, selectStackListItems } from '@store/selectors/lists.selectors';\nimport { FilterEntityTypes } from '@store/selectors/viewstate.selectors';\nimport { GUIDES_PROJECT } from '@app/app.config';\nimport { LAYOUT_TYPE } from '@app/shared/models/layout.model';\nimport { StackList } from '@app/shared/models/list.model';\nimport { StackListComponent } from '@app/stacks/shared/components/stack-list/stack-list.component';\n\nconst CAROUSEL_GUIDES_LIST_ID = 'carousel_guides';\nconst CAROUSEL_GUIDES_HEADING = 'DISCOVER.GUIDES.HEADING';\nconst CAROUSEL_GUIDES_LABEL = 'DISCOVER.GUIDES.LABEL';\n\n@Component({\n  selector: 'fs-carousel-guides',\n  templateUrl: './carousel-guides.component.html',\n  styleUrls: ['./carousel-guides.component.scss'],\n  standalone: true,\n  imports: [NgIf, AsyncPipe, StackListComponent],\n})\nexport class CarouselGuidesComponent implements OnInit {\n  stackList: StackList;\n  layoutType = LAYOUT_TYPE;\n\n  @Input() heading: string;\n  @Input() label: string;\n  @Input() listId = CAROUSEL_GUIDES_LIST_ID;\n  @Input() showListIfEmpty = true;\n\n  constructor(private translate: TranslateService, private store: Store<State>) {}\n\n  ngOnInit() {\n    this.stackList = {\n      id: this.listId,\n      label: this.labelWithDefault,\n      list$: this.store.select(selectList(this.listId)),\n      items$: this.store.select(selectStackListItems(this.listId)).pipe(shareReplay(1)),\n    };\n\n    this.store.dispatch(\n      stackActions.loadFilteredStacks({\n        listId: this.listId,\n        filters: {\n          // : FilterEntity\n          projectId: GUIDES_PROJECT,\n          type: FilterEntityTypes.Featured,\n          id: this.listId,\n          q: null,\n        },\n      })\n    );\n  }\n\n  get labelWithDefault() {\n    return this.label ?? this.translate.instant(CAROUSEL_GUIDES_LABEL);\n  }\n\n  get headingWithDefault() {\n    return this.heading ?? this.translate.instant(CAROUSEL_GUIDES_HEADING);\n  }\n\n  loadMoreStacks(list: List) {\n    this.store.dispatch(\n      stackActions.loadMoreFilteredStacks({\n        listId: list.id,\n        filters: list.filters,\n        nextToken: list.nextToken,\n      })\n    );\n  }\n}\n"],"x_google_ignoreList":[]}