{"version":3,"file":"js/app.min.js","mappings":"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","sources":["webpack:///./src/js/ApiClient.ts","webpack:///./src/js/constants.ts","webpack:///./src/js/helpers/availability.ts","webpack:///./src/js/helpers/browser.ts","webpack:///./src/js/helpers/cookies.ts","webpack:///./src/js/helpers/element/card.ts","webpack:///./src/js/helpers/format.ts","webpack:///./src/js/helpers/language.ts","webpack:///./src/js/helpers/paths.ts","webpack:///./src/js/helpers/sessionStorage.ts","webpack:///./src/js/helpers/sort.ts","webpack:///./src/js/redux/animatedHoverCardReducer.ts","webpack:///./src/js/redux/bookmarksReducer.ts","webpack:///./src/js/redux/carouselReducer.ts","webpack:///./src/js/redux/channelsReducer.ts","webpack:///./src/js/redux/crossPlatformNavReducer.ts","webpack:///./src/js/redux/directorsPageReducer.ts","webpack:///./src/js/redux/directorsReducer.ts","webpack:///./src/js/redux/educationalSubjectPageReducer.ts","webpack:///./src/js/redux/exploreBySubjectReducer.ts","webpack:///./src/js/redux/exploreByWorkPageReducer.ts","webpack:///./src/js/redux/filmHistoryReducer.ts","webpack:///./src/js/redux/filmsReducer.ts","webpack:///./src/js/redux/indigenousCinemaReducer.ts","webpack:///./src/js/redux/likesReducer.ts","webpack:///./src/js/redux/nationsReducer.ts","webpack:///./src/js/redux/playersReducer.ts","webpack:///./src/js/redux/playlistTabsReducer.ts","webpack:///./src/js/redux/recommendationsReducer.ts","webpack:///./src/js/redux/seriesPageReducer.ts","webpack:///./src/js/redux/historyMiddleware.ts","webpack:///./src/js/redux/seriesMiddleware.ts","webpack:///./src/js/redux/workPageMiddleware.ts","webpack:///./src/js/redux/store.ts","webpack:///./src/js/redux/subjectsReducer.ts","webpack:///./src/js/redux/userReducer.ts","webpack:///./src/js/redux/viewingHistoryReducer.ts","webpack:///./src/js/redux/workHistoryReducer.ts","webpack:///./src/js/redux/workPageReducer.ts","webpack:///./src/js/redux/worksReducer.ts","webpack:///./src/js/wc/cards/NFBDisplayWorkCard.ts","webpack:///./src/sass/wc/NFBWorkPageCreator.sass","webpack:///./src/js/wc/work-page/NFBWorkPageCreator.ts","webpack:///./src/sass/wc/NFBWorkPageLegend.sass","webpack:///./src/js/wc/work-page/NFBWorkPageLegend.ts","webpack:///./node_modules/@web-nfb/frontend-static/src/js/custom/modules/m-ribbon.js","webpack:///./src/sass/variables/nfb-platform-nav-exports.module.sass","webpack:///./src/js/elements/NFBPlatformNavManager.ts","webpack:///./src/js/wc/NFBAddToMyList.ts","webpack:///./src/js/wc/NFBGridList.ts","webpack:///./src/sass/wc/NFBHistoryProgressBar.sass","webpack:///./src/js/wc/NFBHistoryProgressBar.ts","webpack:///./src/sass/wc/NFBAnimatedHoverCardLegend.sass","webpack:///./src/js/wc/cards/NFBAnimatedHoverCardLegend.ts","webpack:///./src/sass/wc/NFBAnimatedHoverCard.sass","webpack:///./src/js/wc/cards/NFBAnimatedHoverCard.ts","webpack:///./src/js/wc/carousels/base/NFBNormanCarousel.ts","webpack:///./src/js/wc/carousels/base/NFBWorkCarousel.ts","webpack:///./src/js/wc/carousels/NFBBlogCarousel.ts","webpack:///./src/js/wc/NFBBreadcrumb.ts","webpack:///./src/js/wc/NFBLike.ts","webpack:///./src/sass/wc/NFBHero.sass","webpack:///./src/js/wc/NFBHero.ts","webpack:///./src/sass/wc/NFBFeature.sass","webpack:///./src/js/wc/NFBFeature.ts","webpack:///./src/sass/wc/NFBSurvey.sass","webpack:///./src/js/wc/NFBSurvey.ts","webpack:///./src/sass/wc/NFBPopularSubjectList.sass","webpack:///./src/js/wc/platform-nav/NFBPopularSubjectList.ts","webpack:///./src/js/App.ts","webpack:///./src/js/index.js"],"sourcesContent":["import qs from 'qs'\nimport axios, { AxiosRequestConfig } from 'axios'\n\ndeclare global {\n  interface Window {\n    PUBLIC_API_ENDPOINT: string\n  }\n}\n\ntype ApiClientOptions = {\n  baseURL?: string\n  basePath?: string\n}\n\nexport type WORK_CATEGORY_TYPE = 'films' | 'series' | 'collections'\n\nabstract class ApiClient {\n  declare axios\n  baseURL: string\n  basePath: string\n\n  constructor ({ basePath, baseURL }: ApiClientOptions) {\n    this.baseURL = baseURL ?? ''\n    this.basePath = basePath ?? ''\n    this.axios = axios.create({\n      baseURL: `${this.baseURL}${this.basePath}`\n    })\n  }\n\n  call ({ method, url, data, headers, params }: AxiosRequestConfig) {\n    return this.axios({\n      method,\n      url,\n      data,\n      params,\n      headers,\n      paramsSerializer: params =>\n        qs.stringify(params, { arrayFormat: 'repeat' })\n    })\n  }\n}\n\nclass ApiV4Client extends ApiClient {\n  private static _instance = new ApiV4Client()\n\n  private constructor () {\n    super({ basePath: '/api/v4' })\n\n    this.axios.defaults.xsrfCookieName = 'csrftoken'\n    this.axios.defaults.xsrfHeaderName = 'X-CSRFToken'\n    this.axios.defaults.withCredentials = true\n  }\n\n  static get instance () { return ApiV4Client._instance }\n}\n\nclass PublicApiV5Client extends ApiClient {\n  private static _instance = new PublicApiV5Client()\n\n  private constructor () {\n    super({ baseURL: window.PUBLIC_API_ENDPOINT, basePath: '/api/v5' })\n  }\n\n  static get instance () { return PublicApiV5Client._instance }\n\n  call ({ method, url, data, headers, params }: AxiosRequestConfig) {\n    return super.call({\n      method,\n      url,\n      data,\n      headers,\n      params: {\n        ...params\n      }\n    })\n  }\n}\n\nexport { ApiV4Client, PublicApiV5Client }\n","export const GTM_EVENTS = {\n  ADD_TO_MYLIST: 'nfb_add_to_mylist',\n  REMOVE_FROM_MYLIST: 'nfb_remove_from_mylist',\n  SHARE: 'share',\n  TAB: 'nfb_tab',\n  SELECT_WORK: 'nfb_select_work',\n  SELECT_LIST: 'nfb_select_list',\n  TIE_IN_PROMO: 'nfb_tie_in_promo',\n  REMOVE_FROM_HISTORY: 'nfb_remove_from_history',\n  LIKE: 'nfb_like',\n  PREVIEW_WORK: 'nfb_preview_work',\n\n  // Ecomm\n  ADD_TO_CART: 'add_to_cart',\n  BEGIN_CHECKOUT: 'begin_checkout',\n\n  //  Player\n  WORK_START: 'nfb_work_start',\n  VIDEO_START: 'video_start',\n  WORK_RESUME: 'nfb_work_resume',\n  WORK_PROGRESS: 'nfb_work_progress',\n  VIDEO_PROGRESS: 'video_progress',\n  WORK_COMPLETE: 'nfb_work_complete',\n  VIDEO_COMPLETE: 'video_complete',\n  LANG_SWITCH: 'nfb_lang_switch',\n  CAST_START: 'nfb_cast_start',\n\n  // AB Testing\n  AB_GROUP_VIEW: 'nfb_ab_group_view',\n  AB_GROUP_CLICK: 'nfb_ab_group_click',\n\n  // Newsletter\n  SUBSCRIPTION_NEWSLETTER: 'nfb_subscription_newsletter',\n\n  // Page view\n  PAGE_VIEW_SPA: 'nfb_page_view_spa',\n\n  // Poll\n  POLL_VIEW: 'nfb_poll_view',\n  POLL_ANSWER: 'nfb_poll_answer',\n\n  // Nav\n  MENU: 'nfb_menu',\n  MENU_OPEN: 'nfb_menu_open'\n} as const\n\nexport const GTM_LIST_TYPE = {\n  CAROUSEL: 'carousel',\n  LIST: 'list',\n  GRID: 'grid',\n  FEATURE: 'feature'\n} as const\n\nexport const GTM_LIST_CATEGORY = {\n  PROGRAMMING: 'programming', // thematic carrousels published by the content team\n  BLOG: 'blog',\n  SUGGESTIONS: 'suggestions', // suggested films on work page\n  EXTRAS: 'extras', // extras on work page\n  TRENDING: 'trending', // trending carrousel\n  ARTICLES: 'articles', // @todo: blog carrousel\n  SEARCH_RESULT: 'search_results',\n  EXPLORE: 'explore', // explore by\n  SPECIAL_COLLECTION: 'special_collection', // indigenous collection\n  PLAYLIST: 'playlist',\n  PART_OF: 'part_of', // film or episode list on work page\n  PERSONAL_RECOMMENDATION: 'personal_recommendation',\n  SUBJECTS: 'subjects',\n  FILMOGRAPHY: 'filmography',\n  USER: 'user'\n} as const\n\nexport const GTM_LIST_ID = {\n  SUGGESTIONS: 'recommended', // suggested films on work page\n  EXTRAS: 'extras', // extras on work page\n  USER_RECOMMENDATIONS: 'recommended_for_you',\n  SIMILAR_TASTE: 'similar_taste',\n  CONTINUE: 'continue_watching',\n  INDIGENOUS_CINEMA: 'indigenous_cinema',\n  USER_HISTORY: 'user_history',\n  EXPLORE_BY_WORKS: 'explore_by_title',\n  RENTALS: 'rentals',\n  USER_LIST: 'user_list'\n} as const\n\nexport const GTM_CONTENT_TYPE = {\n  FILM: 'film',\n  SERIES: 'series',\n  COLLECTION: 'collection',\n  PLAYLIST: 'playlist'\n} as const\n\nexport const GTM_VIDEO_CAST_TYPE = {\n  AVAILABLE: 'available',\n  UNAVAILABLE: 'unavailable'\n} as const\n\nexport const GTM_VIDEO_CASTING_TYPE = {\n  ON: 'on',\n  OFF: 'off',\n  NOT_APPLICABLE: 'n/a'\n} as const\n\nexport const GTM_VIDEO_CAST_TECH_TYPE = {\n  CHROMECAST: 'chromecast',\n  AIRPLAY: 'airplay',\n  NOT_APPLICABLE: 'n/a'\n} as const\n\nexport const GTM_LANG_CONTENT_TYPE = {\n  CC: 'cc',\n  DV: 'dv',\n  INTERFACE: 'interface'\n} as const\n\nexport const GTM_ECOMMERCE_ITEM_DETAIL = {\n  CURRENCY: 'CAD',\n  AFFILIATION: 'NFB-ONF',\n  BRAND: 'ONF/NFB'\n} as const\n\nexport const GTM_TIE_IN_DETAIL = {\n  LOGIN_SAVE_PROGRESS: 'login_to_save_progress',\n  LOGIN_TO_ADD: 'login_to_add'\n} as const\n\nexport const GTM_AB_GROUP = {\n  LOGIN_TO_ADD: 'login_to_add_2025_10'\n}\n\nexport const DEFAULT_LIST_LENGTH = 15\n\nexport const ERROR_MESSAGE = {\n  API_ERROR: window.pgettext('error', 'An error occurred while processing your request'),\n  NO_RESULT: window.pgettext('error', 'No result found')\n}\n\nexport const LANGUAGE_FILTER_OPTIONS = [\n  { name: window.pgettext('Language filter', 'All languages'), slug: 'all_languages' },\n  { name: window.pgettext('Language filter', 'French'), slug: 'fr' },\n  { name: window.pgettext('Language filter', 'English'), slug: 'en' }\n]\n\nexport const SORT_BY_FILTER_OPTIONS = [\n  { name: window.pgettext('Order by filter', 'Alphabetical order'), slug: 'title' },\n  { name: window.pgettext('Order by filter', 'Production date'), slug: 'year:desc,title' }\n]\n\nexport const WATCH_HISTORY_LIST_LENGTH = 12\n\nexport const DEFAULT_GRID_LIST_LENGTH = 60\n","import { WorkCard } from '@src/js/redux/worksReducer'\nimport { store } from '@src/js/redux/store'\nimport { selectActiveRentalForWork } from '@src/js/redux/userReducer'\n\nexport enum WorkAvailabilityStatus {\n  PUBLIC = 'public',\n  PROMO = 'promo',\n  UNAVAILABLE = 'unavailable', // unavailable or geoblocked with no buy/rent options\n  PURCHASE = 'purchase', // not public or geoblocked but has buy options\n  RENTED = 'rented' // not public or geoblocked but rented\n}\n\n/** Status considered playable\n * (will eventually include RENTED)\n */\nexport const PLAYABLE_STATUS = [\n  WorkAvailabilityStatus.PUBLIC\n]\n\n/**\n * @returns WorkAvailabilityStatus (public, promo, unavailable, buy)\n * based on availability data returned by API.\n * This status doesn't reflect ALL the availabilites, but\n * the \"first\" way the work can be watched.\n */\nexport const getAvailabilityStatusForWork = (work: WorkCard): WorkAvailabilityStatus => {\n  const availabilityData = work.availability\n\n  // Not availability data or no resource_url, return UNAVAILABLE\n  if (!availabilityData || availabilityData?.resource_url === null) {\n    return WorkAvailabilityStatus.UNAVAILABLE\n  }\n\n  // If can't be watched (geoblocked or not public)...\n  if (work.geoblocked || availabilityData?.is_public === false) {\n    // Look for buy options (RENTED or BUY)\n    if ((availabilityData?.rent || availabilityData?.buy || availabilityData?.dvd)) {\n      if (availabilityData?.rent && !!(selectActiveRentalForWork(store.getState().user, work))) {\n        return WorkAvailabilityStatus.RENTED\n      } else {\n        return WorkAvailabilityStatus.PURCHASE\n      }\n    // If no buy options and geoblocked, return UNAVAILABLE\n    } else if (work.geoblocked) {\n      return WorkAvailabilityStatus.UNAVAILABLE\n    // No buy options, not public and not geoblocked: PROMO is the only option left\n    } else {\n      return WorkAvailabilityStatus.PROMO\n    }\n  }\n\n  return WorkAvailabilityStatus.PUBLIC\n}\n","export function isTouch (isTouchScreen: boolean) {\n  const userAgentCheck = /Mobi|Android|iPhone|iPad|iPod|BlackBerry|webOS|Windows Phone/i.test(navigator.userAgent)\n  const touchCheck = window.matchMedia('(pointer: coarse)').matches || isTouchScreen\n  const screenCheck = window.innerWidth <= 768\n\n  return userAgentCheck || touchCheck || screenCheck\n}\n\nexport function isDialogAvailable () {\n  return typeof HTMLDialogElement === 'function'\n}\n\nexport function getSafariVersion () : number | null {\n  if (navigator.userAgent.includes('Safari/')) {\n    const safariMatch = navigator.userAgent.match(/Version\\/(\\d+(?:\\.\\d+)*)/)\n    if (safariMatch && safariMatch[1]) {\n      return parseFloat(safariMatch[1])\n    }\n  }\n\n  return null\n}\n","/**\n * Use this function instead of navigator.cookieEnabled, which verifies\n * if the browser is configured to interact with cookies, but might still return\n * true if there is a policy in place blocking cookies.\n * @returns wheter cookies are enabled by the navigator.\n */\nexport const cookiesAreEnabled = () => {\n  try {\n    document.cookie.indexOf('test')\n    window.localStorage.getItem('test')\n    window.sessionStorage.getItem('test')\n    return true\n  } catch {\n    return false\n  }\n}\n","import { nothing, TemplateResult } from 'lit'\n\nimport { html } from 'lit/static-html.js'\n\nimport { WorkAvailabilityStatus } from '@src/js/helpers/availability'\nimport {\n  formatComingSoonDate,\n  formatSeriesInfo,\n  formatCollectionInfo,\n  formatYearRange,\n  formatDuration\n} from '@src/js/helpers/format'\nimport { getPlatformLanguageCode } from '@src/js/helpers/language'\nimport normanPaths from '@src/js/helpers/paths'\nimport { selectActiveRentalForWork, UserState } from '@src/js/redux/userReducer'\nimport { WorkCard } from '@src/js/redux/worksReducer'\nimport { bookmarkButtonType } from '@src/js/wc/cards/NFBDisplayWorkCard'\n\nexport const getRestriction = (film: WorkCard, availabilityStatus: WorkAvailabilityStatus, isDark: boolean, userState: UserState) => {\n  const workIsDTO = film?.availability?.buy as boolean\n  const workIsRental = film?.availability?.rent as boolean\n\n  if (availabilityStatus === WorkAvailabilityStatus.PURCHASE) {\n    if (workIsDTO && workIsRental) {\n      return html`\n      <nfb-pill\n        text=\"${window.gettext('Available to rent or buy')}\"\n        icon-name=\"cash\"\n        is-dark=\"${isDark ?? nothing}\"\n        variant=\"round\"\n      >\n      </nfb-pill>`\n    } else if (workIsRental) {\n      return html`\n      <nfb-pill\n        text=\"${window.gettext('Available to rent')}\"\n        icon-name=\"cash\"\n        is-dark=\"${isDark ?? nothing}\"\n        variant=\"round\"\n      >\n      </nfb-pill>`\n    } else {\n      return html`\n      <nfb-pill\n        text=\"${window.gettext('Available to buy')}\"\n        icon-name=\"cash\"\n        is-dark=\"${isDark ?? nothing}\"\n        variant=\"round\"\n      >\n      </nfb-pill>`\n    }\n  } else if (availabilityStatus === WorkAvailabilityStatus.RENTED) {\n    const rental = selectActiveRentalForWork(userState, film as WorkCard)\n    const expirationDate = new Date(rental!.expiration)\n\n    const formatedExpiredDate = new Intl.DateTimeFormat(getPlatformLanguageCode(), {\n      dateStyle: 'medium',\n      timeStyle: 'short'\n    }).format(expirationDate)\n\n    return html`\n      <nfb-pill\n        is-dark=\"${isDark ?? nothing}\"\n        text=\"${`${window.gettext('Expires')} ${window.gettext('on')} ${formatedExpiredDate}`}\"\n        variant=\"primary\"\n      >\n      </nfb-pill>`\n  }\n}\n\nexport const getAvailabilityMessage = (availabilityStatus: WorkAvailabilityStatus, film: WorkCard, isDark: boolean): TemplateResult | typeof nothing => {\n  if (availabilityStatus === WorkAvailabilityStatus.UNAVAILABLE) {\n    const message = film.geoblocked\n      ? window.gettext('Not available to view in your current location.')\n      : window.gettext('This content is no longer available.')\n    return html`\n      <nfb-inline-message\n        is-dark=\"${isDark ?? nothing}\"\n        text=\"${message}\"\n      >\n      </nfb-inline-message>`\n  } else if (availabilityStatus === WorkAvailabilityStatus.PROMO && film.coming_soon) {\n    return html`\n      <nfb-pill\n       is-dark=\"${isDark ?? nothing}\"\n       text=\"${formatComingSoonDate(film.coming_soon)}\"\n      >\n      </nfb-pill>`\n  }\n\n  return nothing\n}\n\nexport const cardShouldBeDisabled = (availabilityStatus: WorkAvailabilityStatus) => {\n  return availabilityStatus === WorkAvailabilityStatus.UNAVAILABLE\n}\n\nexport const getNFBAddToMyListButton = (registryId: number, title: string, isDark: boolean) => {\n  if (window.USER_CONNECTED) {\n    return html`\n    <div slot=\"action-button\">\n      <nfb-add-to-mylist\n        registry-id=\"${registryId}\"\n        source-title=\"${title}\"\n        is-dark=\"${isDark}\"\n        is-small=\"true\"\n      >\n      </nfb-add-to-mylist>\n    <div> `\n  }\n}\n\nexport const getActionButton = (buttonType: bookmarkButtonType | null = null, registryId: number, work: WorkCard, isDark: boolean) => {\n  if (!buttonType || !window.USER_CONNECTED) return nothing\n\n  //  for bookmark\n  if (buttonType === bookmarkButtonType.delete) {\n    return html`\n      <div slot=\"action-button\">\n        <nfb-delete-bookmark-button\n          registry-id=\"${work.id}\"\n          source-title=\"${work.title}\"\n          is-dark=\"${isDark ?? nothing}\"\n          is-small=\"true\"\n        >\n        </nfb-delete-bookmark-button>\n      </div>`\n  }\n\n  if (buttonType === bookmarkButtonType.add) {\n    return getNFBAddToMyListButton(registryId, work.title, isDark)\n  }\n}\n\nexport const handleUrl = (work: WorkCard) => {\n  if (work.category === 'series') return normanPaths.series.replace('{slug}', work.slug)\n\n  if (work.category === 'collection') return normanPaths.collection.replace('{slug}', work.slug)\n\n  return normanPaths.film.replace('{slug}', work.slug)\n}\n\nexport const getSeriesOrCollectionLegend = (work: WorkCard, availabilityStatus: WorkAvailabilityStatus, isDark: boolean) => {\n  let seriesInfo = ''\n  let creatorSlot = null\n  if (work.category === 'series') {\n    creatorSlot = html`\n      <nfb-work-page-creator\n        creators=\"${JSON.stringify(work.directors)}\"\n        is-unavailable=\"${cardShouldBeDisabled(availabilityStatus)}\"\n        is-dark=\"${isDark ?? nothing}\"\n      ></nfb-work-page-creator>`\n    seriesInfo = formatSeriesInfo(work)\n  } else {\n    seriesInfo = formatCollectionInfo(work)\n  }\n  return html`\n    ${creatorSlot}\n    <div class=\"nfb-legend\">\n      <nfb-work-page-legend \n        year=\"${formatYearRange(work)}\"\n        series-info=\"${seriesInfo}\"\n      >\n      </nfb-work-page-legend>\n    </div>\n  `\n}\n\nexport const getFilmLegend = (work: WorkCard, availabilityStatus: WorkAvailabilityStatus, isDark: boolean) => {\n  return html`\n    ${work.directors?.length\n    ? html`<nfb-work-page-creator\n      creators=\"${JSON.stringify(work.directors)}\"\n      is-unavailable=\"${cardShouldBeDisabled(availabilityStatus)}\"\n      is-dark=\"${isDark ?? nothing}\"\n    ></nfb-work-page-creator>`\n    : nothing}\n    <div class=\"nfb-legend\">\n      <nfb-work-page-legend \n        year=\"${work.year}\"\n        running-time=\"${formatDuration(work.duration)}\"\n      >\n      </nfb-work-page-legend>\n    </div>\n  `\n}\n","import { type WorkDirector, type WorkCard } from '@src/js/redux/worksReducer'\nimport { getPlatformLanguageCode } from '@src/js/helpers/language'\n\n/**\n * @param duration\n * @return\n * Duration formatted to XX h XX min, XX min or XX s.\n * If duration can't be converted to Number, return duration.\n*/\nexport const formatDuration = (duration: string | number) => {\n  const durationToNumber = Number(duration)\n\n  if (isNaN(durationToNumber)) return duration\n\n  if (durationToNumber < 60) {\n    return `${duration} s`\n  }\n\n  const h = Math.floor(durationToNumber / 3600).toString()\n  const m = Math.floor(durationToNumber % 3600 / 60).toString()\n\n  return `${h !== '0' ? `${h} h` : ''} ${m !== '0' ? `${m} min` : ''}`\n}\n\n/**\n * @param dateString Coming soon date returned from Public API, expected format: 'YYYY-MM-DDT00:00:00'.\n * @returns Formatted date string based on distance from today:\n *   < 30 days   → Coming (Day) (Month) (Year)\n *   30–180 days → Coming in (Month) (Year)\n *   > 180 days  → Coming Soon\n */\nexport const formatComingSoonDate = (dateString: string): string => {\n  const lang = getPlatformLanguageCode()\n  const dateObject = new Date(dateString)\n\n  if (isNaN(dateObject.getDate())) {\n    return ''\n  }\n\n  const now = new Date()\n  const diffDays = (dateObject.getTime() - now.getTime()) / (1000 * 60 * 60 * 24)\n\n  if (diffDays > 180) {\n    return window.pgettext('Coming soon date', 'Coming Soon')\n  }\n\n  if (diffDays >= 30) {\n    return `${window.pgettext('Coming soon date', 'Coming in')} ${dateObject.toLocaleString(\n      lang,\n      {\n        month: 'long',\n        year: 'numeric'\n      })}`\n  }\n\n  return `${window.pgettext('Coming soon date', 'Coming')} ${dateObject.toLocaleString(\n    lang,\n    {\n      month: 'long',\n      day: 'numeric',\n      year: 'numeric'\n    })}`\n}\n\n/**\n *\n * @param directors\n * @returns directors formatted:\n * 'FirstName LastName',\n * or 'FirstName1 LastName1 & FirstName2 LastName2',\n * or 'FirstName1 LastName1, FirstName2 LastName2 & FirstName3 LastName3'\n */\nexport const formatDirectors = (directors: WorkDirector[]): string | null => {\n  if (directors?.length > 0) {\n    let directorsString = ''\n    directors.forEach((d, index) => {\n      let separator = ''\n\n      if (directors.length > 1 && index > 0) {\n        if (index === directors.length - 1) {\n          separator = ` ${window.gettext('&')} `\n        } else {\n          separator = ', '\n        }\n      }\n\n      directorsString += `${separator}${d.first_name} ${d.last_name}`\n    })\n    return directorsString\n  }\n\n  return null\n}\n\n/**\n * @param work\n * @return\n * Series info formatted to X seasons or X episodes.\n*/\nexport const formatSeriesInfo = (work: WorkCard) => {\n  if (work.seasons_count && work.seasons_count > 1) {\n    return `${work.seasons_count} ${window.pgettext('Helper to format series info', 'seasons')}`\n  } else {\n    return `${work.episodes_count} ${window.pgettext('Helper to format series info', 'episodes')}`\n  }\n}\n\n/**\n * @param work\n * @return\n * Collection info formatted to X editions or X films.\n*/\nexport const formatCollectionInfo = (work: WorkCard) => {\n  if (work.seasons_count && work.seasons_count > 1) {\n    return `${work.seasons_count} ${window.pgettext('Helper to format collections info', 'editions')}`\n  } else {\n    return `${work.episodes_count} ${window.pgettext('Helper to format collections info', 'films')}`\n  }\n}\n\n/**\n * @param work\n * @return\n * Format year range year_max-year_min or year.\n*/\nexport const formatYearRange = (work: WorkCard) => {\n  return work.year_min !== work.year_max ? `${work.year_min + '-' + work.year_max}` : work.year\n}\n\n/**\n * @param timestamp\n * @returns Format timestamp from history item to YYYY-MM-DD\n */\nexport const formatHistoryItemDate = (timestamp: number) => {\n  return new Date(timestamp).toLocaleDateString()\n}\n\n/**\n * @param genreList\n * @return\n * Format genre into string.\n*/\nexport const formatGenreInfo = (genreList: string[]) => {\n  return genreList.join(', ')\n}\n\n/**\n * Remove HTML tags from string\n *\n * @param html\n * @returns string\n */\nexport const stripTags = (html: string) => {\n  const doc = new DOMParser().parseFromString(html, 'text/html')\n  return doc.body.textContent || ''\n}\n\nexport const secondsToMinutes = (seconds: number) => {\n  return Math.round(seconds / 60)\n}\n\nexport const minutesToSeconds = (minutes: number) => {\n  return minutes * 60\n}\n","/**\n * @returns fr if platform is onf.ca else en\n */\nexport const getPlatformLanguageCode = () => {\n  return window.location.host.match(/onf.ca/) ? 'fr' : 'en'\n}\n","const normanPaths = {\n  series: window.gettext('/series/{slug}/'),\n  collection: window.gettext('/collection/{slug}/'),\n  film: window.gettext('/film/{slug}/'),\n  directors: window.gettext('/directors/{slug}/'),\n  embed: window.gettext('/film/{slug}/embed/player/'),\n  promoEmbed: window.gettext('/film/{parentSlug}/{streamType}/{slug}/embed/player/'),\n  indigenousCinemaSubject: window.gettext('/indigenous-cinema/subjects/{slug}/'),\n  indigenousCinemaSecondarySubject: window.gettext('/indigenous-cinema/subjects/{slug}/{secondarySlug}'),\n  playlist: window.gettext('/playlist/{slug}/'),\n  exploreBySubject: window.gettext('/subjects/{parentSubject}/'),\n  exploreByChildSubject: window.gettext('/subjects/{parentSubject}/{childSubject}/')\n}\n\nexport default normanPaths\n","import { postHistory, WorkHistoryReturnParams } from '@src/js/redux/workHistoryReducer'\nimport { AppDispatch } from '@src/js/redux/store'\nimport { sortByTimestamp } from '@src/js/helpers/sort'\nimport { cookiesAreEnabled } from '@src/js/helpers/cookies'\n\nexport const fetchAllFromSessionStorage = (key: string): WorkHistoryReturnParams => {\n  if (!cookiesAreEnabled()) {\n    return { data: [], count: 0 }\n  }\n\n  const unparsedSessionHistory: string|null = window.sessionStorage.getItem(key)\n  const parsedSessionHistory = unparsedSessionHistory ? JSON.parse(unparsedSessionHistory) : []\n\n  const returnData: WorkHistoryReturnParams = {\n    data: parsedSessionHistory.sort(sortByTimestamp),\n    count: parsedSessionHistory.length\n  }\n\n  return returnData\n}\n\nexport const postSessionStorage = async (key: string, thunkAPI: {dispatch: AppDispatch}) => {\n  const historySession = fetchAllFromSessionStorage(key).data\n  if (historySession.length > 0) {\n    for (const item of historySession) {\n      await thunkAPI.dispatch(postHistory(item))\n    }\n    window.sessionStorage.removeItem(key)\n  }\n}\n","export type ObjectWithTimestamp = {\n  timestamp?: number|undefined\n}\n\nexport const sortByTimestamp = (a: ObjectWithTimestamp, b: ObjectWithTimestamp) => {\n  if (!a.timestamp || !b.timestamp) return 0\n  if (a.timestamp > b.timestamp) return -1\n  else return 1\n}\n","import { createSlice } from '@reduxjs/toolkit'\nimport type { PayloadAction } from '@reduxjs/toolkit'\n\nexport interface AnimatedHoverCardState {\n  currentOpenCard: string | null\n}\n\nconst initialState: AnimatedHoverCardState = {\n  currentOpenCard: null\n}\n\nexport const animatedHoverCardSlice = createSlice({\n  name: 'animatedHoverCardSlice',\n  initialState,\n  reducers: {\n    setCurrentOpenCard (state, action: PayloadAction<string|null>) {\n      state.currentOpenCard = action.payload\n    }\n  }\n})\n\nexport const {\n  setCurrentOpenCard\n} = animatedHoverCardSlice.actions\n\nexport default animatedHoverCardSlice.reducer\n","import { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'\nimport { ApiV4Client } from '@src/js/ApiClient'\nimport { AppDispatch, RootState } from '@src/js/redux/store'\nimport { fetchWorks } from '@src/js/redux/worksReducer'\n\ninterface GetBookmarkApiResponse {\n  items: [{ registry_id: number }]\n}\n\nexport interface BookmarksState {\n  list: number[] | null\n  status: undefined | 'loading' | 'succeeded' | 'failed',\n  currentLoadingId: number | null\n}\n\nconst initialState: BookmarksState = {\n  list: null,\n  status: undefined,\n  currentLoadingId: null\n}\n\nconst apiV4Client = ApiV4Client.instance\n\nexport const fetchBookmarks = createAsyncThunk<GetBookmarkApiResponse>('bookmarks/fetch', async () => {\n  const response = await apiV4Client.call({\n    method: 'GET',\n    url: '/bookmarks/'\n  })\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n\n  return await response.data\n})\n\nexport const postBookmark = createAsyncThunk<\n  number | null,\n  number\n>('bookmarks/add', async (registry_id: number): Promise<number|null> => {\n  const response = await apiV4Client.call({\n    method: 'POST',\n    url: `/bookmarks/${registry_id}/`\n  })\n\n  return response.status === 201 ? registry_id : null\n})\n\nexport const deleteBookmark = createAsyncThunk<\n  number | null,\n  number\n>('bookmarks/delete', async (registry_id: number): Promise<number | null> => {\n  const response = await apiV4Client.call({\n    method: 'DELETE',\n    url: `/bookmarks/${registry_id}/`\n  })\n\n  return response.status === 204 ? registry_id : null\n})\n\nexport const fetchBookmarksList = createAsyncThunk<\n  void,\n  void,\n  {\n    dispatch: AppDispatch,\n    state: RootState\n  }>('bookmarks/fetchBookmarks', async (_, thunkAPI) => {\n    await thunkAPI.dispatch(fetchBookmarks())\n    const state: RootState = thunkAPI.getState()\n    const idListToFetch: number[] = state.bookmarks.list!\n    await thunkAPI.dispatch(fetchWorks({ idList: idListToFetch, subset: 'gc/gc-films' }))\n  })\n\nexport const bookmarksSlice = createSlice({\n  name: 'bookmarks',\n  initialState,\n  reducers: {\n    setLoadingItem: (state, action: PayloadAction<number|null>) => {\n      state.currentLoadingId = action.payload\n    }\n  },\n  extraReducers: (builder) => {\n    builder\n      .addCase(fetchBookmarks.pending, (state) => {\n        state.status = 'loading'\n        state.currentLoadingId = null\n      })\n      .addCase(fetchBookmarks.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.list = action.payload.items.map(i => i.registry_id)\n      })\n      .addCase(fetchBookmarks.rejected, (state) => {\n        state.status = 'failed'\n      })\n      .addCase(postBookmark.pending, (state, action) => {\n        state.status = 'loading'\n        state.currentLoadingId = action.meta.arg\n      })\n      .addCase(postBookmark.fulfilled, (state, action: PayloadAction<number|null>) => {\n        state.status = 'succeeded'\n        state.currentLoadingId = null\n        if (state.list !== null && action.payload) {\n          state.list.unshift(action.payload)\n        }\n      })\n      .addCase(postBookmark.rejected, (state) => {\n        state.status = 'failed'\n      })\n      .addCase(deleteBookmark.pending, (state, action) => {\n        state.status = 'loading'\n        state.currentLoadingId = action.meta.arg\n      })\n      .addCase(deleteBookmark.fulfilled, (state, action: PayloadAction<number|null>) => {\n        state.status = 'succeeded'\n        state.currentLoadingId = null\n        if (action.payload) {\n          state.list = state.list!.filter(b => b !== action.payload)\n        }\n      })\n      .addCase(deleteBookmark.rejected, (state) => {\n        state.status = 'failed'\n      })\n  },\n  selectors: {\n    selectIdIsLoading: (state: BookmarksState, id: number): boolean => {\n      return state.status === 'loading' && state.currentLoadingId === id\n    },\n    selectIdHasError: (state: BookmarksState, id: number): boolean => {\n      return state.status === 'failed' && state.currentLoadingId === id\n    },\n    selectIdIsBookmarked: (state: BookmarksState, id: number): boolean => {\n      return state.list !== null && state.list.includes(id)\n    },\n    selectBookmarksIds: (state: BookmarksState): number[] => {\n      return state.list ?? []\n    }\n  }\n})\n\nexport const {\n  selectIdIsBookmarked,\n  selectIdIsLoading,\n  selectIdHasError,\n  selectBookmarksIds\n} = bookmarksSlice.getSelectors()\n\nexport default bookmarksSlice.reducer\n","import { createSlice } from '@reduxjs/toolkit'\nimport type { PayloadAction } from '@reduxjs/toolkit'\n\nexport interface CarouselState {\n  currentActiveCarousel: string | null\n}\n\nconst initialState: CarouselState = {\n  currentActiveCarousel: null\n}\n\nexport const carouselSlice = createSlice({\n  name: 'carouselSlice',\n  initialState,\n  reducers: {\n    setCurrentActiveCarousel (state, action: PayloadAction<string|null>) {\n      state.currentActiveCarousel = action.payload\n    }\n  }\n})\n\nexport const {\n  setCurrentActiveCarousel\n} = carouselSlice.actions\n\nexport default carouselSlice.reducer\n","import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'\n\nimport { ApiV4Client } from '@src/js/ApiClient'\nimport { DEFAULT_LIST_LENGTH } from '@src/js/constants'\nimport { ThunkAPI } from '@src/js/redux/store'\nimport { fetchWorks, basicIncludeFields } from '@src/js/redux/worksReducer'\n\nconst apiV4Client = ApiV4Client.instance\n\nexport interface ChannelsState {\n  list: number[] | null\n  status: undefined | 'loading' | 'succeeded' | 'failed'\n}\n\nconst initialState: ChannelsState = {\n  list: null,\n  status: undefined\n}\n\nexport interface GetChannelsParams {\n  slug: string,\n  include_featured?: boolean,\n  per_page?: number,\n  page?: number\n}\n\nexport const fetchChannel = createAsyncThunk<\nnumber[], GetChannelsParams, ThunkAPI\n>('channelsPage/fetchChannel', async ({\n  slug,\n  include_featured = true,\n  per_page = DEFAULT_LIST_LENGTH,\n  page = 1\n}, thunkAPI) => {\n  const response = await apiV4Client.call({\n    method: 'GET',\n    url: `/channels/${slug}/items`,\n    params: {\n      response_format: 'registry_id',\n      types: 'film,series,collection',\n      include_featured,\n      per_page,\n      page\n    }\n  })\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n\n  const idsList = await response.data.data.map((r: any) => r.registry_id)\n  await thunkAPI.dispatch(fetchWorks({ idList: idsList, includeFields: basicIncludeFields }))\n\n  return idsList as number[]\n})\n\nexport const channelsSlice = createSlice({\n  name: 'channels',\n  initialState,\n  reducers: {},\n  extraReducers: builder => {\n    builder\n      .addCase(fetchChannel.pending, state => {\n        state.status = 'loading'\n      })\n      .addCase(fetchChannel.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.list = action.payload ?? []\n      })\n      .addCase(fetchChannel.rejected, (state) => {\n        state.status = 'failed'\n      })\n  }\n})\n\nexport default channelsSlice.reducer\n","import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'\nimport { AppDispatch, RootState } from '@src/js/redux/store'\n\nimport { SubjectInfo, APISubjectsResponse, getSubjectsAPI } from '@src/js/redux/subjectsReducer'\n\nexport interface CrossPlatformNavState {\n  popularSubjectList: SubjectInfo[] | null\n  status: undefined | 'loading' | 'succeeded' | 'failed',\n}\n\nconst initialState: CrossPlatformNavState = {\n  popularSubjectList: null,\n  status: undefined\n}\n\nexport const fetchPopularSubjects = createAsyncThunk<\n  APISubjectsResponse,\n  void,\n  {\n    dispatch: AppDispatch,\n    state: RootState\n  }\n>('crossPlatformNav/fetchPopularSubjects', async () => {\n  return getSubjectsAPI({ category_type: 'general', highlight: true })\n})\n\nexport const crossPlatformNavSlice = createSlice({\n  name: 'crossPlatformNav',\n  initialState,\n  reducers: {},\n  extraReducers: builder => {\n    builder\n      .addCase(fetchPopularSubjects.pending, state => {\n        state.status = 'loading'\n      })\n      .addCase(fetchPopularSubjects.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.popularSubjectList = action.payload.items ?? []\n      })\n      .addCase(fetchPopularSubjects.rejected, (state) => {\n        state.status = 'failed'\n      })\n  }\n})\n\nexport default crossPlatformNavSlice.reducer\n","import uniq from 'lodash/uniq'\nimport { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'\n\nimport { ThunkAPI } from '@src/js/redux/store'\nimport { ERROR_MESSAGE, DEFAULT_LIST_LENGTH } from '@src/js/constants'\nimport { APIWorksResponse, fetchWorks, WorkCard } from '@src/js/redux/worksReducer'\n\ninterface DirectorWorkIdList {\n  slug: string,\n  idList: number[],\n  totalCount: number\n}\n\nexport interface GetDirectorParams {\n  slug?: string,\n  size?: number,\n  language?: string,\n  page?: number\n}\n\nexport interface DirectorList {\n  [key: string]: number[]\n}\n\ninterface DirectorWorkListTotal {\n  [key: string]: number\n}\n\nexport interface DirectorsPageState {\n  list: DirectorList,\n  status: undefined | 'loading' | 'succeeded' | 'failed',\n  totalCount: DirectorWorkListTotal,\n  apiError: string | null,\n  currentPage: number\n}\n\nconst initialState: DirectorsPageState = {\n  list: {},\n  status: undefined,\n  totalCount: {},\n  apiError: null,\n  currentPage: 1\n}\n\nexport const fetchWorkListByDirector = createAsyncThunk<\n  DirectorWorkIdList,\n  GetDirectorParams,\n  ThunkAPI\n>('directors/fetchWorkListByDirector', async ({ slug, size = DEFAULT_LIST_LENGTH, language = window.LOCALE, page }, thunkAPI) => {\n  let idList: number[] = []\n\n  const worksPayload = (await thunkAPI.dispatch(\n    fetchWorks({\n      sort: 'year:desc',\n      director: slug,\n      language,\n      size,\n      page\n    }))).payload as APIWorksResponse\n\n  if (worksPayload.items?.length) {\n    idList = worksPayload.items?.map((w: WorkCard) => w.id)\n  }\n\n  const totalCount = worksPayload.meta.pagination.total\n\n  return { slug, idList, totalCount } as DirectorWorkIdList\n})\n\nexport const directorsSlice = createSlice({\n  name: 'directorsPage',\n  initialState,\n  reducers: {\n    setCurrentPage (state, action: PayloadAction<number>) {\n      state.currentPage = action.payload\n    },\n    resetList: (state, action: PayloadAction<string>) => {\n      state.list[action.payload] = []\n    }\n  },\n  extraReducers: builder => {\n    builder\n      .addCase(fetchWorkListByDirector.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        const slug = action.payload.slug\n        state.list[slug] = uniq([\n          ...(state.list[slug] ?? []),\n          ...action.payload.idList\n        ])\n        state.totalCount[slug] = action.payload.totalCount\n      })\n      .addCase(fetchWorkListByDirector.rejected, (state, action) => {\n        state.status = 'failed'\n        state.apiError = ERROR_MESSAGE.API_ERROR\n      })\n  }\n})\n\nexport const {\n  setCurrentPage, resetList\n} = directorsSlice.actions\n\nexport default directorsSlice.reducer\n","import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'\nimport { AxiosResponse } from 'axios'\n\nimport { PublicApiV5Client } from '@src/js/ApiClient'\nimport { ERROR_MESSAGE } from '../constants'\nimport { WorkDirector } from './worksReducer'\n\nconst publicApiV5Client = PublicApiV5Client.instance\n\nexport interface APIDirectorsResponse {\n  items: WorkDirector[],\n  meta: {\n    pagination: {\n      page: number,\n      pages: number,\n      size: number,\n      total: number\n    }\n    count_by_letter: object\n  }\n}\n\nexport interface GetDirectorsParams {\n  subset?: 'nfb/public' | 'gc/gc-films' | 'nfb/indigenous-films',\n  indigenous_nation?: string,\n  first_letter?: string,\n  count_by_letter?: boolean,\n  page?: number,\n  size?: number,\n  sort?: string\n}\n\nexport interface DirectorsState {\n  list: WorkDirector[] | null,\n  letterList: object | null,\n  status: undefined | 'loading' | 'succeeded' | 'failed',\n  apiError: string | null\n}\n\nconst initialState: DirectorsState = {\n  list: null,\n  letterList: null,\n  status: undefined,\n  apiError: null\n}\n\nexport const fetchDirectorList = createAsyncThunk<\nAPIDirectorsResponse, GetDirectorsParams\n>('directors/fetchDirectorList', async ({ subset, indigenous_nation, first_letter, count_by_letter, page, size, sort }) => {\n  const response = await publicApiV5Client.call({\n    method: 'GET',\n    url: '/directors',\n    params: {\n      locale: window.LOCALE,\n      ...(subset ? { subset } : {}),\n      ...(indigenous_nation ? { indigenous_nation } : {}),\n      ...(first_letter ? { first_letter } : {}),\n      ...(count_by_letter ? { count_by_letter } : {}),\n      ...(page ? { page } : {}),\n      ...(size ? { size } : {}),\n      ...(sort ? { sort } : {})\n    }\n  }) as AxiosResponse\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n  return await response.data\n})\n\nexport const fetchDirectorCountByLetterList = createAsyncThunk<\nAPIDirectorsResponse, GetDirectorsParams\n>('directors/fetchDirectorCountByLetterList', async ({ subset, indigenous_nation }) => {\n  const response = await publicApiV5Client.call({\n    method: 'GET',\n    url: '/directors',\n    params: {\n      locale: window.LOCALE,\n      size: 0,\n      count_by_letter: true,\n      ...(subset ? { subset } : {}),\n      ...(indigenous_nation ? { indigenous_nation } : {})\n    }\n  }) as AxiosResponse\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n  return await response.data\n})\n\nexport const directorsSlice = createSlice({\n  name: 'indigenousCinema',\n  initialState,\n  reducers: {},\n  extraReducers: builder => {\n    builder\n      .addCase(fetchDirectorList.pending, (state) => {\n        state.status = 'loading'\n      })\n      .addCase(fetchDirectorList.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.list = action.payload.items\n      })\n      .addCase(fetchDirectorList.rejected, (state) => {\n        state.status = 'failed'\n        state.apiError = ERROR_MESSAGE.API_ERROR\n      })\n      .addCase(fetchDirectorCountByLetterList.pending, (state) => {\n        state.status = 'loading'\n      })\n      .addCase(fetchDirectorCountByLetterList.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.letterList = action.payload.meta.count_by_letter\n      })\n      .addCase(fetchDirectorCountByLetterList.rejected, (state) => {\n        state.status = 'failed'\n        state.apiError = ERROR_MESSAGE.API_ERROR\n      })\n  }\n})\n\nexport default directorsSlice.reducer\n","import { createSlice } from '@reduxjs/toolkit'\nimport type { PayloadAction } from '@reduxjs/toolkit'\n\nexport const DEFAULT_FILTER = {\n  language: window.LOCALE,\n  age_min: 5,\n  age_max: 18\n}\n\ninterface Filter {\n  language: string,\n  age_min: number,\n  age_max: number\n}\n\nexport interface EducationalSubjectPageState {\n  currentPage: number,\n  filter: Filter\n}\n\nconst initialState: EducationalSubjectPageState = {\n  currentPage: 1,\n  filter: DEFAULT_FILTER\n}\n\nexport const educationalSubjectPageSlice = createSlice({\n  name: 'educationalSubjectPageSlice',\n  initialState,\n  reducers: {\n    setCurrentPage (state, action: PayloadAction<number>) {\n      state.currentPage = action.payload\n    },\n    setFilter (state, action: PayloadAction<Filter>) {\n      state.filter = action.payload\n    }\n  }\n})\n\nexport const {\n  setCurrentPage, setFilter\n} = educationalSubjectPageSlice.actions\n\nexport default educationalSubjectPageSlice.reducer\n","import uniq from 'lodash/uniq'\n\nimport { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit'\n\nimport { ThunkAPI, NFBStore } from '@src/js/redux/store'\nimport { APIWorksResponse, fetchWorks, WorkCard } from '@src/js/redux/worksReducer'\nimport { DEFAULT_LIST_LENGTH, ERROR_MESSAGE } from '@src/js/constants'\n\ninterface ExploreBySubjectIdList {\n  slug: string,\n  idList: number[],\n  totalCount: number\n}\n\nexport interface ExploreBySubjectList {\n  [key: string]: number[]\n}\n\ninterface ExploreBySubjectTotal {\n  [key: string]: number\n}\n\nexport interface ExploreBySubjectState {\n  list: ExploreBySubjectList\n  status: undefined | 'loading' | 'succeeded' | 'failed',\n  currentPage: number,\n  totalCount: ExploreBySubjectTotal,\n  apiError: string | null\n}\n\nconst initialState: ExploreBySubjectState = {\n  list: {},\n  status: undefined,\n  currentPage: 1,\n  totalCount: {},\n  apiError: null\n}\n\nexport interface GetExploreByChildSubjectParams {\n  slug?: string,\n  size?: number,\n  language?: string,\n  page?: number\n}\n\nexport const fetchExploreByChildSubject = createAsyncThunk<\n  ExploreBySubjectIdList,\n  GetExploreByChildSubjectParams,\n  ThunkAPI\n>('exploreByPage/fetchExploreByChildSubject', async ({ slug, size = DEFAULT_LIST_LENGTH, language = window.LOCALE, page }, thunkAPI) => {\n  let idList: number[] = []\n\n  const worksPayload = (await thunkAPI.dispatch(\n    fetchWorks({\n      sort: 'year:desc',\n      subject: slug,\n      language,\n      size,\n      subjectCategory: 'general',\n      page\n    }))).payload as APIWorksResponse\n\n  if (worksPayload.items?.length) {\n    idList = worksPayload.items?.map((w: WorkCard) => w.id)\n  }\n\n  const totalCount = worksPayload.meta.pagination.total\n\n  return { slug, idList, totalCount } as ExploreBySubjectIdList\n})\n\nexport const exploreBySubjectSlice = createSlice({\n  name: 'exploreBySubject',\n  initialState,\n  reducers: {\n    setCurrentPage (state, action: PayloadAction<number>) {\n      state.currentPage = action.payload\n    },\n    resetList: (state, action: PayloadAction<string>) => {\n      state.list[action.payload] = []\n    }\n  },\n  extraReducers: builder => {\n    builder\n      .addCase(fetchExploreByChildSubject.pending, state => {\n        state.status = 'loading'\n      })\n      .addCase(fetchExploreByChildSubject.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        const slug = action.payload.slug\n        state.list[slug] = uniq([\n          ...(state.list[slug] ?? []),\n          ...action.payload.idList\n        ])\n        state.totalCount[slug] = action.payload.totalCount\n      })\n      .addCase(fetchExploreByChildSubject.rejected, (state, action) => {\n        state.status = 'failed'\n        state.apiError = ERROR_MESSAGE.API_ERROR\n      })\n  }\n})\n\nexport const {\n  setCurrentPage, resetList\n} = exploreBySubjectSlice.actions\n\nexport default exploreBySubjectSlice.reducer\n","import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'\nimport type { PayloadAction } from '@reduxjs/toolkit'\nimport uniq from 'lodash/uniq'\n\nimport { ThunkAPI } from '@src/js/redux/store'\nimport { APIWorksResponse, fetchWorks, GetWorksParams } from '@src/js/redux/worksReducer'\n\nimport { DEFAULT_GRID_LIST_LENGTH, ERROR_MESSAGE } from '@src/js/constants'\n\nconst sortMapping = {\n  alphabetical: 'title',\n  publication_date: 'publication_date:desc',\n  production_date: 'year:desc'\n}\n\nexport const SORT_ORDER = {\n  ALPHABETICAL: 'alphabetical',\n  PUBLICATION_DATE: 'publication_date',\n  PRODUCTION_DATE: 'production_date'\n} as const\n\nexport type SortOrder = typeof SORT_ORDER[keyof typeof SORT_ORDER]\n\nexport interface ExploreByWorkFilterList {\n  language: string,\n  genre: string[],\n  availability: string[],\n  sort: SortOrder,\n  cc: boolean,\n  dv: boolean,\n  safeSearch: boolean,\n  yearMin: number | undefined,\n  yearMax: number | undefined,\n  durationMin: number | undefined,\n  durationMax: number | undefined,\n  titleLetter: string,\n}\n\nexport interface ExploreByWorkPageState extends ExploreByWorkFilterList {\n  isLoading: boolean,\n  currentPage: number,\n  total: number,\n  letterList: object,\n  workIdList: number[],\n  apiError: string | null\n}\n\nexport const initialFilterList: ExploreByWorkFilterList = {\n  language: window.LOCALE,\n  genre: [],\n  availability: [],\n  sort: SORT_ORDER.PRODUCTION_DATE,\n  cc: false,\n  dv: false,\n  safeSearch: false,\n  yearMin: undefined,\n  yearMax: undefined,\n  durationMin: undefined,\n  durationMax: undefined,\n  titleLetter: ''\n}\n\nexport const initialState: ExploreByWorkPageState = {\n  isLoading: true,\n  currentPage: 1,\n  total: 0,\n  letterList: {},\n  workIdList: [],\n  apiError: null,\n  ...initialFilterList\n}\n\nexport const fetchExploreByWork = createAsyncThunk<\n  APIWorksResponse,\n  GetWorksParams,\n  ThunkAPI\n>('exploreByWorkPage/fetchExploreByWork', async ({ page, size = DEFAULT_GRID_LIST_LENGTH }, thunkAPI) => {\n  const currentPageState = thunkAPI.getState().exploreByWorkPage\n\n  const response = await thunkAPI.dispatch(fetchWorks({\n    subset: 'nfb/published',\n    size,\n    page,\n    category: 'film',\n    language: currentPageState.language === 'all_languages' ? '' : currentPageState.language,\n    genre: currentPageState.genre,\n    availability: currentPageState.availability,\n    sort: sortMapping[currentPageState.sort],\n    cc: currentPageState.cc,\n    dv: currentPageState.dv,\n    safeSearch: currentPageState.safeSearch,\n    yearMin: currentPageState.yearMin,\n    yearMax: currentPageState.yearMax,\n    durationMin: currentPageState.durationMin,\n    durationMax: currentPageState.durationMax,\n    titleLetter: currentPageState.titleLetter.toLowerCase()\n  }))\n\n  if (response.type === 'works/fetchWorks/rejected') {\n    return thunkAPI.rejectWithValue('Failed to fetch works')\n  }\n\n  return response.payload as APIWorksResponse\n})\n\nexport const exploreByWorkPageSlice = createSlice({\n  name: 'exploreByWorkPage',\n  initialState,\n  reducers: {\n    setCurrentPage (state, action: PayloadAction<number>) {\n      state.currentPage = action.payload\n    },\n    setLanguage (state, action: PayloadAction<string>) {\n      state.language = action.payload\n    },\n    setGenre (state, action: PayloadAction<string[]>) {\n      state.genre = action.payload\n    },\n    setAvailability (state, action: PayloadAction<string[]>) {\n      state.availability = action.payload\n    },\n    setSort (state, action: PayloadAction<SortOrder>) {\n      state.sort = action.payload\n      if (state.sort === SORT_ORDER.ALPHABETICAL) {\n        state.titleLetter = 'a'\n      } else {\n        state.titleLetter = ''\n      }\n    },\n    setCC (state, action: PayloadAction<boolean>) {\n      state.cc = action.payload\n    },\n    setDV (state, action: PayloadAction<boolean>) {\n      state.dv = action.payload\n    },\n    setSafeSearch (state, action: PayloadAction<boolean>) {\n      state.safeSearch = action.payload\n    },\n    setYearMin (state, action: PayloadAction<number>) {\n      state.yearMin = action.payload\n    },\n    setYearMax (state, action: PayloadAction<number>) {\n      state.yearMax = action.payload\n    },\n    setDurationMin (state, action: PayloadAction<number>) {\n      state.durationMin = action.payload\n    },\n    setDurationMax (state, action: PayloadAction<number>) {\n      state.durationMax = action.payload\n    },\n    setTitleLetter (state, action: PayloadAction<string>) {\n      state.titleLetter = action.payload\n    },\n    resetSearchResult (state) {\n      state.isLoading = initialState.isLoading\n      state.currentPage = initialState.currentPage\n      state.total = initialState.total\n      state.workIdList = initialState.workIdList\n      state.apiError = initialState.apiError\n    },\n    setAllFilters (state, action: PayloadAction<ExploreByWorkFilterList>) {\n      state.genre = action.payload.genre\n      state.language = action.payload.language\n      state.availability = action.payload.availability\n      state.sort = action.payload.sort\n      state.cc = action.payload.cc\n      state.dv = action.payload.dv\n      state.safeSearch = action.payload.safeSearch\n      state.yearMin = action.payload.yearMin\n      state.yearMax = action.payload.yearMax\n      state.durationMin = action.payload.durationMin\n      state.durationMax = action.payload.durationMax\n      state.titleLetter = action.payload.titleLetter\n    }\n  },\n  extraReducers: builder => {\n    builder\n      .addCase(fetchExploreByWork.pending, state => {\n        state.isLoading = true\n      })\n      .addCase(fetchExploreByWork.fulfilled, (state, action: PayloadAction<APIWorksResponse>) => {\n        state.total = action.payload.meta.pagination.total\n        state.letterList = action.payload.meta.letter_count\n        state.workIdList = uniq([\n          ...state.workIdList,\n          ...action.payload.items.map(item => item.id)\n        ])\n        state.isLoading = false\n      })\n      .addCase(fetchExploreByWork.rejected, (state) => {\n        state.apiError = ERROR_MESSAGE.API_ERROR\n      })\n  }\n})\n\nexport const {\n  setCurrentPage,\n  setLanguage,\n  setGenre,\n  setAvailability,\n  setSort,\n  setCC,\n  setDV,\n  setSafeSearch,\n  setYearMin,\n  setYearMax,\n  setDurationMin,\n  setDurationMax,\n  setTitleLetter,\n  resetSearchResult,\n  setAllFilters\n} = exploreByWorkPageSlice.actions\n\nexport default exploreByWorkPageSlice.reducer\n","/**\n * Film history used for work page detail\n * Retrieve only history for a specific film,\n * or to get history for a list of episodes/films if it's a series/collection\n */\nimport { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'\nimport uniqBy from 'lodash/uniqBy'\nimport { ApiV4Client } from '@src/js/ApiClient'\nimport { ThunkAPI } from '@src/js/redux/store'\nimport { fetchAllFromSessionStorage, postSessionStorage } from '@src/js/helpers/sessionStorage'\nimport { cookiesAreEnabled } from '@src/js/helpers/cookies'\nimport { sortByTimestamp } from '@src/js/helpers/sort'\n\nconst apiV4Client = ApiV4Client.instance\nconst SESSION_FILM_HISTORY_KEY = 'nfb_session_film_history'\n\nexport interface FilmHistory {\n  registry_id: number\n  timecode: number\n  percent: number\n  timestamp?: number\n  is_completed?: boolean\n}\n\nexport interface FilmHistoryState {\n  list: FilmHistory[],\n  status: undefined | 'loading' | 'succeeded' | 'failed',\n  countFilmHistory: number,\n}\n\nexport interface GetFilmHistoryParams {\n  is_completed?: boolean,\n  registry_ids?: number[],\n  per_page?: number,\n  page?: number\n}\n\nexport interface FilmHistoryReturnParams {\n  data: FilmHistory[],\n  count: number,\n}\n\nconst initialState: FilmHistoryState = {\n  list: fetchAllFromSessionStorage(SESSION_FILM_HISTORY_KEY).data ?? [],\n  status: undefined,\n  countFilmHistory: 0,\n}\n\nexport const fetchFilmHistory = createAsyncThunk<\n  FilmHistoryReturnParams,\n  GetFilmHistoryParams,\n  ThunkAPI\n  >('filmHistory/fetchFilmHistory', async ({ per_page, is_completed, page, registry_ids }, thunkAPI) => {\n    if (window.USER_CONNECTED) {\n      // user has data in session storage ?\n      // we need to sync\n      await postSessionStorage(SESSION_FILM_HISTORY_KEY, thunkAPI)\n\n      const response = await apiV4Client.call({\n        method: 'GET',\n        url: '/watch_history/films',\n        params: {\n          registry_ids: registry_ids?.join(','),\n          per_page,\n          is_completed,\n          page\n        }\n      })\n\n      if (response.status !== 200) {\n        throw new Error(`Response status: ${response.status}`)\n      }\n\n      return await response.data\n    } else {\n      // get from session storage\n      const sessionHistory = fetchAllFromSessionStorage(SESSION_FILM_HISTORY_KEY).data\n      return {\n        data: sessionHistory.filter((f: FilmHistory) => registry_ids?.includes(f.registry_id))\n      }\n    }\n  })\n\nexport const deleteFilmHistory = createAsyncThunk<\n  number | null,\n  number\n>('filmHistory/delete', async (registry_id: number): Promise<number | null> => {\n  const response = await apiV4Client.call({\n    method: 'DELETE',\n    url: `/watch_history/films/${registry_id}/`\n  })\n  return response.status === 204 ? registry_id : null\n})\n\nexport const filmHistorySlice = createSlice({\n  name: 'filmHistory',\n  initialState,\n  reducers: {\n    updateFilmHistoryList (state, action: PayloadAction<{data: FilmHistory[]}>) {\n      const tempList = uniqBy([\n        ...action.payload.data, // uniqBy keep first occurence\n        ...state.list\n      ], 'registry_id')\n\n      state.list = tempList.sort(sortByTimestamp)\n\n      // Record in local storage\n      if (!window.USER_CONNECTED && cookiesAreEnabled()) {\n        window.sessionStorage.setItem(SESSION_FILM_HISTORY_KEY, JSON.stringify(state.list))\n      }\n    }\n  },\n  extraReducers: builder => {\n    builder\n      .addCase(fetchFilmHistory.pending, state => {\n        state.status = 'loading'\n      })\n      .addCase(fetchFilmHistory.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.countFilmHistory = action.payload.count\n        filmHistorySlice.caseReducers.updateFilmHistoryList(state, action)\n      })\n      .addCase(fetchFilmHistory.rejected, state => {\n        state.status = 'failed'\n        // @todo: handle errors\n      })\n      .addCase(deleteFilmHistory.pending, (state) => {\n        state.status = 'loading'\n      })\n      .addCase(deleteFilmHistory.fulfilled, (state, action: PayloadAction<number|null>) => {\n        state.status = 'succeeded'\n        if (action.payload) {\n          state.list = state.list!.filter(b => b.registry_id !== action.payload)\n        }\n      })\n      .addCase(deleteFilmHistory.rejected, (state) => {\n        state.status = 'failed'\n      })\n  },\n  selectors: {\n    selectFilmHistoryById: (state: FilmHistoryState, id: number) => {\n      return state.list.find(item => item.registry_id === id)\n    },\n    selectFilmHistoryIds: (state: FilmHistoryState) => {\n      return state.list\n        .map(item => (item.registry_id) as number)\n    }\n  }\n})\n\nexport const {\n  selectFilmHistoryById,\n  selectFilmHistoryIds\n} = filmHistorySlice.getSelectors()\n\nexport const {\n  updateFilmHistoryList\n} = filmHistorySlice.actions\n\nexport default filmHistorySlice.reducer\n","import uniqBy from 'lodash/uniqBy'\nimport { createSlice, createAsyncThunk } from '@reduxjs/toolkit'\nimport { AxiosResponse } from 'axios'\n\nimport { PublicApiV5Client } from '@src/js/ApiClient'\nimport { NFBStore } from '@src/js/redux/store'\nimport { WorkCard } from '@src/js/redux/worksReducer'\nimport { ERROR_MESSAGE } from '@src/js/constants'\n\nconst publicApiV5Client = PublicApiV5Client.instance\n\nexport interface FilmDirector {\n  first_name: string,\n  last_name: string,\n  slug: string\n}\n\nexport interface APIFilmsResponse {\n  items: WorkCard[],\n  meta: {\n    age_level_range: {\n      min?: number,\n      max?: number\n    },\n    media: {\n      original_url: string,\n      thumbnail_url: string\n    },\n    pagination: {\n      page: number,\n      pages: number,\n      size: number,\n      total: number\n    },\n    year_range: {\n      min?: number,\n      max?: number\n    },\n    letter_count: object\n  }\n}\n\nexport interface GetFilmsParams {\n  idList?: number[],\n  subset?: 'nfb/public' | 'gc/gc-films' | 'nfb/indigenous-films' | 'nfb/published',\n  subject_category?: 'general' | 'education' | 'indigenous',\n  sort?: string,\n  language?: string,\n  subject?: string,\n  size?: number,\n  page?: number,\n  age_level_min?: number,\n  age_level_max?: number,\n  year_min?: number,\n  year_max?: number,\n  title_letter?: string\n}\n\nexport interface FilmsState {\n  list: WorkCard[] | null,\n  status: 'idle' | 'loading' | 'succeeded' | 'failed',\n  thumbnailPattern: string,\n  currentFetchParams: GetFilmsParams | null,\n  ageRange: {min?: number, max?: number} | null,\n  countFilms: number | null,\n  apiError: string | null,\n  letterCount: object | null,\n  yearRange: {min?: number, max?: number} | null\n}\n\nconst initialState: FilmsState = {\n  list: null,\n  status: 'idle',\n  thumbnailPattern: '',\n  currentFetchParams: null,\n  ageRange: null,\n  countFilms: null,\n  apiError: null,\n  letterCount: null,\n  yearRange: null\n}\n\nexport const fetchFilms = createAsyncThunk<\nAPIFilmsResponse, GetFilmsParams\n>('films/fetchFilms', async ({ idList, sort, language, subset = 'nfb/public', size = 24, subject, subject_category, page, age_level_min, age_level_max, year_min, year_max, title_letter }) => {\n  const response = await publicApiV5Client.call({\n    method: 'GET',\n    url: '/films',\n    params: {\n      locale: window.LOCALE,\n      subset,\n      size,\n      page,\n      ...(idList?.length\n        ? {\n          registry_ids: idList.join(','),\n          size: idList.length\n        }\n        : {}),\n      ...(sort ? { sort } : {}),\n      ...(language ? { language } : {}),\n      ...(subject ? { subject } : {}),\n      ...(subject_category ? { subject_category } : {}),\n      ...(age_level_min ? { age_level_min } : {}),\n      ...(age_level_max ? { age_level_max } : {}),\n      ...(year_min ? { year_min } : {}),\n      ...(year_max ? { year_max } : {}),\n      ...(title_letter ? { title_letter } : {})\n    }\n  }) as AxiosResponse\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n\n  return await response.data\n}, {\n  condition: (getFilmsParams, { getState }) => {\n    // Don't trigger dispatch if film ids from\n    // params already exists in list, or if they\n    // exist in a fetch currently in progress\n\n    const state = (getState() as NFBStore).films\n    const ids = [\n      ...(state.currentFetchParams?.idList ?? []),\n      ...(state.list?.map((w: WorkCard) => w.id) ?? [])]\n\n    if (ids.length && getFilmsParams.idList) {\n      const diff = getFilmsParams.idList?.filter(i => !ids.includes(i))\n      return !!diff?.length\n    }\n\n    return true\n  }\n})\n\nexport const filmsSlice = createSlice({\n  name: 'films',\n  initialState,\n  reducers: {\n    resetFilmList: (state) => {\n      state.list = []\n    }\n  },\n  extraReducers: builder => {\n    builder\n      .addCase(fetchFilms.pending, (state, action) => {\n        state.status = 'loading'\n        state.currentFetchParams = action.meta.arg\n      })\n      .addCase(fetchFilms.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.currentFetchParams = null\n        state.list = uniqBy([\n          ...(state.list ?? []),\n          ...action.payload.items\n        ], 'id')\n        state.thumbnailPattern = action.payload.meta.media.thumbnail_url\n        state.ageRange = action.payload.meta.age_level_range\n        state.countFilms = action.payload.meta.pagination.total\n        state.letterCount = action.payload.meta.letter_count\n        state.yearRange = action.payload.meta.year_range\n      })\n      .addCase(fetchFilms.rejected, (state, action) => {\n        state.status = 'failed'\n        state.apiError = ERROR_MESSAGE.API_ERROR\n      })\n  }\n})\n\nexport const { resetFilmList } = filmsSlice.actions\n\nexport default filmsSlice.reducer\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit'\n\nexport interface Filter {\n  language: string,\n  year_min: number,\n  year_max: number,\n  sort: string,\n  selectedLetter: string\n}\n\nexport interface Slider {\n  year_min: number,\n  year_max: number\n}\n\nexport interface IndigenousCinemaState {\n  currentPage: number,\n  selectedLetter: string | null,\n  filter: Filter | null,\n  sliderMinMax: Slider | null\n}\n\nconst initialState: IndigenousCinemaState = {\n  currentPage: 1,\n  selectedLetter: null,\n  filter: null,\n  sliderMinMax: null\n}\n\nexport const indigenousCinemaSlice = createSlice({\n  name: 'indigenousCinema',\n  initialState,\n  reducers: {\n    setSelectedLetter (state, action: PayloadAction<string|null>) {\n      state.selectedLetter = action.payload\n    },\n    setFilter (state, action: PayloadAction<Filter>) {\n      state.filter = action.payload\n    },\n    setSliderMinMax (state, action: PayloadAction<Slider>) {\n      state.sliderMinMax = action.payload\n    },\n    setCurrentPage (state, action: PayloadAction<number>) {\n      state.currentPage = action.payload\n    }\n  }\n})\n\nexport const {\n  setSelectedLetter, setFilter, setCurrentPage, setSliderMinMax\n} = indigenousCinemaSlice.actions\n\nexport default indigenousCinemaSlice.reducer\n","import { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'\nimport { ApiV4Client } from '@src/js/ApiClient'\n\ninterface GetLikesApiResponse {\n  data: [{ registry_id: number }]\n}\n\nexport interface LikesState {\n  list: number[] | null\n  status: undefined | 'loading' | 'succeeded' | 'failed',\n  currentLoadingId: number | null\n}\n\nconst initialState: LikesState = {\n  list: null,\n  status: undefined,\n  currentLoadingId: null\n}\n\nconst apiV4Client = ApiV4Client.instance\n\nexport const fetchLikeByRegistryId = createAsyncThunk<\n  GetLikesApiResponse,\n  number\n>('likes/fetch', async (registryId: number) => {\n  const response = await apiV4Client.call({\n    method: 'GET',\n    url: '/likes/',\n    params: {\n      registry_id: registryId\n    }\n  })\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n\n  return await response.data\n})\n\nexport const postLike = createAsyncThunk<\n  number | null,\n  number\n>('likes/add', async (registry_id: number): Promise<number|null> => {\n  const response = await apiV4Client.call({\n    method: 'POST',\n    url: `/likes/${registry_id}/`\n  })\n\n  return response.status === 201 ? registry_id : null\n})\n\nexport const deleteLike = createAsyncThunk<\n  number | null,\n  number\n>('likes/delete', async (registry_id: number): Promise<number | null> => {\n  const response = await apiV4Client.call({\n    method: 'DELETE',\n    url: `/likes/${registry_id}/`\n  })\n\n  return response.status === 204 ? registry_id : null\n})\n\nexport const likesSlice = createSlice({\n  name: 'likes',\n  initialState,\n  reducers: {\n    setLoadingItem: (state, action: PayloadAction<number|null>) => {\n      state.currentLoadingId = action.payload\n    }\n  },\n  extraReducers: (builder) => {\n    builder\n      .addCase(fetchLikeByRegistryId.pending, (state) => {\n        state.status = 'loading'\n        state.currentLoadingId = null\n      })\n      .addCase(fetchLikeByRegistryId.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.list = action.payload.data.map(i => i.registry_id)\n      })\n      .addCase(fetchLikeByRegistryId.rejected, (state) => {\n        state.status = 'failed'\n      })\n      .addCase(postLike.pending, (state, action) => {\n        state.status = 'loading'\n        state.currentLoadingId = action.meta.arg\n      })\n      .addCase(postLike.fulfilled, (state, action: PayloadAction<number|null>) => {\n        state.status = 'succeeded'\n        state.currentLoadingId = null\n        if (state.list !== null && action.payload) {\n          state.list.unshift(action.payload)\n        }\n      })\n      .addCase(postLike.rejected, (state) => {\n        state.status = 'failed'\n      })\n      .addCase(deleteLike.pending, (state, action) => {\n        state.status = 'loading'\n        state.currentLoadingId = action.meta.arg\n      })\n      .addCase(deleteLike.fulfilled, (state, action: PayloadAction<number|null>) => {\n        state.status = 'succeeded'\n        state.currentLoadingId = null\n        if (action.payload) {\n          state.list = state.list!.filter(b => b !== action.payload)\n        }\n      })\n      .addCase(deleteLike.rejected, (state) => {\n        state.status = 'failed'\n      })\n  },\n  selectors: {\n    selectIdIsLoading: (state: LikesState, id: number): boolean => {\n      return state.status === 'loading' && state.currentLoadingId === id\n    },\n    selectIdHasError: (state: LikesState, id: number): boolean => {\n      return state.status === 'failed' && state.currentLoadingId === id\n    },\n    selectIdIsLiked: (state: LikesState, id: number): boolean => {\n      return state.list !== null && state.list.includes(id)\n    }\n  }\n})\n\nexport const {\n  selectIdIsLiked,\n  selectIdIsLoading,\n  selectIdHasError\n} = likesSlice.getSelectors()\n\nexport default likesSlice.reducer\n","import { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'\nimport { AxiosResponse } from 'axios'\n\nimport { PublicApiV5Client } from '@src/js/ApiClient'\nimport { ERROR_MESSAGE } from '../constants'\n\nconst publicApiV5Client = PublicApiV5Client.instance\n\nexport interface NationInfo {\n  name?: string\n  slug?: string\n}\n\nexport interface APINationResponse {\n  items: NationInfo[],\n  meta: {\n    pagination: {\n      page: number,\n      pages: number,\n      size: number,\n      total: number\n    }\n  }\n}\n\nexport interface NationsState {\n  list: NationInfo[] | null,\n  status: undefined | 'loading' | 'succeeded' | 'failed',\n  apiError: string | null\n}\n\nconst initialState: NationsState = {\n  list: null,\n  status: undefined,\n  apiError: null\n}\n\nexport const fetchNationList = createAsyncThunk<\nAPINationResponse, void\n>('nations/fetchNationList', async () => {\n  const response = await publicApiV5Client.call({\n    method: 'GET',\n    url: '/nations',\n    params: {\n      locale: window.LOCALE\n    }\n  }) as AxiosResponse\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n  return await response.data\n})\n\nexport const nationsSlice = createSlice({\n  name: 'nations',\n  initialState,\n  reducers: {\n    updateList (state: NationsState, action: PayloadAction<{items: NationInfo[]}>) {\n      const tempList = [\n        { name: window.pgettext('indigenous-cinema', 'All nations/people'), slug: 'all_nations' },\n        ...action.payload.items\n      ]\n\n      state.list = tempList\n    }\n  },\n  extraReducers: builder => {\n    builder\n      .addCase(fetchNationList.pending, (state) => {\n        state.status = 'loading'\n      })\n      .addCase(fetchNationList.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        nationsSlice.caseReducers.updateList(state, action)\n      })\n      .addCase(fetchNationList.rejected, (state) => {\n        state.status = 'failed'\n        state.apiError = ERROR_MESSAGE.API_ERROR\n      })\n  }\n})\n\nexport default nationsSlice.reducer\n","import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'\nimport type { PayloadAction } from '@reduxjs/toolkit'\nimport { AxiosResponse } from 'axios'\n\nimport { PlayerOptions } from '@src/js/types/Player'\nimport { ApiV4Client } from '@src/js/ApiClient'\nimport { ThunkAPI } from '@src/js/redux/store'\n\nexport enum PlayerError {\n  NO_SLUG_OR_STREAM_TYPE = 'no-slug-or-stream-type',\n  NO_PLAYER_OPTIONS = 'no-player-options',\n  NO_SOURCE = 'no-source',\n  VIDEO_JS = 'video-js',\n  GEOBLOCKED = 'geoblocked',\n  GENERIC = 'generic',\n}\n\nexport type StreamTypes =\n  | 'films' | 'trailers' | 'making_ofs' | 'clips' | 'interviews'\n  | 'promo_clips' | 'education_exclusives'\n\ninterface StreamData {\n  hls: string\n  hls_dv: string | undefined\n}\n\nexport interface StreamFetchResponse {\n  registryId: number\n  slug: string,\n  streamType: StreamTypes\n  source: string | undefined\n  dvSource: string | undefined\n}\n\n// We need this 3 infos to identify player\n// Extras work have the same registry id as the main work\nexport interface PlayerUniqId {\n  registryId: number,\n  slug: string,\n  streamType: StreamTypes,\n  isExtra?: boolean\n}\n\nexport interface PlayerOptionsList {\n  [key: string]: PlayerOptions\n}\n\nexport interface PlayersState {\n  // Player options retrieve with window.PLAYER_OPTIONS\n  playerOptionsList: PlayerOptionsList|null,\n  queue: number[],\n  currentPlaying: PlayerUniqId|null,\n  currentError: PlayerError|null,\n  isLoading: boolean,\n  nextIdReturnedByAPI: number|null\n}\n\nconst initialState: PlayersState = {\n  playerOptionsList: null,\n  queue: [],\n  currentPlaying: null,\n  currentError: null,\n  isLoading: true,\n  nextIdReturnedByAPI: null\n}\n\nconst apiV4Client = ApiV4Client.instance\n\nexport const fetchStream = createAsyncThunk<\n  StreamFetchResponse, PlayerUniqId, ThunkAPI\n>('players/fetchStream', async ({ registryId, slug, streamType }) => {\n  let streamData: StreamData | null = null\n  const streamResponse: AxiosResponse = await apiV4Client.call({\n    method: 'GET',\n    url: `${streamType}/${slug}/stream`\n  })\n\n  if (streamResponse.status === 200) {\n    streamData = await streamResponse.data\n  }\n\n  return {\n    registryId,\n    slug,\n    streamType,\n    source: streamData?.hls,\n    dvSource: streamData?.hls_dv\n  }\n})\n\nexport const playersSlice = createSlice({\n  name: 'players',\n  initialState,\n  reducers: {\n    addToPlayerOptionsList (state: PlayersState, action: PayloadAction<PlayerOptionsList|null>) {\n      state.playerOptionsList = {\n        ...(state.playerOptionsList ?? {}),\n        ...action.payload\n      }\n    },\n    setQueue (state: PlayersState, action: PayloadAction<number[]>) {\n      state.queue = action.payload\n    },\n    setCurrentPlaying (state: PlayersState, action: PayloadAction<PlayerUniqId|null>) {\n      state.currentPlaying = action.payload\n    },\n    setCurrentError (state: PlayersState, action: PayloadAction<PlayerError|null>) {\n      state.currentError = action.payload\n    },\n    setIsLoading (state: PlayersState, action: PayloadAction<boolean>) {\n      state.isLoading = action.payload\n    },\n    setNextIdReturnedByAPI (state: PlayersState, action: PayloadAction<number|null>) {\n      state.nextIdReturnedByAPI = action.payload\n    },\n    // Modify player options: currently only used in Cypress tests\n    modifyPlayerOptions (state, action: PayloadAction<Record<number, PlayerOptions>>) {\n      const id = parseInt(Object.keys(action.payload)[0])\n      const existingOptions = state.playerOptionsList && id in state.playerOptionsList\n        ? state.playerOptionsList[id]\n        : {}\n      const options = {\n        ...existingOptions,\n        ...action.payload[id]\n      }\n      state.playerOptionsList = {\n        ...(state.playerOptionsList ?? {}),\n        [id]: options\n      }\n    },\n    // Invalidate stream data: currently only used in Cypress tests\n    invalidateStreamDataForWork (state, action: PayloadAction<number>) {\n      const registryId = action.payload\n      if (state.playerOptionsList && registryId in state.playerOptionsList) {\n        state.playerOptionsList[registryId] = {\n          ...state.playerOptionsList[registryId],\n          source: '',\n          dvSource: ''\n        }\n      }\n    }\n  },\n  extraReducers: builder => {\n    builder\n      .addCase(fetchStream.fulfilled, (state: PlayersState, action: PayloadAction<StreamFetchResponse>) => {\n        const { registryId, source, dvSource } = action.payload\n\n        // Add source to player options\n        if (source && state.playerOptionsList && state.playerOptionsList[registryId]) {\n          state.playerOptionsList[registryId] = {\n            ...state.playerOptionsList[registryId],\n            source,\n            dvSource\n          }\n        }\n      })\n  },\n  selectors: {\n    selectPlayerOptionsByRegistryId (state: PlayersState, registryId: number) {\n      if (!state.playerOptionsList) { return null }\n\n      return state.playerOptionsList[registryId]\n    },\n    selectNextInQueue: (state: PlayersState, currentRegistryId: number) => {\n      if (state.nextIdReturnedByAPI) {\n        return state.nextIdReturnedByAPI\n      }\n\n      let next\n      const indexOfCurrent = state.queue.indexOf(currentRegistryId)\n      const indexOfNext = indexOfCurrent + 1\n      if (indexOfNext > state.queue.length - 1) {\n        next = state.queue[0]\n      } else {\n        next = state.queue[indexOfNext]\n      }\n      return next\n    }\n  }\n})\n\nexport const {\n  selectPlayerOptionsByRegistryId,\n  selectNextInQueue\n} = playersSlice.getSelectors()\n\nexport const {\n  addToPlayerOptionsList,\n  setQueue,\n  setCurrentPlaying,\n  setCurrentError,\n  setIsLoading,\n  setNextIdReturnedByAPI,\n  modifyPlayerOptions,\n  invalidateStreamDataForWork\n} = playersSlice.actions\n\nexport default playersSlice.reducer\n","import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit'\nimport uniqBy from 'lodash/uniqBy'\n\nimport { ApiV4Client } from '@src/js/ApiClient'\nimport { ThunkAPI } from '@src/js/redux/store'\n\nconst apiV4Client = ApiV4Client.instance\n\nexport interface Playlist {\n  url: string,\n  slug: string,\n  title: string,\n  description: string,\n  thumbnails: string[],\n  thumbnail_mode: string\n}\n\nexport interface PlaylistTab {\n  slug: string,\n  items: Playlist[]\n}\n\nexport interface PlaylistTabsState {\n  list: PlaylistTab[]\n  status: undefined | 'loading' | 'succeeded' | 'failed'\n  currentLoadingSlug: string | undefined\n  thumbnailPattern: string\n}\n\nconst initialState: PlaylistTabsState = {\n  list: [],\n  status: undefined,\n  currentLoadingSlug: undefined,\n  thumbnailPattern: window.THUMBNAIL_PATTERN\n}\n\nexport const fetchPlaylistTab = createAsyncThunk<\n  PlaylistTab,\n  string,\n  ThunkAPI\n>('playlistTabs/fetchBySlug', async (slug, ThunkAPI) => {\n  const response = await apiV4Client.call({\n    method: 'GET',\n    url: `/playlist_tabs/${slug}/playlists`,\n    params: {\n      per_page: 70\n    }\n  })\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n\n  const data = await response.data\n\n  ThunkAPI.dispatch(playlistTabsSlice.actions.setThumbnailPattern(data.meta.mixed_media.thumbnail_url))\n\n  const items = data.data\n\n  return {\n    slug,\n    items\n  }\n})\n\nexport const playlistTabsSlice = createSlice({\n  name: 'playlistTabs',\n  initialState,\n  reducers: {\n    setCurrentLoadingSlug: (state: PlaylistTabsState, action: PayloadAction<string>) => {\n      state.currentLoadingSlug = action.payload\n    },\n    setThumbnailPattern: (state: PlaylistTabsState, action: PayloadAction<string>) => {\n      state.thumbnailPattern = action.payload\n    }\n  },\n  extraReducers: builder => {\n    builder\n      .addCase(fetchPlaylistTab.pending, state => {\n        state.status = 'loading'\n      })\n      .addCase(fetchPlaylistTab.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        const tempList = uniqBy([\n          action.payload,\n          ...state.list\n        ], 'slug')\n\n        state.list = tempList\n      })\n      .addCase(fetchPlaylistTab.rejected, (state) => {\n        state.status = 'failed'\n      })\n  },\n  selectors: {\n    selectBySlug: (state: PlaylistTabsState, slug: string): PlaylistTab | null => {\n      return state.list.find(item => item.slug === slug) ?? null\n    }\n  }\n})\nexport const {\n  selectBySlug\n} = playlistTabsSlice.getSelectors()\n\nexport default playlistTabsSlice.reducer\n","import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'\nimport { ApiV4Client } from '@src/js/ApiClient'\nimport { DEFAULT_LIST_LENGTH } from '@src/js/constants'\n\nconst apiV4Client = ApiV4Client.instance\n\nexport interface RecommendationsState {\n  list: number[] | undefined\n  status: 'idle' | 'loading' | 'succeeded' | 'failed'\n}\n\nconst initialState: RecommendationsState = {\n  list: undefined,\n  status: 'idle'\n}\n\nexport interface GetRecommendationsParams {\n  slug: string,\n  workType: string\n}\n\nexport const fetchRecommendations = createAsyncThunk<\n  number[], GetRecommendationsParams\n>('recommendations/fetch', async ({ slug, workType }) => {\n  const recommendationsResponse = await apiV4Client.call({\n    method: 'GET',\n    url: `${workType}/${slug}/recommendations`,\n    params: {\n      size: DEFAULT_LIST_LENGTH + 1\n    }\n  })\n\n  const ids = (await recommendationsResponse.data).data.map((item: any) => item.registry_id)\n  return ids\n})\n\nexport const recommendationsSlice = createSlice({\n  name: 'recommendations',\n  initialState,\n  reducers: {},\n  extraReducers: builder => {\n    builder\n      .addCase(fetchRecommendations.pending, state => {\n        state.status = 'loading'\n      })\n      .addCase(fetchRecommendations.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.list = action.payload ?? []\n      })\n      .addCase(fetchRecommendations.rejected, (state) => {\n        state.status = 'failed'\n      })\n  }\n})\n\nexport default recommendationsSlice.reducer\n","import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'\n\nimport { PublicApiV5Client } from '@src/js/ApiClient'\nimport { WorkCard, addWorkToList, fetchWorks } from '@src/js/redux/worksReducer'\nimport { store, ThunkAPI } from '@src/js/redux/store'\nimport { setQueue } from '@src/js/redux/playersReducer'\nimport { selectFilmHistoryById } from '@src/js/redux/filmHistoryReducer'\n\nconst publicApiV5Client = PublicApiV5Client.instance\n\nconst API_ENDPOINT_FOR_TYPE = {\n  collection: 'collections',\n  series: 'series'\n}\n\nexport type Season = {\n  id: number\n  slug: string\n  title: string\n  number: number\n  year: number\n  episodes: WorkCard[]\n}\n\nexport type SeriesCard = {\n  seasons: Season[]\n} & WorkCard\n\nexport interface SeriesApiResponse {\n  item: SeriesCard\n}\n\ntype EpisodesList = Record<number, number[]>\n\nexport interface SeriesPageState {\n  seriesRegistryId: number | null\n  seriesSlug: string | null\n  seriesType: string | null\n  displayedSeasonNumber: number | null\n  displayedSeasonTitle: string | null\n  seasonList: Season[]\n  episodesList: EpisodesList,\n  allEpisodeIdList: number[],\n}\n\nconst initialState: SeriesPageState = {\n  seriesRegistryId: null,\n  seriesSlug: null,\n  seriesType: null,\n  displayedSeasonNumber: null,\n  displayedSeasonTitle: null,\n  seasonList: [],\n  episodesList: {},\n  allEpisodeIdList: []\n}\n\nexport const fetchSeries = createAsyncThunk<\n  SeriesApiResponse, void, ThunkAPI\n>('seriesPage/fetchSeries', async (_, thunkAPI) => {\n  const state = thunkAPI.getState().seriesPage\n\n  const seriesEndpoint = state.seriesType\n    ? API_ENDPOINT_FOR_TYPE[state.seriesType as keyof typeof API_ENDPOINT_FOR_TYPE]\n    : API_ENDPOINT_FOR_TYPE.series\n\n  const response = await publicApiV5Client.call({\n    method: 'GET',\n    url: `/${seriesEndpoint}/${state.seriesSlug}`\n  })\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n\n  const seriesData = await response.data as SeriesApiResponse\n  thunkAPI.dispatch(addWorkToList([seriesData.item]))\n\n  const seasons: Season[] = seriesData.item.seasons\n  const episodesList: EpisodesList = {}\n  const episodesIdsList: number[] = []\n  seasons.forEach(s => {\n    const idsList = s.episodes.map(e => e.id)\n    episodesList[s.number] = idsList\n    episodesIdsList.push(...idsList)\n  })\n\n  thunkAPI.dispatch(setEpisodesList(episodesList))\n  thunkAPI.dispatch(setAllEpisodeIdList(episodesIdsList))\n  await thunkAPI.dispatch(fetchWorks({ idList: episodesIdsList }))\n\n  if (seriesData.item.category === 'collection') {\n    const reversesSeasons = [...seasons].reverse()\n    const reverseEpisodesList = reversesSeasons.map(s => s.episodes.map(e => e.id)).flat()\n    thunkAPI.dispatch(setQueue(reverseEpisodesList))\n    thunkAPI.dispatch(setSeasonList(reversesSeasons))\n  } else {\n    thunkAPI.dispatch(setQueue(episodesIdsList))\n    thunkAPI.dispatch(setSeasonList(seasons))\n  }\n\n  return seriesData\n})\n\nexport const seriesPageSlice = createSlice({\n  name: 'seriesPage',\n  initialState,\n  reducers: {\n    initSeries (state) {\n      state.seriesRegistryId = window.SERIES_ID\n      state.seriesSlug = window.SERIES_SLUG\n      state.seriesType = window.SERIES_TYPE\n      state.displayedSeasonNumber = parseInt(window.SEASON_NUMBER)\n      state.displayedSeasonTitle = window.SEASON_TITLE\n    },\n    setDisplayedSeasonNumber (state, action) {\n      state.displayedSeasonNumber = action.payload\n    },\n    setDisplayedSeasonTitle (state, action) {\n      state.displayedSeasonTitle = action.payload\n    },\n    setSeasonList (state, action) {\n      state.seasonList = action.payload\n      // when seasonList is updated,\n      // check if displayedSeasonNumber is valid\n      // otherwhise, take the first season's number\n      if (state.displayedSeasonNumber) {\n        const validSeason = (state.displayedSeasonNumber in state.episodesList)\n        if (!validSeason) {\n          state.displayedSeasonNumber = state.seasonList[0].number\n          state.displayedSeasonTitle = state.seasonList[0].title\n        }\n      }\n    },\n    setEpisodesList (state, action) {\n      state.episodesList = action.payload\n    },\n    setAllEpisodeIdList (state, action) {\n      state.allEpisodeIdList = action.payload\n    }\n  },\n  selectors: {\n    selectCurrentEpisodesList: (state) => {\n      const currentSeason = state.displayedSeasonNumber\n      if (!currentSeason || !(currentSeason in state.episodesList)) return null\n\n      return state.episodesList[currentSeason]\n    },\n    selectSeriesIsCompleted: (state) => {\n      let allCompleted = true\n      state.allEpisodeIdList?.some(registryId => {\n        const filmHistory = selectFilmHistoryById(store.getState().filmHistory, registryId)\n\n        // If no history found, episode/film not started\n        if (!filmHistory || filmHistory.is_completed === false) {\n          allCompleted = false\n          return true\n        }\n\n        return false\n      })\n\n      return allCompleted\n    }\n  }\n})\n\nexport const {\n  initSeries,\n  setDisplayedSeasonNumber,\n  setDisplayedSeasonTitle,\n  setSeasonList,\n  setEpisodesList,\n  setAllEpisodeIdList\n} = seriesPageSlice.actions\n\nexport const {\n  selectCurrentEpisodesList,\n  selectSeriesIsCompleted\n} = seriesPageSlice.getSelectors()\n\nexport default seriesPageSlice.reducer\n","import { PayloadAction } from '@reduxjs/toolkit'\n\nimport rootStore from '@web-nfb/workshop-frontend/src/store'\nimport { FilmHistory, updateFilmHistoryList } from '@src/js/redux/filmHistoryReducer'\n\nconst historyMiddleware = (store: typeof rootStore) => (next: (action: PayloadAction<FilmHistory>) => void) => async (action: PayloadAction<FilmHistory>) => {\n  if (action.type.match(/workHistory\\/post\\/fulfilled/)) {\n    // Before saving to work history, we want to save item in film history\n    store.dispatch(updateFilmHistoryList({ data: [action.payload] }))\n  }\n  next(action)\n}\n\nexport default historyMiddleware\n","import { PayloadAction } from '@reduxjs/toolkit'\nimport { setDisplayedSeasonNumber, setDisplayedSeasonTitle, Season } from '@src/js/redux/seriesPageReducer'\n\nconst seriesMiddleware = (store: any) => (next: any) => async (action: PayloadAction<any>) => {\n  if (action.type.match('workPage/setDisplayedRegistryId/fulfilled')) {\n    const seriesPageState = store.getState().seriesPage\n    // When changing displayed registry id, also change displayed season in episodes list if necessary.\n    const registryId = action.payload as number\n    let seasonNumber: string | null = null\n\n    const episodesListEntries = Object.entries(seriesPageState.episodesList)\n    for (const [number, list] of episodesListEntries) {\n      if ((list as number[]).includes((registryId))) {\n        seasonNumber = number\n        break\n      }\n    }\n\n    if (seasonNumber && seriesPageState.displayedSeasonNumber !== seasonNumber) {\n      const seasonNumberInt = parseInt(seasonNumber)\n      const seasonTitle = seriesPageState.seasonList.find((season: Season) => season.number === seasonNumberInt).title\n      store.dispatch(setDisplayedSeasonNumber(seasonNumberInt))\n      store.dispatch(setDisplayedSeasonTitle(seasonTitle))\n    }\n    next(action)\n  } else {\n    next(action)\n  }\n}\n\nexport default seriesMiddleware\n","import { PayloadAction } from '@reduxjs/toolkit'\n\nimport { selectWorkById, WorkCard } from '@src/js/redux/worksReducer'\nimport { setDisplayedWork } from '@src/js/redux/workPageReducer'\n\nconst workPageWiddleware = (store: any) => (next: any) => async (action: PayloadAction<any>) => {\n  if (action.type.match('workPage/setDisplayedRegistryId/fulfilled')) {\n    // When changing displayed registry id, update displayed work if found.\n    const registryId = action.payload as number\n    const work: WorkCard | null = selectWorkById(store.getState().works, registryId)\n    if (work) {\n      store.dispatch(setDisplayedWork(work))\n    }\n    next(action)\n  } else {\n    next(action)\n  }\n}\n\nexport default workPageWiddleware\n","import { configureStore } from '@reduxjs/toolkit'\n\nimport bookmarksReducer, { BookmarksState } from '@src/js/redux/bookmarksReducer'\nimport workHistoryReducer, { WorkHistoryState } from '@src/js/redux/workHistoryReducer'\nimport worksReducer, { WorksState } from '@src/js/redux/worksReducer'\nimport filmHistoryReducer, { FilmHistoryState } from '@src/js/redux/filmHistoryReducer'\nimport workPageReducer, { WorkPageState } from '@src/js/redux/workPageReducer'\nimport seriesPageReducer, { SeriesPageState } from '@src/js/redux/seriesPageReducer'\nimport playersReducer, { PlayersState } from '@src/js/redux/playersReducer'\nimport recommendationsReducer, { RecommendationsState } from '@src/js/redux/recommendationsReducer'\nimport userReducer, { UserState } from '@src/js/redux/userReducer'\nimport channelsReducer, { ChannelsState } from '@src/js/redux/channelsReducer'\nimport viewingHistoryReducer, { ViewingHistoryState } from '@src/js/redux/viewingHistoryReducer'\nimport subjectsReducer, { SubjectsState } from '@src/js/redux/subjectsReducer'\nimport indigenousCinemaReducer, { IndigenousCinemaState } from '@src/js/redux/indigenousCinemaReducer'\nimport nationsReducer, { NationsState } from '@src/js/redux/nationsReducer'\nimport directorsReducer, { DirectorsState } from '@src/js/redux/directorsReducer'\nimport filmsReducer, { FilmsState } from '@src/js/redux/filmsReducer'\nimport educationalSubjectPageReducer, { EducationalSubjectPageState } from '@src/js/redux/educationalSubjectPageReducer'\nimport likesReducer, { LikesState } from '@src/js/redux/likesReducer'\nimport playlistTabsReducer, { PlaylistTabsState } from '@src/js/redux//playlistTabsReducer'\nimport animatedHoverCardReducer, { AnimatedHoverCardState } from '@src/js/redux/animatedHoverCardReducer'\nimport carouselReducer, { CarouselState } from '@src/js/redux/carouselReducer'\nimport exploreBySubjectReducer, { ExploreBySubjectState } from '@src/js/redux/exploreBySubjectReducer'\nimport directorsPageReducer, { DirectorsPageState } from '@src/js/redux/directorsPageReducer'\nimport exploreByWorkPageReducer, { ExploreByWorkPageState } from '@src/js/redux/exploreByWorkPageReducer'\nimport crossPlatformNavReducer, { CrossPlatformNavState } from '@src/js/redux/crossPlatformNavReducer'\n\nimport historyMiddleware from '@src/js/redux/historyMiddleware'\nimport seriesMiddleware from '@src/js/redux/seriesMiddleware'\nimport workPageWiddleware from '@src/js/redux/workPageMiddleware'\n\nexport type NFBStore = {\n  bookmarks: BookmarksState\n  channels: ChannelsState\n  filmHistory: FilmHistoryState\n  players: PlayersState\n  recommendations: RecommendationsState\n  seriesPage: SeriesPageState\n  workHistory: WorkHistoryState\n  workPage: WorkPageState\n  user: UserState\n  works: WorksState\n  viewingHistory: ViewingHistoryState\n  subjects: SubjectsState\n  indigenousCinema: IndigenousCinemaState\n  directors: DirectorsState\n  nations: NationsState\n  films: FilmsState\n  educationalSubjectPage: EducationalSubjectPageState\n  likes: LikesState\n  playlistTabs: PlaylistTabsState\n  animatedHoverCard: AnimatedHoverCardState\n  carousel: CarouselState\n  exploreBySubject: ExploreBySubjectState\n  directorsPage: DirectorsPageState,\n  exploreByWorkPage: ExploreByWorkPageState,\n  crossPlatformNav: CrossPlatformNavState\n}\n\nexport const store = configureStore({\n  reducer: {\n    bookmarks: bookmarksReducer,\n    channels: channelsReducer,\n    filmHistory: filmHistoryReducer,\n    players: playersReducer,\n    recommendations: recommendationsReducer,\n    seriesPage: seriesPageReducer,\n    workHistory: workHistoryReducer,\n    workPage: workPageReducer,\n    user: userReducer,\n    works: worksReducer,\n    viewingHistory: viewingHistoryReducer,\n    subjects: subjectsReducer,\n    indigenousCinema: indigenousCinemaReducer,\n    directors: directorsReducer,\n    nations: nationsReducer,\n    films: filmsReducer,\n    educationalSubjectPage: educationalSubjectPageReducer,\n    likes: likesReducer,\n    playlistTabs: playlistTabsReducer,\n    animatedHoverCard: animatedHoverCardReducer,\n    carousel: carouselReducer,\n    exploreBySubject: exploreBySubjectReducer,\n    directorsPage: directorsPageReducer,\n    exploreByWorkPage: exploreByWorkPageReducer,\n    crossPlatformNav: crossPlatformNavReducer\n  },\n  // @ts-expect-error The expected type comes from property 'middleware' which is declared here on type 'ConfigureStoreOptions'\n  middleware: (getDefaultMiddleware) => {\n    return getDefaultMiddleware().concat(\n      historyMiddleware,\n      seriesMiddleware,\n      workPageWiddleware\n    )\n  }\n})\n\nexport type RootState = ReturnType<typeof store.getState>\nexport type AppDispatch = typeof store.dispatch\nexport type ThunkAPI = {\n  dispatch: AppDispatch,\n  state: RootState\n}\n\nif (window.Cypress) {\n  window.redux = store\n}\n","import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'\nimport { AxiosResponse } from 'axios'\n\nimport { PublicApiV5Client } from '@src/js/ApiClient'\nimport { ERROR_MESSAGE } from '../constants'\n\nconst publicApiV5Client = PublicApiV5Client.instance\n\ntype SubjectsCategory = 'general' | 'education' | 'indigenous'\n\nexport interface SubjectBaseInfo {\n  name: string\n  slug: string\n  category_type: string\n}\n\nexport interface SubjectInfo extends SubjectBaseInfo {\n  highlight: boolean\n  image?: string\n  short_name?: string\n}\n\nexport interface SubjectDetailInfo extends SubjectBaseInfo {\n  children?: SubjectBaseInfo[]\n}\n\nexport interface APISubjectsResponse {\n  items: SubjectInfo[],\n  meta: {\n    pagination: {\n      page: number,\n      pages: number,\n      size: number,\n      total: number\n    },\n    media: {\n      thumbnail_url: string\n    }\n  }\n}\n\nexport interface APISubjectsBySlugResponse {\n  item: SubjectDetailInfo\n}\n\nexport interface GetSubjectsParams {\n  category_type?: SubjectsCategory,\n  page?: number,\n  size?: number,\n  highlight?: boolean\n}\n\nexport interface GetSubjectsBySlugParams {\n  category_type?: SubjectsCategory,\n  slug?: string,\n}\n\nexport interface GetSubjectsByChildParams {\n  category_type?: SubjectsCategory,\n  slug?: string,\n  childSlug?: string\n}\n\nexport interface SubjectsState {\n  list: SubjectInfo[] | null,\n  status: undefined | 'loading' | 'succeeded' | 'failed',\n  subjectBySlugDetail: SubjectDetailInfo | null,\n  subjectDetail: SubjectBaseInfo | null,\n  apiError: string | null,\n  thumbnailPattern: string\n}\n\nconst initialState: SubjectsState = {\n  list: null,\n  status: undefined,\n  subjectBySlugDetail: null,\n  subjectDetail: null,\n  apiError: null,\n  thumbnailPattern: window.THUMBNAIL_PATTERN\n}\n\nexport const getSubjectsAPI = async ({ category_type, page, size, highlight }: GetSubjectsParams) => {\n  const response = await publicApiV5Client.call({\n    method: 'GET',\n    url: '/subjects',\n    params: {\n      category_type,\n      page,\n      locale: window.LOCALE,\n      size,\n      highlight\n    }\n  }) as AxiosResponse\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n  return await response.data\n}\n\nexport const fetchSubjectList = createAsyncThunk<\n  APISubjectsResponse, GetSubjectsParams\n>('subjects/fetchSubjectList', async ({ category_type, page, size, highlight }) => {\n  return getSubjectsAPI({ category_type, page, size, highlight })\n})\n\nexport const fetchSubjectBySlug = createAsyncThunk<\nAPISubjectsBySlugResponse, GetSubjectsBySlugParams\n>('subjects/fetchSubjectBySlug', async ({ slug, category_type }) => {\n  const response = await publicApiV5Client.call({\n    method: 'GET',\n    url: `/subjects/${slug}`,\n    params: {\n      category_type,\n      locale: window.LOCALE\n    }\n  }) as AxiosResponse\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n  return await response.data\n})\n\nexport const fetchSubjectByChildSlug = createAsyncThunk<\nAPISubjectsBySlugResponse, GetSubjectsByChildParams\n>('subjects/fetchSubjectByChildSlug', async ({ slug, childSlug, category_type }) => {\n  const response = await publicApiV5Client.call({\n    method: 'GET',\n    url: `/subjects/${slug}/children/${childSlug}`,\n    params: {\n      category_type,\n      locale: window.LOCALE\n    }\n  }) as AxiosResponse\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n  return await response.data\n})\n\nexport const subjectsSlice = createSlice({\n  name: 'subjects',\n  initialState,\n  reducers: {},\n  extraReducers: builder => {\n    builder\n      .addCase(fetchSubjectList.pending, (state) => {\n        state.status = 'loading'\n      })\n      .addCase(fetchSubjectList.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.list = action.payload.items\n        state.thumbnailPattern = action.payload.meta.media.thumbnail_url\n      })\n      .addCase(fetchSubjectList.rejected, (state) => {\n        state.status = 'failed'\n        state.apiError = ERROR_MESSAGE.API_ERROR\n      })\n      .addCase(fetchSubjectBySlug.pending, (state) => {\n        state.status = 'loading'\n      })\n      .addCase(fetchSubjectBySlug.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.subjectBySlugDetail = action.payload.item\n      })\n      .addCase(fetchSubjectBySlug.rejected, (state) => {\n        state.status = 'failed'\n        state.apiError = ERROR_MESSAGE.API_ERROR\n      })\n      .addCase(fetchSubjectByChildSlug.pending, (state) => {\n        state.status = 'loading'\n      })\n      .addCase(fetchSubjectByChildSlug.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.subjectDetail = action.payload.item\n      })\n      .addCase(fetchSubjectByChildSlug.rejected, (state) => {\n        state.status = 'failed'\n        state.apiError = ERROR_MESSAGE.API_ERROR\n      })\n  },\n  selectors: {\n    selectHighlight: (state: SubjectsState) => {\n      return state.list?.filter(s => s.highlight === true)\n    },\n    selectNotHighlight: (state: SubjectsState) => {\n      return state.list?.filter(s => s.highlight === false)\n    }\n  }\n})\n\nexport const {\n  selectHighlight,\n  selectNotHighlight\n} = subjectsSlice.getSelectors()\n\nexport default subjectsSlice.reducer\n","import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'\n\nimport { ApiV4Client } from '@src/js/ApiClient'\nimport { WorkCard, fetchWorks } from '@src/js/redux/worksReducer'\nimport { ThunkAPI } from '@src/js/redux/store'\nimport { DEFAULT_LIST_LENGTH } from '@src/js/constants'\n\nconst apiV4Client = ApiV4Client.instance\n\ninterface Rental {\n  registry_id: number\n  expiration: number\n}\n\nexport interface UserState {\n  isConnected: boolean\n  rentals: Rental[]\n  recommendations: number[]\n  similarTaste: number[]\n}\n\nconst initialState: UserState = {\n  isConnected: window.USER_CONNECTED,\n  rentals: [],\n  recommendations: [],\n  similarTaste: []\n}\n\nexport interface GetRentalsParams {\n  include_expired?: boolean,\n}\n\nexport const fetchRentals = createAsyncThunk<\n  Rental[], GetRentalsParams, ThunkAPI\n>('user/fetchRentals', async ({ include_expired = true }, thunkAPI) => {\n  if (thunkAPI.getState().user.isConnected) {\n    const response = await apiV4Client.call({\n      method: 'GET',\n      url: '/rentals',\n      params: {\n        include_expired\n      }\n    })\n\n    const idsList = await response.data.data.map((r: any) => r.registry_id)\n    await thunkAPI.dispatch(fetchWorks({ idList: idsList }))\n\n    return (await response.data).data\n  }\n\n  return []\n})\n\nexport const fetchUserRecommendations = createAsyncThunk<\n  number[], number, ThunkAPI\n>('user/fetchRecommendations', async (size = DEFAULT_LIST_LENGTH, thunkAPI) => {\n  if (thunkAPI.getState().user.isConnected) {\n    const response = await apiV4Client.call({\n      method: 'GET',\n      url: '/recommendations',\n      params: {\n        size,\n        language: window.LOCALE\n      }\n    })\n\n    return (await response.data).data\n  }\n\n  return []\n})\n\nexport const fetchUserSimilarTaste = createAsyncThunk<\n  number[], number, ThunkAPI\n>('user/fetchSimilarTaste', async (size = DEFAULT_LIST_LENGTH, thunkAPI) => {\n  if (thunkAPI.getState().user.isConnected) {\n    const response = await apiV4Client.call({\n      method: 'GET',\n      url: '/similar_taste',\n      params: {\n        size,\n        language: window.LOCALE\n      }\n    })\n\n    return (await response.data).data.map((item: { registry_id: number }) => item.registry_id)\n  }\n\n  return []\n})\n\nexport const userSlice = createSlice({\n  name: 'user',\n  initialState,\n  reducers: {},\n  extraReducers: builder => {\n    builder.addCase(fetchRentals.fulfilled, (state, action) => {\n      state.rentals = action.payload\n    })\n    builder.addCase(fetchUserRecommendations.fulfilled, (state, action) => {\n      state.recommendations = action.payload\n    })\n    builder.addCase(fetchUserSimilarTaste.fulfilled, (state, action) => {\n      state.similarTaste = action.payload\n    })\n  },\n  selectors: {\n    selectActiveRentalForWork: (state: UserState, work: WorkCard) => {\n      return state.rentals.find(r => r.registry_id === work.id)\n    }\n  }\n})\n\nexport const {\n  selectActiveRentalForWork\n} = userSlice.getSelectors()\n\nexport default userSlice.reducer\n","import { createSlice } from '@reduxjs/toolkit'\nimport type { PayloadAction } from '@reduxjs/toolkit'\n\nexport interface ViewingHistoryState {\n  currentPage: number,\n  isDeleting: boolean\n}\n\nconst initialState: ViewingHistoryState = {\n  currentPage: 1,\n  isDeleting: false\n}\n\nexport const viewingHistorySlice = createSlice({\n  name: 'viewingHistory',\n  initialState,\n  reducers: {\n    setCurrentPage (state, action: PayloadAction<number>) {\n      state.currentPage = action.payload\n    },\n    setIsDeleting (state, action: PayloadAction<boolean>) {\n      state.isDeleting = action.payload\n    }\n  }\n})\n\nexport const {\n  setCurrentPage,\n  setIsDeleting\n} = viewingHistorySlice.actions\n\nexport default viewingHistorySlice.reducer\n","/**\n * Work history used for continue watching carrousel or history listing.\n * We only want history information about the \"main\" work for series/collections\n */\nimport { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'\nimport uniqBy from 'lodash/uniqBy'\nimport uniq from 'lodash/uniq'\nimport { ApiV4Client } from '@src/js/ApiClient'\nimport { ThunkAPI } from '@src/js/redux/store'\n\nimport { FilmHistory, updateFilmHistoryList } from '@src/js/redux/filmHistoryReducer'\nimport { setNextIdReturnedByAPI } from '@src/js/redux/playersReducer'\nimport { fetchAllFromSessionStorage, postSessionStorage } from '@src/js/helpers/sessionStorage'\nimport { sortByTimestamp } from '@src/js/helpers/sort'\nimport { DEFAULT_LIST_LENGTH } from '@src/js/constants'\nimport { cookiesAreEnabled } from '@src/js/helpers/cookies'\n\nconst SESSION_WORK_HISTORY_KEY = 'nfb_session_work_history'\nconst apiV4Client = ApiV4Client.instance\n\nexport interface WorkHistory extends FilmHistory {\n  work?: { // only for series/collection type\n    is_completed?: boolean\n    registry_id: number,\n  }\n}\n\nexport interface UpdateWorkHistoryResponse {\n  code: string,\n  message: string\n}\n\nexport interface GetWatchHistoryParams {\n  is_completed?: boolean,\n  registry_id?: number,\n  per_page?: number,\n  page?: number\n}\n\nexport interface WorkHistoryState {\n  list: WorkHistory[],\n  continueWatchingList: WorkHistory[],\n  countContinueWatching: number,\n  countWatchHistory: number\n  status: undefined | 'idle' | 'loading' | 'succeeded' | 'failed'\n}\n\nexport interface WorkHistoryReturnParams {\n  data: WorkHistory[],\n  count: number,\n}\n\nexport const fetchAllFromApi = async (params: GetWatchHistoryParams) => {\n  const response = await apiV4Client.call({\n    method: 'GET',\n    url: '/watch_history/works',\n    params\n  })\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n\n  return await response.data\n}\n\nexport const fetchAll = createAsyncThunk<\n  WorkHistoryReturnParams,\n  GetWatchHistoryParams,\n  ThunkAPI\n  >('workHistory/fetchAll', async ({ per_page = DEFAULT_LIST_LENGTH, is_completed, registry_id, page }, thunkAPI) => {\n    if (window.USER_CONNECTED) {\n      // user has data in session storage ?\n      // we need to sync\n      await postSessionStorage(SESSION_WORK_HISTORY_KEY, thunkAPI)\n\n      return await fetchAllFromApi({ per_page, is_completed, page, registry_id })\n    } else {\n      let sessionHistory = fetchAllFromSessionStorage(SESSION_WORK_HISTORY_KEY)\n      if (registry_id) {\n        const filteredSessionHistory = sessionHistory.data.filter((f: WorkHistory) => f.work && registry_id === f.work.registry_id)\n        sessionHistory = {\n          data: filteredSessionHistory,\n          count: filteredSessionHistory.length\n        }\n      }\n      return sessionHistory\n    }\n  })\n\nexport const fetchAllContinueWatching = createAsyncThunk<\n  WorkHistoryReturnParams,\n  void,\n  ThunkAPI\n  >('workHistory/fetchAllContinueWatching', async (_, thunkAPI) => {\n    if (window.USER_CONNECTED) {\n      await postSessionStorage(SESSION_WORK_HISTORY_KEY, thunkAPI)\n      // Fetch one more than default list length to trigger see more card behavior if necessary.\n      return await fetchAllFromApi({ is_completed: false, per_page: DEFAULT_LIST_LENGTH + 1 })\n    } else {\n      return []\n    }\n  })\n\nexport const postHistory = createAsyncThunk<\nWorkHistory, WorkHistory, ThunkAPI\n>('workHistory/post', async (history, thunkAPI) => {\n  if (!history.timestamp) {\n    history.timestamp = Date.now()\n  }\n\n  if (window.USER_CONNECTED) {\n    const response = await apiV4Client.call({\n      method: 'POST',\n      url: '/watch_history/works',\n      data: history\n    })\n\n    if (response.status !== 200) {\n      throw new Error(`Response status: ${response.status}`)\n    }\n\n    const returnedHistory = (await response.data).data\n\n    // Only for series/collection\n    if (history.work?.registry_id !== history.registry_id) {\n      // Next item sent by API\n      if (returnedHistory.registry_id !== history.registry_id) {\n        // Current is ended\n        history.is_completed = true\n        // Parent work could be completed to\n        history.work = returnedHistory.work\n        // Save next in store\n        thunkAPI.dispatch(setNextIdReturnedByAPI(returnedHistory.registry_id))\n        // Save current completed in film history\n        thunkAPI.dispatch(updateFilmHistoryList({ data: [history] }))\n      }\n    }\n\n    return returnedHistory\n  } else {\n    history.is_completed = history.percent >= 95\n\n    return history\n  }\n})\n\nconst initialState: WorkHistoryState = {\n  list: fetchAllFromSessionStorage(SESSION_WORK_HISTORY_KEY).data ?? [],\n  continueWatchingList: [],\n  countContinueWatching: 0,\n  countWatchHistory: 0,\n  status: undefined\n}\n\nexport const workHistorySlice = createSlice({\n  name: 'workHistory',\n  initialState,\n  reducers: {\n    updateList (state: WorkHistoryState, action: PayloadAction<{data: WorkHistory[]}>) {\n      // Work history should return only one film by work id\n      const tempList = uniqBy([\n        ...action.payload.data,\n        ...state.list\n      ], 'work.registry_id')\n\n      state.list = tempList.sort(sortByTimestamp)\n\n      // Record in local storage\n      if (!window.USER_CONNECTED && cookiesAreEnabled()) {\n        window.sessionStorage.setItem(SESSION_WORK_HISTORY_KEY, JSON.stringify(state.list))\n      }\n    }\n  },\n  extraReducers: builder => {\n    builder\n      .addCase(fetchAll.pending, state => {\n        state.status = 'loading'\n      })\n      .addCase(fetchAll.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.countWatchHistory = action.payload.count\n        workHistorySlice.caseReducers.updateList(state, action)\n      })\n      .addCase(fetchAll.rejected, state => {\n        state.status = 'failed'\n        // @todo: handle errors\n      })\n      .addCase(fetchAllContinueWatching.pending, state => {\n        state.status = 'loading'\n      })\n      .addCase(fetchAllContinueWatching.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.continueWatchingList = action.payload.data\n        state.countContinueWatching = action.payload.count\n        workHistorySlice.caseReducers.updateList(state, action)\n      })\n      .addCase(fetchAllContinueWatching.rejected, state => {\n        state.status = 'failed'\n        // @todo: handle errors\n      })\n      .addCase(postHistory.pending, state => {\n        state.status = 'loading'\n      })\n      .addCase(postHistory.fulfilled, (state: WorkHistoryState, action) => {\n        state.status = 'succeeded'\n        workHistorySlice.caseReducers.updateList(state, { payload: { data: [action.payload] }, type: 'workHistory/updateList' })\n      })\n      .addCase(postHistory.rejected, (state, action) => {\n        state.status = 'failed'\n        // If post failed, save data from action arg to list\n        const history = action.meta.arg\n        workHistorySlice.caseReducers.updateList(state, { payload: { data: [history] }, type: 'workHistory/updateList' })\n      })\n  },\n  selectors: {\n    selectWorkHistoryById: (state: WorkHistoryState, id: number): WorkHistory | undefined => {\n      return state.list.find(item => item.registry_id === id)\n    },\n    selectContinueWatching: (state: WorkHistoryState) => {\n      return state.continueWatchingList\n    },\n    selectContinueWatchingIds: (state: WorkHistoryState) => {\n      return state.continueWatchingList\n        .map(item => (item.registry_id) as number)\n    },\n    selectContinueWatchingAndParentWorkIds: (state: WorkHistoryState) => {\n      const filmIds: number[] = workHistorySlice.getSelectors().selectContinueWatchingIds(state)\n      const viewContextIds: number[] = state.continueWatchingList\n        .map(item => (item.work?.registry_id) as number)\n      return uniq([...filmIds, ...viewContextIds])\n    },\n    selectHistoryForParentWork: (state, parentRegistryId: number): WorkHistory[] | null => {\n      return state.list\n        .filter(h => h.work?.registry_id === parentRegistryId)\n        .sort(sortByTimestamp)\n    }\n  }\n})\n\nexport const {\n  selectWorkHistoryById,\n  selectContinueWatching,\n  selectContinueWatchingIds,\n  selectContinueWatchingAndParentWorkIds,\n  selectHistoryForParentWork\n} = workHistorySlice.getSelectors()\n\nexport default workHistorySlice.reducer\n","import { AxiosResponse } from 'axios'\n\nimport { createAsyncThunk, createSlice } from '@reduxjs/toolkit'\nimport type { PayloadAction } from '@reduxjs/toolkit'\n\nimport { ThunkAPI } from '@src/js/redux/store'\nimport { PublicApiV5Client } from '@src/js/ApiClient'\nimport { fetchWorks, WorkCard } from '@src/js/redux/worksReducer'\nimport { setNextIdReturnedByAPI } from '@src/js/redux/playersReducer'\n\nconst publicApiV5Client = PublicApiV5Client.instance\n\nexport interface WorkPageState {\n  pageIsReady: boolean\n  headerImageIsLoaded: boolean | null\n  displayedRegistryId: number | null\n  displayedWork: WorkCard | null\n  highlightId: string | null\n  lastClickElement: string|null\n  currentActiveClickElement: string|null\n  versionList: WorkCard[] | null\n}\n\nconst initialState: WorkPageState = {\n  pageIsReady: false,\n  headerImageIsLoaded: null,\n  displayedRegistryId: null,\n  displayedWork: null,\n  highlightId: null,\n  lastClickElement: null,\n  currentActiveClickElement: null,\n  versionList: []\n}\n\nexport interface GetWorkVersionsParams {\n  expression_id: number,\n  id: number,\n  subset?: 'nfb/public'\n  includeFields?: string []\n}\n\nexport const setDisplayedRegistryId = createAsyncThunk<\n  number, number, ThunkAPI\n>('workPage/setDisplayedRegistryId', async (registryId, thunkAPI) => {\n  // Make sure we have info loaded from Public API\n  const worksList = thunkAPI.getState().works.list\n  if (!worksList || !(worksList.find(w => w.id === registryId))) {\n    await thunkAPI.dispatch(fetchWorks({ idList: [registryId] }))\n  }\n  // Reset next\n  thunkAPI.dispatch(setNextIdReturnedByAPI(null))\n\n  return registryId\n})\n\nexport const fetchVersionList = createAsyncThunk<\n  WorkCard[], GetWorkVersionsParams\n>('workPage/fetchVersionList', async ({ expression_id, id, subset = 'nfb/published', includeFields = ['cataloging_language', 'slug'] }) => {\n  const response = await publicApiV5Client.call({\n    method: 'GET',\n    url: '/works',\n    params: {\n      expression_id,\n      include_fields: includeFields,\n      subset\n    }\n  }) as AxiosResponse\n\n  return await response.data.items.filter((i: WorkCard) => i.id !== id)\n})\n\nexport const workPageSlice = createSlice({\n  name: 'workPage',\n  initialState,\n  reducers: {\n    setPageIsReady (state, action: PayloadAction<boolean>) {\n      state.pageIsReady = action.payload\n    },\n    initHighlightId (state) {\n      const currentUrl = new URL(window.location.href)\n      const highlightIdFromURL = currentUrl.searchParams.get('highlight')\n      if (highlightIdFromURL) {\n        state.highlightId = highlightIdFromURL\n      }\n    },\n    initWork (state) {\n      state.displayedRegistryId = window.DISPLAYED_WORK_ID ?? null\n    },\n    setHighlightId (state, action: PayloadAction<string | null>) {\n      const { payload: id } = action\n      state.highlightId = id\n    },\n    // dispatch when play is triggered\n    setLastClickElement (state, action: PayloadAction<string|null>) {\n      state.lastClickElement = action.payload\n    },\n    // dispatch when player is closed\n    setCurrentActiveClickElement (state, action: PayloadAction<string|null>) {\n      state.currentActiveClickElement = action.payload\n    },\n    setHeaderImageIsLoaded (state, action: PayloadAction<boolean>) {\n      state.headerImageIsLoaded = action.payload\n    },\n    setDisplayedWork (state, action: PayloadAction<WorkCard>) {\n      state.displayedWork = action.payload\n    }\n  },\n  extraReducers: builder => {\n    builder\n      .addCase(setDisplayedRegistryId.fulfilled, (state, action) => {\n        state.displayedRegistryId = action.payload\n      })\n      .addCase(setDisplayedRegistryId.rejected, (state, action) => {\n        console.log(action.error)\n      })\n      .addCase(fetchVersionList.fulfilled, (state, action) => {\n        state.versionList = action.payload\n      })\n  }\n})\n\nexport const {\n  setPageIsReady,\n  initWork,\n  initHighlightId,\n  setHighlightId,\n  setHeaderImageIsLoaded,\n  setDisplayedWork,\n  setLastClickElement,\n  setCurrentActiveClickElement\n} = workPageSlice.actions\n\nexport default workPageSlice.reducer\n","import uniqBy from 'lodash/uniqBy'\nimport { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'\nimport { AxiosResponse } from 'axios'\n\nimport { Language } from '@web-nfb/player/src/types'\n\nimport { PublicApiV5Client } from '@src/js/ApiClient'\nimport { fetchAllContinueWatching, selectContinueWatchingAndParentWorkIds, GetWatchHistoryParams } from '@src/js/redux/workHistoryReducer'\nimport { AppDispatch, NFBStore, RootState } from '@src/js/redux/store'\nimport { fetchFilmHistory, selectFilmHistoryIds } from '@src/js/redux/filmHistoryReducer'\nimport { StreamTypes } from '@src/js/redux/playersReducer'\n\nconst publicApiV5Client = PublicApiV5Client.instance\n\ntype WorkCategory = 'film' | 'series' | 'collection'\n\nexport interface WorkDirector {\n  first_name: string,\n  last_name: string,\n  slug: string\n}\n\nexport interface ExtraCard {\n  content_type: StreamTypes\n  description: string\n  duration: number\n  id: number\n  slug: string\n  thumbnail: string\n  title: string\n  year: number\n  publish_date: string\n}\n\nexport interface WorkCard {\n  id: number\n  title: string\n  slug: string\n  duration: number\n  year: number\n  thumbnail: string\n  label?: string\n  directors?: WorkDirector[]\n  producers?: WorkDirector[]\n  category: WorkCategory\n  description: string\n  tagline?: string\n  cc?: boolean\n  dv?: boolean\n  rating?: string\n  coming_soon?: string\n  is_new_release?: boolean\n  leaving_soon?: string\n  title_treatment?: string | null\n  key_art_square?: string | null\n  key_art_horizontal?: string | null\n  jacket?: string | null\n  story_art_horizontal?: string | null\n  story_art_vertical?: string | null\n  story_art_square?: string | null\n  geoblocked?: boolean\n  warning?: string\n  availability?: {\n    resource_url?: string | null\n    buy?: boolean\n    dvd?: boolean\n    is_public?: boolean\n    rent?: boolean\n  }\n  subjects?: string[]\n  credits_timecodes?: {\n    opening: number | null\n    ending: number | null\n  }\n  year_max?: number\n  year_min?: number\n  episodes_count?: number\n  seasons_count?: number\n  genres?: string[]\n  extras?: Record<StreamTypes, ExtraCard[]>\n  cataloging_language: Language\n  opening_credits_timecode?: number | null\n  ending_credits_timecode?: number | null\n  part_of?: [\n    {\n      category: 'collection' | 'series'\n      registry_id: number\n      slug: string\n    }\n  ]\n}\n\nexport interface APIWorksResponse {\n  items: WorkCard[],\n  meta: {\n    letter_count: object,\n    mixed_media: {\n      thumbnail_url: {\n        film: string,\n        collection: string,\n        interactive: string,\n        series: string\n      }\n    },\n    pagination: {\n      page: number,\n      pages: number,\n      size: number,\n      total: number\n    }\n  }\n}\n\nexport interface APITypeResponse {\n  item: {\n    subjects: [\n      {\n        category_type: string\n        slug: string\n        name: string\n        children: [\n          {\n            category_type: string | null,\n            slug: string\n            name: string\n          }\n        ]\n      },\n    ]\n  }\n}\n\nexport interface GetWorksParams {\n  idList?: number [],\n  subset?: 'nfb/public' | 'gc/gc-films' | 'nfb/indigenous-films' | 'nfb/published'\n  includeFields?: string [],\n  category?: string,\n  sort?: string,\n  language?: string,\n  subject?: string,\n  size?: number,\n  subjectCategory?: 'general' | 'education' | 'indigenous',\n  director?: string,\n  page?: number,\n  genre?: string[],\n  availability?: string[],\n  cc?: boolean,\n  dv?: boolean,\n  safeSearch?: boolean,\n  yearMin?: number,\n  yearMax?: number,\n  durationMin?: number, // in seconds\n  durationMax?: number, // in seconds\n  titleLetter?: string,\n}\n\nexport const basicIncludeFields = [\n  'slug', 'duration', 'year', 'thumbnail', 'directors', 'cc', 'dv', 'rating', 'coming_soon',\n  'is_new_release', 'leaving_soon', 'availability', 'geoblocked', 'producers', 'year_max',\n  'year_min', 'seasons_count', 'episodes_count', 'cataloging_language', 'story_art_horizontal'\n]\n\nexport const detailedIncludeFields = [\n  ...basicIncludeFields,\n  'tagline', 'description', 'label',\n  'title_treatment', 'key_art_square', 'jacket',\n  'subjects', 'genres',\n  'extras', 'part_of'\n]\n\nexport interface WorksState {\n  list: WorkCard[] | null,\n  status: 'idle' | 'loading' | 'succeeded' | 'failed',\n  thumbnailPattern: {\n    [key: string]: string\n  },\n  currentFetchParams: GetWorksParams | null\n}\n\nconst initialState: WorksState = {\n  list: null,\n  status: 'idle',\n  thumbnailPattern: {},\n  currentFetchParams: null\n}\n\nexport const fetchWorks = createAsyncThunk<\n  APIWorksResponse, GetWorksParams\n>('works/fetchWorks', async ({\n  idList,\n  // --- filter\n  availability,\n  cc,\n  category,\n  director,\n  durationMax,\n  durationMin,\n  dv,\n  genre,\n  includeFields = detailedIncludeFields,\n  language,\n  safeSearch,\n  sort,\n  subject,\n  subjectCategory,\n  subset,\n  titleLetter,\n  yearMax,\n  yearMin,\n  // --- pagination\n  page = 1,\n  size = 25\n}) => {\n  const response = await publicApiV5Client.call({\n    method: 'GET',\n    url: '/works',\n    params: {\n      include_series_episodes: true,\n      include_fields: includeFields,\n      locale: window.LOCALE,\n      subject_category: subjectCategory,\n      subset,\n      size,\n      page,\n      ...(category ? { category } : {}),\n      ...(idList?.length\n        ? {\n          registry_ids: idList.join(','),\n          size: idList.length\n        }\n        : {}),\n      ...(sort ? { sort } : {}),\n      ...(language ? { language } : {}),\n      ...(subject ? { subject } : {}),\n      ...(director ? { director } : {}),\n      ...(genre ? { genre } : {}),\n      ...(availability ? { availability } : {}),\n      ...(cc ? { cc } : {}),\n      ...(dv ? { dv } : {}),\n      ...(safeSearch ? { safe_search: safeSearch } : {}),\n      ...(yearMax ? { year_max: yearMax } : {}),\n      ...(yearMin ? { year_min: yearMin } : {}),\n      ...(durationMax ? { duration_max: durationMax } : {}),\n      ...(durationMin ? { duration_min: durationMin } : {}),\n      ...(titleLetter ? { title_letter: titleLetter } : {})\n    }\n  }) as AxiosResponse\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n\n  return await response.data\n}, {\n  condition: (getWorkParams, { getState }) => {\n    // Don't trigger dispatch if work ids from\n    // params already exists in list, or if they\n    // exist in a fetch currently in progress\n\n    const state = (getState() as NFBStore).works\n    const ids = [\n      ...(state.currentFetchParams?.idList ?? []),\n      ...(state.list?.map((w: WorkCard) => w.id) ?? [])]\n\n    if (ids.length && getWorkParams.idList) {\n      const diff = getWorkParams.idList?.filter(i => !ids.includes(i))\n      return !!diff?.length\n    }\n\n    return true\n  }\n})\n\nexport const worksSlice = createSlice({\n  name: 'works',\n  initialState,\n  reducers: {\n    addWorkToList: (state, action: PayloadAction<WorkCard[]>) => {\n      state.list = uniqBy([\n        ...action.payload,\n        ...(state.list ?? [])\n      ], 'id')\n    },\n    resetWorkList: (state) => {\n      state.list = []\n    }\n  },\n  extraReducers: builder => {\n    builder\n      .addCase(fetchWorks.pending, (state, action) => {\n        state.status = 'loading'\n        state.currentFetchParams = action.meta.arg\n      })\n      .addCase(fetchWorks.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.currentFetchParams = null\n        state.list = uniqBy([\n          ...action.payload.items,\n          ...(state.list ?? [])\n        ], 'id')\n        state.thumbnailPattern = action.payload.meta.mixed_media.thumbnail_url\n      })\n      .addCase(fetchWorks.rejected, (state, action) => {\n        state.status = 'failed'\n        state.currentFetchParams = null\n        console.log(action.error)\n        // @todo: handle errors\n      })\n  },\n  selectors: {\n    selectWorkById: (state: WorksState, id: number) => {\n      if (!state.list) return null\n\n      return state.list.find(work => work.id === id) ?? null\n    },\n    selectWorkByIdList: (state: WorksState, idList: number[]): WorkCard[] | null => {\n      if (!state.list) return null\n\n      if (!idList?.length) {\n        return []\n      }\n\n      // NB: The result will be a list of work in the same order as the ids\n      // in idList, without removing duplicates. If duplicates should be filtered out,\n      // this should be done on idList before calling this function.\n      return idList.map((id: number) => {\n        return state.list?.find(w => w.id === id)\n      }).filter(w => !!w)\n    },\n    selectWorksFromParams: (state: WorksState, params: GetWorksParams) => {\n      if (!state.list) return null\n\n      return state.list.filter(work => {\n        let test = true\n        if (params.category && work.category) {\n          test = test && work.category === params.category\n        }\n        if (params.language && work.cataloging_language) {\n          test = test && work.cataloging_language === params.language\n        }\n        return test\n      })\n    }\n  }\n})\n\nexport const fetchContinueWatchingWorks = createAsyncThunk<\n  void,\n  void,\n  {\n    dispatch: AppDispatch,\n    state: RootState\n  }>('works/fetchContinueWatching', async (_, thunkAPI) => {\n    await thunkAPI.dispatch(fetchAllContinueWatching())\n    const state: RootState = thunkAPI.getState()\n    const idListToFetch: number[] = selectContinueWatchingAndParentWorkIds(state.workHistory)\n    if (idListToFetch.length) {\n      // This call is needed to popuplate film history store\n      await thunkAPI.dispatch(fetchFilmHistory({ registry_ids: idListToFetch }))\n      // This call is needed to fetch infos for displaying card\n      await thunkAPI.dispatch(fetchWorks({ idList: idListToFetch }))\n    }\n  })\n\nexport const fetchViewingHistory = createAsyncThunk<\n  void,\n  GetWatchHistoryParams,\n  {\n    dispatch: AppDispatch,\n    state: RootState\n  }>('works/fetchViewingHistory', async (params, thunkAPI) => {\n    await thunkAPI.dispatch(fetchFilmHistory(params))\n    const state: RootState = thunkAPI.getState()\n    const idListToFetch: number[] = selectFilmHistoryIds(state.filmHistory)\n\n    if (idListToFetch.length) {\n      // This call is needed to fetch infos for displaying card\n      await thunkAPI.dispatch(fetchWorks({ idList: idListToFetch }))\n    }\n  })\n\nexport const { addWorkToList, resetWorkList } = worksSlice.actions\n\nexport const {\n  selectWorkById, selectWorkByIdList, selectWorksFromParams\n} = worksSlice.getSelectors()\n\nexport default worksSlice.reducer\n","/**\n * Class NFBDisplayWorkCard.\n *\n * Component that can display any type of work on any variant of card.\n */\n\nimport { LitElement, css, nothing } from 'lit'\nimport { html, literal } from 'lit/static-html.js'\nimport { Unsubscribe } from '@reduxjs/toolkit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { classMap } from 'lit-html/directives/class-map.js'\nimport { unsafeHTML } from 'lit-html/directives/unsafe-html.js'\n\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\nimport { ShapeVariant } from '@web-nfb/frontend-static/design-system/wc/card/NFBCard'\n\nimport {\n  getRestriction,\n  getAvailabilityMessage,\n  cardShouldBeDisabled,\n  getActionButton,\n  handleUrl,\n  getSeriesOrCollectionLegend,\n  getFilmLegend\n} from '@src/js/helpers/element/card'\nimport { getAvailabilityStatusForWork, WorkAvailabilityStatus, PLAYABLE_STATUS } from '@src/js/helpers/availability'\nimport { store, RootState } from '@src/js/redux/store'\nimport { WorkCard, selectWorkById } from '@src/js/redux/worksReducer'\n\n// @ts-expect-error Lit Sass import\nimport cardStyleSlot from '@web-nfb/frontend-static/design-system/wc/card/NFBCardSlot.sass?lit'\nimport { escapeText } from '@web-nfb/frontend-static/design-system/script/utils/string'\nimport type NFBCard from '@web-nfb/frontend-static/design-system/wc/card/NFBCard'\n\nexport enum CardType {\n carousel = 'carousel',\n bookmark = 'bookmark'\n}\n\nexport enum bookmarkButtonType {\n  add = 'add',\n  delete = 'delete',\n}\n\n@customElement('nfb-display-work-card')\nexport class NFBDisplayWorkCard extends LitElement {\n  @property({ type: Number, attribute: 'registry-id' })\n  registryId: number\n\n  @property({ type: String, attribute: 'href' })\n  href = ''\n\n  @property({ type: String, attribute: 'card-type' })\n  cardType: CardType | null = null\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-dark' })\n  isDark: boolean = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-rounded' })\n  isRounded: boolean = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-active' })\n  isActive: boolean = false\n\n  @property({ type: String, attribute: 'gtm-attributes' })\n  gtmAttribute: string = ''\n\n  @property({ converter: stringToBooleanConverter, attribute: 'include-progress-bar' })\n  includeProgressBar: boolean = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'include-description' })\n  includeDescription: boolean = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'truncate-description' })\n  truncateDescription: boolean = true\n\n  @property({ converter: stringToBooleanConverter, attribute: 'include-see-more-link' })\n  includeSeeMoreLink: boolean = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'include-legend' })\n  includeLegend: boolean = true\n\n  @property({ converter: stringToBooleanConverter, attribute: 'use-thumbnail-pattern' })\n  // Set to false if thumbnailPath is an absolute URL\n  // and no pattern should be used to generate thumbnail\n  useThumbnailPattern: boolean = true\n\n  @property({ type: String, attribute: 'primary-variant' })\n  primaryVariant: string = ''\n\n  @property({ type: String, attribute: 'secondary-variant' })\n  secondaryVariant: string | '' = ''\n\n  @property({ type: String, attribute: 'shape-variant' })\n  shapeVariant: ShapeVariant | '' = ''\n\n  @property({ attribute: 'bookmark-button-type' })\n  bookmarkButtonType: bookmarkButtonType | null = null\n\n  @property({ type: String, attribute: 'thumbnail-path' })\n  thumbnailPath: string | null = null\n\n  @property({ type: String, attribute: 'thumbnail-pattern' })\n  thumbnailPattern: string | null = null\n\n  @state()\n  availabilityStatus: WorkAvailabilityStatus = WorkAvailabilityStatus.PUBLIC\n\n  @state()\n  work: WorkCard | null = null\n\n  @state()\n  contextWork: WorkCard | null = null\n\n  _storeUnsubscribe: Unsubscribe\n  _cardId: string\n  _rootState: RootState\n  _thumbnailPatterns: { [key: string]: string }\n\n  static get styles () {\n    return [cardStyleSlot, css`\n      nfb-work-page-legend::part(container) {\n        margin-top: 0;\n        margin-bottom: 0;\n      }\n  \n      .nfb-display-work-card--truncate-description .nfb-card__description div {\n        display: -webkit-box !important;\n        -webkit-line-clamp: 4;\n        -webkit-box-orient: vertical;\n        overflow: hidden !important;\n        word-break: normal !important;\n      }\n\n      .nfb-progress-bar--rounded {\n        border-radius: 6px;\n        overflow: hidden;\n      }\n    `]\n  }\n\n  constructor () {\n    super()\n    this.stateChanged = this.stateChanged.bind(this)\n    this.getIsInert = this.getIsInert.bind(this)\n    this.getCardElement = this.getCardElement.bind(this)\n    this.getParentCarouselElement = this.getParentCarouselElement.bind(this)\n  }\n\n  async connectedCallback (): Promise<void> {\n    super.connectedCallback()\n    this._storeUnsubscribe = store.subscribe(this.stateChanged)\n    this.stateChanged()\n  }\n\n  disconnectedCallback (): void {\n    super.disconnectedCallback()\n    this._storeUnsubscribe()\n  }\n\n  protected firstUpdated () {\n    this._cardId = `card-${this.work?.id}`\n  }\n\n  attributeChangedCallback (name: string, _old: string | null, value: string | null): void {\n    super.attributeChangedCallback(name, _old, value)\n    if (name === 'registry-id' && _old !== null) {\n      // When registry id changed\n      this.work = null // show loading\n      // Update new work\n      this.updateWork()\n    }\n  }\n\n  stateChanged (): void {\n    this._rootState = store.getState()\n    this.updateWork()\n  }\n\n  updateWork () {\n    const { works } = store.getState()\n    if (this.registryId) {\n      this.work = selectWorkById(works, this.registryId)\n      if (this.work) {\n        this._thumbnailPatterns = works.thumbnailPattern\n        this.availabilityStatus = getAvailabilityStatusForWork(this.work)\n      }\n    }\n  }\n\n  getGTMAttributes (): string {\n    const jsonGTMAttribute = this.gtmAttribute\n      ? JSON.parse(this.gtmAttribute)\n      : {}\n\n    return JSON.stringify({\n      ...jsonGTMAttribute,\n      nfb_version_title: this.work?.title\n    })\n  }\n\n  getProgressBar (work: WorkCard) {\n    if (!this.includeProgressBar) return nothing\n\n    return html`\n    <div slot=\"progress-bar\" class=\"nfb-progress-bar ${!this.includeLegend && !this.bookmarkButtonType ? 'nfb-progress-bar--rounded' : ''}\" data-ui-active=\"true\">\n      <nfb-history-progress-bar\n        full-width=\"true\"\n        registry-id=\"${work.id}\"\n      >\n      </nfb-history-progress-bar>\n    </div>`\n  }\n\n  getDescription (work: WorkCard) {\n    let description = null\n    let showMoreLink = null\n\n    if (this.includeDescription) {\n      description = html`\n        <div>\n          ${unsafeHTML(escapeText(work.tagline ?? work.description))}\n        </div>\n      `\n    }\n\n    if (this.includeSeeMoreLink) {\n      showMoreLink = html`\n        <div class=\"nfb-card__extra-header-content\">\n          <a href=\"${work.availability?.resource_url}\">${window.gettext('More info')}</a>\n        </div>\n      `\n    }\n\n    if (!description && !showMoreLink) return nothing\n\n    return html`\n      <div slot=\"description\" class=\"nfb-card__description\">\n       ${description}\n       ${showMoreLink}\n      </div>\n    `\n  }\n\n  getClasses (availabilityStatus: WorkAvailabilityStatus) {\n    return {\n      'nfb-bookmarks--inactive': cardShouldBeDisabled(availabilityStatus),\n      'nfb-display-work-card--truncate-description': this.truncateDescription\n    }\n  }\n\n  // Implementing this function will allow NFBCarousel handleArrowButtonFocus() to fetch right card element\n  getIsInert (): boolean {\n    return (this.shadowRoot?.querySelector('nfb-carousel-card') as NFBCard)?.getIsInert()\n  }\n\n  getCardElement (): HTMLElement {\n    return (this.shadowRoot?.querySelector('nfb-carousel-card') as NFBCard) ?? false\n  }\n\n  getParentCarouselElement (): HTMLElement | null {\n    return (this.getRootNode() as ShadowRoot)?.host?.shadowRoot?.querySelector('nfb-carousel') ?? null\n  }\n\n  render () {\n    if (!this.work) {\n      return html`\n        <nfb-spinner\n          is-dark=\"${this.isDark}\"\n          is-loading=\"true\"\n        ></nfb-spinner>`\n    }\n\n    const elementTag = this.cardType === CardType.carousel\n      ? literal`nfb-carousel-card`\n      : literal`nfb-card`\n\n    const thumbnailPattern = this.useThumbnailPattern\n      ? (this.thumbnailPattern ?? this._thumbnailPatterns[this.work.category] ?? this._thumbnailPatterns.film)\n      : nothing\n\n    return html`\n      <${elementTag} ${this.cardType === CardType.carousel ? literal`data-ui-el=\"carousel-card\"` : nothing}\n        part=\"nfb-card\"\n        data-ui-el=\"${this._cardId}\"\n        class=\"${classMap(this.getClasses(this.availabilityStatus))}\"\n        primary-variant=\"${this.primaryVariant ?? nothing}\"\n        secondary-variant=\"${this.secondaryVariant ?? nothing}\"\n        shape-variant=\"${this.shapeVariant ?? nothing}\"\n        is-rounded=\"${this.isRounded || (this.isDark && this.secondaryVariant === 'no-border')}\"\n        title=\"${this.work.title}\"\n        is-unavailable=\"${cardShouldBeDisabled(this.availabilityStatus)}\"\n        href=\"${this.href ? this.href : handleUrl(this.work)}\"\n        default-thumbnail=\"${this.shapeVariant !== ShapeVariant.vertical ? window.FALLBACK_THUMBNAIL_PATTERN.replace('{path}', window.FALLBACK_THUMBNAIL_PATH) : window.FALLBACK_THUMBNAIL_PATTERN.replace('{path}', window.FALLBACK_THUMBNAIL_VERTICAL_PATH)}\"\n        thumbnail-path=\"${this.thumbnailPath ? this.thumbnailPath : (this.shapeVariant !== ShapeVariant.vertical && this.work.thumbnail ? this.work.thumbnail : nothing)}\"\n        thumbnail-url-pattern=\"${thumbnailPattern}\"\n        gtm-attributes=\"${this.getGTMAttributes() ?? nothing}\"\n        is-dark=\"${this.isDark ?? nothing}\"\n        is-active=\"${this.isActive ?? nothing}\"\n        hover-icon-name=\"${PLAYABLE_STATUS.includes(this.availabilityStatus) || this.work.geoblocked ? 'ctrl-play' : nothing}\"\n      >\n    ${this.shapeVariant === ShapeVariant.vertical\n    ? nothing\n    : html` <div slot=\"legend\">\n          ${getRestriction(this.work, this.availabilityStatus, this.isDark, this._rootState.user)}\n          ${getAvailabilityMessage(this.availabilityStatus, this.work, this.isDark)}\n          ${this.includeLegend\n    ? (['collection', 'series'].includes(this.work.category)\n      ? getSeriesOrCollectionLegend(this.work, this.availabilityStatus, this.isDark)\n      : getFilmLegend(this.work, this.availabilityStatus, this.isDark))\n    : nothing}\n        </div>\n        ${this.getProgressBar(this.work)}\n        ${getActionButton(this.bookmarkButtonType, this.registryId, this.work, this.isDark)}\n        ${this.getDescription(this.work)}`}\n      </${elementTag}>`\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'nfb-display-work-card': NFBDisplayWorkCard\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`.nfb-work-page-creator {\n  --nfb-work-page-creator-color: #000000;\n  --nfb-work-page-link-hover-color: #1C7A3E;\n  margin-bottom: 0.25rem;\n}\n\n.nfb-work-page-creator--clamped {\n  display: -webkit-box !important;\n  -webkit-line-clamp: 2;\n  -webkit-box-orient: vertical;\n  overflow: hidden !important;\n  word-break: normal !important;\n}\n\n.nfb-work-page-creator__separator {\n  font-size: 0.875rem;\n  font-weight: normal;\n}\n\n.nfb-work-page-creator__link {\n  text-decoration: none;\n  outline: none;\n}\n\n.nfb-work-page-creator__link:focus-visible {\n  text-decoration: underline;\n  color: var(--nfb-work-page-creator-color);\n}\n\n.nfb-work-page-creator__link--inactive {\n  pointer-events: none !important;\n  user-select: none !important;\n}\n\n.nfb-work-page-creator__link--inactive span {\n  color: #c0bfbe !important;\n}\n\n.nfb-work-page-creator__link span {\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 500;\n  font-size: 0.875rem;\n  line-height: 1rem;\n  color: #1c1b1b;\n  color: var(--nfb-work-page-creator-color);\n  text-decoration: none;\n}\n\n.nfb-work-page-creator__link span:hover {\n  color: var(--nfb-work-page-link-hover-color);\n}\n\n.nfb-work-page-creator--header {\n  --nfb-work-page-creator-color: var(--header-infos-color);\n  --nfb-work-page-link-hover-color: var(--nfb-work-page-creator-color);\n  margin-bottom: 0;\n}\n\n.nfb-work-page-creator--header .nfb-work-page-creator__link span {\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 500;\n  font-size: 1rem;\n  line-height: 1.5rem;\n  color: #1c1b1b;\n  color: var(--nfb-work-page-creator-color);\n}\n\n.nfb-work-page-creator--header .nfb-work-page-creator__link span:hover {\n  text-decoration: underline;\n}\n\n.nfb-work-page-creator--dark {\n  --nfb-work-page-creator-color: #FFFFFF;\n}\n\n.nfb-work-page-creator--dark:not(.nfb-work-page-creator--header) {\n  --nfb-work-page-link-hover-color: #05EE80;\n}`;\nexport default styles;\n","import { LitElement, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { classMap } from 'lit-html/directives/class-map.js'\n\n// @ts-expect-error Lit Sass import\nimport styles from '@src/sass/wc/NFBWorkPageCreator.sass?lit'\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\n\nimport normanPaths from '@src/js/helpers/paths'\n\nexport interface Creator {\n  first_name: string\n  last_name: string\n  slug: string\n}\n\n@customElement('nfb-work-page-creator')\nexport default class NFBWorkPageCreator extends LitElement {\n  @property({ type: Array })\n  creators: Creator[] | null = null\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-dark' })\n  isDark = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-unavailable' })\n  isUnavailable = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-clamped' })\n  isClamped = true\n\n  @property({ type: String, attribute: 'variant' })\n  variant: 'header' | null = null\n\n  static styles = [styles]\n\n  renderDirectors () {\n    return this.creators?.map((c, index) => {\n      let suffix = ''\n      if (this.creators!.length > 1 && index !== this.creators!.length - 1) {\n        suffix = index === this.creators!.length - 2 ? ` ${window.gettext('&')}` : ', '\n      }\n\n      return html`\n        <span class=\"director\" itemscope itemtype=\"http://schema.org/Person\" data-cy=\"director\">\n          <a \n            class=\"nfb-work-page-creator__link ${this.isUnavailable ? 'nfb-work-page-creator__link--inactive' : ''}\"\n            href=\"${normanPaths.directors.replace('{slug}', c.slug)}\"\n            title=\"${window.gettext('More films by')} ${c.first_name} ${c.last_name}\"\n            itemprop=\"url\"\n            target=\"_parent\"\n          >\n            <span part=\"creator\" itemprop=\"director\" >${c.first_name} ${c.last_name}</span></a><span part=\"separator\" class=\"nfb-work-page-creator__separator\">${suffix}</span>\n        </span>\n      `\n    })\n  }\n\n  getClasses () {\n    let classes = {\n      'nfb-work-page-creator': true,\n      'nfb-work-page-creator--dark': this.isDark,\n      'nfb-work-page-creator--clamped': this.isClamped\n    }\n\n    if (this.variant) {\n      const variantClass = `nfb-work-page-creator--${this.variant}`\n      classes = {\n        [variantClass]: true,\n        ...classes\n      }\n    }\n\n    return classes\n  }\n\n  render () {\n    if (!this.creators) return\n\n    return html`\n      <div\n        class=\"${classMap(this.getClasses())}\"\n        part=\"container\"\n      >\n        ${this.renderDirectors()}\n      </div>\n    `\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`@charset \"UTF-8\";\n.nfb-legend {\n  width: 100%;\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: normal;\n  font-size: 1rem;\n  line-height: 1.5rem;\n  color: #000;\n  color: #6b6a69;\n  margin-bottom: 1rem;\n}\n\n.nfb-legend__item {\n  display: inline-flex;\n  align-items: center;\n  margin-right: 0.25rem;\n  font-size: 0.75rem;\n}\n\n.nfb-legend__item + .nfb-legend__item::before {\n  content: \"|\";\n  margin-right: 0.5rem;\n}\n\n.nfb-legend__icon:not(:last-child) {\n  margin-right: 0.5rem;\n}\n\n.nfb-legend {\n  color: var(--nfb-card-legend-color);\n  width: auto;\n  margin-top: 0.5rem;\n  margin-bottom: 0.5rem;\n  margin-right: 0.5rem;\n}\n\n.nfb-legend-container {\n  display: flex;\n  align-items: first baseline;\n  flex-wrap: wrap;\n}\n\n.nfb-legend nfb-legend-item:not(.nfb-card__creator) + nfb-legend-item::before, .nfb-legend nfb-legend-item:not(.nfb-card__creator) + nfb-legend-icons::before {\n  content: \"•\"/\"\";\n  margin-right: 0.5rem;\n}\n\n.nfb-legend nfb-legend-item, .nfb-legend nfb-legend-icons {\n  display: inline-flex;\n  align-items: center;\n  margin-right: 0.25rem;\n  font-size: 0.75rem;\n}`;\nexport default styles;\n","import { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\nimport { LanguageVariant } from '@web-nfb/frontend-static/design-system/wc/legend/legendIcons/NFBLegendIcons'\nimport { html, css, LitElement, nothing } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\n// @ts-expect-error Lit Sass import\nimport styles from '@src/sass/wc/NFBWorkPageLegend.sass?lit'\n\n@customElement('nfb-work-page-legend')\nexport default class NFBWorkPageLegend extends LitElement {\n  @property({ converter: stringToBooleanConverter, attribute: 'is-cc' })\n  isCC = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-dv' })\n  isDV = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-leaving-soon' })\n  isLeavingSoon = false\n\n  @property({ type: String, attribute: 'language' })\n  language = LanguageVariant.en\n\n  @property({ type: String, attribute: 'year' })\n  year = ''\n\n  @property({ type: String, attribute: 'running-time' })\n  runningTime = ''\n\n  @property({ type: String, attribute: 'series-info' })\n  seriesInfo = ''\n\n  @property({ type: String, attribute: 'rating' })\n  rating = ''\n\n  @property({ type: String, attribute: 'genre' })\n  genre = ''\n\n  static styles = [styles,\n    css`\n    :host(.nfb-work-page-legend) {\n      nfb-legend-item {\n        font-size: 1rem;\n      }\n    }\n  `\n  ]\n\n  render () {\n    return html`\n      <div\n        class=\"nfb-work-page-legend nfb-legend\"\n        part=\"container\"\n      >\n    ${this.year\n    ? html`\n        <nfb-legend-item\n          data-cy=\"work-page-legend-year\"\n          text=\"${this.year}\"\n        >\n        </nfb-legend-item>`\n    : nothing}\n    ${this.runningTime\n    ? html`\n        <nfb-legend-item\n          data-cy=\"work-page-legend-running-time\"\n          text=\"${this.runningTime}\"\n        >\n        </nfb-legend-item>`\n    : nothing}\n    ${this.seriesInfo\n    ? html`\n        <nfb-legend-item\n          data-cy=\"work-page-legend-series-info\"\n          text=\"${this.seriesInfo}\"\n        >\n        </nfb-legend-item>`\n    : nothing}\n    ${this.genre\n    ? html`\n        <nfb-legend-item\n          data-cy=\"work-page-legend-genre\"\n          text=\"${this.genre}\"\n        >\n        </nfb-legend-item>`\n    : nothing}\n    ${this.isCC || this.isDV || this.rating\n    ? html`\n        <nfb-legend-icons\n          language=\"${this.language}\"\n          is-dv=\"${this.isDV}\"\n          is-cc=\"${this.isCC}\"\n          rating=\"${this.rating}\"\n          dv-label=\"${window.pgettext('NFB Legend Icon', 'Audio Description')}\"\n          cc-label=\"${window.pgettext('NFB Legend Icon', 'Closed Caption')}\"\n        >\n        </nfb-legend-icons>`\n    : nothing}\n      <slot></slot>\n    </div>\n    `\n  }\n}\n","const ribbon = (el, i) => {\n  const hide = (e) => {\n    e.preventDefault()\n    el.remove()\n    if (el.dataset.jsUseCookie !== undefined) {\n      const cookieName = el.dataset.jsCookieName ?? `ribbon-${i}`\n      const cookieExpires = el.dataset.jsCookieExpiresAt ? new Date(el.dataset.jsCookieExpiresAt) : new Date(new Date().getTime() + (2 * 24 * 60 * 60 * 1000))\n      document.cookie = `${cookieName}=1;expires=${cookieExpires.toUTCString()};path=/`\n    }\n  }\n\n  el.querySelector('[data-js-btn-close]').addEventListener('click', hide)\n\n  // Return destroy function\n  return {\n    hide,\n    destroy: () => {\n      el.querySelector('[data-js-btn-close]').removeEventListener('click', hide)\n    }\n  }\n}\n\nconst ribbonList = []\n\nexport const initRibbons = () => {\n  document.querySelectorAll('[data-js-ribbon]').forEach((el, i) => ribbonList.push(ribbon(el, i)))\n}\n\nexport const destroyRibbons = () => {\n  ribbonList.forEach(ribbon => ribbon.destroy())\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"NFBPlatformNavHeight\":\"3.5rem\"};","import throttle from 'lodash/throttle'\nimport navVariables from '@src/sass/variables/nfb-platform-nav-exports.module.sass'\nimport { gsap } from 'gsap'\nimport { GTM_EVENTS } from '@src/js/constants'\n\nexport default class NFBPlatformNavManager {\n  topNav: HTMLElement | null = null\n\n  leftNav: HTMLElement | null = null\n  leftNavBackdrop: HTMLElement | null = null\n  leftNavToggle: NodeListOf<HTMLElement>\n\n  exploreButton: HTMLButtonElement | null = null\n  exploreButtonMobile: HTMLButtonElement | null = null\n  exploreDropdownMobile: HTMLElement | null = null\n  exploreDropdown: HTMLElement | null = null\n  exploreCloseButton: HTMLButtonElement | null = null\n\n  languageButton: HTMLButtonElement | null = null\n  languageDropdown: HTMLElement | null = null\n\n  userButton: HTMLButtonElement | null = null\n  userDropdown: HTMLElement | null = null\n\n  focusScopeEnd: HTMLElement | null = null\n  focusElementOnLeftNavClose: HTMLElement | null = null\n\n  mobileMainMenuElement: HTMLElement | null = null\n\n  topNavFixedHeight: number\n\n  #isScrolling?: boolean // user is scrolling and scroll !== 0\n  #hasScrolledToTop?: boolean // scroll is equal or lower to height of top nav\n\n  #exploreIsExpanded?: boolean\n  #userIsExpanded?: boolean\n  #languageIsExpanded?: boolean\n\n  throttledPageIsScrolling: () => void\n\n  gsapTimelineToggle: gsap.core.Timeline = gsap.timeline()\n  gsapTimelineClose: gsap.core.Timeline = gsap.timeline()\n\n  constructor () {\n    // Get fixed height of top nav from Sass variable * font size of root element.\n    const rootFontSize = parseInt(window.getComputedStyle(document.body).getPropertyValue('font-size'))\n    this.topNavFixedHeight = parseFloat(navVariables.NFBPlatformNavHeight) * rootFontSize\n    this.throttledPageIsScrolling = throttle(this.pageIsScrolling, 50)\n  }\n\n  init () {\n    this.topNav = document.querySelector('[data-ui-el=\"platform-nav-top\"]')\n    this.leftNav = document.querySelector('[data-ui-el=\"platform-nav-left\"]')\n    this.leftNavBackdrop = document.querySelector('[data-ui-el=\"platform-nav-backdrop\"]')\n\n    this.hasScrolledToTop = true\n    this.isScrolling = false\n\n    this.focusElementOnLeftNavClose = this.topNav?.querySelector('[data-ui-el=\"element-focus-on-left-nav-close\"]') as HTMLElement\n\n    this.mobileMainMenuElement = this.leftNav?.querySelector('[data-ui-el=\"mobile-main-menu\"]') as HTMLElement\n\n    // Focus trap elements\n    this.focusScopeEnd = this.leftNav?.querySelector('[data-ui-el=\"focus-scope-end\"]') as HTMLElement\n\n    this.exploreIsExpanded = false\n    this.exploreButton = this.topNav?.querySelector('[data-ui-el=\"explore-button\"]') as HTMLButtonElement\n    this.exploreDropdown = this.topNav?.querySelector('[data-ui-el=\"explore-dropdown\"]') as HTMLElement\n    this.exploreButtonMobile = this.leftNav?.querySelector('[data-ui-el=\"explore-button\"]') as HTMLButtonElement\n    this.exploreDropdownMobile = this.leftNav?.querySelector('[data-ui-el=\"explore-dropdown\"]') as HTMLElement\n    this.exploreCloseButton = this.exploreDropdownMobile?.querySelector('[data-ui-el=\"explore-close-button\"]') as HTMLButtonElement\n\n    this.languageButton = this.topNav?.querySelector('[data-ui-el=\"language-button\"]') as HTMLButtonElement\n    this.languageDropdown = this.topNav?.querySelector('[data-ui-el=\"language-dropdown\"]') as HTMLElement\n\n    this.userButton = this.topNav?.querySelector('[data-ui-el=\"user-button\"]') as HTMLButtonElement\n    this.userDropdown = this.topNav?.querySelector('[data-ui-el=\"user-dropdown\"]') as HTMLElement\n\n    this.leftNavToggle = document.querySelectorAll('[data-ui-el=\"platform-left-nav-toggle\"]')\n\n    this.initSubMenuListeners()\n    this.initLeftNavListeners()\n\n    window.addEventListener('scroll', this.throttledPageIsScrolling)\n  }\n\n  initSubMenuListeners = () => {\n    this.exploreButton?.addEventListener('click', this.toggleExploreSubMenu)\n    this.exploreButtonMobile?.addEventListener('click', this.toggleExploreMobileSubMenu)\n    this.exploreCloseButton?.addEventListener('click', this.closeExploreMobileSubMenu)\n    this.exploreButton?.addEventListener('focusout', this.handleExploreFocusOut)\n    this.exploreDropdown?.addEventListener('focusout', this.handleExploreFocusOut)\n\n    this.languageButton?.addEventListener('click', this.toggleLanguageSubMenu)\n    this.languageButton?.addEventListener('focusout', this.handleLanguageFocusOut)\n    this.languageDropdown?.addEventListener('focusout', this.handleLanguageFocusOut)\n\n    this.userButton?.addEventListener('click', this.toggleUserSubMenu)\n    this.userButton?.addEventListener('focusout', this.handleUserFocusOut)\n    this.userDropdown?.addEventListener('focusout', this.handleUserFocusOut)\n  }\n\n  initLeftNavListeners = () => {\n    this.focusScopeEnd?.addEventListener('focus', this.handleFocusScopeEnd)\n\n    if (this.leftNavToggle.length > 0) {\n      this.leftNavToggle.forEach(leftNavToggle => {\n        leftNavToggle.addEventListener('click', this.toggleLeftNav)\n      })\n    }\n\n    this.leftNavBackdrop?.addEventListener('click', this.toggleLeftNav)\n  }\n\n  handleFocusScopeEnd = (): void => {\n    // When the focus reaches the last element on the left nav, we want to trap the focus in the\n    // left nav instead of letting the focus be on the element outside of the left nav\n    const firstFocusableElement = this.leftNav?.querySelector('[data-ui-el=\"first-focusable-element\"]') as HTMLElement\n\n    if (firstFocusableElement) {\n      firstFocusableElement.focus()\n    }\n  }\n\n  toggleLeftNav = (): void => {\n    const isCollapsed = this.leftNav?.dataset.uiCollapsed === 'true'\n    const navOpened = !isCollapsed\n\n    this.leftNav!.dataset.uiCollapsed = navOpened.toString()\n    this.leftNavBackdrop!.dataset.uiCollapsed = navOpened.toString()\n\n    if (navOpened) {\n      // Nav is closing\n      this.leftNav?.removeAttribute('tabindex')\n      this.focusElementOnLeftNavClose?.setAttribute('tabindex', '-1')\n      this.focusElementOnLeftNavClose?.focus()\n      document.body.style.overflow = ''\n\n      // the explore sub menu might be open when the nav is closing\n      // we need to make sure the sub menu closes.\n      if (this.exploreIsExpanded) {\n        this.closeExploreMobileSubMenu()\n      }\n    } else {\n      // Nav is opening\n      this.leftNav?.setAttribute('tabindex', '-1')\n      this.leftNav?.focus()\n      // to prevent scroll in the main page when nav is scrolling in mobile\n      document.body.style.overflow = 'hidden'\n      this.sendGTMMenuOpen('main_nav')\n    }\n  }\n\n  toggleUserSubMenu = () => {\n    this.userIsExpanded = !this.userIsExpanded\n\n    if (this.userIsExpanded) {\n      document.addEventListener('click', this.handleClickOutside)\n      this.exploreIsExpanded = false\n      this.languageIsExpanded = false\n      this.sendGTMMenuOpen('user_menu')\n    }\n  }\n\n  toggleExploreSubMenu = () => {\n    this.exploreIsExpanded = !this.exploreIsExpanded\n\n    if (this.exploreIsExpanded) {\n      document.addEventListener('click', this.handleClickOutside)\n      this.userIsExpanded = false\n      this.languageIsExpanded = false\n      this.sendGTMMenuOpen('explore_menu')\n    }\n  }\n\n  toggleLanguageSubMenu = () => {\n    this.languageIsExpanded = !this.languageIsExpanded\n\n    if (this.languageIsExpanded) {\n      document.addEventListener('click', this.handleClickOutside)\n      this.userIsExpanded = false\n      this.exploreIsExpanded = false\n      this.sendGTMMenuOpen('language_menu')\n    }\n  }\n\n  toggleExploreMobileSubMenu = () => {\n    this.exploreIsExpanded = !this.exploreIsExpanded\n\n    this.gsapTimelineClose.clear()\n\n    if (this.exploreIsExpanded && this.exploreDropdownMobile) {\n      this.sendGTMMenuOpen('explore_menu')\n      this.gsapTimelineToggle\n        .add('start')\n        .set(this.exploreDropdownMobile, { visibility: 'visible', x: '0%', display: 'flex' })\n        .set(this.mobileMainMenuElement, { visibility: 'visible', x: '0%' })\n        .to(this.exploreDropdownMobile, {\n          duration: 0.4,\n          opacity: 1,\n          x: '-100%',\n          ease: 'power2.inOut'\n        }, 'start')\n        .to(this.mobileMainMenuElement, {\n          x: '-100%',\n          opacity: 0,\n          duration: 0.4,\n          ease: 'power2.inOut',\n          onComplete: () => {\n            gsap.set(this.mobileMainMenuElement, { visibility: 'hidden' })\n            this.exploreCloseButton?.setAttribute('tabindex', '0')\n            this.exploreCloseButton?.focus()\n            this.exploreCloseButton?.removeAttribute('tabindex')\n          }\n        }, 'start')\n    }\n  }\n\n  closeExploreMobileSubMenu = (): void => {\n    this.exploreIsExpanded = !this.exploreIsExpanded\n\n    this.gsapTimelineToggle.clear()\n    this.gsapTimelineClose\n      .add('start')\n      .set(this.exploreDropdownMobile, { visibility: 'visible', x: '-100%' })\n      .set(this.mobileMainMenuElement, { visibility: 'visible', x: '-100%' })\n      .to(this.exploreDropdownMobile, {\n        duration: 0.4,\n        opacity: 0,\n        x: '0%',\n        ease: 'power2.inOut',\n        onComplete: () => {\n          gsap.set(this.exploreDropdownMobile, { visibility: 'hidden', display: 'none' })\n        }\n      }, 'start')\n      .to(this.mobileMainMenuElement, {\n        x: '0%',\n        opacity: 1,\n        duration: 0.4,\n        ease: 'power2.inOut'\n      }, 'start')\n  }\n\n  sendGTMMenuOpen = (nfb_detail: string) => {\n    window.dataLayer = window.dataLayer || []\n    window.dataLayer.push({\n      event: GTM_EVENTS.MENU_OPEN,\n      nfb_detail\n    })\n  }\n\n  // Close dropdowns if focus moves outside the dropdown and button\n\n  handleExploreFocusOut = (e: FocusEvent) => {\n    const relatedTarget = e.relatedTarget as HTMLElement\n\n    if (relatedTarget && !this.exploreDropdown?.contains(relatedTarget) && !this.exploreButton?.contains(relatedTarget)) {\n      this.exploreIsExpanded = false\n    }\n  }\n\n  handleLanguageFocusOut = (e: FocusEvent) => {\n    const relatedTarget = e.relatedTarget as HTMLElement\n\n    if (relatedTarget && !this.languageDropdown?.contains(relatedTarget) && !this.languageButton?.contains(relatedTarget)) {\n      this.languageIsExpanded = false\n    }\n  }\n\n  handleUserFocusOut = (e: FocusEvent) => {\n    const relatedTarget = e.relatedTarget as HTMLElement\n\n    if (relatedTarget && !this.userDropdown?.contains(relatedTarget) && !this.userButton?.contains(relatedTarget)) {\n      this.userIsExpanded = false\n    }\n  }\n\n  handleClickOutside = (e: MouseEvent) => {\n    const target = e.target as HTMLElement\n\n    // Check if click is outside all dropdowns and their buttons\n    const isOutsideExplore = !this.exploreButton?.contains(target) && !this.exploreDropdown?.contains(target)\n    const isOutsideLanguage = !this.languageButton?.contains(target) && !this.languageDropdown?.contains(target)\n    const isOutsideUser = !this.userButton?.contains(target) && !this.userDropdown?.contains(target)\n\n    if (isOutsideExplore && this.exploreIsExpanded) {\n      this.exploreIsExpanded = false\n      document.removeEventListener('click', this.handleClickOutside)\n    }\n\n    if (isOutsideLanguage && this.languageIsExpanded) {\n      this.languageIsExpanded = false\n      document.removeEventListener('click', this.handleClickOutside)\n    }\n\n    if (isOutsideUser && this.userIsExpanded) {\n      this.userIsExpanded = false\n      document.removeEventListener('click', this.handleClickOutside)\n    }\n  }\n\n  pageIsScrolling = (): void => {\n    const currentScroll = document.documentElement.scrollTop ?? document.body.scrollTop\n    const hasScrolledToTop = currentScroll < this.topNavFixedHeight\n    this.hasScrolledToTop = hasScrolledToTop\n    this.isScrolling = currentScroll !== 0\n  }\n\n  /* Setters & Getters */\n\n  get exploreIsExpanded (): boolean | undefined { return this.#exploreIsExpanded }\n\n  set exploreIsExpanded (value: boolean) {\n    if (this.#exploreIsExpanded !== value) {\n      this.#exploreIsExpanded = value\n      this.exploreButtonMobile?.setAttribute('aria-expanded', value.toString())\n      this.exploreButton?.setAttribute('aria-expanded', value.toString())\n      this.exploreDropdown?.setAttribute('aria-expanded', value.toString())\n    }\n  }\n\n  get userIsExpanded (): boolean | undefined { return this.#userIsExpanded }\n\n  set userIsExpanded (value: boolean) {\n    if (this.#userIsExpanded !== value) {\n      this.#userIsExpanded = value\n      this.userButton?.setAttribute('aria-expanded', value.toString())\n      this.userDropdown?.setAttribute('aria-expanded', value.toString())\n      if (!this.#userIsExpanded) {\n        this.userButton?.classList.remove('_nfb-button--is-active')\n      } else {\n        this.userButton?.classList.add('_nfb-button--is-active')\n      }\n    }\n  }\n\n  get languageIsExpanded (): boolean | undefined { return this.#languageIsExpanded }\n\n  set languageIsExpanded (value: boolean) {\n    if (this.#languageIsExpanded !== value) {\n      this.#languageIsExpanded = value\n      this.languageButton?.setAttribute('aria-expanded', value.toString())\n      this.languageDropdown?.setAttribute('aria-expanded', value.toString())\n    }\n  }\n\n  get isScrolling (): boolean | undefined { return this.#isScrolling }\n\n  set isScrolling (value: boolean) {\n    if (this.#isScrolling !== value) {\n      this.#isScrolling = value\n      this.topNav!.dataset.uiScrolling = value.toString()\n    }\n  }\n\n  get hasScrolledToTop (): boolean | undefined { return this.#hasScrolledToTop }\n\n  set hasScrolledToTop (value: boolean) {\n    if (value !== this.#hasScrolledToTop) {\n      this.#hasScrolledToTop = value\n      this.topNav!.dataset.uiTop = value.toString()\n    }\n  }\n\n  destroy (): void {\n    window.removeEventListener('scroll', this.throttledPageIsScrolling)\n  }\n}\n","import { LitElement, html, nothing, css } from 'lit'\nimport { customElement, property, state, query } from 'lit/decorators.js'\n\nimport { PrimaryVariant } from '@web-nfb/frontend-static/design-system/wc/button/NFBButton'\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\n\nimport {\n  fetchBookmarks,\n  postBookmark,\n  deleteBookmark,\n  selectIdIsBookmarked,\n  selectIdIsLoading,\n  selectIdHasError\n} from '@src/js/redux/bookmarksReducer'\nimport { store } from '@src/js/redux/store'\nimport {\n  GTMAddToMylist,\n  GTMRemoveFromMylist\n} from '@src/js/types/GTM'\nimport { GTM_EVENTS } from '@src/js/constants'\n\n@customElement('nfb-add-to-mylist')\nexport class NFBAddToMyList extends LitElement {\n  @state()\n  _addedToMyList: boolean = false\n\n  @state()\n  _myListIsLoaded: boolean = false\n\n  @state()\n  _isLoading: boolean\n\n  @state()\n  _hasError: boolean = false\n\n  @state()\n  _ariaPressed: boolean = false\n\n  @property({ type: Number, attribute: 'registry-id' })\n  registryId: number|null = null\n\n  @property({ type: String, attribute: 'source-title' })\n  sourceTitle: string|null = null\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-dark' })\n  isDark: boolean = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-small' })\n  isSmall: boolean = false\n\n  @property({ type: String, attribute: 'login-url' })\n  loginUrl: string = ''\n\n  @query('[data-ui-el=\"toggle-message\"]')\n  toggleMessage: HTMLElement\n\n  static get styles () {\n    return [css`\n      [data-ui-el=\"toggle-message\"] {\n        position: absolute;\n        width: 1px;\n        height: 1px;\n        padding: 0;\n        margin: -1px;\n        overflow: hidden;\n        clip: rect(0, 0, 0, 0);\n        white-space: nowrap;\n        border: 0;\n      }`\n    ]\n  }\n\n  constructor () {\n    super()\n    this.stateChanged = this.stateChanged.bind(this)\n\n    // fetchBookmark should be called only once,\n    // make the call if status is at its initial value\n    if (store.getState().bookmarks.status === undefined) {\n      store.dispatch(fetchBookmarks())\n    }\n  }\n\n  connectedCallback (): void {\n    super.connectedCallback()\n    store.subscribe(this.stateChanged)\n    this.stateChanged()\n  }\n\n  stateChanged (): void {\n    const bookmarksState = store.getState().bookmarks\n\n    if (this.registryId) {\n      this._myListIsLoaded = bookmarksState.list !== null\n      this._hasError = selectIdHasError(bookmarksState, this.registryId)\n      this._isLoading = selectIdIsLoading(bookmarksState, this.registryId)\n      this._addedToMyList = selectIdIsBookmarked(bookmarksState, this.registryId)\n    }\n  }\n\n  addToMyList (e: Event): void {\n    e.preventDefault()\n    if (this.registryId) {\n      store.dispatch(postBookmark(this.registryId)).then(() => {\n        if (!this._hasError) {\n          // the aria-pressed indicates whether or not the button is pressed/activated\n          // when user adds a work into their list it is activated\n          this._ariaPressed = true\n          this.pushDataLayerEvent(GTM_EVENTS.ADD_TO_MYLIST)\n          // the aria-live text content is empty and has to be dynamically set for the voiceover to\n          // annouce the change of action\n          this.toggleMessage.textContent = window.pgettext('NFB Add to my list', 'Title Added to My List')\n        }\n      })\n    }\n  }\n\n  removeFromMyList (e: Event): void {\n    e.preventDefault()\n    if (this.registryId) {\n      store.dispatch(deleteBookmark(this.registryId)).then(() => {\n        if (!this._hasError) {\n          this._ariaPressed = false\n          this.pushDataLayerEvent(GTM_EVENTS.REMOVE_FROM_MYLIST)\n          this.toggleMessage.textContent = window.pgettext('NFB Add to my list', 'Title removed from My List')\n        }\n      })\n    }\n  }\n\n  pushDataLayerEvent (eventName: string): void {\n    if (!this._hasError && this.registryId && this.sourceTitle) {\n      window.dataLayer = window.dataLayer || []\n      const data: GTMAddToMylist | GTMRemoveFromMylist = {\n        event: eventName,\n        nfb_version_id: this.registryId.toString(),\n        nfb_version_title: this.sourceTitle\n      }\n      window.dataLayer?.push(data)\n    }\n  }\n\n  render () {\n    if (!this._myListIsLoaded) return\n\n    const buttonLabel = this._addedToMyList\n      ? window.gettext('Remove from My List')\n      : window.gettext('Add to My List')\n\n    return html`\n      <nfb-button\n        @click=${this._addedToMyList ? this.removeFromMyList : this.addToMyList}\n        primary-variant=\"${PrimaryVariant.roundWithIcon}\"\n        icon-name=\"${this._addedToMyList ? 'check-mark' : 'add'}\"\n        is-dark=\"${this.isDark}\"\n        is-active=\"${this._isLoading}\"\n        size=\"${this.isSmall ? 'sm' : nothing}\"\n        data-ui-el=\"nfb-add-to-mylist-button\"\n        data-cy=\"nfb-add-to-my-list-button\"\n        aria-label=\"${buttonLabel}\"\n        tooltip=\"${buttonLabel}\"\n        aria-pressed=\"${this._ariaPressed}\"\n      >\n      </nfb-button>\n      <div data-ui-el=\"toggle-message\" aria-live=\"polite\"></div>\n    `\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'nfb-add-to-mylist': NFBAddToMyList\n  }\n}\n","import { LitElement, nothing, css } from 'lit'\nimport { literal, html } from 'lit/static-html.js'\nimport { classMap } from 'lit-html/directives/class-map.js'\nimport { repeat } from 'lit/directives/repeat.js'\nimport { customElement, state, property } from 'lit/decorators.js'\nimport { store } from '@src/js/redux/store'\nimport { GTMSelectWork } from '@src/js/types/GTM'\nimport { GTM_EVENTS, GTM_LIST_CATEGORY, GTM_LIST_TYPE } from '@src/js/constants'\nimport {\n  WorkCard, fetchWorks, selectWorksFromParams,\n  selectWorkById, selectWorkByIdList, GetWorksParams\n} from '@src/js/redux/worksReducer'\nimport normanPaths from '@src/js/helpers/paths'\nimport { bookmarkButtonType } from '@src/js/wc/cards/NFBDisplayWorkCard'\n\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\n\n// @ts-expect-error Lit Sass import\nimport gridListStyle from '@web-nfb/frontend-static/design-system/sass/layout/grid-list.sass?lit'\n\nexport interface ContextWork {\n  registry_id?: number,\n  work?: {\n    registry_id?: number\n  }\n}\n\n@customElement('nfb-grid-list')\nexport default class NFBGridList extends LitElement {\n  @property({ type: Array, attribute: 'registry-id-list' })\n  registryIdList: number[] = []\n\n  @property({ type: Object, attribute: 'get-works-params' })\n  getWorksParams = null as GetWorksParams | null\n\n  @property({ converter: stringToBooleanConverter, attribute: 'show-see-more' })\n  showSeeMore = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'see-more-loading' })\n  seeMoreLoading = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'include-progress-bar' })\n  includeProgressBar = false\n\n  @property({ type: Array, attribute: 'context-detail-list' })\n  contextDetailList: ContextWork[] = []\n\n  @property({ attribute: 'bookmark-button-type' })\n  bookmarkButtonType: bookmarkButtonType | '' = ''\n\n  @property({ attribute: 'list-title' })\n  listTitle = ''\n\n  @property({ attribute: 'list-id' })\n  listId = ''\n\n  @property({ attribute: 'list-category' })\n  listCategory = GTM_LIST_CATEGORY.PROGRAMMING\n\n  @property()\n  loadMoreButtonClick: () => void = () => { }\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-dark' })\n  isDark = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-clothesline' })\n  isClothesline = false\n\n  @state()\n  list: WorkCard[] | null = null\n\n  @state()\n  isLoading = false\n\n  _workCardTemplateTag = literal`nfb-animated-hover-card`\n\n  static get styles () {\n    return [gridListStyle, css`\n      .nfb-grid-list__container {\n        min-height: 200px;\n\n        nfb-see-more {\n          min-height: 300px;\n        }\n      }`\n    ]\n  }\n\n  async connectedCallback () {\n    super.connectedCallback()\n    if (store.getState().works && this.registryIdList?.length) {\n      this.isLoading = true\n      this.updateList()\n    }\n  }\n\n  attributeChangedCallback (name: string, _old: string | null, value: string | null): void {\n    super.attributeChangedCallback(name, _old, value)\n    if ((name === 'registry-id-list') ||\n      (name === 'get-works-params' && this.getWorksParams)) {\n      this.updateList()\n    }\n  }\n\n  async updateList () {\n    if (this.registryIdList?.length) {\n      await store.dispatch(fetchWorks({ idList: this.registryIdList }))\n      this.list = selectWorkByIdList(store.getState().works, this.registryIdList)\n    } else if (this.getWorksParams) {\n      await store.dispatch(fetchWorks(this.getWorksParams))\n      this.list = (selectWorksFromParams(store.getState().works, this.getWorksParams) ?? [])\n\n      if (['series', 'collection'].includes(this.getWorksParams?.category ?? '')) {\n        // Temporary sort: Public API doesn't sort by year_max for series and collection\n        this.list.sort((a: WorkCard, b: WorkCard) => {\n          const yearA = a.year_max ?? a.year\n          const yearB = b.year_max ?? b.year\n          return yearB < yearA ? -1 : (yearA === yearB ? 0 : 1)\n        })\n      }\n    } else {\n      this.list = null\n    }\n\n    this.isLoading = false\n  }\n\n  disconnectedCallback (): void {\n    super.disconnectedCallback()\n  }\n\n  /**\n   *\n   * @param work: A film, a series, a collection.\n   * @returns the context work for the work, if it's a film\n   * (ex: the series or collection the film is a part of).\n   * Context work will be used for the thumbnail and the link of the card.\n   */\n  getContextWorkForWork (work: WorkCard): WorkCard | null {\n    const relatedHistory = this.contextDetailList.find(h => h.registry_id === work.id)\n\n    if (!relatedHistory?.work?.registry_id) {\n      return null\n    }\n\n    const contextWork = selectWorkById(store.getState().works, relatedHistory.work?.registry_id)\n    return contextWork ?? null\n  }\n\n  getSeeMoreCard () {\n    if (!this.list?.length || !this.showSeeMore) return nothing\n\n    return html`\n      <nfb-see-more\n        is-loading=\"${this.seeMoreLoading}\"\n        data-ui-el=\"carousel-card\"\n        .seeMoreClick=\"${this.loadMoreButtonClick}\"\n        text=\"${window.pgettext('User Profile', 'Load More')}\"\n      ></nfb-see-more>\n    `\n  }\n\n  getWorkCard (work: WorkCard, index: number) {\n    let contextWork = null\n\n    if (this.contextDetailList.length > 0) {\n      contextWork = this.getContextWorkForWork(work)\n    }\n\n    const url = normanPaths[contextWork?.category ?? work.category]\n\n    const gtmAttrs: GTMSelectWork = {\n      event: GTM_EVENTS.SELECT_WORK,\n      nfb_list_name: this.listTitle,\n      nfb_list_id: this.listId,\n      nfb_list_type: GTM_LIST_TYPE.GRID,\n      nfb_list_category: this.listCategory,\n      nfb_position: (index + 1).toString(),\n      nfb_version_title: work.title\n    }\n\n    return html`\n      <${this._workCardTemplateTag}\n        thumbnail-path=\"${contextWork?.thumbnail ?? work.thumbnail}\"\n        registry-id=${work.id}\n        bookmark-button-type=\"${this.bookmarkButtonType}\"\n        gtm-attributes=\"${JSON.stringify(gtmAttrs)}\"\n        href=\"${url.replace('{slug}', contextWork?.slug ?? work.slug)}\"\n        include-progress-bar=\"${this.includeProgressBar ?? nothing}\"\n        is-dark=\"${this.isDark ?? nothing}\"\n        secondary-variant=\"${this.isClothesline ? 'no-border' : nothing}\"\n      >\n      </${this._workCardTemplateTag}>`\n  }\n\n  render () {\n    return html`\n    <div class=\"nfb-grid-list__container\">\n      ${!this.isLoading ? nothing : html`<nfb-spinner is-loading=\"true\" size=\"sm\" is-dark=\"${this.isDark}\"></nfb-spinner>`}\n      <div class=\"${classMap({ 'nfb-grid-list': true, 'nfb-grid-list--dark': this.isDark })}\">\n      ${this.list ? repeat(this.list, work => work.id, (work, index) => this.getWorkCard(work, index)) : nothing}\n      ${this.getSeeMoreCard()}\n    </div>`\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'nfb-grid-list': NFBGridList\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`.nfb-progress-bar {\n  --nfb-progress-bar-fill-color: #05EE80;\n}\n\n.nfb-progress-bar[data-ui-active=true] {\n  padding-bottom: 0 !important;\n  max-width: 100%;\n  width: 100%;\n  bottom: 0;\n}\n\n.nfb-progress-bar__bar {\n  background-color: var(--nfb-progress-bar-fill-color);\n}\n\n.nfb-progress-bar__bar-container {\n  background-color: #c0bfbe !important;\n}`;\nexport default styles;\n","import { LitElement, html, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { store } from '@src/js/redux/store'\nimport { selectFilmHistoryById } from '@src/js/redux/filmHistoryReducer'\n\n// @ts-expect-error Lit Sass import\nimport style from '@src/sass/wc/NFBHistoryProgressBar.sass?lit'\n// @ts-expect-error Lit Sass import\nimport progressBarStyle from '@web-nfb/frontend-static/design-system/sass/elements/progress-bar.sass?lit'\n\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\n\n@customElement('nfb-history-progress-bar')\nexport class NFBHistoryProgressBar extends LitElement {\n  @property({ type: Number, attribute: 'registry-id' })\n    registryId = undefined\n\n  @property({ converter: stringToBooleanConverter, attribute: 'full-width' })\n    fullWidth: false\n\n  @state()\n    percent = 0\n\n  static styles = [progressBarStyle, style]\n\n  constructor () {\n    super()\n    this.stateChanged = this.stateChanged.bind(this)\n  }\n\n  connectedCallback (): void {\n    super.connectedCallback()\n    store.subscribe(this.stateChanged)\n    this.stateChanged()\n  }\n\n  attributeChangedCallback (name: string, _old: string | null, value: string | null): void {\n    super.attributeChangedCallback(name, _old, value)\n    if (name === 'registry-id' && _old !== null) {\n      // If new registryId, force reset when updating percent.\n      // Percent should reflect new registry id.\n      this.updatePercent(true)\n    }\n  }\n\n  stateChanged (): void {\n    this.updatePercent()\n  }\n\n  updatePercent (withReset = false) {\n    if (this.registryId) {\n      const state = store.getState()\n      const filmHistory = selectFilmHistoryById(state.filmHistory, this.registryId)\n      if (filmHistory) {\n        const filmHistoryPercent = filmHistory?.percent ?? 0\n        this.percent = filmHistory?.timecode > 0 ? Math.max(filmHistoryPercent, 1) : 0\n      } else if (withReset) {\n        this.percent = 0\n      }\n    }\n  }\n\n  render () {\n    return html`\n    <div\n      class=\"nfb-progress-bar ${this.fullWidth ? 'nfb-progress-bar--full-width' : ''}\"\n      data-ui-active=\"${this.percent !== 0}\"\n      data-related-id=\"${this.registryId}\"\n      part=\"nfb-progress-bar\"\n    >\n      <div class=\"nfb-progress-bar__bar-container\">\n        <div class=\"nfb-progress-bar__bar\" style=\"${this.percent !== 0 ? `width: ${this.percent}%;` : nothing}\"></div>\n      </div>\n    </div>`\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'nfb-history-progress-bar': NFBHistoryProgressBar\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`@charset \"UTF-8\";\n.nfb-legend {\n  width: 100%;\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: normal;\n  font-size: 1rem;\n  line-height: 1.5rem;\n  color: #000;\n  color: #6b6a69;\n  margin-bottom: 1rem;\n}\n\n.nfb-legend__item {\n  display: inline-flex;\n  align-items: center;\n  margin-right: 0.25rem;\n  font-size: 0.75rem;\n}\n\n.nfb-legend__item + .nfb-legend__item::before {\n  content: \"|\";\n  margin-right: 0.5rem;\n}\n\n.nfb-legend__icon:not(:last-child) {\n  margin-right: 0.5rem;\n}\n\n.nfb-legend {\n  color: var(--nfb-card-legend-color);\n  width: auto;\n  margin-top: 0;\n  margin-bottom: 0;\n  margin-right: 0.5rem;\n  display: flex;\n  flex-direction: column;\n  gap: 1rem;\n}\n\n.nfb-legend-container {\n  display: flex;\n  align-items: first baseline;\n  flex-wrap: wrap;\n}\n\n.nfb-legend nfb-legend-item:not(.nfb-card__creator) + nfb-legend-item::before, .nfb-legend nfb-legend-item:not(.nfb-card__creator) + nfb-legend-icons::before {\n  content: \"•\"/\"\";\n  margin-right: 0.5rem;\n}\n\n.nfb-legend nfb-legend-item, .nfb-legend nfb-legend-icons {\n  display: inline-flex;\n  align-items: center;\n  margin-right: 0.5rem;\n  font-size: 0.875rem;\n}`;\nexport default styles;\n","import { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\nimport { LanguageVariant } from '@web-nfb/frontend-static/design-system/wc/legend/legendIcons/NFBLegendIcons'\nimport { html, css, LitElement, nothing } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { formatDuration } from '@src/js/helpers/format'\n\n// @ts-expect-error Lit Sass import\nimport styles from '@src/sass/wc/NFBAnimatedHoverCardLegend.sass?lit'\n\n@customElement('nfb-animated-hover-card-legend')\nexport default class NFBAnimatedHoverCardLegend extends LitElement {\n  @property({ converter: stringToBooleanConverter, attribute: 'is-cc' })\n  isCC = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-dv' })\n  isDV = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-leaving-soon' })\n  isLeavingSoon = false\n\n  @property({ type: String, attribute: 'language' })\n  language = LanguageVariant.en\n\n  @property({ type: String, attribute: 'year' })\n  year = ''\n\n  @property({ type: String, attribute: 'running-time' })\n  runningTime = ''\n\n  @property({ type: String, attribute: 'series-info' })\n  seriesInfo = ''\n\n  @property({ type: String, attribute: 'rating' })\n  rating = ''\n\n  @property({ type: String, attribute: 'genre' })\n  genre = ''\n\n  static styles = [styles]\n\n  render () {\n    return html`\n      <div\n        class=\"nfb-work-page-legend nfb-legend\"\n        part=\"container\"\n        data-cy=\"work-page-legend\"\n      >\n        <div class=\"nfb-legend-container\">\n    ${this.year\n    ? html`\n        <nfb-legend-item\n          part=\"item\"\n          data-cy=\"work-page-legend-year\"\n          text=\"${this.year}\"\n        >\n        </nfb-legend-item>`\n    : nothing}\n    ${this.runningTime\n    ? html`\n        <nfb-legend-item\n          part=\"item\"\n          data-cy=\"work-page-legend-running-time\"\n          text=\"${formatDuration(this.runningTime)}\"\n        >\n        </nfb-legend-item>`\n    : nothing}\n    ${this.seriesInfo\n    ? html`\n        <nfb-legend-item\n          part=\"item\"\n          data-cy=\"work-page-legend-series-info\"\n          text=\"${this.seriesInfo}\"\n        >\n        </nfb-legend-item>`\n    : nothing}\n    ${this.isCC || this.isDV || this.rating\n    ? html`\n        <nfb-legend-icons\n          part=\"item\"\n          language=\"${this.language}\"\n          is-dv=\"${this.isDV}\"\n          is-cc=\"${this.isCC}\"\n          rating=\"${this.rating}\"\n          dv-label=\"${window.pgettext('NFB Legend Icon', 'Audio Description')}\"\n          cc-label=\"${window.pgettext('NFB Legend Icon', 'Closed Caption')}\"\n        >\n        </nfb-legend-icons>`\n    : nothing}\n        </div>\n    ${this.genre\n    ? html`\n        <nfb-legend-item\n          part=\"item\"\n          data-cy=\"work-page-legend-genre\"\n          text=\"${this.genre}\"\n        >\n        </nfb-legend-item>`\n    : nothing}\n      <slot></slot>\n    </div>\n    `\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`nfb-card::part(card-thumbnail-container) {\n  border-radius: 6px;\n}\n\n.nfb-animated-hover-card__parent-container {\n  position: relative;\n}\n\nnfb-card [slot=progress-bar], nfb-carousel-card [slot=progress-bar] {\n  border-radius: 6px;\n  overflow: hidden;\n}\n\n[slot=action-button] {\n  grid-row: 1/1;\n  grid-column: 2/3;\n  align-items: flex-start;\n  margin-left: 0.5rem;\n  justify-self: end;\n}\n\n.nfb-animated-hover-card {\n  --nfb-card-text-color: #FFFFFF;\n  --nfb-card-background-color: #000000;\n  --nfb-card-legend-color: #D4D3D6;\n  --nfb-card-border-color: #403E43;\n  --nfb-card-hover-color: #05EE80;\n  --nfb-icon-color: #D4D3D6;\n  --nfb-play-icon-background-color: #05EE80;\n  --nfb-play-icon-color: #000000;\n  padding: 0.5rem;\n  height: auto;\n  box-sizing: border-box;\n  outline: none;\n}\n\n@media screen and (max-width: 990px), print {\n  .nfb-animated-hover-card {\n    padding: 0.25rem;\n  }\n}\n.nfb-animated-hover-card[data-ui-focus=true] .nfb-animated-hover-card__container {\n  outline: 4px solid var(--nfb-card-hover-color);\n  border: none;\n}\n\n.nfb-animated-hover-card nfb-thumbnail {\n  display: flex;\n  aspect-ratio: 16/9;\n}\n\n.nfb-animated-hover-card .nfb-animated-hover-card {\n  color: var(--nfb-card-text-color);\n}\n\n.nfb-animated-hover-card .nfb-animated-hover-card__container {\n  height: 100%;\n  box-sizing: border-box;\n  background: var(--nfb-card-background-color);\n  display: flex;\n  flex-direction: column;\n  box-shadow: 0 0 0.5rem #000;\n  outline: 1px solid #403e43;\n  border-radius: 6px;\n  overflow: hidden;\n}\n\n.nfb-animated-hover-card .nfb-animated-hover-card__description {\n  color: var(--nfb-card-text-color);\n  display: none;\n}\n\n.nfb-animated-hover-card .nfb-animated-hover-card__thumbnail-container {\n  position: relative;\n  aspect-ratio: 16/9;\n  height: fit-content;\n}\n\n.nfb-animated-hover-card .nfb-animated-hover-card__thumbnail-container:focus-visible {\n  outline: 0;\n}\n\n.nfb-animated-hover-card .nfb-animated-hover-card nfb-thumbnail {\n  height: 100%;\n  width: 100%;\n  object-fit: cover;\n  transition: opacity 0.25s;\n}\n\n.nfb-animated-hover-card .nfb-animated-hover-card__content {\n  background: #18171a;\n}\n\n.nfb-animated-hover-card .nfb-animated-hover-card__content-container {\n  flex: 1;\n  padding: 1rem;\n  display: grid;\n  grid-template-columns: auto;\n  grid-template-rows: min-content auto;\n  opacity: 0;\n}\n\n.nfb-animated-hover-card .nfb-animated-hover-card__header {\n  display: flex;\n  flex-direction: column;\n}\n\n.nfb-animated-hover-card .nfb-animated-hover-card__title {\n  margin-bottom: 1rem;\n  outline: 0;\n}\n\n.nfb-animated-hover-card .nfb-animated-hover-card__title:focus-visible, .nfb-animated-hover-card .nfb-animated-hover-card__title:focus, .nfb-animated-hover-card .nfb-animated-hover-card__title:focus-within {\n  text-decoration: underline;\n}\n\na.nfb-animated-hover-card .nfb-animated-hover-card__title {\n  text-decoration: underline;\n}\n\n.nfb-animated-hover-card .nfb-animated-hover-card__title:hover, .nfb-animated-hover-card .nfb-animated-hover-card__title[data-ui-hover=true] {\n  color: var(--nfb-card-hover-color);\n}\n\n.nfb-animated-hover-card .nfb-animated-hover-card__title {\n  font-family: \"Elza Round\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 600;\n  font-size: 1rem;\n  line-height: 1.25rem;\n  color: #000;\n  text-decoration: none;\n  color: var(--nfb-card-text-color);\n  line-height: 1.2;\n  display: block;\n  grid-column: 1/2;\n  grid-row: 1/1;\n}\n\n.nfb-animated-hover-card nfb-icon {\n  cursor: pointer;\n}\n\n.nfb-animated-hover-card nfb-icon::part(icon) {\n  position: absolute;\n  color: var(--nfb-play-icon-color);\n  bottom: 0;\n  left: 0;\n  width: 8px;\n  height: 8px;\n  font-size: 0.75rem;\n  border-radius: 999px;\n  background-color: var(--nfb-play-icon-background-color);\n  padding: 8px;\n  margin-left: 1rem;\n  margin-bottom: 1rem;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  opacity: 1;\n  box-sizing: content-box;\n  transition: opacity 0.25s;\n}\n\n.nfb-animated-hover-card nfb-icon::part(icon)::before {\n  margin-left: 2px;\n}\n\n.nfb-animated-hover-card nfb-badge, .nfb-animated-hover-card nfb-pill, .nfb-animated-hover-card nfb-inline-message {\n  margin-bottom: 1rem;\n  display: inline-flex;\n}\n\n.nfb-animated-hover-card.nfb-animated-hover-card--rounded {\n  border-radius: 6px;\n  overflow: hidden;\n}\n\n.nfb-animated-hover-card[data-ui-el=detail-card] {\n  visibility: hidden;\n  position: absolute;\n  opacity: 0;\n  z-index: 4;\n}\n\n.nfb-animated-hover-card[data-ui-el=detail-card] nfb-thumbnail[data-ui-el=story-art-thumbnail] {\n  position: absolute;\n  width: 100%;\n  top: 0;\n  opacity: 0;\n  visibility: hidden;\n}\n\n.nfb-animated-hover-card[data-ui-el=detail-card] nfb-thumbnail {\n  cursor: pointer;\n}\n\nnfb-work-page-creator::part(container) {\n  margin-bottom: 0;\n}\n\nnfb-work-page-creator::part(creator) {\n  color: #d4d3d6;\n}\n\nnfb-work-page-creator::part(creator):hover, nfb-work-page-creator::part(creator):focus-visible {\n  color: var(--nfb-work-page-link-hover-color);\n}\n\nnfb-work-page-creator::part(separator) {\n  color: #d4d3d6;\n}\n\n.nfb-animated-hover-card--inactive {\n  pointer-events: none;\n  user-select: none;\n  color: #c0bfbe;\n}\n\n.nfb-animated-hover-card--inactive nfb-thumbnail {\n  opacity: 50%;\n}\n\n.nfb-animated-hover-card--inactive * {\n  color: #c0bfbe;\n}\n\nnfb-carousel-card::part(card-thumbnail-container) {\n  border-radius: 6px;\n}`;\nexport default styles;\n","/**\n * Class NFBAnimatedHoverCard.\n *\n * Component that on NFBCard hover, has logic to display more info.\n */\n\nimport { gsap } from 'gsap'\n\nimport { LitElement, nothing, TemplateResult } from 'lit'\nimport { html, literal } from 'lit/static-html.js'\nimport { customElement, property, state, query } from 'lit/decorators.js'\nimport throttle from 'lodash/throttle'\n\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\n\nimport { GTM_EVENTS } from '@src/js/constants'\nimport { getAvailabilityStatusForWork, WorkAvailabilityStatus } from '@src/js/helpers/availability'\nimport { isTouch } from '@src/js/helpers/browser'\nimport {\n  getRestriction,\n  getAvailabilityMessage,\n  cardShouldBeDisabled,\n  getActionButton,\n  handleUrl\n} from '@src/js/helpers/element/card'\nimport { formatDuration, formatSeriesInfo, formatCollectionInfo, formatYearRange } from '@src/js/helpers/format'\nimport { setCurrentOpenCard } from '@src/js/redux/animatedHoverCardReducer'\nimport { setCurrentActiveCarousel } from '@src/js/redux/carouselReducer'\nimport { store, RootState } from '@src/js/redux/store'\nimport { WorkCard, selectWorkById } from '@src/js/redux/worksReducer'\nimport { bookmarkButtonType, CardType } from '@src/js/wc/cards/NFBDisplayWorkCard'\nimport type NFBCard from '@web-nfb/frontend-static/design-system/wc/card/NFBCard'\n\nimport '@src/js/wc/cards/NFBAnimatedHoverCardLegend'\n\n// @ts-expect-error Lit Sass import\nimport cardStyleSlot from '@web-nfb/frontend-static/design-system/wc/card/NFBCardSlot.sass?lit'\n// @ts-expect-error Lit Sass import\nimport animatedHoverCardStyle from '@src/sass/wc/NFBAnimatedHoverCard.sass?lit'\n\nconst FADE_IN_ANIMATION_DURATION = 0.25\nconst FADE_OUT_ANIMATION_DURATION = 0.1\n\n@customElement('nfb-animated-hover-card')\nexport class NFBAnimatedHoverCard extends LitElement {\n  @property({ type: String, attribute: 'carousel-slug' })\n  carouselSlug = ''\n\n  @property({ type: Number, attribute: 'registry-id' })\n  registryId: number\n\n  @property({ type: Object, attribute: 'gtm-attributes' })\n  gtmAttribute: object = {}\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-dark' })\n  isDark: boolean = false\n\n  @property({ type: String, attribute: 'card-type' })\n  cardType: CardType | null = null\n\n  @property({ attribute: 'bookmark-button-type' })\n  bookmarkButtonType: bookmarkButtonType | null = null\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-focus' })\n  isFocus = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'include-progress-bar' })\n  includeProgressBar: boolean = false\n\n  @state()\n  work: WorkCard | null = null\n\n  @query('nfb-card')\n  nfbSimpleCard!: LitElement\n\n  @query('nfb-carousel-card')\n  nfbCarouselCard!: LitElement\n\n  @query('[data-ui-el=\"detail-card\"]')\n  nfbAnimatedHoverCard!: LitElement\n\n  @query('[data-ui-el=\"nfb-card-link\"]')\n  nfbAnimatedHoverCardLink: HTMLElement\n\n  @query('[data-ui-el=\"story-art-thumbnail\"]')\n  nfbStoryArtThumbnail: HTMLElement\n\n  @query('[data-ui-el=\"nfb-animated-hover-card-text-container\"]')\n  nfbAnimatedHoverTextContainer!: HTMLElement\n\n  @state()\n  availabilityStatus: WorkAvailabilityStatus = WorkAvailabilityStatus.PUBLIC\n\n  @state()\n  isLeft: boolean\n\n  @state()\n  isRight: boolean\n\n  leftIntersectingObserver: IntersectionObserver\n  rightIntersectingObserver: IntersectionObserver\n\n  gsapTimelineFadeIn: gsap.core.Timeline = gsap.timeline()\n  gsapTimelineFadeOut: gsap.core.Timeline = gsap.timeline()\n\n  _rootState: RootState\n  _thumbnailPatterns: { [key: string]: string }\n  _cardId: string\n  _lastFocusChange = 0\n  _isTouchScreen: boolean\n\n  static get styles () {\n    return [animatedHoverCardStyle, cardStyleSlot]\n  }\n\n  constructor () {\n    super()\n    this.stateChanged = this.stateChanged.bind(this)\n    this.onMouseEnter = this.onMouseEnter.bind(this)\n    this.cardIsIntersectingLeft = this.cardIsIntersectingLeft.bind(this)\n    this.cardIsIntersectingRight = this.cardIsIntersectingRight.bind(this)\n    this.getParentCarouselElement = this.getParentCarouselElement.bind(this)\n    this.onMouseMove = throttle(this.onMouseMove.bind(this), 500)\n    this.watchResize = throttle(this.watchResize.bind(this), 200)\n  }\n\n  connectedCallback (): void {\n    super.connectedCallback()\n    store.subscribe(this.stateChanged)\n    this.stateChanged()\n\n    window.addEventListener('resize', this.watchResize)\n\n    // Detect when touch is actually being used\n    document.addEventListener('touchstart', () => {\n      this._isTouchScreen = true\n      // document.removeEventListener('mousemove', this.onMouseMove)\n    })\n\n    document.addEventListener('mousemove', this.onMouseMove)\n\n    // document.addEventListener('touchend', () => {\n    //   document.addEventListener('mousemove', this.onMouseMove)\n    // })\n\n    // When the mouse is on card 1 and we use TAB to navigate to card 2, when press ENTER, it triggers\n    // another mouseenter event on card 1. This is to insure that when mouseenter is triggered, it is\n    // not the one caused by the ENTER or TAB key.\n    document.addEventListener('keydown', (e) => {\n      if (['Enter'].includes(e.key) || ['Tab'].includes(e.key)) {\n        this._lastFocusChange = Date.now()\n      }\n\n      if (['Escape'].includes(e.key)) {\n        this.closeCard()\n      }\n    })\n  }\n\n  /* Page Events\n    ========================================================================== */\n\n  // Detect when mouse is being used especially useful for hybrid screens\n  onMouseMove = (e: MouseEvent) => {\n    // In hybrid screen, it seems that mousemove is also triggered in touch events\n    // movementX and movementY will be 0 for touchstart and touchend\n    if (this._isTouchScreen && (e.movementX !== 0 || e.movementY !== 0)) {\n      this._isTouchScreen = false\n    }\n\n    // document.removeEventListener('mousemove', this.onMouseMove)\n  }\n\n  watchResize = () => {\n    this.closeCard()\n  }\n\n  attributeChangedCallback (name: string, _old: string | null, value: string | null): void {\n    super.attributeChangedCallback(name, _old, value)\n    if (name === 'registry-id' && _old !== null) {\n      this.work = null\n      this.updateWork()\n    }\n  }\n\n  stateChanged (): void {\n    const oldOpenCard = this._rootState?.animatedHoverCard?.currentOpenCard\n    this._rootState = store.getState()\n    const currentOpenCard = this._rootState.animatedHoverCard?.currentOpenCard\n\n    if (this.nfbAnimatedHoverCard && oldOpenCard !== currentOpenCard) {\n      if (this._cardId !== currentOpenCard && this._cardId === oldOpenCard) {\n        this.handleFadeOutAnimation()\n      } else if (this._cardId === currentOpenCard) {\n        this.handleFadeInAnimation()\n      }\n    }\n  }\n\n  updateWork () {\n    const { works } = store.getState()\n    if (this.registryId) {\n      this.work = selectWorkById(works, this.registryId)\n      if (this.work) {\n        this._thumbnailPatterns = works.thumbnailPattern\n        this.availabilityStatus = getAvailabilityStatusForWork(this.work)\n        this._cardId = this.carouselSlug ? `${this.carouselSlug}-card-${this.work?.id}` : `card-${this.work?.id}`\n      }\n    }\n  }\n\n  firstUpdated (): void {\n    this.updateWork()\n    let rootContainer = null\n\n    if (this.cardType === CardType.carousel) {\n      rootContainer = this.getRootNode().host?.shadowRoot?.querySelector('nfb-carousel')?.shadowRoot?.querySelector('.nfb-carousel__track-container')\n    } else {\n      rootContainer = this.getRootNode().host?.shadowRoot?.querySelector('.nfb-grid-list__container')\n    }\n\n    this.leftIntersectingObserver = new IntersectionObserver(this.cardIsIntersectingLeft, {\n      root: rootContainer,\n      rootMargin: '0px -90% 0px 0px',\n      threshold: [0.1]\n    })\n\n    this.rightIntersectingObserver = new IntersectionObserver(this.cardIsIntersectingRight, {\n      root: rootContainer,\n      rootMargin: '0px 0px 0px -90%',\n      threshold: [0.1]\n    })\n\n    this.leftIntersectingObserver.observe(this)\n    this.rightIntersectingObserver.observe(this)\n  }\n\n  focusCard (): void {\n    this.isFocus = true\n  }\n\n  /* Intersection Observer\n    ========================================================================== */\n\n  cardIsIntersectingLeft = (entry: IntersectionObserverEntry[]): void => {\n    const targetCard = entry[0].target?.shadowRoot?.querySelector('[data-ui-el=\"detail-card\"]')\n\n    if (targetCard) {\n      if (entry[0].isIntersecting) {\n        this.isLeft = true\n      } else {\n        this.isLeft = false\n      }\n    }\n  }\n\n  cardIsIntersectingRight = (entry: IntersectionObserverEntry[]): void => {\n    const targetCard = entry[0].target?.shadowRoot?.querySelector('[data-ui-el=\"detail-card\"]')\n\n    if (targetCard) {\n      if (entry[0].isIntersecting) {\n        this.isRight = true\n      } else {\n        this.isRight = false\n      }\n    }\n  }\n\n  /* Animation\n  ========================================================================== */\n\n  getTopShadowHost = () => {\n    let host = this.getRootNode()?.host\n    while (host?.getRootNode() instanceof ShadowRoot) {\n      host = host.getRootNode().host\n    }\n    return host\n  }\n\n  handleFadeInAnimation = () => {\n    this.getTopShadowHost()?.setAttribute('data-is-hover', 'true')\n    const scaleIncrease = 115\n    const scaleIncreaseRatio = (scaleIncrease - 100) / 100\n    const cardWidth = this.nfbAnimatedHoverCard.offsetWidth\n    const pixelOffset = -(cardWidth * scaleIncreaseRatio)\n\n    const pixelOffsetHalf = pixelOffset / 2\n\n    this.gsapTimelineFadeOut.clear()\n    gsap.set(this.nfbAnimatedHoverCard, { visibility: 'visible', opacity: 1, width: '100%', y: '0%', x: '0%', top: 0 })\n    gsap.set(this.nfbStoryArtThumbnail, { opacity: 0 })\n    let x = `${pixelOffsetHalf}px`\n\n    if (this.isLeft) {\n      x = '0%'\n    } else if (this.isRight) {\n      x = `${pixelOffset}px`\n    }\n    this.gsapTimelineFadeIn\n      .add('start')\n      .to(this.nfbAnimatedHoverCard, {\n        duration: FADE_IN_ANIMATION_DURATION,\n        opacity: 1,\n        y: '-4%',\n        x,\n        transformOrigin: 'center center',\n        width: `${scaleIncrease}%`,\n        ease: 'cubic-bezier(0.64, 0.12, 0.57, 0.77)',\n        onComplete: () => {\n          if (this.isFocus) {\n            this.nfbAnimatedHoverCardLink.focus()\n          }\n        }\n      }, 'start')\n      .to(this.nfbAnimatedHoverTextContainer, {\n        duration: FADE_IN_ANIMATION_DURATION * 2,\n        autoAlpha: 1,\n        onComplete: () => {\n          this.sendGTMPreviewWork()\n        }\n      }, 'start')\n      .to(this.nfbStoryArtThumbnail, {\n        duration: FADE_IN_ANIMATION_DURATION,\n        delay: 0.65,\n        width: '100%',\n        autoAlpha: 1,\n        ease: 'expo.out'\n      }, 'start')\n  }\n\n  handleFadeOutAnimation = () => {\n    // This logic is to make sure that the carousel we are removing the fade out is not an already active one\n    // In the case where the user hovers in one card (triggers fade in)\n    // Opens another card in the same carousel (triggers fade in)\n    // But it'll trigger a fade out at the end as the first card is being closed\n    // We want to avoid the data-is-hover to be removed in that case\n\n    setTimeout(() => {\n      const currentActiveCarousel = store.getState().carousel.currentActiveCarousel\n      if (this.carouselSlug !== currentActiveCarousel) {\n        this.getTopShadowHost()?.removeAttribute('data-is-hover')\n      }\n    }, 0)\n\n    this.gsapTimelineFadeIn.clear()\n    this.gsapTimelineFadeOut.to(this.nfbAnimatedHoverCard, {\n      duration: FADE_OUT_ANIMATION_DURATION,\n      width: '100%',\n      y: '0%',\n      x: '0%',\n      top: 0,\n      visibility: 'hidden',\n      ease: 'cubic-bezier(0.64, 0.12, 0.57, 0.77)'\n    })\n      .to(this.nfbAnimatedHoverTextContainer, {\n        duration: FADE_OUT_ANIMATION_DURATION,\n        autoAlpha: 0,\n        ease: 'expo.in'\n      })\n      .to(this.nfbStoryArtThumbnail, {\n        duration: FADE_OUT_ANIMATION_DURATION,\n        width: '100%',\n        autoAlpha: 0,\n        ease: 'expo.in'\n      })\n  }\n\n  /* Card Events\n  ========================================================================== */\n  onMouseEnter = (event: PointerEvent) => {\n    event.preventDefault()\n    event.stopImmediatePropagation()\n\n    const timeSinceKeyboard = Date.now() - this._lastFocusChange\n\n    // Only works if it's a mouse\n    if (event?.relatedTarget && !isTouch(this._isTouchScreen)) {\n      // If focus changed very recently, ignore this mouse enter\n      if (timeSinceKeyboard < 100) {\n        return\n      }\n\n      store.dispatch(setCurrentOpenCard(this._cardId))\n      if (this.carouselSlug) {\n        store.dispatch(setCurrentActiveCarousel(this.carouselSlug))\n      }\n    }\n  }\n\n  onMouseLeave = () => {\n    if (store.getState().animatedHoverCard.currentOpenCard === this._cardId) {\n      this.closeCard()\n    }\n  }\n\n  closeCard = () => {\n    store.dispatch(setCurrentOpenCard(null))\n    store.dispatch(setCurrentActiveCarousel(null))\n    this.isFocus = false\n  }\n\n  openCard = (event: PointerEvent) => {\n    if (!isTouch(this._isTouchScreen)) {\n      event.stopPropagation()\n      event.preventDefault()\n      store.dispatch(setCurrentOpenCard(this._cardId))\n      if (this.carouselSlug) {\n        store.dispatch(setCurrentActiveCarousel(this.carouselSlug))\n      }\n\n      this.isFocus = true\n\n      if (this.nfbSimpleCard) {\n        this.nfbSimpleCard.blur()\n      } else {\n        this.nfbCarouselCard.blur()\n      }\n    } else {\n      this.linkClick(event)\n    }\n  }\n\n  focusout = (event: PointerEvent) => {\n    event.preventDefault()\n    const relatedTargetElement = event.relatedTarget as HTMLElement\n    if (relatedTargetElement && !this.nfbAnimatedHoverCard?.contains(relatedTargetElement)) {\n      this.closeCard()\n    }\n  }\n\n  linkClick = (event: Event) => {\n    event.preventDefault()\n    this.nfbAnimatedHoverCardLink.click()\n  }\n\n  sendSelectWorkGTMEvent = () => {\n    if (this.gtmAttribute && Object.keys(this.gtmAttribute).length && window.dataLayer) {\n      window.dataLayer.push({\n        ...this.gtmAttribute\n      })\n    }\n  }\n\n  sendGTMPreviewWork = () => {\n    if (this.gtmAttribute && Object.keys(this.gtmAttribute).length && window.dataLayer) {\n      window.dataLayer.push({\n        ...this.gtmAttribute,\n        event: GTM_EVENTS.PREVIEW_WORK\n      })\n    }\n  }\n\n  /* Card Infos\n  ========================================================================== */\n\n  getProgressBar (work: WorkCard) {\n    if (!this.includeProgressBar) return nothing\n\n    return html`\n    <div slot=\"progress-bar\" class=\"nfb-progress-bar\" data-ui-active=\"true\">\n      <nfb-history-progress-bar\n        full-width=\"true\"\n        registry-id=\"${work.id}\"\n      >\n      </nfb-history-progress-bar>\n    </div>`\n  }\n\n  getSeriesOrCollectionLegend = (work: WorkCard) => {\n    let seriesInfo = ''\n    let creatorSlot = null\n    if (work.category === 'series') {\n      creatorSlot = html`\n        <nfb-work-page-creator\n          creators=\"${JSON.stringify(work.directors)}\"\n          is-unavailable=\"${cardShouldBeDisabled(this.availabilityStatus)}\"\n          is-dark=\"${this.isDark ?? nothing}\"\n        ></nfb-work-page-creator>`\n      seriesInfo = formatSeriesInfo(work)\n    } else {\n      seriesInfo = formatCollectionInfo(work)\n    }\n    return html`\n      ${creatorSlot}\n      <div class=\"nfb-legend\">\n        <nfb-animated-hover-card-legend \n          year=\"${formatYearRange(work)}\"\n          series-info=\"${seriesInfo}\"\n          genre=${work && work?.genres ? work.genres[0] : nothing}\n        >\n        </nfb-animated-hover-card-legend>\n      </div>\n    `\n  }\n\n  getFilmLegend = (work: WorkCard) => {\n    return html`\n      ${work.directors?.length\n      ? html`<nfb-work-page-creator\n        creators=\"${JSON.stringify(work.directors)}\"\n        is-unavailable=\"${cardShouldBeDisabled(this.availabilityStatus)}\"\n        is-dark=\"${this.isDark ?? nothing}\"\n      ></nfb-work-page-creator>`\n      : nothing}\n      <div class=\"nfb-legend\">\n        <nfb-animated-hover-card-legend \n          year=\"${work.year}\"\n          running-time=\"${formatDuration(work.duration)}\"\n          genre=${work && work?.genres ? work.genres[0] : nothing}\n        >\n        </nfb-animated-hover-card-legend>\n      </div>\n        `\n  }\n\n  getIsInert (): boolean {\n    return (this.shadowRoot?.querySelector('nfb-carousel-card') as NFBCard)?.getIsInert()\n  }\n\n  getCardElement (): HTMLElement {\n    return (this.shadowRoot?.querySelector('nfb-carousel-card') as NFBCard) ?? false\n  }\n\n  getParentCarouselElement (): HTMLElement | null {\n    return (this.getRootNode() as ShadowRoot)?.host?.shadowRoot?.querySelector('nfb-carousel') ?? null\n  }\n\n  getHoverCard (shouldBeDisabled: boolean, work: WorkCard): TemplateResult {\n    return html`\n        <div\n          id=\"${this._cardId}\"\n          data-ui-el=\"detail-card\"\n          data-ui-focus=\"${this.isFocus}\"\n          class=\"nfb-animated-hover-card nfb-animated-hover-card--rounded\"\n          part=\"card\"\n          ${shouldBeDisabled ? literal`inert` : nothing}\n          @mouseleave=\"${this.onMouseLeave}\"\n          @focusout=\"${this.focusout}\"\n        >\n          <div class=\"nfb-animated-hover-card__container\" part=\"card-container\">\n            <div\n              class=\"nfb-animated-hover-card__thumbnail-container ${shouldBeDisabled ? 'nfb-animated-hover-card--inactive' : ''}\"\n              data-ui-el=\"nfb-animated-hover-card-thumbnail-container\"\n              @click=\"${this.linkClick}\"\n            >\n              <nfb-thumbnail\n                part=\"card-thumbnail\"\n                aria-hidden=\"true\"\n                title=\"${this.title}\"\n                path=\"${work.thumbnail}\"\n                url-pattern=\"${(this._thumbnailPatterns[work.category] ?? this._thumbnailPatterns.film)}\"\n                default-url=\"${window.FALLBACK_THUMBNAIL_PATTERN.replace('{path}', window.FALLBACK_THUMBNAIL_PATH)}\"\n              >\n              </nfb-thumbnail>\n              <nfb-thumbnail\n                data-ui-el=\"story-art-thumbnail\"\n                aria-hidden=\"true\"\n                title=\"${this.title}\"\n                path=\"${work.story_art_horizontal ?? work.thumbnail}\"\n                url-pattern=\"${(this._thumbnailPatterns[work.category] ?? this._thumbnailPatterns.film)}\"\n                default-url=\"${window.FALLBACK_THUMBNAIL_PATTERN.replace('{path}', window.FALLBACK_THUMBNAIL_PATH)}\"\n              >\n              </nfb-thumbnail>\n              <nfb-icon name=\"ctrl-play\"></nfb-icon>\n              ${this.getProgressBar(work)}\n            </div>\n            <div class=\"nfb-animated-hover-card__content\" part=\"card-content\">\n              <div class=\"nfb-animated-hover-card__content-container\" data-ui-el=\"nfb-animated-hover-card-text-container\">\n                <a\n                  @click=\"${this.sendSelectWorkGTMEvent}\"\n                  @focus=${this.focusCard}\n                  part=\"title\"\n                  data-ui-el=\"nfb-card-link\"\n                  data-cy=\"card-title\"\n                  href=\"${handleUrl(work)}\"\n                  class=\"nfb-animated-hover-card__title ${shouldBeDisabled ? 'nfb-animated-hover-card--inactive' : ''}\"\n                >\n                  ${work.title}\n                </a>\n                <div>\n                ${getRestriction(work, this.availabilityStatus, this.isDark, this._rootState.user)}\n                ${getAvailabilityMessage(this.availabilityStatus, work, this.isDark)}\n                ${['collection', 'series'].includes(work.category) ? this.getSeriesOrCollectionLegend(work) : this.getFilmLegend(work)}\n                </div>\n                ${getActionButton(this.bookmarkButtonType, this.registryId, work, this.isDark)}\n              </div>\n            </div>\n          </div>\n        </div>\n      `\n  }\n\n  render () {\n    const elementTag = this.cardType === CardType.carousel\n      ? literal`nfb-carousel-card`\n      : literal`nfb-card`\n\n    const shouldBeDisabled = cardShouldBeDisabled(this.availabilityStatus)\n\n    if (!this.work) {\n      return html`\n        <nfb-spinner\n          is-dark=\"${this.isDark}\"\n          is-loading=\"true\"\n        ></nfb-spinner>`\n    }\n\n    return html`\n      <div class=\"nfb-animated-hover-card__parent-container\">\n        <${elementTag} ${this.cardType === CardType.carousel ? literal`data-ui-el=\"carousel-card\"` : nothing}\n          part=\"nfb-card\"\n          default-thumbnail=\"${window.FALLBACK_THUMBNAIL_PATTERN.replace('{path}', window.FALLBACK_THUMBNAIL_PATH)}\"\n          thumbnail-path=\"${this.work.thumbnail}\"\n          thumbnail-url-pattern=\"${(this._thumbnailPatterns[this.work.category] ?? this._thumbnailPatterns.film)}\"\n          is-dark=\"${this.isDark ?? nothing}\"\n          secondary-variant=\"no-border\"\n          is-rounded=\"true\"\n          title=\"${this.work.title}\"\n          href=\"${handleUrl(this.work)}\"\n          @mouseenter=\"${shouldBeDisabled ? nothing : this.onMouseEnter}\"\n          is-unavailable=\"${shouldBeDisabled}\"\n          .onCustomClick=\"${this.openCard}\"\n          gtm-attributes=\"${JSON.stringify(this.gtmAttribute)}\"\n        >\n          ${this.getProgressBar(this.work)}\n          <div slot=\"legend\">\n            ${getRestriction(this.work, this.availabilityStatus, this.isDark, this._rootState.user)}\n            ${getAvailabilityMessage(this.availabilityStatus, this.work, this.isDark)}\n          </div>\n        </${elementTag}>\n        ${this.getHoverCard(shouldBeDisabled, this.work)}\n      </div>\n    `\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'nfb-animated-hover-card': NFBAnimatedHoverCard\n  }\n}\n","/**\n * Class NFBNormanCarousel.\n *\n * Generic carousel displaying slotted elements within a NFBCarousel component.\n *\n */\n\nimport { LitElement, nothing, css, TemplateResult } from 'lit'\nimport { literal, html } from 'lit/static-html.js'\nimport { customElement, property, state } from 'lit/decorators.js'\n\n// @ts-expect-error Lit Sass import\nimport carouselSlotStyle from '@web-nfb/frontend-static/design-system/wc/carousel/NFBCarouselSlot.sass?lit'\n\n// @ts-expect-error Lit Sass import\nimport boxedCarouselSlotStyle from '@web-nfb/frontend-static/design-system/wc/carousel/boxedCarousel/NFBBoxedCarouselSlot.sass?lit'\n\n// @ts-expect-error Lit Sass import\nimport cardSlotStyle from '@web-nfb/frontend-static/design-system/wc/card/NFBCardSlot.sass?lit'\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\n\nimport '@src/js/wc/work-page/NFBWorkPageCreator'\nimport '@src/js/wc/work-page/NFBWorkPageLegend'\nimport { ObjectValues } from '@src/js/types/GTM'\nimport { GTM_LIST_CATEGORY, GTM_LIST_TYPE } from '@src/js/constants'\n\nexport type CarouselGTMAttrs = {\n  nfb_list_type?: typeof GTM_LIST_TYPE.CAROUSEL,\n  nfb_list_category?: ObjectValues<typeof GTM_LIST_CATEGORY>\n  nfb_list_id?: string,\n  nfb_list_name?: string,\n}\n\n@customElement('nfb-norman-carousel')\nexport default class NFBNormanCarousel extends LitElement {\n  @property({ converter: stringToBooleanConverter, attribute: 'show-title' })\n  showTitle = true\n\n  @property({ type: String, attribute: 'carousel-title' })\n  carouselTitle: string\n\n  @property({ type: String, attribute: 'see-more-link' })\n  seeMoreLink: string | null = null\n\n  /** Show see more link as card. No effect if seeMoreLink is null. */\n  @property({ converter: stringToBooleanConverter, attribute: 'show-see-more-card' })\n  showSeeMoreCard = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-dark' })\n  isDark = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-clothesline' })\n  isClothesLine = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-vertical' })\n  isVertical = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-boxed' })\n  isBoxed = false\n\n  @property({ type: Object, attribute: 'gtm-attributes' })\n  gtmAttributes: CarouselGTMAttrs = {}\n\n  @state()\n  isLoading = false\n\n  _defaultSeeMoreCardText = window.gettext('See more')\n  _carouselTemplateTag = literal`nfb-carousel`\n\n  static get styles () {\n    return [carouselSlotStyle, boxedCarouselSlotStyle, cardSlotStyle, css`\n    .nfb-norman-carousel__spinner-container {\n      min-height: 240px;\n      position: relative;\n    }\n\n    nfb-carousel::part(carousel) {\n      background-color: transparent;\n    }\n\n    nfb-boxed-carousel::part(carousel) {\n      background-color: transparent;\n    }\n\n    nfb-history-progress-bar::part(nfb-progress-bar) {\n      position: absolute;\n    }\n\n    nfb-work-page-legend::part(container) {\n      margin-top: 0;\n      margin-bottom: 0;\n    }\n\n    :host([data-is-hover=\"true\"]) {\n      z-index: 2;\n    }\n  `]\n  }\n\n  firstUpdated () {\n    if (this.isBoxed) {\n      this._carouselTemplateTag = literal`nfb-boxed-carousel`\n    }\n  }\n\n  /**\n   *\n   * @returns show or hide see more card.\n   * Based on the attribute by default. Can be overriden\n   * for a different condition.\n   */\n  shouldShowSeeMoreCard () {\n    return this.showSeeMoreCard\n  }\n\n  /**\n   * @returns TemplateResult that is to be assigned to the \"card\" slot of the NFBCarousel\n   * or nothing if no card to display.\n   */\n  getElements (): TemplateResult | typeof nothing {\n    return html`<slot slot=\"card\"></slot>`\n  }\n\n  /**\n   * To be overwritten in extended carousel\n   * @returns CarouselGTMAttrs with default nfb_list_type and nfb_list_name\n   */\n  protected getCarouselGTMAttributes (): CarouselGTMAttrs {\n    return {\n      nfb_list_type: GTM_LIST_TYPE.CAROUSEL,\n      nfb_list_name: this.carouselTitle,\n      ...this.gtmAttributes\n    }\n  }\n\n  private getFormattedCarouselGTMAttributes () : string | typeof nothing {\n    const gtmAttrs = this.getCarouselGTMAttributes()\n    if (gtmAttrs) {\n      return JSON.stringify(gtmAttrs)\n    }\n\n    return nothing\n  }\n\n  /**\n   * @returns TemplateResult of a NFBCarousel or nothing if no elements to display.\n   */\n  getCarousel (): TemplateResult | typeof nothing {\n    const carouselId = this.carouselTitle ? `${this.carouselTitle}-carousel`.toLowerCase() : nothing\n    const elements = this.getElements()\n    if (elements === nothing) {\n      return nothing\n    }\n\n    return html`\n      <${this._carouselTemplateTag}\n        id=\"${carouselId}\"\n        data-cy=\"${carouselId}\"\n        title=\"${this.showTitle ? this.carouselTitle : nothing}\"\n        skip-list=\"${window.gettext('Skip This List')}\"\n        aria-label-previous=\"${window.gettext('See previous')} ${this.carouselTitle}\"\n        aria-label-next=\"${window.gettext('See next')} ${this.carouselTitle}\"\n        is-dark=${this.isDark ?? nothing}\n        see-more-link=${this.seeMoreLink ?? nothing}\n        see-more-card-text=${this.shouldShowSeeMoreCard() ? this._defaultSeeMoreCardText : nothing}\n        is-clothesline=${this.isClothesLine ?? nothing}\n        is-loading=${this.isLoading ?? nothing}\n        gtm-attributes=${this.getFormattedCarouselGTMAttributes()}\n        is-vertical=${this.isVertical ?? nothing}\n        is-rounded=${this.isDark && this.isClothesLine}\n      >\n        ${this.getElements()}\n      </${this._carouselTemplateTag}>\n    `\n  }\n\n  render () {\n    if (this.isLoading) {\n      return html`\n      <div class=\"nfb-norman-carousel__spinner-container\" data-cy=\"carousel-spinner\">\n        <nfb-spinner\n          is-dark=\"${this.isDark ?? nothing}\"\n          is-loading=\"true\"\n        ></nfb-spinner>\n      </div>\n    `\n    }\n\n    return this.getCarousel()\n  }\n}\n","/**\n * Class NFBWorkCarousel.\n *\n * Generic carousel displaying NFBDisplayWork elements within a NFBCarousel component\n * based on a list of registry ids passed as attributes.\n *\n */\n\nimport { nothing, PropertyValues, TemplateResult } from 'lit'\nimport { html, literal } from 'lit/static-html.js'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport normanPaths from '@src/js/helpers/paths'\nimport { GTMSelectWork } from '@src/js/types/GTM'\nimport { GTM_EVENTS, DEFAULT_LIST_LENGTH } from '@src/js/constants'\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\nimport { fetchWorks, selectWorkByIdList, WorkCard } from '@src/js/redux/worksReducer'\nimport NFBNormanCarousel, { CarouselGTMAttrs } from './NFBNormanCarousel'\nimport { store } from '@src/js/redux/store'\nimport { bookmarkButtonType } from '@src/js/wc/cards/NFBDisplayWorkCard'\nimport { ShapeVariant } from '@web-nfb/frontend-static/design-system/wc/card/NFBCard'\n\ntype SelectWorkGTMEvent = {\n  event: typeof GTM_EVENTS.SELECT_WORK,\n} & CarouselGTMAttrs\n\n@customElement('nfb-work-carousel')\nexport default class NFBWorkCarousel extends NFBNormanCarousel {\n  @property({ type: Array, attribute: 'registry-id-list' })\n  initialRegistryIdList: null | number[] = null\n\n  @property({ type: String, attribute: 'subset' })\n  subset: 'nfb/public' | 'gc/gc-films' | 'nfb/published' = 'nfb/published'\n\n  @property({ type: String, attribute: 'carousel-slug' })\n  carouselSlug = ''\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-vertical' })\n  isVertical = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'include-bookmark-button' })\n  includeBookmarkButton = true\n\n  @property({ converter: stringToBooleanConverter, attribute: 'has-hover-card' })\n  hasHoverCard = true\n\n  /** List of work to display. Is null if works have not\n   * been fetched yet, empty if fetch is completed but no\n   * work to display.\n   */\n  @state()\n  worksList: WorkCard[] | null = null\n\n  _includeProgressBar = false\n  _defaultListLength = DEFAULT_LIST_LENGTH\n\n  /**\n   * After update, calls getRegistryIds() and use\n   * the returned list to select works.\n   */\n  async connectedCallback (): Promise<void> {\n    super.connectedCallback()\n    if (this.isBoxed) this._defaultListLength = 12\n    this.isLoading = true\n    await this.updateComplete\n    const registryIds = await this.getRegistryIds()\n    this.worksList = selectWorkByIdList(store.getState().works, registryIds) ?? []\n  }\n\n  protected updated (_changedProperties: PropertyValues): void {\n    if (_changedProperties.has('worksList') && this.worksList !== null && this.isLoading) {\n      this.isLoading = false\n    }\n  }\n\n  /**\n   * Called for each card in getWorkCard.\n   * @returns GTM dict containing all generic attributes\n   * for nfb_select_work related to this carousel. Will be used\n   * to send work specific event on card click.\n   *\n   * Should be overwritten in child class to set up specific values.\n   */\n  getGTMAttributesForSelectWork (): SelectWorkGTMEvent {\n    if (!this.carouselTitle) {\n      // Throw an error if no title has been attributed,\n      // since this will cause bad data for GTM event.\n      throw new Error('No carousel title has been defined.')\n    }\n\n    return {\n      ...this.getCarouselGTMAttributes(),\n      event: GTM_EVENTS.SELECT_WORK\n    }\n  }\n\n  /**\n   *\n   * @returns A list of registry ids to be displayed. In the generic\n   * version, returns value of registry-id-list attribute. Should be\n   * overwritten in child class if registry-id-list should be fetched\n   * from store.\n   */\n  async getRegistryIds (): Promise<number[]> {\n    if (!this.initialRegistryIdList?.length) {\n      return []\n    }\n\n    await store.dispatch(fetchWorks({\n      idList: this.initialRegistryIdList,\n      subset: this.subset\n    }))\n    return this.initialRegistryIdList\n  }\n\n  shouldShowSeeMoreCard () {\n    return this.showSeeMoreCard &&\n    !!this.worksList?.length && this.worksList.length > this._defaultListLength\n  }\n\n  getElements () {\n    if (!this.worksList?.length) {\n      this.classList.add('nfb-carousel--empty')\n      return nothing\n    }\n\n    this.classList.remove('nfb-carousel--empty')\n\n    const cardMax = this.shouldShowSeeMoreCard()\n      ? this._defaultListLength - 1\n      : this._defaultListLength\n\n    return html`${\n      this.worksList?.slice(0, cardMax).map((work, index) => this.getWorkCard(work, index))\n    }`\n  }\n\n  /**\n   *\n   * @param work\n   * @returns The context work (series or collection), or null if no\n   * context. Thumbnail and resource path of the context work will be\n   * used when displaying card for work.\n   *\n   * Returns null by default, should be overwritten if a context work\n   * is to be used.\n   */\n  getContextWork (work: WorkCard): WorkCard | null { return null }\n\n  /**\n   *\n   * @param work\n   * @param index\n   * @returns TemplateResult containing nfb-display-work card to be\n   * displayed\n   */\n  getWorkCard (work: WorkCard, index: number): TemplateResult {\n    const elementTag = this.hasHoverCard\n      ? literal`nfb-animated-hover-card`\n      : literal`nfb-display-work-card`\n\n    const gtmAttrs: GTMSelectWork = {\n      ...this.getGTMAttributesForSelectWork(),\n      nfb_version_title: work.title,\n      nfb_position: (index + 1).toString()\n    }\n\n    const bookmarkButton = store.getState().user.isConnected && this.includeBookmarkButton\n      ? bookmarkButtonType.add\n      : nothing\n\n    const contextWork = this.getContextWork(work) ?? work\n    let thumbnailPath = contextWork.thumbnail\n\n    if (this.isVertical) {\n      thumbnailPath = work.jacket ?? ''\n    }\n\n    return html`\n      <li slot=\"card\" class=\"nfb-carousel__card ${this.isDark ? 'nfb-carousel__card--dark' : ''}\" id=\"${this.title}-${work.title}-${index}\" data-index=\"${index}\">\n        <${elementTag}\n          carousel-slug=\"${this.carouselSlug}\"\n          data-ui-el=\"carousel-card\"\n          registry-id=\"${work.id}\"\n          thumbnail-path=\"${thumbnailPath}\"\n          include-progress-bar=\"${this._includeProgressBar ?? nothing}\"\n          gtm-attributes=\"${JSON.stringify(gtmAttrs)}\"\n          href=\"${normanPaths[contextWork.category].replace('{slug}', contextWork.slug)}\"\n          is-dark=\"${this.isDark ?? nothing}\"\n          shape-variant=\"${this.isVertical ? ShapeVariant.vertical : nothing}\"\n          secondary-variant=\"${this.isClothesLine ? 'no-border' : nothing}\"\n          card-type=\"carousel\"\n          bookmark-button-type=${bookmarkButton}\n        >\n        </${elementTag}>\n      </li>`\n  }\n}\n","/**\n * Class NFBBlogCarousel\n *\n * Extends class NFBNormanCarousel.\n * Overwrite getElements() to fetch blog from RSS.\n */\n\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { html, nothing, TemplateResult } from 'lit'\nimport { literal } from 'lit/static-html.js'\n\nimport NFBNormanCarousel from '@src/js/wc/carousels/base/NFBNormanCarousel'\n\n// @ts-expect-error Lit Sass import\nimport blogCarouselStyle from '@web-nfb/frontend-static/design-system/wc/carousel/NFBCarouselBlogSlot.sass?lit'\nimport { GTM_EVENTS, GTM_LIST_CATEGORY, GTM_LIST_TYPE } from '@src/js/constants'\n\ninterface BlogEntry {\n  title: string | undefined | null\n  image: string | undefined | null\n  link: string | undefined | null\n  avatar: string | undefined | null\n  author: string | undefined | null\n}\n\n@customElement('nfb-blog-carousel')\nexport default class NFBBlogCarousel extends NFBNormanCarousel {\n  @property({ type: String, attribute: 'lang' })\n  lang: 'fr' | 'en'\n\n  @property({ type: String, attribute: 'slug' })\n  slug: string\n\n  showSeeMoreCard = true\n\n  @state()\n  entryList: BlogEntry[] | null = null\n\n  static get styles () {\n    return [\n      super.styles,\n      blogCarouselStyle\n    ]\n  }\n\n  firstUpdated () {\n    if (this.isBoxed) {\n      this._carouselTemplateTag = literal`nfb-boxed-carousel`\n    }\n  }\n\n  async connectedCallback () {\n    super.connectedCallback()\n    await this.updateComplete\n\n    const domain = this.lang === 'fr' ? 'https://blogue.onf.ca' : 'https://blog.nfb.ca'\n    const url = `${domain}/${this.slug}/feed/`\n    const stringResult = await (await fetch(`${url}`)).text()\n    const xml = new window.DOMParser().parseFromString(stringResult, 'text/xml')\n\n    this.entryList = []\n    xml.querySelectorAll('item').forEach(e => {\n      this.entryList!.push({\n        link: e.querySelector('link')?.textContent,\n        image: e.querySelector('enclosure')?.getAttribute('url'),\n        title: e.querySelector('title')?.textContent,\n        author: e.querySelector('creator')?.textContent,\n        avatar: e.querySelector('img')?.getAttribute('src')\n      })\n    })\n  }\n\n  getElements () {\n    let numberCards = 14\n    if (this.isBoxed) numberCards = 11\n    return html`${this.entryList?.slice(0, numberCards).map((e, i) => this.getBlogCard(e, i))}`\n  }\n\n  getBlogCard (element: BlogEntry, index: number): TemplateResult<1> {\n    const entry = element as BlogEntry\n\n    const gtmAttributes = {\n      event: GTM_EVENTS.SELECT_WORK,\n      nfb_list_category: GTM_LIST_CATEGORY.ARTICLES,\n      nfb_list_type: GTM_LIST_TYPE.CAROUSEL,\n      nfb_list_name: this.carouselTitle,\n      nfb_list_id: 'nfb_blog',\n      nfb_version_title: element.title,\n      nfb_position: (index + 1).toString()\n    }\n\n    return html`\n    <li slot=\"card\" class=\"nfb-carousel__card nfb-carousel__card--dark\" data-index=${index}>\n      <nfb-carousel-card\n        title=\"${entry.title}\"\n        href=\"${entry.link}\"\n        thumbnail-path=\"${entry.image}\"\n        gtm-attributes=\"${JSON.stringify(gtmAttributes)}\"\n        data-ui-el=\"carousel-card\"\n        is-dark=${this.isDark ?? nothing}\n        is-rounded=${this.isDark && this.isClothesLine}\n        secondary-variant=\"${this.isClothesLine ? 'no-border' : nothing}\"\n      >\n        <div slot=\"legend\">\n          <div class=\"nfb-card__author\">\n            <img class=\"nfb-card__author-avatar\" src=\"${element.avatar}\" />\n            <div class=\"nfb-card__author-name\">${element.author}</div>\n          </div>\n        </div>\n      </nfb-carousel-card>\n    </li>`\n  }\n\n  render () {\n    if (!this.entryList) {\n      return nothing\n    }\n\n    return super.render()\n  }\n}\n","/* ==========================================================================\n  NFBBreadcrumb Web Component\n  ========================================================================== */\n\nimport { LitElement, type TemplateResult, css } from 'lit'\nimport { html } from 'lit/static-html.js'\nimport { customElement, property } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\n\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\n\n// @ts-expect-error Lit Sass import\nimport style from '@web-nfb/frontend-static/design-system/sass/elements/breadcrumb.sass?lit'\n\nexport type BreadcrumbItem = {\n  title: string\n  link: string\n}\n\n@customElement('nfb-breadcrumb')\nexport default class NFBBreadcrumb extends LitElement {\n  @property({ converter: stringToBooleanConverter, attribute: 'is-dark' })\n  isDark = false\n\n  @property({ type: Array, attribute: 'list' })\n  list: BreadcrumbItem[] = []\n\n  static styles = [style, css`\n    nfb-icon::part(icon) {\n      color: var(--nfb-breadcrumb-next-icon-color);\n      font-size: 1rem;\n      display: flex;\n      justify-content: center;\n    }\n  `]\n\n  getClasses (): Record<string, boolean> {\n    return {\n      'nfb-breadcrumb': true,\n      'nfb-breadcrumb--dark': this.isDark\n    }\n  }\n\n  render (): TemplateResult {\n    const itemTemplates = []\n    if (this.list.length === 0) {\n      itemTemplates.push(html`<div class=\"nfb-breadcrumb__link\"><a href=\"${this.list[0]?.link}\">${this.list[0]?.title}</a></div>`)\n    } else {\n      for (let i = 0; i < this.list.length; i++) {\n        if (i === 0) {\n          itemTemplates.push(html`<div class=\"nfb-breadcrumb__link\"><a href=\"${this.list[i]?.link}\">${this.list[i]?.title}</a></div>`)\n        } else {\n          itemTemplates.push(html`\n            <div class=\"nfb-breadcrumb__icon\">\n              <nfb-icon name=\"next\"></nfb-icon>\n            </div>\n            <div class=\"nfb-breadcrumb__link\"><a href=\"${this.list[i]?.link}\">${this.list[i]?.title}</a></div>`)\n        }\n      }\n    }\n    return html`\n    <div class=\"${classMap(this.getClasses())}\">\n      ${itemTemplates}\n    </div>\n    `\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'nfb-breadcrumb': NFBBreadcrumb\n  }\n}\n","import { LitElement, html, css } from 'lit'\nimport { customElement, property, state, query } from 'lit/decorators.js'\n\nimport { PrimaryVariant } from '@web-nfb/frontend-static/design-system/wc/button/NFBButton'\n\nimport { store } from '@src/js/redux/store'\nimport {\n  GTMLike\n} from '@src/js/types/GTM'\nimport { GTM_EVENTS } from '@src/js/constants'\nimport {\n  deleteLike,\n  fetchLikeByRegistryId,\n  postLike,\n  selectIdHasError,\n  selectIdIsLiked,\n  selectIdIsLoading\n} from '@src/js/redux/likesReducer'\n\n@customElement('nfb-like')\nexport class NFBLike extends LitElement {\n  @property({ type: Number, attribute: 'registry-id' })\n  registryId: number\n\n  @property({ type: String, attribute: 'source-title' })\n  sourceTitle: string\n\n  @state()\n  _isLiked: boolean = false\n\n  @state()\n  _isLoading: boolean\n\n  @state()\n  _hasError: boolean = false\n\n  @state()\n  _ariaPressed: boolean = false\n\n  @query('[data-ui-el=\"toggle-message\"]')\n  toggleMessage: HTMLElement\n\n  static get styles () {\n    return [css`\n      [data-ui-el=\"toggle-message\"] {\n        position: absolute;\n        width: 1px;\n        height: 1px;\n        padding: 0;\n        margin: -1px;\n        overflow: hidden;\n        clip: rect(0, 0, 0, 0);\n        white-space: nowrap;\n        border: 0;\n      }`\n    ]\n  }\n\n  constructor () {\n    super()\n    this.stateChanged = this.stateChanged.bind(this)\n  }\n\n  connectedCallback (): void {\n    super.connectedCallback()\n    store.dispatch(fetchLikeByRegistryId(this.registryId))\n    store.subscribe(this.stateChanged)\n    this.stateChanged()\n  }\n\n  stateChanged (): void {\n    const likesState = store.getState().likes\n    this._hasError = selectIdHasError(likesState, this.registryId)\n    this._isLoading = selectIdIsLoading(likesState, this.registryId)\n    this._isLiked = selectIdIsLiked(likesState, this.registryId)\n  }\n\n  like (): void {\n    store.dispatch(postLike(this.registryId))\n      .then(() => {\n        if (!this._hasError) {\n          this._isLiked = selectIdIsLiked(store.getState().likes, this.registryId)\n          // the aria-pressed indicates whether or not the button is pressed/activated\n          // when user likes a button it is activated\n          this._ariaPressed = true\n          this.pushDataLayerEvent()\n          // the aria-live text content is empty and has to be dynamically set for the voiceover to\n          // annouce the change of action\n          this.toggleMessage.textContent = window.pgettext('NFB Like', 'Title liked')\n        }\n      })\n  }\n\n  unlike (): void {\n    store.dispatch(deleteLike(this.registryId))\n      .then(() => {\n        if (!this._hasError) {\n          this._isLiked = selectIdIsLiked(store.getState().likes, this.registryId)\n          this._ariaPressed = false\n          this.pushDataLayerEvent()\n          this.toggleMessage.textContent = window.pgettext('NFB Like', 'Title unliked')\n        }\n      })\n  }\n\n  pushDataLayerEvent (): void {\n    if (!this._hasError && this.registryId && this.sourceTitle) {\n      window.dataLayer = window.dataLayer || []\n      const data: GTMLike = {\n        event: GTM_EVENTS.LIKE,\n        nfb_version_id: this.registryId.toString(),\n        nfb_version_title: this.sourceTitle,\n        nfb_detail: this._isLiked ? 'liked' : 'unliked'\n      }\n      window.dataLayer?.push(data)\n    }\n  }\n\n  render () {\n    const tooltipLabel = this._isLiked\n      ? window.pgettext('NFB Like', 'Liked')\n      : window.pgettext('NFB Like', 'Like')\n\n    const ariaLabel = this._isLiked\n      ? window.pgettext('NFB Like', 'You’ve liked this title. To undo your evaluation, click the button again.')\n      : window.pgettext('NFB Like', 'Like button. Click this button to inform us that you like this title.')\n\n    return html`\n      <nfb-button\n        @click=${this._isLiked ? this.unlike : this.like}\n        primary-variant=\"${PrimaryVariant.roundWithIcon}\"\n        icon-name=\"${this._isLiked ? 'thumb-up' : 'thumb-up-o'}\"\n        is-dark=\"true\"\n        is-active=\"${this._isLoading}\"\n        data-ui-el=\"nfb-like-button\"\n        data-cy=\"nfb-like-button\"\n        aria-label=\"${ariaLabel}\"\n        tooltip=\"${tooltipLabel}\"\n        aria-pressed=\"${this._ariaPressed}\"\n      >\n      </nfb-button>\n      <div data-ui-el=\"toggle-message\" aria-live=\"polite\"></div>\n    `\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'nfb-like': NFBLike\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`.nfb-hero {\n  --nfb-hero-color: #000000;\n  --nfb-hero-accent-color: #1C7A3E;\n  display: grid;\n  width: 100%;\n  position: relative;\n  padding-bottom: 0;\n  align-items: center;\n  gap: 1rem;\n  background-color: #000;\n  z-index: 2;\n  grid-template-columns: 80px repeat(10, 1fr) 80px;\n}\n\n.nfb-hero nfb-thumbnail {\n  width: 100%;\n  height: 100%;\n}\n\n.nfb-hero__figure {\n  position: relative;\n  justify-self: end;\n  grid-row: 1;\n  margin-bottom: 0;\n  z-index: -1;\n  align-self: stretch;\n  grid-column: 4/-2;\n  width: 100%;\n  display: block;\n  aspect-ratio: 16/7.5;\n}\n\n@media (min-width: 1536px) {\n  .nfb-hero__figure {\n    max-width: 1440px;\n  }\n}\n@media (min-width: 2600px) {\n  .nfb-hero__figure {\n    max-width: 2048px;\n  }\n}\n.nfb-hero__subtitle, .nfb-hero__description {\n  font-family: \"Elza Round\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: normal;\n  font-size: 1rem;\n  line-height: 1.25rem;\n  color: #000;\n  color: var(--nfb-hero-color);\n  margin: 0.5rem 0;\n}\n\n@media screen and (min-width: 1440px), print {\n  .nfb-hero__subtitle, .nfb-hero__description {\n    font-size: clamp(1rem, 1.111vw, 2rem);\n    line-height: 1.2;\n  }\n}\n.nfb-hero__title {\n  font-family: \"Elza Round\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 600;\n  font-size: 2rem;\n  line-height: 2.375rem;\n  color: #000;\n  font-size: clamp(4rem, 3.33vw, 8rem);\n  margin: 0.5rem 0;\n  color: var(--nfb-hero-color) !important;\n}\n\n.nfb-hero__title a {\n  color: inherit;\n  text-decoration: none;\n  transition: color 0.2s;\n  line-height: 1;\n}\n\n.nfb-hero__title a:focus-visible {\n  text-decoration: underline;\n  outline: 0;\n}\n\n.nfb-hero__title a:hover {\n  color: var(--nfb-hero-accent-color);\n}\n\n.nfb-hero__title-treatment {\n  max-width: 100%;\n  max-height: 200px;\n}\n\n.nfb-hero__title-treatment-container {\n  display: flex;\n  margin: 8px 0;\n}\n\n.nfb-hero nfb-button::part(button) {\n  margin-top: 1.5rem;\n}\n\n.nfb-hero__text {\n  grid-row: 1;\n  height: 100%;\n  background: linear-gradient(270deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 50%, rgba(0, 0, 0, 0.7) 75%, #000 100%) padding-box, linear-gradient(to right, #626065, transparent) border-box;\n  border-radius: 6px;\n  border: 1px solid rgba(0, 0, 0, 0);\n  grid-column: 2/7;\n}\n\n.nfb-hero__text-container {\n  box-sizing: border-box;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  height: 100%;\n  margin-left: 0;\n  position: relative;\n  margin-left: 6rem;\n  margin-right: 4rem;\n}\n\n.nfb-hero__figure-overlay {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: linear-gradient(270deg, rgba(0, 0, 0, 0) 50%, rgba(0, 0, 0, 0.3) 73.3%, #000 100%);\n}\n\n.nfb-hero:has(.nfb-hero__title):has(.nfb-hero__title-treatment-container) .nfb-hero__title {\n  display: none;\n}\n\n.nfb-hero.nfb-hero--dark {\n  --nfb-hero-color: #FFFFFF;\n  --nfb-hero-accent-color: #05EE80;\n}\n\n@media screen and (max-width: 1920px), print {\n  .nfb-hero__title {\n    font-family: \"Elza Round\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n    font-style: normal;\n    font-weight: 600;\n    font-size: 1.5rem;\n    line-height: 1.75rem;\n    color: #000;\n    font-size: clamp(3rem, 3.33vw, 4rem);\n  }\n}\n@media screen and (max-width: 1440px), print {\n  .nfb-hero {\n    grid-template-columns: 3rem repeat(8, 1fr) 3rem;\n  }\n  .nfb-hero__figure {\n    grid-column: 3/-2;\n  }\n  .nfb-hero__title {\n    font-family: \"Elza Round\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n    font-style: normal;\n    font-weight: 600;\n    font-size: 1.125rem;\n    line-height: 1.25rem;\n    color: #000;\n    font-size: clamp(2rem, 3.33vw, 3rem);\n  }\n  .nfb-hero__text {\n    grid-column: 2/6;\n  }\n  .nfb-hero__text-container {\n    margin-left: 4rem;\n    margin-right: 4rem;\n  }\n  .nfb-hero__figure {\n    grid-column: 3/-2;\n  }\n}\n@media screen and (max-width: 1280px), print {\n  .nfb-hero {\n    grid-template-columns: 2rem repeat(8, 1fr) 2rem;\n  }\n  .nfb-hero__text {\n    grid-column: 2/6;\n    background: linear-gradient(270deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 50%, rgba(0, 0, 0, 0.7) 75%, #000 100%);\n    border: 0;\n  }\n  .nfb-hero__text-container {\n    margin-left: 0;\n    margin-right: 3rem;\n  }\n}\n@media screen and (max-width: 990px), print {\n  .nfb-hero {\n    grid-template-columns: 1.5rem repeat(6, 1fr) 1.5rem;\n  }\n  .nfb-hero__figure {\n    grid-column: 1/-1;\n    width: 100%;\n  }\n  .nfb-hero__text {\n    background: none;\n    grid-column: 2/5;\n  }\n  .nfb-hero__text-container {\n    justify-content: end;\n    padding-bottom: 2rem;\n    margin-right: 0;\n  }\n  .nfb-hero__title {\n    margin-bottom: 0;\n  }\n  .nfb-hero__title-treatment {\n    max-height: 150px;\n  }\n  .nfb-hero__description {\n    display: none;\n  }\n  .nfb-hero__subtitle-container {\n    margin: 0;\n    display: flex;\n    align-items: center;\n    gap: 0.5rem;\n    margin: 0.5rem 0;\n  }\n  .nfb-hero__subtitle-container nfb-pill {\n    margin-bottom: 2px;\n  }\n  .nfb-hero__subtitle-container h2 {\n    margin: 0;\n  }\n  .nfb-hero__figure-overlay {\n    background: linear-gradient(238deg, rgba(0, 0, 0, 0) 30.61%, rgba(0, 0, 0, 0.9) 100%);\n  }\n}\n@media screen and (max-width: 640px), print {\n  .nfb-hero {\n    display: flex;\n    flex-direction: column;\n    gap: 24px;\n  }\n  .nfb-hero__text {\n    display: grid;\n    grid-template-columns: 0.5rem repeat(4, 1fr) 0.5rem;\n    width: 100%;\n    grid-row: 1;\n  }\n  .nfb-hero__text-container {\n    grid-column: 2/6;\n    width: 100%;\n    height: fit-content;\n    align-items: center;\n    padding-left: 2rem;\n    padding-right: 2rem;\n    padding-bottom: 0;\n    text-align: center;\n  }\n  .nfb-hero__figure-overlay {\n    display: none;\n  }\n  .nfb-hero__title-treatment-container {\n    display: none;\n  }\n  .nfb-hero:has(.nfb-hero__title):has(.nfb-hero__title-treatment-container) .nfb-hero__title {\n    display: block;\n  }\n}`;\nexport default styles;\n","import { LitElement, html, nothing } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { unsafeHTML } from 'lit-html/directives/unsafe-html.js'\n\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\nimport { GTM_EVENTS as CARD_GTM_EVENTS } from '@web-nfb/frontend-static/design-system/gtm/constants'\n\nimport { GTM_EVENTS, GTM_LIST_CATEGORY, GTM_LIST_TYPE } from '@src/js/constants'\nimport { formatComingSoonDate } from '@src/js/helpers/format'\n\n// @ts-expect-error Lit Sass import\nimport heroStyle from '@src/sass/wc/NFBHero.sass?lit'\n\n@customElement('nfb-hero')\nexport class NFBHero extends LitElement {\n  @property({ type: String, attribute: 'link' })\n  link: string = ''\n\n  @property({ type: String, attribute: 'work-title' })\n  workTitle: string = ''\n\n  @property({ type: String, attribute: 'thumbnail-path' })\n  thumbnailPath: string = ''\n\n  @property({ type: String, attribute: 'thumbnail-pattern' })\n  thumbnailPattern: string = window.THUMBNAIL_PATTERN\n\n  @property({ type: String, attribute: 'description' })\n  description: string = ''\n\n  @property({ type: Object, attribute: 'gtm-attributes' })\n  gtmAttributes: object = {}\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-new-release' })\n  isNewRelease: boolean = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-work' })\n  isWork: boolean = true\n\n  @property({ type: String, attribute: 'release-start-date' })\n  releaseStartDate: string = ''\n\n  @property({ type: String, attribute: 'label' })\n  label: string = ''\n\n  @property({ type: String, attribute: 'title-treatment-path' })\n  titleTreatmentPath: string = ''\n\n  _intersectionObserver!: IntersectionObserver\n  _srcsetMaps = [\n    { width: 284, height: '', size: '284w' },\n    { width: 350, height: '', size: '350w' },\n    { width: 598, height: '', size: '598w' },\n    { width: 618, height: '', size: '618w' },\n    { width: 1024, height: '', size: '1024w' },\n    { width: 1236, height: '', size: '1236w' },\n    { width: 1440, height: '', size: '1440w' },\n    { width: 2048, height: '', size: '2048w' }\n  ]\n\n  static styles = [heroStyle]\n\n  constructor () {\n    super()\n    this.intersectingHero = this.intersectingHero.bind(this)\n  }\n\n  firstUpdated (): void {\n    this._intersectionObserver = new IntersectionObserver(this.intersectingHero, {\n      threshold: [0.2]\n    })\n    this._intersectionObserver.observe(this)\n  }\n\n  private intersectingHero (entries: IntersectionObserverEntry[]): void {\n    entries.forEach((entry) => {\n      if (entry.isIntersecting && this.isWork) {\n        this.sendOnVisibleGTMEvent()\n        this._intersectionObserver.unobserve(this)\n      }\n    })\n  }\n\n  getGTMAttributes () {\n    return {\n      nfb_list_category: GTM_LIST_CATEGORY.PROGRAMMING,\n      nfb_list_type: GTM_LIST_TYPE.FEATURE,\n      nfb_position: '1',\n      ...this.gtmAttributes\n    }\n  }\n\n  private sendOnVisibleGTMEvent (): void {\n    if (this.gtmAttributes && Object.keys(this.gtmAttributes).length && window.dataLayer) {\n      window.dataLayer.push({\n        event: CARD_GTM_EVENTS.CARD_VISIBLE,\n        ...this.getGTMAttributes()\n      })\n    }\n  }\n\n  private sendOnClickGTMEvent (): void {\n    if (this.gtmAttributes && Object.keys(this.gtmAttributes).length && window.dataLayer) {\n      let eventName: string = GTM_EVENTS.SELECT_LIST\n      if (this.isWork) {\n        eventName = GTM_EVENTS.SELECT_WORK\n      }\n      window.dataLayer.push({\n        event: eventName,\n        ...this.getGTMAttributes()\n      })\n    }\n  }\n\n  renderNewRelease () {\n    if (!this.isNewRelease) {\n      return nothing\n    }\n\n    return html`\n      <nfb-pill\n        is-dark=\"true\" \n        text=\"${window.gettext('New release')}\"\n      ></nfb-pill>\n    `\n  }\n\n  renderComingSoonDate () {\n    if (!this.releaseStartDate) {\n      return nothing\n    }\n\n    return html`\n      <nfb-pill\n        is-dark=\"true\"\n        text=\"${formatComingSoonDate(this.releaseStartDate)}\"\n      ></nfb-pill>`\n  }\n\n  renderLabel () {\n    if (!this.label) {\n      return nothing\n    }\n\n    return html`\n      <h2 class=\"nfb-hero__subtitle\">\n        ${this.label}\n      </h2>`\n  }\n\n  renderSubtitle () {\n    if (!this.isNewRelease && !this.releaseStartDate && !this.label) {\n      return nothing\n    }\n\n    return html`\n      <div class=\"nfb-hero__subtitle-container\">\n        ${this.renderNewRelease()}\n        ${this.renderComingSoonDate()}\n        ${this.renderLabel()}\n      </div>`\n  }\n\n  getUrl (width: number | string, height: number | string = ''): string {\n    return this.thumbnailPattern\n      ? this.thumbnailPattern\n        .replace('{path}', this.titleTreatmentPath)\n        .replace('{width}', width.toString())\n        .replace('{height}', height.toString())\n      : this.titleTreatmentPath\n  }\n\n  getSrcSetValue (): string {\n    return this._srcsetMaps.map(srcset => {\n      return `${this.getUrl(srcset.width, srcset.height)} ${srcset.size}`\n    }).join(', ')\n  }\n\n  renderTitle () {\n    return html`\n      <h1 class=\"nfb-hero__title\">\n        <a\n          href=\"${this.link}\"\n          @click=${this.sendOnClickGTMEvent}\n        >\n          ${this.workTitle}\n        </a>\n      </h1>`\n  }\n\n  renderTitleTreatment () {\n    if (!this.titleTreatmentPath) return nothing\n\n    return html`\n    <hgroup>\n      <a\n        class='nfb-hero__title-treatment-container'\n        href=\"${this.link}\"\n        @click=${this.sendOnClickGTMEvent}\n      >\n        <img\n          class=\"nfb-hero__title-treatment\"\n          sizes=\"sizes=\"(min-width: 640px) 45vw, 100vw\"\n          alt=\"${this.workTitle}\"\n          data-cy=\"title-treatment-img\"\n          srcset=\"${this.getSrcSetValue()}\"\n          fetchpriority=\"high\"\n        >\n      </a>\n    </hgroup>`\n  }\n\n  render () {\n    return html`\n      <div class=\"nfb-hero nfb-hero--dark\">\n        <a\n          class=\"nfb-hero__figure\"\n          href=\"${this.link}\"\n          tabindex=\"-1\"\n          @click=${this.sendOnClickGTMEvent}\n        >\n          <nfb-thumbnail\n            is-rounded=\"true\"\n            show-loader=\"false\"\n            path=\"${this.thumbnailPath}\"\n            url-pattern=\"${this.thumbnailPattern}\"\n            srcsetMaps=\"${this._srcsetMaps}\"\n            sizes=\"(min-width: 2600px) 2048px, (min-width: 1536px) 1440px, 90vw\"\n          ></nfb-thumbnail>\n          <div class=\"nfb-hero__figure-overlay\"></div>\n        </a>\n        <div class=\"nfb-hero__text\">\n          <div class=\"nfb-hero__text-container\">  \n            ${this.renderSubtitle()}\n            ${this.renderTitle()}\n            ${this.renderTitleTreatment()}\n            <div class=\"nfb-hero__description\">${unsafeHTML(this.description)}</div>\n              <nfb-button\n                text=\"${window.pgettext('Watch button', 'Watch now')}\"\n                primary-variant=\"primary\"\n                icon-name=\"play\"\n                size=\"md\"\n                is-dark=\"true\"\n                link=\"${this.link}\"\n                @click=${this.sendOnClickGTMEvent}\n              ></nfb-button>\n          </div>\n        </div>\n      </div>\n    `\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'nfb-hero': NFBHero\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`.nfb-feature {\n  --nfb-feature-color: #000000;\n  --nfb-feature-accent-color: #1C7A3E;\n  display: grid;\n  width: 100%;\n  position: relative;\n  padding-bottom: 0;\n  align-items: center;\n  gap: 1rem;\n  background-color: #000;\n  z-index: 2;\n  grid-template-columns: 80px repeat(10, 1fr) 80px;\n}\n\n.nfb-feature nfb-thumbnail::part(image) {\n  aspect-ratio: 16/7.5;\n}\n\n.nfb-feature__figure {\n  position: relative;\n  justify-self: end;\n  grid-row: 1;\n  margin-bottom: 0;\n  z-index: -1;\n  align-self: stretch;\n  grid-column: 4/-3;\n}\n\n.nfb-feature__subtitle {\n  font-family: \"Elza Round\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: normal;\n  font-size: 1rem;\n  line-height: 1.25rem;\n  color: #000;\n  color: var(--nfb-feature-color);\n  margin: 0.5rem 0;\n}\n\n@media screen and (min-width: 1440px), print {\n  .nfb-feature__subtitle {\n    font-size: clamp(1rem, 1.111vw, 2rem);\n    line-height: 1.2;\n  }\n}\n.nfb-feature__title {\n  font-family: \"Elza Round\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 600;\n  font-size: 2rem;\n  line-height: 2.375rem;\n  color: #000;\n  font-size: clamp(4rem, 3.33vw, 8rem);\n  margin: 0;\n  color: var(--nfb-feature-color) !important;\n}\n\n.nfb-feature__title a {\n  color: inherit;\n  text-decoration: none;\n  transition: color 0.2s;\n  line-height: 1;\n}\n\n.nfb-feature__title a:focus-visible {\n  text-decoration: underline;\n  outline: 0;\n}\n\n.nfb-feature__title a:hover {\n  color: var(--nfb-feature-accent-color);\n}\n\n.nfb-feature__title-treatment {\n  max-width: 100%;\n  max-height: 200px;\n}\n\n.nfb-feature__title-treatment-container {\n  display: flex;\n  margin: 8px 0;\n}\n\n.nfb-feature nfb-button::part(button) {\n  margin-top: 1.5rem;\n}\n\n.nfb-feature__text {\n  grid-row: 1;\n  height: 100%;\n  background: linear-gradient(270deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 50%, rgba(0, 0, 0, 0.7) 75%, #000 100%) padding-box, linear-gradient(to right, #626065, transparent) border-box;\n  border-radius: 6px;\n  border: 1px solid rgba(0, 0, 0, 0);\n  grid-column: 3/7;\n}\n\n.nfb-feature__text-container {\n  box-sizing: border-box;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  height: 100%;\n  margin-left: 0;\n  position: relative;\n  margin-left: 6rem;\n  margin-right: 4rem;\n  gap: 16px;\n}\n\n.nfb-feature__figure-overlay {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: linear-gradient(270deg, rgba(0, 0, 0, 0) 50%, rgba(0, 0, 0, 0.3) 73.3%, #000 100%);\n}\n\n.nfb-feature:has(.nfb-feature__title):has(.nfb-feature__title-treatment-container) .nfb-feature__title {\n  display: none;\n}\n\n.nfb-feature.nfb-feature--dark {\n  --nfb-feature-color: #FFFFFF;\n  --nfb-feature-accent-color: #05EE80;\n}\n\n@media screen and (max-width: 1920px), print {\n  .nfb-feature__title {\n    font-family: \"Elza Round\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n    font-style: normal;\n    font-weight: 600;\n    font-size: 1.5rem;\n    line-height: 1.75rem;\n    color: #000;\n    font-size: clamp(3rem, 3.33vw, 4rem);\n  }\n}\n@media screen and (max-width: 1440px), print {\n  .nfb-feature {\n    grid-template-columns: 3rem repeat(8, 1fr) 3rem;\n  }\n  .nfb-feature__figure {\n    grid-column: 3/-2;\n  }\n  .nfb-feature__title {\n    font-family: \"Elza Round\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n    font-style: normal;\n    font-weight: 600;\n    font-size: 1.125rem;\n    line-height: 1.25rem;\n    color: #000;\n    font-size: clamp(2rem, 3.33vw, 3rem);\n  }\n  .nfb-feature__text {\n    grid-column: 2/6;\n  }\n  .nfb-feature__text-container {\n    margin-left: 4rem;\n    margin-right: 4rem;\n  }\n  .nfb-feature__figure {\n    grid-column: 3/-2;\n  }\n}\n@media screen and (max-width: 1280px), print {\n  .nfb-feature {\n    grid-template-columns: 2rem repeat(8, 1fr) 2rem;\n  }\n  .nfb-feature__text {\n    grid-column: 2/6;\n    background: linear-gradient(270deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 50%, rgba(0, 0, 0, 0.7) 75%, #000 100%);\n    border: 0;\n  }\n  .nfb-feature__text-container {\n    margin-left: 0;\n    margin-right: 3rem;\n  }\n}\n@media screen and (max-width: 990px), print {\n  .nfb-feature {\n    grid-template-columns: 1.5rem repeat(6, 1fr) 1.5rem;\n  }\n  .nfb-feature__figure {\n    grid-column: 3/-2;\n    width: 100%;\n  }\n  .nfb-feature__title {\n    font-family: \"Elza Round\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n    font-style: normal;\n    font-weight: 600;\n    font-size: 1.5rem;\n    line-height: 1.75rem;\n    color: #000;\n  }\n  .nfb-feature__text {\n    grid-column: 2/5;\n  }\n  .nfb-feature__subtitle-container {\n    margin: 0;\n    display: flex;\n    align-items: center;\n    gap: 0.5rem;\n  }\n  .nfb-feature__subtitle-container nfb-pill {\n    margin-bottom: 2px;\n  }\n  .nfb-feature__subtitle-container h2 {\n    margin: 0;\n  }\n}\n@media screen and (max-width: 640px), print {\n  .nfb-feature {\n    display: flex;\n    flex-direction: column;\n    gap: 24px;\n  }\n  .nfb-feature__figure {\n    display: grid;\n    grid-template-columns: 2rem repeat(4, 1fr) 2rem;\n  }\n  .nfb-feature__figure nfb-thumbnail {\n    grid-column: 2/6;\n  }\n  .nfb-feature__text {\n    display: grid;\n    grid-template-columns: 2rem repeat(4, 1fr) 2rem;\n    width: 100%;\n    grid-row: 1;\n  }\n  .nfb-feature__text-container {\n    grid-column: 2/6;\n    width: 100%;\n    height: fit-content;\n    padding-bottom: 0;\n    text-align: left;\n  }\n  .nfb-feature__figure-overlay {\n    display: none;\n  }\n  .nfb-feature__title-treatment-container {\n    display: none;\n  }\n  .nfb-feature nfb-button::part(button) {\n    margin-top: 0;\n    margin-bottom: 24px;\n  }\n  .nfb-feature:has(.nfb-feature__title):has(.nfb-feature__title-treatment-container) hgroup {\n    display: none;\n  }\n  .nfb-feature:has(.nfb-feature__title):has(.nfb-feature__title-treatment-container) .nfb-feature__title {\n    display: block;\n  }\n}`;\nexport default styles;\n","import { LitElement, html, nothing } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\nimport { GTM_EVENTS as CARD_GTM_EVENTS } from '@web-nfb/frontend-static/design-system/gtm/constants'\n\nimport { GTM_EVENTS, GTM_LIST_CATEGORY, GTM_LIST_TYPE } from '@src/js/constants'\nimport { formatComingSoonDate } from '@src/js/helpers/format'\n\n// @ts-expect-error Lit Sass import\nimport featureStyle from '@src/sass/wc/NFBFeature.sass?lit'\n\n@customElement('nfb-feature')\nexport class NFBFeature extends LitElement {\n  @property({ type: String, attribute: 'link' })\n  link: string = ''\n\n  @property({ type: String, attribute: 'work-title' })\n  workTitle: string = ''\n\n  @property({ type: String, attribute: 'thumbnail-path' })\n  thumbnailPath: string = ''\n\n  @property({ type: String, attribute: 'thumbnail-pattern' })\n  thumbnailPattern: string = window.THUMBNAIL_PATTERN\n\n  @property({ type: Object, attribute: 'gtm-attributes' })\n  gtmAttributes: object = {}\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-new-release' })\n  isNewRelease: boolean = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-work' })\n  isWork: boolean = true\n\n  @property({ type: String, attribute: 'release-start-date' })\n  releaseStartDate: string = ''\n\n  @property({ type: String, attribute: 'label' })\n  label: string = ''\n\n  @property({ type: String, attribute: 'title-treatment-path' })\n  titleTreatmentPath: string = ''\n\n  _intersectionObserver!: IntersectionObserver\n  _srcsetMaps = [\n    { width: 284, height: '', size: '284w' },\n    { width: 350, height: '', size: '350w' },\n    { width: 598, height: '', size: '598w' },\n    { width: 618, height: '', size: '618w' },\n    { width: 1024, height: '', size: '1024w' },\n    { width: 1236, height: '', size: '1236w' },\n    { width: 1440, height: '', size: '1440w' },\n    { width: 2048, height: '', size: '2048w' }\n  ]\n\n  static styles = [featureStyle]\n\n  constructor () {\n    super()\n    this.intersectingFeature = this.intersectingFeature.bind(this)\n  }\n\n  firstUpdated (): void {\n    this._intersectionObserver = new IntersectionObserver(this.intersectingFeature, {\n      threshold: [0.2]\n    })\n    this._intersectionObserver.observe(this)\n  }\n\n  private intersectingFeature (entries: IntersectionObserverEntry[]): void {\n    entries.forEach((entry) => {\n      if (entry.isIntersecting && this.isWork) {\n        this.sendOnVisibleGTMEvent()\n        this._intersectionObserver.unobserve(this)\n      }\n    })\n  }\n\n  getGTMAttributes () {\n    return {\n      nfb_list_category: GTM_LIST_CATEGORY.PROGRAMMING,\n      nfb_list_type: GTM_LIST_TYPE.FEATURE,\n      nfb_position: '1',\n      ...this.gtmAttributes\n    }\n  }\n\n  private sendOnVisibleGTMEvent (): void {\n    if (this.gtmAttributes && Object.keys(this.gtmAttributes).length && window.dataLayer) {\n      window.dataLayer.push({\n        event: CARD_GTM_EVENTS.CARD_VISIBLE,\n        ...this.getGTMAttributes()\n      })\n    }\n  }\n\n  private sendOnClickGTMEvent (): void {\n    if (this.gtmAttributes && Object.keys(this.gtmAttributes).length && window.dataLayer) {\n      let eventName: string = GTM_EVENTS.SELECT_LIST\n      if (this.isWork) {\n        eventName = GTM_EVENTS.SELECT_WORK\n      }\n      window.dataLayer.push({\n        event: eventName,\n        ...this.getGTMAttributes()\n      })\n    }\n  }\n\n  renderNewRelease () {\n    if (!this.isNewRelease) {\n      return nothing\n    }\n\n    return html`\n      <nfb-pill\n        is-dark=\"true\" \n        text=\"${window.gettext('New release')}\"\n      ></nfb-pill>\n    `\n  }\n\n  renderComingSoonDate () {\n    if (!this.releaseStartDate) {\n      return nothing\n    }\n\n    return html`\n      <nfb-pill\n        is-dark=\"true\"\n        text=\"${formatComingSoonDate(this.releaseStartDate)}\"\n      ></nfb-pill>`\n  }\n\n  renderLabel () {\n    if (!this.label) {\n      return nothing\n    }\n\n    return html`\n      <h2 class=\"nfb-feature__subtitle\">\n        ${this.label}\n      </h2>`\n  }\n\n  renderSubtitle () {\n    if (!this.isNewRelease && !this.releaseStartDate && !this.label) {\n      return nothing\n    }\n\n    return html`\n      <div class=\"nfb-feature__subtitle-container\">\n        ${this.renderNewRelease()}\n        ${this.renderComingSoonDate()}\n        ${this.renderLabel()}\n      </div>`\n  }\n\n  getUrl (width: number | string, height: number | string = ''): string {\n    return this.thumbnailPattern\n      ? this.thumbnailPattern\n        .replace('{path}', this.titleTreatmentPath)\n        .replace('{width}', width.toString())\n        .replace('{height}', height.toString())\n      : this.titleTreatmentPath\n  }\n\n  getSrcSetValue (): string {\n    return this._srcsetMaps.map(srcset => {\n      return `${this.getUrl(srcset.width, srcset.height)} ${srcset.size}`\n    }).join(', ')\n  }\n\n  renderTitle () {\n    return html`\n      <h1 class=\"nfb-feature__title\">\n        <a\n          href=\"${this.link}\"\n          @click=${this.sendOnClickGTMEvent}\n        >\n          ${this.workTitle}\n        </a>\n      </h1>`\n  }\n\n  renderTitleTreatment () {\n    if (!this.titleTreatmentPath) return nothing\n\n    return html`\n    <hgroup>\n      <a\n        class='nfb-feature__title-treatment-container'\n        href=\"${this.link}\"\n        @click=${this.sendOnClickGTMEvent}\n      >\n        <img\n          class=\"nfb-feature__title-treatment\"\n          sizes=\"sizes=\"(min-width: 640px) 45vw, 100vw\"\n          alt=\"${this.workTitle}\"\n          data-cy=\"title-treatment-img\"\n          srcset=\"${this.getSrcSetValue()}\"\n          fetchpriority=\"high\"\n        >\n      </a>\n    </hgroup>`\n  }\n\n  render () {\n    return html`\n      <div class=\"nfb-feature nfb-feature--dark\">\n        <a\n          class=\"nfb-feature__figure\"\n          href=\"${this.link}\"\n          tabindex=\"-1\"\n          @click=${this.sendOnClickGTMEvent}\n        >\n          <nfb-thumbnail\n            is-rounded=\"true\"\n            show-loader=\"false\"\n            path=\"${this.thumbnailPath}\"\n            url-pattern=\"${this.thumbnailPattern}\"\n            srcsetMaps=\"${this._srcsetMaps}\"\n            sizes=\"(min-width: 2600px) 2048px, (min-width: 1536px) 1440px, 90vw\"\n          ></nfb-thumbnail>\n          <div class=\"nfb-feature__figure-overlay\"></div>\n        </a>\n        <div class=\"nfb-feature__text\">\n          <div class=\"nfb-feature__text-container\">  \n            ${this.renderSubtitle()}\n            ${this.renderTitle()}\n            ${this.renderTitleTreatment()}\n            <nfb-button\n              text=\"${window.pgettext('Watch button', 'Watch now')}\"\n              primary-variant=\"primary\"\n              icon-name=\"play\"\n              size=\"md\"\n              is-dark=\"true\"\n              link=\"${this.link}\"\n              @click=${this.sendOnClickGTMEvent}\n            ></nfb-button>\n          </div>\n        </div>\n      </div>\n    `\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'nfb-feature': NFBFeature\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`.nfb-survey {\n  position: fixed;\n  box-sizing: border-box;\n  max-width: 25rem;\n  outline: none;\n  box-shadow: 0 0 1rem rgba(0, 0, 0, 0.5);\n  height: auto;\n  bottom: 0;\n  z-index: 999;\n  padding: 0;\n  border: none;\n  border-radius: 0.5rem;\n  background-color: rgba(0, 0, 0, 0);\n  max-height: 90vh;\n  width: 100%;\n  margin-bottom: 1.5rem;\n  overflow-y: auto;\n  opacity: 0;\n}\n\n.nfb-survey__title {\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 500;\n  font-size: 1rem;\n  line-height: 1.5rem;\n  color: var(--nfb-page-text-color);\n  font-weight: 600;\n  color: #fff;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  background: #403e43;\n  padding: 1rem 20px 1rem 20px;\n}\n\n.nfb-survey__content {\n  background-color: #fff;\n  padding: 1.5rem;\n}\n\n.nfb-survey__content nfb-button {\n  display: flex;\n  justify-content: flex-end;\n  margin-top: 1.5rem;\n}\n\n.nfb-survey__confirmation {\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: normal;\n  font-size: 0.875rem;\n  line-height: 1.25rem;\n  color: #000;\n  gap: 1rem;\n  display: flex;\n  flex-direction: column;\n}\n\n.nfb-survey__confirmation-message {\n  font-weight: bold;\n  display: flex;\n  align-items: center;\n  gap: 0.5rem;\n  justify-content: flex-start;\n}\n\n.nfb-survey__confirmation nfb-icon {\n  display: flex;\n}\n\n.nfb-survey__confirmation p {\n  margin: 0;\n}\n\n.nfb-survey__confirmation a {\n  text-decoration: underline;\n  text-underline-position: from-font;\n  color: #000;\n}\n\n.nfb-survey__confirmation a:hover, .nfb-survey__confirmation a:focus-visible {\n  color: #1c7a3e;\n  outline: 0;\n}\n\n.nfb-survey .nfb-form {\n  --nfb-form-accent-color: #000000;\n}\n\n.nfb-survey fieldset {\n  padding: 0;\n}\n\n.nfb-survey .nfb-form__element-container {\n  width: 100%;\n  min-width: unset;\n  display: flex;\n  flex-direction: column;\n  gap: 12px;\n}\n\n.nfb-survey .nfb-form__input-legend {\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: normal;\n  font-size: 0.875rem;\n  line-height: 1.25rem;\n  color: #000;\n  margin-top: 0;\n  margin-bottom: 12px;\n}\n\n.nfb-survey .nfb-form__input-container {\n  border: 1px solid #d4d3d6;\n  border-radius: 60px;\n  padding: 0.5rem 1rem 0.5rem 1rem;\n  width: unset;\n  margin-bottom: 0;\n}\n\n.nfb-survey .nfb-form__input-container label {\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: normal;\n  font-size: 0.875rem;\n  line-height: 1.25rem;\n  color: #000;\n  margin-bottom: 0;\n  display: flex;\n  width: stretch;\n}\n\n.nfb-survey .nfb-form__radio-container {\n  display: flex;\n  justify-content: flex-start;\n  align-items: center;\n  gap: 0.5rem;\n  width: 100%;\n}\n\n@media screen and (min-width: 480px), print {\n  .nfb-survey {\n    margin-right: 1.5rem;\n  }\n}`;\nexport default styles;\n","import { gsap } from 'gsap'\nimport { LitElement, html, PropertyValues, nothing } from 'lit'\nimport { customElement, query, state, queryAll } from 'lit/decorators.js'\nimport { unsafeHTML } from 'lit-html/directives/unsafe-html.js'\nimport dialogPolyfill from 'dialog-polyfill'\n\nimport { COOKIE_NAME, COOKIE_EVENT_NAME } from '@web-nfb/frontend-static/design-system/script/elements/CookiesBannerManager'\nimport { setCookie, cookieExists } from '@web-nfb/frontend-static/design-system/script/utils/cookies'\nimport { GTM_EVENTS } from '@src/js/constants'\nimport { isDialogAvailable } from '@src/js/helpers/browser'\n\n// @ts-expect-error Lit Sass import\nimport style from '@src/sass/wc/NFBSurvey.sass?lit'\n// @ts-expect-error Lit Sass import\nimport formStyles from '@web-nfb/frontend-static/design-system/sass/elements/form.sass?lit'\n\nconst PLATFORM_COOKIE_NAME = {\n  ANSWERED: 'platform_survey_answered',\n  DISMISSED: 'platform_survey_dismissed'\n}\n\nconst SURVEY_DELAY_MS = 3500\n\n@customElement('nfb-survey')\nexport class NFBSurvey extends LitElement {\n  @query('dialog')\n  _dialog!: HTMLDialogElement\n\n  @queryAll('input[type=\"radio\"]')\n  _radioList!: NodeListOf<HTMLInputElement>\n\n  @state()\n  _isSubmitted: boolean = false\n\n  @state()\n  _showDialog: boolean = false\n\n  @state()\n  _submitButtonIsDisabled: boolean = true\n\n  ageArray = [\n    { label: 'under_18', value: window.pgettext('nfb survey', 'Under 18') },\n    { label: '18-24', value: window.pgettext('nfb survey', '18-24') },\n    { label: '25-34', value: window.pgettext('nfb survey', '25-34') },\n    { label: '35-44', value: window.pgettext('nfb survey', '35-44') },\n    { label: '45-54', value: window.pgettext('nfb survey', '45-54') },\n    { label: '55-64', value: window.pgettext('nfb survey', '55-64') },\n    { label: 'over_65', value: window.pgettext('nfb survey', '65+') }\n  ]\n\n  // Text\n  surveyLabel = window.pgettext('nfb survey', 'What is your age group?')\n  surveyConfirmationMessage = window.pgettext('nfb survey', 'Thank you for helping us improve.')\n  surveyNewsletter = window.pgettext('nfb survey', 'Stay part of what we make. <a href=\"%s\">Subscribe to our newsletter.</a>')\n  surveyNewsletterLink = window.pgettext('nfb survey', 'https://www.nfb.ca/newsletters/')\n  surveyTitle = window.pgettext('nfb survey', 'One question to serve you better.')\n\n  static styles = [style, formStyles]\n\n  protected async firstUpdated (): Promise<void> {\n    // Dialog polyfill for old browser\n    if (!isDialogAvailable()) {\n      dialogPolyfill.registerDialog(this._dialog)\n    }\n\n    if (cookieExists(COOKIE_NAME)) {\n      this.handleDialog()\n    } else {\n      window.addEventListener(COOKIE_EVENT_NAME, this.handleDialog)\n    }\n  }\n\n  async updated (_changedProperties: PropertyValues) {\n    if (_changedProperties.has('_showDialog')) {\n      const oldValue = _changedProperties.get('_showDialog')\n\n      if (oldValue !== undefined && !oldValue) {\n        this.displaySurvey()\n      }\n    }\n  }\n\n  displaySurvey = () => {\n    this._dialog?.show()\n    gsap.set(this._dialog, { yPercent: 50 })\n    gsap.to(this._dialog, {\n      duration: 0.25,\n      opacity: 1,\n      yPercent: 0,\n      ease: 'cubic-bezier(0.64, 0.12, 0.57, 0.77)',\n      onComplete: () => {\n        window.dataLayer?.push({\n          event: GTM_EVENTS.POLL_VIEW\n        })\n      }\n    })\n  }\n\n  submitSurvey = () => {\n    const checkedValue = Array.from(this._radioList).find(r => r.checked)?.value\n\n    if (checkedValue) {\n      setCookie(PLATFORM_COOKIE_NAME.ANSWERED, '1', { expirationDays: 30, path: '/' })\n      this.sendSubmitEventGTM(checkedValue)\n      this._isSubmitted = true\n    }\n\n    gsap.to(this._dialog, {\n      duration: 0.25,\n      opacity: 0,\n      yPercent: 50,\n      ease: 'cubic-bezier(0.64, 0.12, 0.57, 0.77)',\n      delay: 12,\n      onComplete: () => {\n        this._showDialog = false\n      }\n    })\n  }\n\n  handleDialog = () => {\n    setTimeout(() => {\n      if (\n        !cookieExists(PLATFORM_COOKIE_NAME.DISMISSED) &&\n        !cookieExists(PLATFORM_COOKIE_NAME.ANSWERED) &&\n        cookieExists(COOKIE_NAME) &&\n        !!window.google_tag_manager\n      ) {\n        this._showDialog = true\n      }\n    }, SURVEY_DELAY_MS)\n  }\n\n  closeModal = () => {\n    setCookie(PLATFORM_COOKIE_NAME.DISMISSED, '1', { expirationDays: 7, path: '/' })\n    this._dialog.close()\n  }\n\n  sendSubmitEventGTM (nfb_detail: string): void {\n    window.dataLayer?.push({\n      event: GTM_EVENTS.POLL_ANSWER,\n      nfb_detail\n    })\n  }\n\n  onInputChange (): void {\n    this._submitButtonIsDisabled = false\n  }\n\n  getSurveyContent = () => {\n    return this._isSubmitted\n      ? html`\n      <div class=\"nfb-survey__confirmation\">\n        <p class=\"nfb-survey__confirmation-message\">\n          <nfb-icon name=\"smile-o\"></nfb-icon>\n          ${this.surveyConfirmationMessage}\n        </p>\n        <p class=\"nfb-survey__confirmation-newsletter\">\n          ${unsafeHTML(window.interpolate(this.surveyNewsletter, [this.surveyNewsletterLink]))}\n        </p>             \n      </div>`\n      : html`\n      <fieldset>\n        <div class=\"nfb-form__element-container\">\n          <legend class=\"nfb-form__input-legend\">${this.surveyLabel}</legend>\n          ${this.ageArray.map((age, index) => {\n            return html`\n              <div class=\"nfb-form__input-container\">\n                <div class=\"nfb-form__radio-container\">\n                  <input\n                    type=\"radio\"\n                    value=\"${age.label}\"\n                    id=\"radio${index}\"\n                    name=\"group1\"\n                    @change=\"${this.onInputChange}\"\n                  />\n                  <label for=\"radio${index}\">${age.value}</label>\n                </div>\n              </div>`\n          })}\n        </div>\n      </fieldset>\n      <nfb-button\n        primary-variant=\"primary\"\n        text=\"${window.pgettext('nfb survey', 'Submit')}\"\n        @click=\"${this.submitSurvey}\"\n        is-disabled=\"${this._submitButtonIsDisabled}\"\n      ></nfb-button>`\n  }\n\n  getDialogElement = () => {\n    return html`\n      <dialog class=\"nfb-survey\">\n        <div class=\"nfb-survey__title\">\n          <span>${this.surveyTitle}</span>\n          <nfb-button\n            icon-name=\"delete\"\n            is-dark=\"true\"\n            primary-variant=\"round-with-icon\"\n            secondary-variant=\"discreet\"\n            @click=\"${this.closeModal}\"\n          >\n          </nfb-button>\n        </div>\n        <div class=\"nfb-survey__content\">\n          <div class=\"nfb-form\">\n            ${this.getSurveyContent()}\n          </div>\n        </div>\n      </dialog>`\n  }\n\n  render () {\n    if (this._showDialog) return this.getDialogElement()\n\n    return nothing\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'nfb-survey': NFBSurvey\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`:host {\n  columns: 3;\n  column-gap: 1.5rem;\n}\n\nul, li {\n  list-style-type: none;\n}\n\n.nfb-platform-nav__menu-item {\n  margin-bottom: 1.5rem;\n  width: fit-content;\n}\n\n.nfb-platform-nav__menu-item a {\n  font-family: \"Elza Round\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 600;\n  font-size: 0.875rem;\n  line-height: 1rem;\n  color: var(--nfb-page-text-color);\n  font-weight: 500;\n  color: var(--nfb-platform-nav--text-color);\n  text-decoration: none;\n  display: block;\n  break-inside: avoid-column;\n  width: 100%;\n}\n\n.nfb-platform-nav__menu-item a:hover, .nfb-platform-nav__menu-item a:focus-visible {\n  color: var(--nfb-platform-nav--hover-color);\n  text-decoration: underline;\n  text-underline-position: under;\n}\n\n.nfb-platform-nav__menu-item a:hover {\n  text-decoration-thickness: 2px;\n}\n\n.nfb-platform-nav__menu-item a:focus-visible {\n  outline: 0;\n  text-decoration-thickness: 4px;\n}\n\n.nfb-platform-nav__menu-item:last-child {\n  margin-bottom: 0;\n}\n\n.nfb-platform-nav__menu-item--active a {\n  text-decoration: underline;\n  text-underline-position: under;\n  color: var(--nfb-platform-nav--text-color);\n  font-weight: bold;\n  text-decoration-thickness: 2px;\n}\n\n@media screen and (max-width: 61.875rem) {\n  :host {\n    columns: 1;\n  }\n  .nfb-platform-nav__menu-item {\n    margin-bottom: 1.5rem;\n    width: fit-content;\n  }\n  .nfb-platform-nav__menu-item a {\n    font-family: \"Elza Round\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n    font-style: normal;\n    font-weight: 600;\n    font-size: 1rem;\n    line-height: 1.25rem;\n    color: var(--nfb-page-text-color);\n    font-weight: 500;\n  }\n}`;\nexport default styles;\n","/**\n * Class NFBPopularSubjectList\n */\n\nimport { LitElement } from 'lit'\nimport { html } from 'lit/static-html.js'\nimport { customElement, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\n\nimport normanPaths from '@src/js/helpers/paths'\nimport { GTM_EVENTS } from '@src/js/constants'\nimport { store } from '@src/js/redux/store'\nimport { fetchPopularSubjects } from '@src/js/redux/crossPlatformNavReducer'\nimport { SubjectInfo } from '@src/js/redux/subjectsReducer'\n\n// @ts-expect-error Lit Sass import\nimport styles from '@src/sass/wc/NFBPopularSubjectList.sass?lit'\n\n@customElement('nfb-popular-subject-list')\nexport default class NFBPopularSubjectList extends LitElement {\n  @state()\n  popularSubjectList: SubjectInfo[] | null = null\n\n  static get styles () {\n    return [styles]\n  }\n\n  constructor () {\n    super()\n    this.stateChanged = this.stateChanged.bind(this)\n  }\n\n  stateChanged (): void {\n    const currentStates = store.getState()\n    if (!this.popularSubjectList && currentStates.crossPlatformNav?.popularSubjectList) {\n      this.popularSubjectList = currentStates.crossPlatformNav?.popularSubjectList\n    }\n  }\n\n  async connectedCallback () {\n    super.connectedCallback()\n    store.subscribe(this.stateChanged)\n    if (store.getState().crossPlatformNav.status === undefined) {\n      await store.dispatch(fetchPopularSubjects())\n      this.popularSubjectList = store.getState().crossPlatformNav.popularSubjectList\n    }\n  }\n\n  getClasses (isActive: boolean): Record<string, boolean> {\n    return {\n      'nfb-platform-nav__menu-item': true,\n      'nfb-platform-nav__menu-item--active': isActive\n    }\n  }\n\n  getGTMAttributes (subject: SubjectInfo, path: string) {\n    const gtmAttribute = {\n      nfb_detail: 'explore_menu',\n      event: GTM_EVENTS.MENU,\n      link_url: `${window.location.origin}${path}`,\n      link_text: subject.short_name ?? subject.name\n    }\n\n    window.dataLayer.push(gtmAttribute)\n  }\n\n  render () {\n    return html`\n${this.popularSubjectList?.map((subject) => {\n    const path = normanPaths.exploreBySubject.replace('{parentSubject}', subject.slug)\n    const isActive = window.location.pathname === path\n    return html`\n    <li\n      class=\"${classMap(this.getClasses(isActive))}\"\n    >\n      <a\n        class=\"nfb-platform-nav__menu-link\"\n        href=\"${path}\"\n        @click=${() => this.getGTMAttributes(subject, path)}\n        title=\"${subject.short_name ?? subject.name}\"\n      >\n        <span>${subject.short_name ?? subject.name}</span>\n      </a>\n    </li>\n    `\n  })}\n    `\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'nfb-popular-subject-list': NFBPopularSubjectList\n  }\n}\n","import AccordionManager from '@web-nfb/frontend-static/design-system/script/elements/AccordionManager'\nimport CollapsableManager from '@web-nfb/frontend-static/design-system/script/elements/CollapsableManager'\nimport CookiesBannerManager from '@web-nfb/frontend-static/design-system/script/elements/CookiesBannerManager'\nimport CarouselsManager from '@web-nfb/frontend-static/design-system/script/elements/CarouselsManager'\nimport CardManager from '@web-nfb/frontend-static/design-system/script/elements/CardManager'\nimport DropdownManager from '@web-nfb/frontend-static/design-system/script/elements/DropdownManager'\nimport FormManager from '@web-nfb/frontend-static/design-system/script/elements/FormManager'\nimport LeftNavManager from '@web-nfb/frontend-static/design-system/script/elements/LeftNavManager'\nimport { initTooltips } from '@web-nfb/frontend-static/design-system/script/elements/TooltipManager'\nimport { initRibbons, destroyRibbons } from '@web-nfb/frontend-static/src/js/custom/modules/m-ribbon.js'\nimport NFBPlatformNavManager from '@src/js/elements/NFBPlatformNavManager'\n\nimport '@web-nfb/frontend-static/design-system/wc/button/NFBButton'\nimport '@web-nfb/frontend-static/design-system/wc/card/NFBCard'\nimport '@web-nfb/frontend-static/design-system/wc/card/NFBCarouselCard'\nimport '@web-nfb/frontend-static/design-system/wc/carousel/NFBCarousel'\nimport '@web-nfb/frontend-static/design-system/wc/carousel/boxedCarousel/NFBBoxedCarousel'\nimport '@web-nfb/frontend-static/design-system/wc/confirmation/NFBConfirmation'\nimport '@web-nfb/frontend-static/design-system/wc/icon/NFBIcon'\nimport '@web-nfb/frontend-static/design-system/wc/inlineMessage/NFBInlineMessage'\nimport '@web-nfb/frontend-static/design-system/wc/legend/legendIcons/NFBLegendIcons'\nimport '@web-nfb/frontend-static/design-system/wc/legend/legendItem/NFBLegendItem'\nimport '@web-nfb/frontend-static/design-system/wc/loader/NFBLoader'\nimport '@web-nfb/frontend-static/design-system/wc/ribbon/NFBRibbon'\nimport '@web-nfb/frontend-static/design-system/wc/spinner/NFBSpinner'\nimport '@web-nfb/frontend-static/design-system/wc/thumbnail/NFBThumbnail'\nimport '@web-nfb/frontend-static/design-system/wc/seeMore/NFBSeeMore'\nimport '@web-nfb/frontend-static/design-system/wc/pill/NFBPill'\n\nimport '@src/js/wc/NFBAddToMyList'\nimport '@src/js/wc/NFBGridList'\nimport '@src/js/wc/NFBHistoryProgressBar'\nimport '@src/js/wc/cards/NFBDisplayWorkCard'\nimport '@src/js/wc/cards/NFBAnimatedHoverCard'\nimport '@src/js/wc/carousels/base/NFBNormanCarousel'\nimport '@src/js/wc/carousels/base/NFBWorkCarousel'\nimport '@src/js/wc/carousels/NFBBlogCarousel'\nimport '@src/js/wc/NFBBreadcrumb'\nimport '@src/js/wc/NFBLike'\nimport '@src/js/wc/NFBHero'\nimport '@src/js/wc/NFBFeature'\nimport '@src/js/wc/NFBSurvey'\nimport '@src/js/wc/platform-nav/NFBPopularSubjectList'\n\nimport { cookiesAreEnabled } from '@src/js/helpers/cookies'\n\n// Expose CarouselsManager globally\n// to initiate objects in non-module JS files (ex: for the blog carousel)\nwindow.CarouselsManager = CarouselsManager\nwindow.CardManager = CardManager\n\nexport default class App {\n  accordionManager: AccordionManager | undefined\n  collapsableManager: CollapsableManager | undefined\n  cookiesBannerManager: CookiesBannerManager | undefined\n  carouselsManager: CarouselsManager | undefined\n  cardManager: CardManager | undefined\n  dropdownManager: DropdownManager | undefined\n  formManager: FormManager | undefined\n  leftNavManager: LeftNavManager | undefined\n  NFBPlatformNavManager: NFBPlatformNavManager | undefined\n\n  cookieEnabled: boolean = true\n\n  init () {\n    this.cookieEnabled = cookiesAreEnabled()\n\n    console.log('Init app')\n\n    if (this.cookieEnabled) {\n      this.cookiesBannerManager = new CookiesBannerManager()\n      this.cookiesBannerManager.init()\n    }\n\n    this.carouselsManager = new CarouselsManager()\n    this.carouselsManager.init()\n\n    this.cardManager = new CardManager()\n    this.dropdownManager = new DropdownManager({ selector: '[data-ui-el=\"nfb-dropdown-trigger\"]' })\n    this.dropdownManager.init()\n\n    this.accordionManager = new AccordionManager()\n    this.collapsableManager = new CollapsableManager()\n\n    this.formManager = new FormManager()\n    this.formManager.init()\n\n    try {\n      this.leftNavManager = new LeftNavManager()\n      this.leftNavManager.init()\n    } catch {}\n\n    try {\n      this.NFBPlatformNavManager = new NFBPlatformNavManager()\n      this.NFBPlatformNavManager.init()\n    } catch {}\n\n    this.setContentAsLoaded()\n\n    initTooltips()\n    initRibbons()\n  }\n\n  setContentAsLoaded = () => {\n    // this function is to display a tooltip for users who do not have their cookies enabled\n    // this is for the nfb-left-nav (in education and distribution page)\n    let leftNavLogin = document.querySelector('[data-ui-el=\"left-nav-sign-in\"]') as HTMLElement\n    if (!this.cookieEnabled) {\n      // this is for the nfb-platform-nav\n      if (!leftNavLogin) leftNavLogin = document.querySelector('[data-ui-el=\"user-menu-element\"]') as HTMLElement\n      leftNavLogin.dataset.uiDisabled = true.toString()\n      const cookieDisabledTooltip = document.querySelector('[data-ui-el=\"cookies-disabled-tooltip\"]') as HTMLElement\n      if (cookieDisabledTooltip) {\n        cookieDisabledTooltip.dataset.uiShow = true.toString()\n      }\n    }\n\n    const layout = document.querySelector('[data-ui-el=\"main-layout\"]') as HTMLElement\n    if (layout) { layout.dataset.uiLoaded = true.toString() }\n  }\n\n  destroy () {\n    console.log('Destroy app')\n    this.cookiesBannerManager?.destroy()\n    this.carouselsManager?.destroy()\n    this.cardManager?.destroy()\n    this.dropdownManager?.destroy()\n\n    destroyRibbons()\n  }\n}\n","import App from './App.ts'\n\nlet app = null\n\n// Begin HMR Stuff used in dev\nif (import.meta.webpackHot) {\n  import.meta.webpackHot.accept()\n  if (import.meta.webpackHot.data) {\n    ({ app } = import.meta.webpackHot.data)\n    app.destroy()\n\n    app = new App()\n    app.init()\n  }\n}\n// End HMR Stuff used in dev\n\nif (!app) {\n  app = new App()\n  document.addEventListener('DOMContentLoaded', () => app.init())\n}\n\n// Begin HMR Stuff used in dev\nif (import.meta.webpackHot) {\n  import.meta.webpackHot.dispose(data => {\n    data.app = app\n  })\n}\n// End HMR Stuff used in dev\n"],"names":["ApiClient","basePath","baseURL","method","url","data","headers","params","ApiV4Client","PublicApiV5Client","GTM_EVENTS","GTM_LIST_TYPE","GTM_LIST_CATEGORY","GTM_LIST_ID","GTM_CONTENT_TYPE","GTM_VIDEO_CAST_TYPE","GTM_VIDEO_CASTING_TYPE","GTM_VIDEO_CAST_TECH_TYPE","GTM_LANG_CONTENT_TYPE","GTM_ECOMMERCE_ITEM_DETAIL","GTM_TIE_IN_DETAIL","GTM_AB_GROUP","DEFAULT_LIST_LENGTH","ERROR_MESSAGE","LANGUAGE_FILTER_OPTIONS","SORT_BY_FILTER_OPTIONS","WATCH_HISTORY_LIST_LENGTH","DEFAULT_GRID_LIST_LENGTH","WorkAvailabilityStatus","PLAYABLE_STATUS","getAvailabilityStatusForWork","work","availabilityData","isTouch","isTouchScreen","userAgentCheck","touchCheck","screenCheck","isDialogAvailable","getSafariVersion","safariMatch","cookiesAreEnabled","getRestriction","film","availabilityStatus","isDark","userState","workIsDTO","workIsRental","rental","expirationDate","formatedExpiredDate","getAvailabilityMessage","message","cardShouldBeDisabled","getNFBAddToMyListButton","registryId","title","getActionButton","buttonType","handleUrl","getSeriesOrCollectionLegend","seriesInfo","creatorSlot","getFilmLegend","formatDuration","duration","durationToNumber","h","m","formatComingSoonDate","dateString","lang","dateObject","now","diffDays","formatDirectors","directors","directorsString","d","index","separator","formatSeriesInfo","formatCollectionInfo","formatYearRange","formatHistoryItemDate","timestamp","formatGenreInfo","genreList","stripTags","html","secondsToMinutes","seconds","minutesToSeconds","minutes","getPlatformLanguageCode","fetchAllFromSessionStorage","key","unparsedSessionHistory","parsedSessionHistory","postSessionStorage","thunkAPI","historySession","item","sortByTimestamp","a","b","initialState","animatedHoverCardSlice","state","action","setCurrentOpenCard","apiV4Client","fetchBookmarks","response","postBookmark","registry_id","deleteBookmark","fetchBookmarksList","_","idListToFetch","bookmarksSlice","builder","i","id","selectIdIsBookmarked","selectIdIsLoading","selectIdHasError","selectBookmarksIds","carouselSlice","setCurrentActiveCarousel","fetchChannel","slug","include_featured","per_page","page","idsList","r","fetchPopularSubjects","fetchWorkListByDirector","size","language","idList","worksPayload","w","totalCount","directorsSlice","setCurrentPage","resetList","publicApiV5Client","fetchDirectorList","subset","indigenous_nation","first_letter","count_by_letter","sort","fetchDirectorCountByLetterList","DEFAULT_FILTER","educationalSubjectPageSlice","setFilter","fetchExploreByChildSubject","exploreBySubjectSlice","sortMapping","SORT_ORDER","initialFilterList","fetchExploreByWork","currentPageState","exploreByWorkPageSlice","setLanguage","setGenre","setAvailability","setSort","setCC","setDV","setSafeSearch","setYearMin","setYearMax","setDurationMin","setDurationMax","setTitleLetter","resetSearchResult","setAllFilters","SESSION_FILM_HISTORY_KEY","fetchFilmHistory","is_completed","registry_ids","f","deleteFilmHistory","filmHistorySlice","tempList","selectFilmHistoryById","selectFilmHistoryIds","updateFilmHistoryList","fetchFilms","subject","subject_category","age_level_min","age_level_max","year_min","year_max","title_letter","getFilmsParams","getState","ids","diff","filmsSlice","resetFilmList","indigenousCinemaSlice","setSelectedLetter","setSliderMinMax","fetchLikeByRegistryId","postLike","deleteLike","likesSlice","selectIdIsLiked","fetchNationList","nationsSlice","PlayerError","fetchStream","streamType","streamData","streamResponse","playersSlice","existingOptions","options","source","dvSource","currentRegistryId","next","indexOfNext","selectPlayerOptionsByRegistryId","selectNextInQueue","addToPlayerOptionsList","setQueue","setCurrentPlaying","setCurrentError","setIsLoading","setNextIdReturnedByAPI","modifyPlayerOptions","invalidateStreamDataForWork","fetchPlaylistTab","ThunkAPI","playlistTabsSlice","items","selectBySlug","fetchRecommendations","workType","API_ENDPOINT_FOR_TYPE","fetchSeries","seriesEndpoint","seriesData","seasons","episodesList","episodesIdsList","s","e","setEpisodesList","setAllEpisodeIdList","reversesSeasons","reverseEpisodesList","setSeasonList","seriesPageSlice","currentSeason","allCompleted","filmHistory","initSeries","setDisplayedSeasonNumber","setDisplayedSeasonTitle","selectCurrentEpisodesList","selectSeriesIsCompleted","store","seriesPageState","seasonNumber","episodesListEntries","number","list","seasonNumberInt","seasonTitle","season","bookmarksReducer","channelsReducer","filmHistoryReducer","playersReducer","recommendationsReducer","seriesPageReducer","workHistoryReducer","workPageReducer","userReducer","worksReducer","viewingHistoryReducer","subjectsReducer","indigenousCinemaReducer","directorsReducer","nationsReducer","filmsReducer","educationalSubjectPageReducer","likesReducer","playlistTabsReducer","animatedHoverCardReducer","carouselReducer","exploreBySubjectReducer","directorsPageReducer","exploreByWorkPageReducer","crossPlatformNavReducer","getDefaultMiddleware","getSubjectsAPI","category_type","highlight","fetchSubjectList","fetchSubjectBySlug","fetchSubjectByChildSlug","childSlug","subjectsSlice","selectHighlight","selectNotHighlight","fetchRentals","include_expired","fetchUserRecommendations","fetchUserSimilarTaste","userSlice","selectActiveRentalForWork","viewingHistorySlice","setIsDeleting","SESSION_WORK_HISTORY_KEY","fetchAllFromApi","fetchAll","sessionHistory","filteredSessionHistory","fetchAllContinueWatching","postHistory","history","_a","returnedHistory","workHistorySlice","filmIds","viewContextIds","parentRegistryId","selectWorkHistoryById","selectContinueWatching","selectContinueWatchingIds","selectContinueWatchingAndParentWorkIds","selectHistoryForParentWork","setDisplayedRegistryId","worksList","fetchVersionList","expression_id","includeFields","workPageSlice","highlightIdFromURL","setPageIsReady","initWork","initHighlightId","setHighlightId","setHeaderImageIsLoaded","setDisplayedWork","setLastClickElement","setCurrentActiveClickElement","basicIncludeFields","detailedIncludeFields","fetchWorks","availability","cc","category","director","durationMax","durationMin","dv","genre","safeSearch","subjectCategory","titleLetter","yearMax","yearMin","getWorkParams","worksSlice","test","fetchContinueWatchingWorks","fetchViewingHistory","addWorkToList","resetWorkList","selectWorkById","selectWorkByIdList","selectWorksFromParams","CardType","bookmarkButtonType","NFBDisplayWorkCard","name","_old","value","works","jsonGTMAttribute","description","showMoreLink","elementTag","thumbnailPattern","NFBWorkPageCreator","c","suffix","classes","variantClass","NFBWorkPageLegend","ribbon","el","hide","cookieName","cookieExpires","ribbonList","initRibbons","destroyRibbons","NFBPlatformNavManager","gsap","leftNavToggle","firstFocusableElement","navOpened","nfb_detail","relatedTarget","target","isOutsideExplore","isOutsideLanguage","isOutsideUser","currentScroll","hasScrolledToTop","rootFontSize","NFBAddToMyList","bookmarksState","eventName","buttonLabel","NFBGridList","_b","yearA","yearB","relatedHistory","contextWork","gtmAttrs","repeat","NFBHistoryProgressBar","withReset","filmHistoryPercent","NFBAnimatedHoverCardLegend","format","FADE_IN_ANIMATION_DURATION","FADE_OUT_ANIMATION_DURATION","NFBAnimatedHoverCard","entry","host","scaleIncrease","scaleIncreaseRatio","pixelOffset","pixelOffsetHalf","x","currentActiveCarousel","event","timeSinceKeyboard","relatedTargetElement","card","oldOpenCard","currentOpenCard","rootContainer","shouldBeDisabled","NFBNormanCarousel","carouselId","NFBWorkCarousel","registryIds","_changedProperties","cardMax","bookmarkButton","thumbnailPath","NFBBlogCarousel","stringResult","xml","numberCards","element","gtmAttributes","NFBBreadcrumb","itemTemplates","NFBLike","likesState","tooltipLabel","ariaLabel","NFBHero","entries","width","height","srcset","NFBFeature","PLATFORM_COOKIE_NAME","SURVEY_DELAY_MS","NFBSurvey","checkedValue","age","oldValue","NFBPopularSubjectList","currentStates","isActive","path","gtmAttribute","CarouselsManager","CardManager","App","leftNavLogin","cookieDisabledTooltip","layout","CookiesBannerManager","DropdownManager","AccordionManager","CollapsableManager","FormManager","LeftNavManager","app"],"sourceRoot":""}