{"version":3,"file":"js/hub-page.min.js","mappings":"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","sources":["webpack:///./src/sass/wc/NFBIndigenousCinemaBanner.sass","webpack:///./src/js/wc/NFBIndigenousCinemaBanner.ts","webpack:///./src/js/wc/carousels/NFBUserRecommendationsCarousel.ts","webpack:///./src/js/wc/carousels/NFBUserSimilarTasteCarousel.ts","webpack:///./src/sass/wc/NFBThemedCarousel.sass","webpack:///./src/js/wc/carousels/NFBThemedCarousel.ts","webpack:///./src/sass/wc/NFBNewsletterBanner.sass","webpack:///./src/js/wc/NFBNewsletterBanner.ts","webpack:///./src/js/wc/carousels/NFBBookmarksCarousel.ts","webpack:///./src/js/wc/carousels/NFBContinueWatchingCarousel.ts","webpack:///./src/sass/section.sass","webpack:///./src/sass/wc/NFBSpinnerContainer.sass"],"sourcesContent":["import {css} from 'lit';\nexport const styles = css`.nfb-indigenous-cinema-banner {\n  background-image: var(--nfb-indigenous-banner-url);\n  background-size: cover;\n  background-position: center;\n  display: block;\n  padding: 1.5rem;\n  display: flex;\n  flex-direction: column;\n  gap: 1rem;\n  text-decoration: none;\n  border-radius: 6px;\n  overflow: hidden;\n}\n\n.nfb-indigenous-cinema-banner:focus-visible {\n  text-decoration: underline;\n  outline: 0;\n  text-decoration-thickness: 2px;\n  color: #1c7a3e;\n}\n\n@media screen and (min-width: 768px), print {\n  .nfb-indigenous-cinema-banner {\n    flex-direction: row;\n    align-items: center;\n    justify-content: space-between;\n  }\n}\n.nfb-indigenous-cinema-banner__container {\n  display: flex;\n  flex-direction: column;\n  gap: 16px;\n}\n\n.nfb-indigenous-cinema-banner__title {\n  margin-top: 0;\n  text-transform: uppercase;\n  font-weight: 500;\n  font-size: 1.25rem;\n  font-family: \"Elza Round\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  margin-bottom: 0;\n  color: #fff;\n}\n\n.nfb-indigenous-cinema-banner__description {\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: #fff;\n  margin-bottom: 0;\n}\n\n::part(button) {\n  --nfb-button-border-color--hover: #b3b2b1;\n  --nfb-button-border-color--active: #b3b2b1;\n  --nfb-button-border-color--focus: #b3b2b1;\n  --nfb-button-border-color--selected: #b3b2b1;\n  --nfb-button-background-color--hover: #FFFFFF;\n  --nfb-button-background-color--active: #FFFFFF;\n  --nfb-button-background-color--focus: #FFFFFF;\n  --nfb-button-background-color--selected: #FFFFFF;\n  font-weight: 600;\n}`;\nexport default styles;\n","import { LitElement, html, css, unsafeCSS } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport indigenousBannerImg from '@src/img/indigenous-banner.jpg'\n\n// @ts-expect-error Lit Sass import\nimport styles from '@src/sass/wc/NFBIndigenousCinemaBanner.sass?lit'\n\n@customElement('nfb-indigenous-cinema-banner')\nexport default class NFBIndigenousCinemaBanner extends LitElement {\n  @property({ type: String, attribute: 'link' })\n  link = ''\n\n  static styles = [\n    styles,\n    css`\n    :host {\n      --nfb-indigenous-banner-url: url(${unsafeCSS(indigenousBannerImg)});\n    }`\n  ]\n\n  render () {\n    return html`\n      <a\n        class=\"nfb-indigenous-cinema-banner\"\n        href=\"${this.link}\"\n      >\n        <div class=\"nfb-indigenous-cinema-banner__container\">\n          <span class=\"nfb-indigenous-cinema-banner__title\">\n          ${window.pgettext('Indigenous banner', 'Indigenous Cinema')}\n          </span>\n          <span class=\"nfb-indigenous-cinema-banner__description\">\n            ${window.pgettext('Indigenous banner', 'Discover the NFB’s rich online collection of Indigenous-made films.')}\n          </span>\n        </div>\n        <nfb-button\n          text=\"${window.pgettext('Indigenous banner', 'Watch')}\"\n          tabindex=\"-1\"\n        ></nfb-button>\n      </a>\n    `\n  }\n}\n","/**\n * Class NFBUserRecommendationsCarousel.\n *\n */\n\nimport { LitElement, html, nothing } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\n\nimport { store } from '@src/js/redux/store'\nimport { DEFAULT_LIST_LENGTH, GTM_LIST_CATEGORY, GTM_LIST_ID } from '@src/js/constants'\nimport '@src/js/wc/work-page/NFBWorkPageCreator'\nimport '@src/js/wc/work-page/NFBWorkPageLegend'\n\nimport { fetchUserRecommendations } from '@src/js/redux/userReducer'\n\n@customElement('nfb-user-recommendations-carousel')\nexport default class NFBUserRecommendationsCarousel extends LitElement {\n  @state()\n  _registryIds: number[]\n\n  @state()\n  _isLoading: boolean = true\n\n  _carouselSlug: string = 'user-recommendations-carousel'\n  _carouselTitle: string = window.pgettext('User recommendations carousel', 'Recommended for you')\n\n  async connectedCallback () {\n    super.connectedCallback()\n    await store.dispatch(fetchUserRecommendations(DEFAULT_LIST_LENGTH))\n    const state = store.getState()\n    this._registryIds = state.user.recommendations ?? []\n    this._isLoading = false\n  }\n\n  render () {\n    if (this._isLoading) { return nothing }\n\n    // nfb_list_name and nfb_list_type are found in NFBNormanCarousel\n    const gtmAttributes = JSON.stringify(\n      {\n        nfb_list_category: GTM_LIST_CATEGORY.PERSONAL_RECOMMENDATION,\n        nfb_list_id: GTM_LIST_ID.USER_RECOMMENDATIONS\n      }\n    )\n\n    return html`\n      <nfb-work-carousel\n        registry-id-list=\"${JSON.stringify(this._registryIds)}\"\n        carousel-title=\"${this._carouselTitle}\"\n        gtm-attributes=\"${gtmAttributes}\"\n        carousel-slug=\"${this._carouselSlug}\"\n        data-cy=\"carousel-channel-${this._carouselSlug}\"\n        is-dark=\"true\"\n        is-clothesline=\"true\"\n      >\n      </nfb-work-carousel>\n    `\n  }\n}\n","/**\n * Class NFBUserSimilarTasteCarousel.\n *\n */\n\nimport { LitElement, html, nothing } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\n\nimport { store } from '@src/js/redux/store'\nimport { GTM_LIST_CATEGORY, GTM_LIST_ID, DEFAULT_LIST_LENGTH } from '@src/js/constants'\nimport '@src/js/wc/work-page/NFBWorkPageCreator'\nimport '@src/js/wc/work-page/NFBWorkPageLegend'\n\nimport { fetchUserSimilarTaste } from '@src/js/redux/userReducer'\n\n@customElement('nfb-user-similar-taste-carousel')\nexport default class NFBUserSimilarTasteCarousel extends LitElement {\n  @state()\n  _registryIds: number[]\n\n  @state()\n  _isLoading: boolean = true\n\n  _carouselSlug: string = 'user-similar-taste-carousel'\n  _carouselTitle: string = window.pgettext('User similar taste carousel', 'Top picks by film buffs with similar taste')\n\n  async connectedCallback () {\n    super.connectedCallback()\n    await store.dispatch(fetchUserSimilarTaste(DEFAULT_LIST_LENGTH))\n    const userState = store.getState().user\n    if (userState && !this._registryIds?.length) {\n      this._registryIds = userState.similarTaste ?? []\n      this._isLoading = false\n    }\n  }\n\n  render () {\n    if (this._isLoading) { return nothing }\n\n    // nfb_list_name and nfb_list_type are found in NFBNormanCarousel\n    const gtmAttributes = JSON.stringify(\n      {\n        nfb_list_category: GTM_LIST_CATEGORY.PERSONAL_RECOMMENDATION,\n        nfb_list_id: GTM_LIST_ID.SIMILAR_TASTE\n      }\n    )\n\n    return html`\n      <nfb-work-carousel\n        registry-id-list=\"${JSON.stringify(this._registryIds)}\"\n        carousel-title=\"${this._carouselTitle}\"\n        gtm-attributes=\"${gtmAttributes}\"\n        carousel-slug=\"${this._carouselSlug}\"\n        data-cy=\"carousel-channel-${this._carouselSlug}\"\n        is-dark=\"true\"\n        is-clothesline=\"true\"\n      >\n      </nfb-work-carousel>\n    `\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`.nfb-themed-carousel {\n  position: relative;\n  background-position: 0 -7.1vw;\n  background-size: 100%;\n  background-repeat: no-repeat;\n  background-image: var(--bg-image);\n  padding-top: 35vw;\n  display: flex;\n  flex-direction: column;\n  justify-content: flex-end;\n  overflow: unset;\n  height: fit-content;\n  border-radius: 6px;\n  box-sizing: border-box;\n  max-width: 1440px !important;\n  max-height: 824px;\n  box-sizing: border-box;\n}\n\n.nfb-themed-carousel nfb-carousel {\n  z-index: 2;\n}\n\n.nfb-themed-carousel nfb-carousel::part(carousel) {\n  background-color: rgba(0, 0, 0, 0);\n  --nfb-carousel-background-color: rgba(0,0,0,0.4);\n}\n\n@media screen and (min-width: 1900px), print {\n  .nfb-themed-carousel {\n    padding-top: 0;\n    height: 950px;\n    background-position: 0 -4vw;\n  }\n  .nfb-themed-carousel nfb-carousel {\n    padding: 0 16px 48px 16px;\n  }\n}\n@media screen and (max-width: 480px), print {\n  .nfb-themed-carousel {\n    padding-top: 40vw;\n  }\n}\n.nfb-themed-carousel .spinner-container {\n  min-height: 128px;\n}`;\nexport default styles;\n","import { LitElement, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { styleMap } from 'lit/directives/style-map.js'\n\nimport { GTM_EVENTS, GTM_LIST_CATEGORY, GTM_LIST_TYPE } from '@src/js/constants'\nimport { fetchChannel } from '@src/js/redux/channelsReducer'\nimport { store, RootState } from '@src/js/redux/store'\nimport { selectWorkById } from '@src/js/redux/worksReducer'\nimport { CarouselGTMAttrs } from '@src/js/wc/carousels/base/NFBNormanCarousel'\n\n// @ts-expect-error Lit Sass import\nimport carouselSlotStyle from '@web-nfb/frontend-static/design-system/wc/carousel/NFBCarouselSlot.sass?lit'\n// @ts-expect-error Lit Sass import\nimport style from '@src/sass/wc/NFBThemedCarousel.sass?lit'\n// @ts-expect-error Lit Sass import\nimport sectionStyle from '@src/sass/section.sass?lit'\n\n@customElement('nfb-themed-carousel')\nexport default class NFBThemeCarousel extends LitElement {\n  @property({ type: String, attribute: 'title' })\n  title: string\n\n  @property({ type: String, attribute: 'slug' })\n  slug: string\n\n  @property({ type: String, attribute: 'bg-img' })\n  bgImg: string\n\n  @state()\n  isLoading: boolean = true\n\n  @state()\n  _registryIds: number[] | null\n\n  _rootState: RootState\n\n  static styles = [\n    style,\n    carouselSlotStyle,\n    sectionStyle\n  ]\n\n  async connectedCallback (): Promise<void> {\n    super.connectedCallback()\n    if (store.getState().channels.status === undefined) {\n      this.isLoading = true\n      await store.dispatch(fetchChannel({ slug: this.slug }))\n      this._rootState = store.getState()\n      this._registryIds = this._rootState.channels.list\n      this.isLoading = false\n    }\n  }\n\n  getCarouselGTMAttributes () : CarouselGTMAttrs {\n    return {\n      nfb_list_type: GTM_LIST_TYPE.CAROUSEL,\n      nfb_list_category: GTM_LIST_CATEGORY.PROGRAMMING,\n      nfb_list_name: this.title,\n      nfb_list_id: this.slug\n    }\n  }\n\n  buildGTMAttributes (id: number, index: number) {\n    const gtmAttrs = {\n      ...this.getCarouselGTMAttributes(),\n      event: GTM_EVENTS.SELECT_WORK,\n      nfb_version_title: selectWorkById(this._rootState.works, id)?.title,\n      nfb_position: (index + 1).toString()\n    }\n    return JSON.stringify(gtmAttrs)\n  }\n\n  getBgUrl () {\n    if (!this.bgImg) {\n      return ''\n    }\n\n    return `url(${\n      window.THUMBNAIL_PATTERN\n        .replace('{width}', '1920')\n        .replace('{height}', '')\n        .replace('{path}', this.bgImg)\n    })`\n  }\n\n  getCards () {\n    if (this.isLoading) {\n      return html`\n        <li\n          slot=\"card\"\n        >\n          <div class=\"spinner-container\">\n            <nfb-spinner\n              is-loading=\"true\"\n            ></nfb-spinner>\n          </div>\n        </li>\n      `\n    }\n\n    return this._registryIds?.map((id, index) => html`\n      <li\n        slot=\"card\"\n        class=\"nfb-carousel__card nfb-carousel__card--dark\"\n        data-index=\"${index}\"\n      >\n        <nfb-animated-hover-card\n          data-ui-el=\"carousel-card\"\n          carousel-slug=\"${this.slug}\"\n          registry-id=\"${id}\"\n          is-dark=\"true\"\n          card-type=\"carousel\"\n          bookmark-button-type=\"add\"\n          gtm-attributes=\"${this.buildGTMAttributes(id, index)}\"\n        ></nfb-animated-hover-card>\n      </li>`)\n  }\n\n  render () {\n    return html`\n    <div\n      style=\"${styleMap({ '--bg-image': this.getBgUrl() })}\"\n      class=\"nfb-themed-carousel nfb-section__content nfb-section__content--full-width\"\n    >\n      <nfb-carousel\n        aria-label-previous=\"${window.gettext('See previous')} ${this.title}\"\n        aria-label-next=\"${window.gettext('See next')} ${this.title}\"\n        is-dark=\"true\"\n        skip-list=\"${window.gettext('Skip This List')}\"\n        gtm-attributes=\"${JSON.stringify(this.getCarouselGTMAttributes())}\"\n        is-clothesline=\"true\"\n        is-rounded=\"true\"\n      >\n        ${this.getCards()}\n      </nfb-carousel>\n    </div>\n    `\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`.nfb-newsletter-banner {\n  display: flex;\n  gap: 4rem;\n  padding-top: 1.5rem;\n  padding-bottom: 3rem;\n  color: var(--nfb-page-text-color);\n  min-height: 160px;\n  align-items: center;\n}\n\n@media screen and (max-width: 1200px), print {\n  .nfb-newsletter-banner {\n    flex-direction: column;\n    align-items: stretch;\n    gap: 1.5rem;\n  }\n}\n.nfb-newsletter-banner__intro {\n  flex: 1 1 40%;\n  max-width: 720px;\n}\n\n.nfb-newsletter-banner__intro h3 {\n  font-family: \"Elza Round\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: bold;\n  font-size: 1.75rem;\n  line-height: 2rem;\n  color: var(--nfb-page-text-color);\n  margin: 0;\n  margin-bottom: 1.5rem;\n}\n\n.nfb-newsletter-banner__intro p {\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: var(--nfb-page-text-color);\n  margin: 0;\n}\n\n.nfb-newsletter-banner__form-container {\n  flex-grow: 1;\n}\n\n.nfb-newsletter-banner__form {\n  display: flex;\n  gap: 1rem;\n  align-items: flex-start;\n}\n\n@media screen and (max-width: 768px), print {\n  .nfb-newsletter-banner__form {\n    flex-direction: column;\n    align-items: stretch;\n  }\n}\n.nfb-newsletter-banner__form nfb-button::part(button) {\n  height: calc(30px + 1em);\n}\n\n.nfb-newsletter-banner__form nfb-input {\n  flex-grow: 1;\n}\n\n.nfb-newsletter-banner__form nfb-input::part(form-element-container) {\n  min-width: 0;\n}\n\n.nfb-newsletter-banner__form .nfb-form__message--error {\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: var(--nfb-page-text-color);\n}\n\n.nfb-newsletter-banner__terms {\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.75rem;\n  line-height: 1rem;\n  color: var(--nfb-page-text-color);\n  color: #626065;\n}\n\n.nfb-newsletter-banner__terms button {\n  display: inline;\n  margin: 0;\n  padding: 0;\n  text-decoration: underline;\n  cursor: pointer;\n  color: inherit;\n  background: none;\n  border: none;\n  box-shadow: none;\n  -webkit-appearance: none;\n}\n\n.nfb-newsletter-banner__terms button:hover, .nfb-newsletter-banner__terms button:focus {\n  color: #1C7A3E;\n}\n\n.nfb-newsletter-banner--dark nfb-input::part(form-element-container) {\n  --nfb-form-background-color: #FFFFFF;\n  --nfb-form-color: #000000;\n}\n\n.nfb-newsletter-banner--dark .nfb-newsletter-banner__terms {\n  color: #D4D3D6;\n}\n\n.nfb-newsletter-banner--dark .nfb-newsletter-banner__terms button:hover, .nfb-newsletter-banner--dark .nfb-newsletter-banner__terms button:focus {\n  color: #05EE80;\n}`;\nexport default styles;\n","import { LitElement, html } from 'lit'\nimport { customElement, query, state, property } from 'lit/decorators.js'\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'\nimport { classMap } from 'lit/directives/class-map.js'\n\nimport { NFBInput } from '@web-nfb/frontend-static/design-system/wc/form/NFBInput'\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\n\nimport { GTM_EVENTS } from '@src/js/constants'\n\n// @ts-expect-error Lit Sass import\nimport formStyles from '@web-nfb/frontend-static/design-system/sass/elements/form.sass?lit'\n// @ts-expect-error Lit Sass import\nimport newsletterStyles from '@src/sass/wc/NFBNewsletterBanner.sass?lit'\n\n@customElement('nfb-newsletter-banner')\nexport class NFBNewsletterBanner extends LitElement {\n  emptyEmailError: string = window.pgettext('Newsletter banner', 'Please enter a value.')\n  invalidEmailError: string = window.pgettext('Newsletter banner', 'Please enter a valid email address.')\n\n  @property({ type: String, attribute: 'api-key' })\n  apiKey: string\n\n  @property({ type: String, attribute: 'newsletter-slug' })\n  newsletterSlug: string\n\n  @property({ type: String, attribute: 'title' })\n  title: string = window.pgettext('Newsletter banner', 'Stay inspired. Stream stories that matter.')\n\n  @property({ type: String, attribute: 'subtitle' })\n  subtitle: string = window.pgettext('Newsletter banner', 'Get the best of Canadian documentary and animation in your inbox every week.')\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-dark' })\n  isDark: boolean = true\n\n  @property({ type: String, attribute: 'email' })\n  email: string\n\n  @property({ type: String, attribute: 'position' })\n  position: string\n\n  @state()\n  emailInvalid: boolean = false\n\n  @state()\n  emailPristine: boolean = true\n\n  @state()\n  emailError: string = ''\n\n  @state()\n  formIsLoading: boolean = false\n\n  @state()\n  submitSucceed: boolean = false\n\n  @query('nfb-input')\n  nfbInput: NFBInput\n\n  @query('[data-ui-el=\"newsletter-terms-button\"]')\n  termsButton: HTMLButtonElement\n\n  _termsModal: HTMLDialogElement | null\n  _submitLabel: string = window.pgettext('Newsletter banner', 'Subscribe')\n\n  static styles = [\n    formStyles,\n    newsletterStyles\n  ]\n\n  constructor () {\n    super()\n\n    if (!window.customElements.get('nfb-input')) {\n      window.customElements.define('nfb-input', NFBInput)\n    }\n\n    this.validateEmail = this.validateEmail.bind(this)\n    this.openTermsModal = this.openTermsModal.bind(this)\n    this.closeTermsModal = this.closeTermsModal.bind(this)\n    this.onEscape = this.onEscape.bind(this)\n  }\n\n  connectedCallback (): void {\n    super.connectedCallback()\n\n    // Wait for page to be loaded to have access to outside modal\n    document.addEventListener('DOMContentLoaded', () => {\n      this.initModal()\n    })\n  }\n\n  initModal () {\n    this._termsModal = document.querySelector('[data-ui-el=\"newsletter-terms-modal\"]')\n    const modalContainer = document.querySelector('[data-ui-el=\"modal-inner-container-element\"]')\n\n    if (this._termsModal) {\n      const termsModalCloseBtn = document.querySelector('[data-ui-el=\"close-modal-button\"]')\n      termsModalCloseBtn?.addEventListener('click', this.closeTermsModal)\n      this.termsButton.addEventListener('click', this.openTermsModal)\n      this._termsModal.addEventListener('click', this.closeTermsModal)\n      modalContainer?.addEventListener('click', (e) => e.stopPropagation())\n    }\n  }\n\n  validateEmail () {\n    this.emailPristine = false\n    const input = this.nfbInput.inputField\n    if (!input) {\n      return false\n    }\n\n    if (!input.checkValidity()) {\n      const validityState = input.validity\n      if (validityState.valueMissing) {\n        this.emailError = this.emptyEmailError\n      } else if (validityState.typeMismatch) {\n        this.emailError = this.invalidEmailError\n      }\n      this.emailInvalid = true\n      input.focus()\n      return false\n    }\n\n    this.emailInvalid = false\n    return true\n  }\n\n  submitForm (e: Event) {\n    e.preventDefault()\n    // add type listener on first submit\n    if (this.emailPristine) {\n      this.nfbInput.inputField?.addEventListener('input', this.validateEmail)\n    }\n\n    if (this.validateEmail()) {\n      this.formIsLoading = true\n\n      const data = new FormData()\n      data.append('api_key', this.apiKey)\n      data.append('list_of_newsletter', this.newsletterSlug)\n      data.append('email', this.nfbInput.inputField.value)\n      data.append('referrer', window.location.href)\n\n      fetch('/api/v2/json/newsletter/subscribe/', {\n        method: 'post',\n        body: data\n      }).then((response) => {\n        if (response.status === 200) {\n          this.submitSucceed = true\n          window.dataLayer?.push({\n            event: GTM_EVENTS.SUBSCRIPTION_NEWSLETTER,\n            nfb_detail: this.newsletterSlug,\n            link_text: this._submitLabel,\n            nfb_position: this.position\n          })\n        }\n      }).finally(() => {\n        this.formIsLoading = false\n      })\n    }\n  }\n\n  openTermsModal () {\n    this._termsModal?.showModal()\n    const firstFocusableElement = this._termsModal?.querySelector('button, a') as HTMLElement\n    if (firstFocusableElement) {\n      firstFocusableElement.focus()\n    }\n    this.disableParentScrolling()\n    document.addEventListener('keydown', this.onEscape)\n  }\n\n  onEscape (e: KeyboardEvent) {\n    if (e.key === 'Escape') {\n      this.closeTermsModal()\n    }\n  }\n\n  closeTermsModal () {\n    this._termsModal?.close()\n    this.termsButton.focus()\n    this.enableParentScrolling()\n    document.removeEventListener('keydown', this.onEscape)\n  }\n\n  enableParentScrolling () {\n    document.querySelector('html')!.dataset.uiShowModal = false.toString()\n  }\n\n  disableParentScrolling () {\n    document.querySelector('html')!.dataset.uiShowModal = true.toString()\n  }\n\n  renderForm () {\n    return html`\n    <div class=\"nfb-newsletter-banner__intro\">\n      <h3>${unsafeHTML(this.title)}</h3>\n      <p>${unsafeHTML(this.subtitle)}</p>\n    </div>\n    <div class=\"nfb-newsletter-banner__form-container\">\n      <div>\n        <form\n          class=\"nfb-form ${classMap({ 'nfb-form--dark': this.isDark })} nfb-newsletter-banner__form\"\n          part=\"form\"\n        >\n          <nfb-input\n            name=\"email\"\n            type=\"email\"\n            placeholder=\"${window.pgettext('Newsletter banner', 'Enter your email')}\"\n            initial-value=\"${this.email}\"\n            type=\"email\"\n            is-required=\"true\"\n            invalid=\"${this.emailInvalid}\"\n            valid=\"${!this.emailPristine && !this.emailInvalid}\"\n            error-message=\"${this.emailError}\"\n            data-cy=\"nfb-input\"\n          ></nfb-input>\n\n          <nfb-button\n            text=\"${this._submitLabel}\"\n            icon-name=\"newsletter-o\"\n            primary-variant=\"primary\"\n            is-dark=\"${this.isDark}\"\n            is-disabled=\"${this.emailInvalid}\"\n            is-loading=\"${this.formIsLoading}\"\n            type=\"submit\"\n            @click=\"${this.submitForm}\"\n            data-cy=\"nfb-button\"\n            exportparts=\"button\"\n          ></nfb-button>\n        </form>\n        <p class=\"nfb-newsletter-banner__terms\">\n          ${html`${unsafeHTML(\n    window.interpolate(\n      window.pgettext(\n        'Newsletter banner',\n        'By clicking Subscribe, you\\'re confirming that you agree with our <button %(button_attribute)s>Terms and Conditions</button>.'\n      ), {\n        button_attribute: 'data-cy=\"newsletter-terms-button\" data-ui-el=\"newsletter-terms-button\"'\n      },\n      true\n    ))\n  }`}\n        </p>\n      </div>\n  </div>`\n  }\n\n  renderSuccess () {\n    return html`\n    <div data-cy=\"success\">\n      <h3>${window.pgettext('Newsletter banner', 'One last step...')}</h3>\n      <p>${window.pgettext('Newsletter banner', 'You will soon receive an email from us. Please confirm your email address and your subcription by clicking the confirmation link.')}</p>\n      <p>${window.pgettext('Newsletter banner', 'Adding info@nfb.ca to your email address book will ensure reliable delivery.')}</p>\n    </div>`\n  }\n\n  render () {\n    return html`\n    <div class=\"nfb-newsletter-banner ${classMap({ 'nfb-newsletter-banner--dark': this.isDark })}\">\n      ${this.submitSucceed ? this.renderSuccess() : this.renderForm()}\n    </div>\n    `\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'nfb-newsletter-banner': NFBNewsletterBanner\n  }\n}\n","/**\n * Class NFBBookmarksCarousel.\n *\n */\n\nimport { LitElement, html, nothing } from 'lit'\nimport { customElement, state, property } from 'lit/decorators.js'\n\nimport { store } from '@src/js/redux/store'\nimport { GTM_LIST_CATEGORY, GTM_LIST_ID } from '@src/js/constants'\nimport '@src/js/wc/work-page/NFBWorkPageCreator'\nimport '@src/js/wc/work-page/NFBWorkPageLegend'\n\nimport { fetchBookmarks } from '@src/js/redux/bookmarksReducer'\n\n@customElement('nfb-bookmarks-carousel')\nexport default class NFBBookmarksCarousel extends LitElement {\n  @property({ type: String, attribute: 'see-more-link' })\n  seeMoreLink: string = ''\n\n  @state()\n  _registryIds: number[]\n\n  @state()\n  _isLoading: boolean = true\n\n  _carouselSlug: string = 'bookmarks'\n  _carouselTitle: string = window.pgettext('My list carousel title', 'My list')\n\n  async connectedCallback () {\n    super.connectedCallback()\n    await store.dispatch(fetchBookmarks())\n    const state = store.getState()\n    this._registryIds = state.bookmarks.list ?? []\n    this._isLoading = false\n  }\n\n  render () {\n    if (this._isLoading) { return nothing }\n\n    // nfb_list_name and nfb_list_type are found in NFBNormanCarousel\n    const gtmAttributes = JSON.stringify(\n      {\n        nfb_list_category: GTM_LIST_CATEGORY.USER,\n        nfb_list_id: GTM_LIST_ID.USER_LIST\n      }\n    )\n\n    return html`\n      <nfb-work-carousel\n        registry-id-list=\"${JSON.stringify(this._registryIds)}\"\n        carousel-title=\"${this._carouselTitle}\"\n        gtm-attributes=\"${gtmAttributes}\"\n        carousel-slug=\"${this._carouselSlug}\"\n        show-see-more-card=\"true\"\n        see-more-link=\"${this.seeMoreLink}\"\n        include-bookmark-button=\"false\"\n        data-cy=\"carousel-channel-${this._carouselSlug}\"\n        is-dark=\"true\"\n        is-clothesline=\"true\"\n      >\n      </nfb-work-carousel>\n    `\n  }\n}\n","/**\n * Class NFBContinueWatchingCarousel.\n *\n */\n\nimport { LitElement, html, nothing } from 'lit'\nimport { customElement, state, property } from 'lit/decorators.js'\n\nimport { selectContinueWatching, WorkHistory } from '@src/js/redux/workHistoryReducer'\nimport { fetchContinueWatchingWorks, selectWorkById, WorkCard, selectWorkByIdList } from '@src/js/redux/worksReducer'\nimport { store } from '@src/js/redux/store'\nimport { CarouselGTMAttrs } from '@src/js/wc/carousels/base/NFBNormanCarousel'\nimport { GTM_EVENTS, GTM_LIST_CATEGORY, GTM_LIST_ID, GTM_LIST_TYPE, DEFAULT_LIST_LENGTH } from '@src/js/constants'\nimport normanPaths from '@src/js/helpers/paths'\n\n// @ts-expect-error Lit Sass import\nimport carouselSlotStyle from '@web-nfb/frontend-static/design-system/wc/carousel/NFBCarouselSlot.sass?lit'\n// @ts-expect-error Lit Sass import\nimport spinnerStyle from '@src/sass/wc/NFBSpinnerContainer.sass?lit'\n\n@customElement('nfb-continue-watching-carousel')\nexport default class NFBContinueWatchingCarousel extends LitElement {\n  @property({ type: String, attribute: 'see-more-link' })\n  seeMoreLink: string = ''\n\n  @state()\n  _isLoading: boolean = true\n\n  @state()\n  _registryIds: number[]\n\n  @state()\n  _worksList: WorkCard[] | null = null\n\n  @state()\n  _workHistory: WorkHistory[]\n\n  static get styles () {\n    return [carouselSlotStyle, spinnerStyle]\n  }\n\n  _defaultSeeMoreCardText = window.pgettext('Continue watching carousel', 'See my history')\n  _carouselTitle: string = window.pgettext('Continue watching carousel', 'Continue watching')\n  _carouselSlug: string = 'continue-watching'\n\n  async connectedCallback () {\n    super.connectedCallback()\n    await store.dispatch(fetchContinueWatchingWorks())\n    const state = store.getState()\n    this._workHistory = selectContinueWatching(state.workHistory)\n    // Remove duplicates from registry ids (ex: a work watched in\n    // a collection page and on a film page will be present twice)\n    this._registryIds = [...new Set(this._workHistory.map(h => h.registry_id))]\n    this._worksList = selectWorkByIdList(store.getState().works, this._registryIds) ?? []\n    this._isLoading = false\n  }\n\n  getCarouselGTMAttributes () : CarouselGTMAttrs {\n    return {\n      nfb_list_type: GTM_LIST_TYPE.CAROUSEL,\n      nfb_list_category: GTM_LIST_CATEGORY.USER,\n      nfb_list_name: this._carouselTitle,\n      nfb_list_id: GTM_LIST_ID.CONTINUE\n    }\n  }\n\n  shouldShowSeeMoreCard () {\n    if (this._registryIds?.length > DEFAULT_LIST_LENGTH) return true\n\n    return false\n  }\n\n  buildGTMAttributes (title: string, index: number) {\n    const gtmAttrs = {\n      ...this.getCarouselGTMAttributes(),\n      event: GTM_EVENTS.SELECT_WORK,\n      nfb_version_title: title,\n      nfb_position: (index + 1).toString()\n    }\n    return JSON.stringify(gtmAttrs)\n  }\n\n  getContextWork (work: WorkCard): WorkCard | null {\n    const state = store.getState()\n    const relatedHistory = this._workHistory.find(\n      h => h.registry_id === work.id)\n\n    if (!relatedHistory?.work?.registry_id) {\n      return null\n    }\n\n    const contextWork = selectWorkById(state.works, relatedHistory.work?.registry_id)\n    return contextWork ?? null\n  }\n\n  getCards () {\n    if (this._isLoading) {\n      return html`\n        <li\n          slot=\"card\"\n        >\n          <div class=\"spinner-container\">\n            <nfb-spinner\n              is-loading=\"true\"\n            ></nfb-spinner>\n          </div>\n        </li>\n      `\n    }\n    return this._worksList?.slice(0, DEFAULT_LIST_LENGTH)?.map((work, index) => this.getCard(work, index))\n  }\n\n  getCard (work: WorkCard, index: number) {\n    const contextWork = this.getContextWork(work) ?? work\n\n    const thumbnailPath = contextWork.thumbnail\n\n    return html`\n      <li\n        slot=\"card\"\n        class=\"nfb-card nfb-carousel__card nfb-carousel__card--dark\"\n        data-index=\"${index}\"\n      >\n        <nfb-display-work-card\n          data-ui-el=\"carousel-card\"\n          carousel-slug=\"${this._carouselSlug}\"\n          registry-id=\"${work.id}\"\n          thumbnail-path=\"${thumbnailPath}\"\n          href=\"${normanPaths[contextWork.category].replace('{slug}', contextWork.slug)}\"\n          is-dark=\"true\"\n          card-type=\"carousel\"\n          gtm-attributes=\"${this.buildGTMAttributes(work.title, index)}\"\n          include-progress-bar=\"true\"\n          secondary-variant=\"no-border\"\n          include-legend=\"false\"\n        ></nfb-display-work-card>\n      </li>\n    `\n  }\n\n  render () {\n    const carouselId = this._carouselTitle ? `${this._carouselTitle}-carousel`.toLowerCase() : nothing\n\n    if (this._registryIds?.length === 0) {\n      return nothing\n    }\n\n    return html`\n      <nfb-carousel\n        title=\"${this._carouselTitle}\"\n        id=\"${carouselId}\"\n        data-cy=\"${carouselId}\"\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        gtm-attributes=\"${JSON.stringify(this.getCarouselGTMAttributes())}\"\n        is-dark=\"true\"\n        see-more-link=\"${this.seeMoreLink}\"\n        see-more-card-text=${this.shouldShowSeeMoreCard() ? this._defaultSeeMoreCardText : nothing}\n        is-rounded=\"true\"\n        is-clothesline=\"true\"\n      >\n        ${this.getCards()}\n      </nfb-carousel>`\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`.nfb-section__content {\n  padding-left: 3rem;\n  padding-right: 3rem;\n  max-width: 1440px;\n  margin-left: auto;\n  margin-right: auto;\n}\n\n.nfb-section__content--full-width {\n  max-width: 100%;\n}\n\n@media screen and (max-width: 768px), print {\n  .nfb-section__content {\n    padding-left: 1.5rem;\n    padding-right: 1.5rem;\n  }\n}\n@media screen and (max-width: 480px), print {\n  .nfb-section__content {\n    padding-left: 1rem;\n    padding-right: 1rem;\n  }\n}`;\nexport default styles;\n","import {css} from 'lit';\nexport const styles = css`.spinner-container {\n  min-height: 128px;\n}`;\nexport default styles;\n"],"names":["NFBIndigenousCinemaBanner","NFBUserRecommendationsCarousel","store","state","gtmAttributes","NFBUserSimilarTasteCarousel","userState","NFBThemeCarousel","id","index","gtmAttrs","NFBNewsletterBanner","NFBInput","modalContainer","termsModalCloseBtn","e","input","validityState","data","response","_a","firstFocusableElement","NFBBookmarksCarousel","NFBContinueWatchingCarousel","h","title","work","relatedHistory","contextWork","thumbnailPath","carouselId"],"sourceRoot":""}