{"version":3,"sources":["node_modules/browser-pack/_prelude.js","source/js/Core.ts","source/js/components/Accordion.ts","source/js/components/AppLinks.ts","source/js/components/CardHeight.ts","source/js/components/ColorSwatches.ts","source/js/components/FeaturedCard.ts","source/js/components/Header.ts","source/js/components/Hero.ts","source/js/components/Menu.ts","source/js/components/Parallaxer.ts","source/js/components/Ribbons.ts","source/js/components/Slideshow.ts","source/js/components/Stats.ts","source/js/components/Tabs.ts","source/js/components/Underline.ts","source/js/components/Video.ts","source/js/components/video-gallery.ts","source/js/components/yt-accordion.ts","source/js/site.ts","source/js/util/array-from-polyfill.js"],"names":["e","t","n","r","s","o","u","a","require","i","f","Error","code","l","exports","call","length","1","module","Accordion_1","AppLinks_1","CardHeight_1","ColorSwatches_1","FeaturedCard_1","Header_1","Hero_1","Menu_1","Parallaxer_1","Ribbons_1","Slideshow_1","Stats_1","Tabs_1","Underline_1","yt_accordion_1","video_gallery_1","ACCORDION_SELECTOR","APP_LINKS_SELECTOR","CARD_SWATCH_SELECTOR","CARDS_SELECTOR","FEATURED_CARD_SELECTOR","PARALLAX_SELECTOR","INTRO_ANIMATION_SELECTOR","UNDERLINE_SELECTOR","RIBBON_SELECTOR","RESIZE_TIMEOUT","INTRO_ANIMATION_SPEED","INTRO_ANIMATION_DELAY","MOBILE_BREAKPOINT","window_","window","Core","this","areEventsAttached","isIntroAnimating","accordionItems","Array","from","document","querySelectorAll","forEach","expandable","default","onYouTubeIframeAPIReady","videoPlayer","querySelector","siteMenu","bodyElem","body","rootHTMLElem","documentElement","header","hero","introAnimation","slideshow","stats","tabs","mediaQuery","matchMedia","preventScrollEvent","bind","enableScroll","disableScroll","onResize","onScroll","moduleResizes","mobileCheck","windowWidth","innerWidth","pageIntroAnimation","initialize","accordion","map","_this","appLinks","link","cardHeights","cards","colorSwatches","swatch","featuredCards","card","parallaxers","parallax","ribbons","ribbon","underlines","underline","attachEvents","addEventListener","resizeTimeout","clearTimeout","setTimeout","parallaxer","isMobile","matches","style","overflowY","preventDefault","element","top","offsetTop","offsetParent","TweenMax","fromTo","opacity","y","delay","onComplete","_this2","setAttribute","ANIMATION_SPEED","ACCORDION_CONTENT","ACCORDION_TRIGGER","ACCORDION_TRIGGER_OPEN_TEXT","ACCORDION_TRIGGER_CLOSE_TEXT","ACCORDION_HEIGHT_SELECTOR","CARD_SELECTOR","Accordion","core","elem","isAccordionOpen","cardsWrapper","cardAnchors","accordionContent","accordionInnerHeight","accordionTrigger","accordionTriggerOpenText","accordionTriggerCloseText","cardHeight","onClick","setAccordionHeight","set","height","toggleAccordion","getTallestCard","accordionHeight","offsetHeight","closeAccordion","openAccordion","display","to","scrollTo","getDistanceFromPageTop","headerHeight","ease","Expo","easeInOut","onUpdate","updateElement","overflow","anchor","removeAttribute","onStart","NO_IOS_CLASS","NO_ANDROID_CLASS","TIMEOUT_DELAY","AppLinks","isAndroid","isIos","defaultLink","href","iosLink","dataset","androidLink","targetUrl","test","navigator","userAgent","classList","contains","clickTimeout","open","CARD_INNER_SELECTOR","CARD_HEIGHT_CLASS","CardHeight","inners","removeHeight","heights","tallest","Math","max","apply","_toConsumableArray","tallestHeight","parseInt","getComputedStyle","paddingBottom","paddingTop","CARD_SWATCH_ACTIVE_CLASS","CARD_SWATCH_MESSAGE_VISIBLE_TIME","CARD_SWATCH_MESSAGE","CARD_SWATCH_MESSAGE_COPIED","ColorSwatches","cardMessage","cardMessageCopied","clipboard","Clipboard","onSuccess","onFail","showCopiedMessage","hideCopiedMessage","on","add","remove","Video_1","FEATURED_CARD_PLAY_ICON","FEATURED_FOCUS_SELECTOR","VIDEO_WRAPPER_SELECTOR","VIDEO_OVERFLOW_SELECTOR","YT_WRAPPER_SELECTOR","YT_PLAYER_SELECTOR","INLINE_VIDEO_SELECTOR","SCROLL_DISTANCE","ANIMATION_SPEED_FAST","ANIMATION_SPEED_SLOW","ENTER_KEYCODE","FeaturedCard","isExpanded","isFullScreen","isLoopingHidden","isResizeDisabled","focus","videoWrapper","videoOverflow","playIcon","video","ytWrapper","ytPlayer","videoId","onOutsideClick","onFullscreen","onFocus","onBlur","onFocusKeypress","playLoop","pauseLoop","expandPlayer","checkState","load","pause","detachEvents","doc","exitFullscreen","webkitExitFullscreen","mozExitFullscreen","msExitFullscreen","removeEventListener","togglePlayerState","event","target","collapsePlayer","yOffset","scrollY","pageYOffset","intialScroll","keyCode","tl","TimelineMax","pageCenter","innerHeight","forceHideHeader","autoAlpha","width","easeOut","initializeVideo","_this3","YtVideo","stop","play","paused","scale","_this4","_this5","HEADER_SELECTOR","SUBHEADER_SECTION_SELECTOR","SUBHEADER_SELECTOR","SUBHEADER_FADE_SELECTOR","MENU_OPEN_ICON","LOGO_SELECTOR","SUB_LOGO_SELECTOR","LOGO_TEXT_SELECTOR","LOGO_BG_SELECTOR","CLEAR_CLASS","HOME_CLASS","TOP_ANIMATION_SPEED","CLEAR_ANIMATION_SPEED","SUBNAV_ANIMATION_SPEED","SUBNAV_FONT_SIZE","SUBNAV_STICKY_FONT_SIZE","HEADER_LIGHT_COLOR","HEADER_DARK_COLOR","BOX_SHADOW","STICKY_CLASS","TAB_NAV_CLASS","BORDER_WIDTH","BORDER_COLOR","BORDER_STYLE","RED_COLOR","Header","isHeaderShown","isHeaderScrolled","isHome","isInitialLoad","breakpointCache","subHeadSection","subHead","subHeadHeight","subHeadFade","menuOpenIcon","logo","subLogo","logoText","logoBackground","makeClear","isHeaderClear","toggleHeaderVisibility","setMenuIconLight","setMenuIconDark","updateCache","toggleHeaderTransparency","scrollEvents","initialScroll","isSubnavSticky","setSubheadPosition","sectionTop","sectionHeight","headerOffset","abs","difference","isScrollingDown","preSticky","isSticky","postSticky","subNavPreSticky","subNavSticky","subPostSticky","isSubnavPreSticky","background","borderWidth","left","marginLeft","marginTop","position","isSubnavPostSticky","boxShadow","tabTriggers","fontSize","setUnderlineWidth","zIndex","isSubnavSticking","borderColor","borderStyle","updateModuleHeight","isHeaderForced","headerTimout","hideHeader","showHeader","isExternal","_this6","animateSubHead","_this7","scrolledHeaderState","topHeaderState","_this8","backgroundColor","fill","_this9","HERO_SELECTOR","LOOP_SELECTOR","WRAPPER_SELECTOR","YT_SELECTOR","SVG_SELECTOR","Hero","isLoopHidden","loop","videoElem","onMouseEnter","onMouseLeave","playVideo","stopVideo","isPlaying","currentTime","MENU_SELECTOR","MENU_WRAPPER_SELECTOR","MENU_BUTTON_SELECTOR","ESCAPE_KEY","ANIMATION_DELAY","WRAPPER_ANIMATION_SPEED","OPEN_ICON_SELECTOR","CLOSE_ICON_SELECTOR","OPEN_LABEL_SELECTOR","CLOSE_LABEL_SELECTOR","Menu","isMenuOpen","wrapper","trigger","openIcon","closeIcon","openLabel","closeLabel","onKeyUp","toggleMenu","showMenu","closeMenu","showMenuWrapper","blur","hideMenuWrapper","BACKGROUND_SELECTOR","Parallaxer","isParallaxed","elemheight","speed","parseFloat","isBackground","parallaxBackground","parallaxElement","removeParallax","getBoundingClientRect","belowView","aboveView","requestAnimationFrame","backgroundPositionY","ACTIVE_CLASS","Ribbons","center","scrollCheck","SLIDESHOW_SELECTOR","SLIDE_SELECTOR","SLIDE_FOCUS_SELECTOR","APP_LINKS_CLASS","VIDEO_WRAPPER_CLASS","ENTER_CODE","Slideshow","slides","slide","focuses","isRTL","getElementsByTagName","dir","check","slideIndex","srcElement","isSetup","setSlideshowSize","snapToSlide","updateSlideshowPosition","onSlideClick","cardWidth","offsetWidth","fullWidth","widths","index","dragggable","Draggable","create","type","cursor","lockAxis","dragClickables","throwProps","zIndexBoost","snap","x","endValue","round","bounds","minX","maxX","onDragStart","onDragEnd","videoElement","kill","STATS_SELECTOR","BACK_SELECTOR","FOWARD_SELECTOR","LINE_LEFT_SELECTOR","LINE_RIGHT_SELECTOR","LEFT_RIBBON_SELECTOR","RIGHT_RIBBON_SELECTOR","TEXTFADE_SELECTOR","RIBBON_CLASS","ANIMATION_SPEED_MEDIUM","TIMELINE_DELAY","SWIPE_THRESHOLD","Stats","isSlideChanging","slideNumber","fades","back","forward","lineLeft","lineRight","currentSlide","slideshowBack","slideshowForward","setCurrent","onTouchStart","onTouchEnd","initialTouchXPosition","layerX","initialScrollY","xDiff","yDiff","setHeight","hideCurrent","previousSlide","easeIn","TABS_SELECTOR","TAB_WRAPPER_SELECTOR","TRIGGER_SELECTOR","INLINE_TRIGGER_SELECTOR","TAB_SELECTOR","CONTAINER_SELECTOR","NAV_SELECTOR","SCROLL_CONTAINER_SELECTOR","ARROW_SELECTOR","ANIMATION_DISTANCE","LEFT_SCROLL_BUFFER","ANIMATIONS_SPEED_FAST","ANIMATIONS_SPEED_MEDIUM","ANIMATIONS_SPEED_SLOW","Tabs","currentIndex","isUpdating","navWrapper","container","overflowArrows","inlineTriggers","nav","scrollContainer","onNavClick","onInlineClick","onArrowClick","onNavScroll","animationSpeed","toggleOverflowArrows","initialHashCheck","hash","location","updateActiveTab","arrow","clicked","indexOf","el","num","targetIndex","checkNavScrollPosition","previousIndex","updateActiveNav","toggleActiveTab","centering","distance","offsetLeft","directionIn","directionOut","resumeHeader","arrowWidth","reduce","total","item","buttonWidth","arrowAlpha","isLeft","scrollLeft","leftOpacity","isRight","scrollWidth","rightOpacity","WIDTH_SELECTOR","LINE_SELECTOR","Underline","text","line","Video","videoLoaded","onPlayerReady","loadVideo","player","YT","Player","iv_load_policy","showinfo","events","onReady","ClassNames","ACTIVE_DESCRIPTION","ACTIVE_THUMB","Selectors","DESCRIPTIONS","THUMBS","Attributes","DESCRIPTION_ID","THUMB_ID","VIDEO_ID","VideoGallery","playerEl","getAttribute","allDescriptions","allThumbs","init","setUpVideoDetails","registerVideoGalleryEvents","setDetails","elements","attr","activeClassName","console","log","currentTarget","cueVideoById","thumb","changeVideo","utils","delegate","selector","eventName","handler","parentElement","Element","prototype","matchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","debounce","callback","threshold","execAsap","timeout","obj","args","_arguments","delayed","CONTENT","EXPANDABLE","TOGGLE","EXPANDED_CLASSNAME","ARIA","ESC_KEYCODE","YTAccordion","root","toggleBtn","content","children","contentHeight","setContentMaxHeight","registerAccordionEvents","deepLink","toggleContent","child","marginBottom","getContentHeight","maxHeight","toggle","toString","collpaseAll","debounceContentHeight","handleKeyEvents","Core_1","tag","createElement","src","firstScriptTag","parentNode","insertBefore","isIOS","match","BLOG_IDS_","Blog","id","url","getRequestUrl_","getBlogPosts_","blogID","http","XMLHttpRequest","onreadystatechange","readyState","status","response","JSON","parse","responseText","headline","postLink","textContent","items","title","send","blog","toStr","Object","isCallable","fn","toInteger","value","number","Number","isNaN","isFinite","floor","maxSafeInteger","pow","toLength","len","min","arrayLike","C","TypeError","T","mapFn","arguments","kValue","A","k"],"mappings":"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","file":"site.min.js","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o {\n return window;\n};\n\n/**\n * Main JS control for the site.\n */\nexport default class Core {\n private accordion: Array;\n private appLinks: Array;\n private areEventsAttached = false;\n bodyElem: HTMLElement;\n cardHeights: Array;\n private colorSwatches: Array;\n featuredCards: Array;\n header: Header;\n hero: Hero;\n introAnimation: HTMLElement;\n isIntroAnimating = false;\n isMobile: boolean;\n mediaQuery: MediaQueryList;\n parallaxers: Array;\n private resizeTimeout: number;\n ribbons: Array;\n private rootHTMLElem: HTMLElement;\n private siteMenu: Menu;\n private slideshow: Slideshow;\n private stats: Stats;\n tabs: Tabs;\n underlines: Array;\n private windowWidth: number;\n\n constructor() {\n const accordionItems = Array.from(document.querySelectorAll(\n '.yt-js-accordion-expandable'));\n if (accordionItems.length) {\n accordionItems.forEach(expandable => new YTAccordion(expandable));\n }\n\n window_().onYouTubeIframeAPIReady = () => {\n const videoPlayer = document.querySelector('#player');\n if (videoPlayer) new VideoGallery(videoPlayer);\n };\n\n this.siteMenu = new Menu(this);\n this.bodyElem = document.body as HTMLElement;\n this.rootHTMLElem = document.documentElement as HTMLElement;\n this.header = new Header(this);\n this.hero = new Hero(this);\n this.introAnimation =\n document.querySelector(INTRO_ANIMATION_SELECTOR) as HTMLElement;\n\n if (this.introAnimation) {\n this.isIntroAnimating = true;\n }\n\n this.slideshow = new Slideshow(this);\n this.stats = new Stats(this);\n this.tabs = new Tabs(this);\n\n this.mediaQuery = window.matchMedia(MOBILE_BREAKPOINT);\n\n this.preventScrollEvent = this.preventScrollEvent.bind(this);\n this.enableScroll = this.enableScroll.bind(this);\n this.disableScroll = this.disableScroll.bind(this);\n this.onResize = this.onResize.bind(this);\n this.onScroll = this.onScroll.bind(this);\n this.moduleResizes = this.moduleResizes.bind(this);\n this.mobileCheck = this.mobileCheck.bind(this);\n\n this.windowWidth = window.innerWidth;\n }\n\n /**\n * Initializes site modules.\n */\n initialize(): void {\n this.pageIntroAnimation();\n this.mobileCheck();\n\n this.header.initialize();\n this.hero.initialize();\n this.siteMenu.initialize();\n this.slideshow.initialize();\n this.stats.initialize();\n this.tabs.initialize();\n\n this.accordion = Array.from(document.querySelectorAll(ACCORDION_SELECTOR))\n .map((accordion) => new Accordion(this, accordion as HTMLElement));\n this.appLinks = Array.from(document.querySelectorAll(APP_LINKS_SELECTOR))\n .map((link) => new AppLinks(this, link as HTMLAnchorElement));\n this.cardHeights = Array.from(document.querySelectorAll(CARDS_SELECTOR))\n .map((cards) => new CardHeight(this, cards as HTMLElement));\n this.colorSwatches =\n Array.from(document.querySelectorAll(CARD_SWATCH_SELECTOR))\n .map((swatch) => new ColorSwatches(this, swatch as HTMLButtonElement));\n this.featuredCards =\n Array.from(document.querySelectorAll(FEATURED_CARD_SELECTOR))\n .map((card) => new FeaturedCard(this, card as HTMLVideoElement));\n this.parallaxers = Array.from(document.querySelectorAll(PARALLAX_SELECTOR))\n .map((parallax) => new Parallaxer(this, parallax as HTMLElement));\n this.ribbons = Array.from(document.querySelectorAll(RIBBON_SELECTOR))\n .map((ribbon) => new Ribbons(this, ribbon as HTMLElement));\n this.underlines = Array.from(document.querySelectorAll(UNDERLINE_SELECTOR))\n .map((underline) => new Underline(this, underline as HTMLElement));\n\n this.attachEvents();\n }\n\n /**\n * Attaches site events.\n */\n private attachEvents(): void {\n if (this.areEventsAttached) return;\n\n window.addEventListener('resize', this.onResize);\n window.addEventListener('scroll', this.onScroll);\n\n this.areEventsAttached = true;\n }\n\n /**\n * Global site throttled resize event.\n */\n onResize(): void {\n if (this.isIntroAnimating) return;\n\n if (this.resizeTimeout) {\n clearTimeout(this.resizeTimeout);\n }\n\n this.resizeTimeout = setTimeout(this.moduleResizes, RESIZE_TIMEOUT);\n }\n\n /**\n * Module resize functions, called by global site resize event.\n */\n moduleResizes(): void {\n this.mobileCheck();\n\n this.stats.onResize();\n\n this.accordion.forEach((accordion) => {\n accordion.onResize();\n });\n\n this.cardHeights.forEach((card) => {\n card.onResize();\n });\n\n this.parallaxers.forEach((parallaxer) => {\n parallaxer.onResize();\n });\n\n this.ribbons.forEach((ribbon) => {\n ribbon.onResize();\n });\n\n this.underlines.forEach((underline) => {\n underline.onResize();\n });\n\n // Prevent resize if height changes but not width, targets mobile url\n // bars hiding/showing on scroll\n if (this.windowWidth === window.innerWidth && this.isMobile) return;\n\n this.header.onResize();\n this.slideshow.onResize();\n this.tabs.onResize();\n\n this.featuredCards.forEach((card) => {\n card.onResize();\n });\n\n this.windowWidth = window.innerWidth;\n }\n\n /**\n * Global site scroll event.\n */\n onScroll(): void {\n if (this.isIntroAnimating) return;\n\n this.header.onScroll();\n\n this.parallaxers.forEach((parallaxer) => {\n parallaxer.onScroll();\n });\n\n this.ribbons.forEach((ribbon) => {\n ribbon.onScroll();\n });\n }\n\n /**\n * Checks if page is mobile width.\n */\n mobileCheck(): void {\n this.isMobile = this.mediaQuery.matches;\n }\n\n /**\n * Disables page scrolling.\n */\n disableScroll(): void {\n this.bodyElem.style.overflowY = 'hidden';\n }\n\n /**\n * Enables page scrolling.\n */\n enableScroll(): void {\n this.bodyElem.style.overflowY = 'auto';\n }\n\n /**\n * Prevents default scrolling event.\n */\n private preventScrollEvent(e): void {\n e.preventDefault();\n }\n\n /**\n * Finds element's distance from top of page.\n */\n getDistanceFromPageTop(element): number {\n let top = 0;\n\n while (element) {\n top += element.offsetTop;\n element = element.offsetParent;\n }\n return top;\n }\n\n /**\n * Page intro animation.\n */\n pageIntroAnimation(): void {\n TweenMax.fromTo(this.introAnimation, INTRO_ANIMATION_SPEED, {\n opacity: 0,\n y: 30,\n }, {\n opacity: 1,\n y: 0,\n delay: INTRO_ANIMATION_DELAY,\n onComplete: () => {\n this.introAnimation.setAttribute('style', '');\n this.isIntroAnimating = false;\n },\n });\n }\n}\n","declare var TweenMax;\ndeclare var Expo;\nimport Core from '../Core';\nimport CardHeight from '../components/CardHeight';\n\nconst ANIMATION_SPEED = 0.5;\nconst ACCORDION_CONTENT = '.js-accordion-content';\nconst ACCORDION_TRIGGER = '.js-accordion-trigger';\nconst ACCORDION_TRIGGER_OPEN_TEXT = '.js-accordion-trigger-open-text';\nconst ACCORDION_TRIGGER_CLOSE_TEXT = '.js-accordion-trigger-close-text';\nconst ACCORDION_HEIGHT_SELECTOR = '.js-accordion-height';\nconst CARDS_SELECTOR = '.js-cards';\nconst CARD_SELECTOR = '.js-card';\n\n/**\n * Accordion controller.\n */\nexport default class Accordion {\n private accordionContent: HTMLElement;\n private accordionHeight: number;\n private accordionInnerHeight: HTMLElement;\n private accordionTrigger: HTMLButtonElement;\n private accordionTriggerCloseText: HTMLSpanElement;\n private accordionTriggerOpenText: HTMLSpanElement;\n private areEventsAttached = false;\n private cardAnchors: Array;\n private cardHeight: CardHeight;\n private cardsWrapper: HTMLElement;\n private core: Core;\n private elem: HTMLElement;\n private isAccordionOpen = false;\n\n constructor(core: Core, elem: HTMLElement) {\n this.core = core;\n this.elem = elem;\n this.cardsWrapper = this.elem.querySelector(CARDS_SELECTOR) as HTMLElement;\n this.cardAnchors = Array.from(\n this.elem.querySelectorAll(CARD_SELECTOR)) as Array;\n this.accordionContent =\n document.querySelector(ACCORDION_CONTENT) as HTMLElement;\n this.accordionInnerHeight =\n document.querySelector(ACCORDION_HEIGHT_SELECTOR) as HTMLElement;\n this.accordionTrigger =\n document.querySelector(ACCORDION_TRIGGER) as HTMLButtonElement;\n this.accordionTriggerOpenText =\n document.querySelector(ACCORDION_TRIGGER_OPEN_TEXT) as HTMLSpanElement;\n this.accordionTriggerCloseText =\n document.querySelector(ACCORDION_TRIGGER_CLOSE_TEXT) as HTMLSpanElement;\n\n if (this.cardsWrapper) {\n this.cardHeight = new CardHeight(this.core, this.cardsWrapper);\n }\n\n this.onResize = this.onResize.bind(this);\n this.onClick = this.onClick.bind(this);\n this.initialize();\n }\n\n /**\n * Initializes Accordion.\n */\n private initialize(): void {\n\n // Sets the initial height of accordion content.\n this.setAccordionHeight();\n\n // After storing height value, sets the height to zero.\n TweenMax.set(this.accordionContent, {\n height: 0,\n });\n\n this.attachEvents();\n }\n\n /**\n * Attaches module event listeners.\n */\n private attachEvents(): void {\n if (this.areEventsAttached) return;\n this.accordionTrigger.addEventListener('click', this.onClick);\n this.areEventsAttached = true;\n }\n\n /**\n * Click event. Calls toggleAccordion.\n */\n private onClick(e: Event): void {\n this.toggleAccordion();\n }\n\n /**\n * Resize event. Gets accordion content height as inner height changes.\n */\n onResize(): void {\n if (!this.elem) return;\n if (this.cardHeight) {\n this.cardHeight.onResize();\n }\n this.setAccordionHeight();\n }\n\n /**\n * Gets the inner height of accordion content, sets total height accordingly.\n */\n setAccordionHeight(): void {\n if (this.cardHeight) {\n this.cardHeight.getTallestCard();\n }\n\n this.accordionHeight = this.accordionInnerHeight.offsetHeight;\n\n if (!this.isAccordionOpen) return;\n\n // Set the accordionContent height to match the inner content.\n TweenMax.set(this.accordionContent, {\n height: this.accordionHeight,\n });\n }\n\n /**\n * Toggles accordion when accordionTrigger is clicked.\n */\n toggleAccordion(): void {\n if (this.isAccordionOpen) {\n this.closeAccordion();\n } else {\n this.openAccordion();\n }\n }\n\n /**\n * Animates accordion state to open.\n */\n openAccordion(): void {\n TweenMax.set(this.accordionTriggerOpenText, {\n display: 'none',\n onComplete: () => {\n this.accordionTriggerOpenText.setAttribute('aria-hidden', 'true');\n },\n });\n\n TweenMax.set(this.accordionTriggerCloseText, {\n display: 'block',\n onComplete: () => {\n this.accordionTriggerCloseText.setAttribute('aria-hidden', 'false');\n this.accordionTrigger.setAttribute('aria-pressed', 'true');\n this.accordionTrigger.setAttribute('aria-expanded', 'true');\n },\n });\n\n TweenMax.to(window, ANIMATION_SPEED, {\n scrollTo: this.core.getDistanceFromPageTop(this.elem) -\n this.core.header.headerHeight,\n ease: Expo.easeInOut,\n });\n\n TweenMax.to(this.accordionContent, ANIMATION_SPEED, {\n height: this.accordionHeight,\n opacity: 1,\n ease: Expo.easeInOut,\n onUpdate: () => {\n this.core.parallaxers.forEach((parallaxer) => {\n parallaxer.updateElement();\n });\n },\n onComplete: () => {\n this.isAccordionOpen = true;\n TweenMax.set(this.accordionContent, {\n overflow: 'visible',\n });\n this.accordionContent.setAttribute('aria-hidden', 'false');\n this.cardAnchors.forEach((anchor) => {\n anchor.removeAttribute('tabIndex');\n });\n },\n });\n }\n\n /**\n * Animates accordion state to closed.\n */\n closeAccordion(): void {\n TweenMax.set(this.accordionTriggerOpenText, {\n display: 'block',\n onComplete: () => {\n this.accordionTriggerOpenText.setAttribute('aria-hidden', 'true');\n this.accordionTrigger.setAttribute('aria-pressed', 'false');\n this.accordionTrigger.setAttribute('aria-expanded', 'false');\n },\n });\n\n TweenMax.set(this.accordionTriggerCloseText, {\n display: 'none',\n onComplete: () => {\n this.accordionTriggerCloseText.setAttribute('aria-hidden', 'false');\n },\n });\n\n TweenMax.to(this.accordionContent, ANIMATION_SPEED, {\n height: 0,\n opacity: 0,\n ease: Expo.easeInOut,\n onStart: () => {\n TweenMax.set(this.accordionContent, {\n overflow: 'hidden',\n });\n },\n onUpdate: () => {\n this.core.parallaxers.forEach((parallaxer) => {\n parallaxer.updateElement();\n });\n },\n onComplete: () => {\n this.isAccordionOpen = false;\n\n this.accordionContent.setAttribute('aria-hidden', 'true');\n this.cardAnchors.forEach((anchor) => {\n anchor.setAttribute('tabIndex', '-1');\n });\n },\n });\n }\n}\n","import Core from '../Core';\n\nconst NO_IOS_CLASS = 'js-app-link-no-ios';\nconst NO_ANDROID_CLASS = 'js-app-link-no-android';\nconst TIMEOUT_DELAY = 100;\n\n/**\n * AppLinks controller.\n */\nexport default class AppLinks {\n private androidLink: string;\n private areEventsAttached = false;\n private clickTimeout: number;\n private core: Core;\n private defaultLink: string;\n private elem: HTMLAnchorElement;\n private iosLink: string;\n private isAndroid = false;\n private isIos = false;\n private targetUrl: string;\n\n constructor(core: Core, elem: HTMLAnchorElement) {\n this.elem = elem;\n this.core = core;\n this.defaultLink = this.elem.href;\n this.iosLink = this.elem.dataset['ios'];\n this.androidLink = this.elem.dataset['android'];\n this.targetUrl = this.defaultLink;\n\n this.onClick = this.onClick.bind(this);\n\n this.initialize();\n }\n\n /**\n * Initializes AppLinks. Checks device user agent and assigns appropriate\n * mobile link as targetUrl.\n */\n private initialize(): void {\n\n if (/Android/.test(navigator.userAgent)) {\n this.isAndroid = true;\n this.targetUrl = this.androidLink ? this.androidLink : this.defaultLink;\n } else if (/iPhone|iPad|iPod/.test(navigator.userAgent)) {\n this.isIos = true;\n this.targetUrl = this.iosLink ? this.iosLink : this.defaultLink;\n }\n\n this.attachEvents();\n }\n\n /**\n * Attaches module event listeners.\n */\n private attachEvents(): void {\n if (this.areEventsAttached) return;\n this.elem.addEventListener('click', this.onClick);\n this.areEventsAttached = true;\n }\n\n /**\n * Click event. Prevents default click behavior and uses clickTimeout to\n * prevent double click events caused by Draggable Slideshow.\n */\n private onClick(e: Event): void {\n e.preventDefault();\n\n if ((this.elem.classList.contains(NO_ANDROID_CLASS) && this.isAndroid) ||\n (this.elem.classList.contains(NO_IOS_CLASS) && this.isIos)) {\n return;\n }\n\n if (this.clickTimeout) {\n clearTimeout(this.clickTimeout);\n }\n\n this.clickTimeout = setTimeout(() => {\n window.open(this.targetUrl, '_blank');\n }, TIMEOUT_DELAY);\n }\n}\n","declare var TweenMax;\nimport Core from '../Core';\n\nconst CARD_SELECTOR = '.js-card';\nconst CARD_INNER_SELECTOR = '.js-card-inner';\nconst CARD_HEIGHT_CLASS = 'js-cards-height';\n\n/**\n * CardHeight controller.\n */\nexport default class CardHeight {\n private cards: Array;\n private core: Core;\n private elem: HTMLElement;\n private heights: Array;\n private inners: Array;\n private tallestHeight: number;\n\n constructor(core: Core, elem: HTMLElement) {\n this.core = core;\n this.elem = elem as HTMLElement;\n this.cards = Array.from(\n this.elem.querySelectorAll(CARD_SELECTOR)) as Array;\n this.inners = Array.from(\n this.elem.querySelectorAll(CARD_INNER_SELECTOR)) as Array;\n\n if (this.elem.classList.contains(CARD_HEIGHT_CLASS)) {\n this.getTallestCard();\n }\n\n this.onResize = this.onResize.bind(this);\n }\n\n /**\n * Resize event. Calls getTallestCard function.\n */\n onResize(): void {\n if (this.core.isMobile) {\n this.removeHeight();\n return;\n }\n this.getTallestCard();\n }\n\n /**\n * Gets the largest card inner height, compares this to the value already set\n * on the cards, and if it does not match the heights of all cards in the\n * array are updated.\n */\n getTallestCard(): void {\n if (!this.cards.length || !this.inners.length) return;\n\n this.heights = this.inners.map((card) => {\n return card.offsetHeight;\n }) as Array;\n const tallest = Math.max(...this.heights);\n\n if (this.tallestHeight !== tallest) {\n this.tallestHeight = tallest;\n TweenMax.set(this.cards, {\n height: `${this.tallestHeight +\n parseInt(window.getComputedStyle(this.cards[0]).paddingBottom, 10) +\n parseInt(window.getComputedStyle(this.cards[0]).paddingTop, 10)}px`,\n });\n }\n }\n\n /**\n * Removes js set height from all items in cards array.\n */\n private removeHeight(): void {\n TweenMax.set(this.cards, {\n height: 'auto',\n });\n }\n}\n","declare var Clipboard;\nimport Core from '../Core';\n\nconst CARD_SWATCH_ACTIVE_CLASS = 'card--resource-brand-color--active';\nconst CARD_SWATCH_MESSAGE_VISIBLE_TIME = 2000;\nconst CARD_SWATCH_MESSAGE = '.js-swatch-message';\nconst CARD_SWATCH_MESSAGE_COPIED = '.js-swatch-message-copied';\n\n/**\n * ColorSwatches controller.\n */\nexport default class ColorSwatches {\n private areEventsAttached = false;\n private clipboard: any;\n private cardMessage: HTMLElement;\n private cardMessageCopied: HTMLElement;\n private core: Core;\n private elem: HTMLButtonElement;\n\n constructor(core: Core, elem: HTMLButtonElement) {\n this.core = core;\n this.elem = elem as HTMLButtonElement;\n this.cardMessage =\n document.querySelector(CARD_SWATCH_MESSAGE) as HTMLElement;\n this.cardMessageCopied =\n document.querySelector(CARD_SWATCH_MESSAGE_COPIED) as HTMLElement;\n\n this.clipboard = new Clipboard(this.elem);\n this.onSuccess = this.onSuccess.bind(this);\n this.onFail = this.onFail.bind(this);\n this.showCopiedMessage = this.showCopiedMessage.bind(this);\n this.hideCopiedMessage = this.hideCopiedMessage.bind(this);\n\n this.initialize();\n }\n\n /**\n * Initializes ColorSwatches.\n */\n private initialize(): void {\n this.attachEvents();\n }\n\n /**\n * Attaches module event listeners.\n */\n private attachEvents(): void {\n if (this.areEventsAttached) return;\n\n this.clipboard.on('success', this.onSuccess);\n this.clipboard.on('error', this.onFail);\n this.areEventsAttached = true;\n }\n\n /**\n * Adds active class to card and sets aria-hidden attributes on message.\n */\n private showCopiedMessage(): void {\n this.elem.classList.add(CARD_SWATCH_ACTIVE_CLASS);\n this.cardMessage.setAttribute('aria-hidden', 'true');\n this.cardMessageCopied.setAttribute('aria-hidden', 'false');\n setTimeout(this.hideCopiedMessage, CARD_SWATCH_MESSAGE_VISIBLE_TIME);\n }\n\n /**\n * Removes active class on card and resets aria-hidden attributes on message.\n */\n private hideCopiedMessage(): void {\n this.elem.classList.remove(CARD_SWATCH_ACTIVE_CLASS);\n this.cardMessage.setAttribute('aria-hidden', 'false');\n this.cardMessageCopied.setAttribute('aria-hidden', 'true');\n }\n\n /**\n * Clipboard success event.\n */\n private onSuccess(e: Event): void {\n this.showCopiedMessage();\n }\n\n /**\n * Clipboard failure event.\n */\n private onFail(): void {\n throw new Error('There was an error copying to clipboard');\n }\n}\n","declare var TweenMax;\ndeclare var TimelineMax;\ndeclare var Expo;\nimport Core from '../Core';\nimport Video from './Video';\n\nconst CARD_SELECTOR = '.js-video-card';\nconst FEATURED_CARD_PLAY_ICON = '.js-featured-card-play-icon';\nconst FEATURED_FOCUS_SELECTOR = '.js-featured-focus';\nconst VIDEO_WRAPPER_SELECTOR = '.js-video-wrapper';\nconst VIDEO_OVERFLOW_SELECTOR = '.js-video-overflow';\nconst YT_WRAPPER_SELECTOR = '.js-youtube-wrapper';\nconst YT_PLAYER_SELECTOR = '.js-youtube-player';\nconst INLINE_VIDEO_SELECTOR = '.js-video';\nconst SCROLL_DISTANCE = 400;\nconst ANIMATION_SPEED_FAST = 0.1;\nconst ANIMATION_SPEED = 0.2;\nconst ANIMATION_SPEED_SLOW = 0.5;\nconst ENTER_KEYCODE = 13;\nconst TIMEOUT_DELAY = 500;\n\n/**\n * FeaturedCard controller.\n */\nexport default class FeaturedCard {\n private areEventsAttached = false;\n private card: HTMLElement;\n private core: Core;\n private elem: HTMLElement;\n private focus: HTMLElement;\n private intialScroll: number;\n isExpanded = false;\n private isFullScreen = false;\n private isLoopingHidden = false;\n private isResizeDisabled = false;\n private playIcon: HTMLElement;\n private video: HTMLVideoElement;\n videoId: string;\n private videoOverflow: HTMLElement;\n private videoWrapper: HTMLElement;\n private ytPlayer: HTMLElement;\n private YtVideo: Video;\n private ytWrapper: HTMLElement;\n\n constructor(core: Core, elem: HTMLElement) {\n this.core = core;\n this.elem = elem;\n this.focus =\n this.elem.querySelector(FEATURED_FOCUS_SELECTOR) as HTMLElement;\n this.videoWrapper =\n this.elem.querySelector(VIDEO_WRAPPER_SELECTOR) as HTMLElement;\n this.videoOverflow =\n this.elem.querySelector(VIDEO_OVERFLOW_SELECTOR) as HTMLElement;\n this.playIcon =\n this.elem.querySelector(FEATURED_CARD_PLAY_ICON) as HTMLElement;\n this.video =\n this.elem.querySelector(INLINE_VIDEO_SELECTOR) as HTMLVideoElement;\n this.ytWrapper =\n this.elem.querySelector(YT_WRAPPER_SELECTOR) as HTMLElement;\n this.ytPlayer = this.elem.querySelector(YT_PLAYER_SELECTOR) as HTMLElement;\n this.videoId = this.ytPlayer.dataset['video'];\n this.card = this.elem.querySelector(CARD_SELECTOR) as HTMLElement;\n\n this.onClick = this.onClick.bind(this);\n this.onOutsideClick = this.onOutsideClick.bind(this);\n this.onFullscreen = this.onFullscreen.bind(this);\n this.onScroll = this.onScroll.bind(this);\n this.onFocus = this.onFocus.bind(this);\n this.onBlur = this.onBlur.bind(this);\n this.onFocusKeypress = this.onFocusKeypress.bind(this);\n this.playLoop = this.playLoop.bind(this);\n this.pauseLoop = this.pauseLoop.bind(this);\n this.expandPlayer = this.expandPlayer.bind(this);\n\n this.initialize();\n }\n\n /**\n * Initializes FeaturedCard.\n */\n initialize(): void {\n this.checkState();\n\n // Force render of first frame for devices that default to a blank player.\n this.video.load();\n this.video.pause();\n }\n\n /**\n * Checks state. If mobile, module events are detached, otherwise they are\n * added.\n */\n checkState(): void {\n if (this.core.isMobile) {\n this.detachEvents();\n } else {\n this.attachEvents();\n }\n }\n\n /**\n * Attaches FeaturedCard events.\n */\n private attachEvents(): void {\n if (this.areEventsAttached || this.core.isMobile) return;\n this.videoWrapper.addEventListener('click', this.onClick);\n this.core.bodyElem.addEventListener('click', this.onOutsideClick);\n this.videoWrapper.addEventListener('mouseenter', this.playLoop);\n this.videoWrapper.addEventListener('mouseleave', this.pauseLoop);\n this.focus.addEventListener('focus', this.onFocus);\n this.focus.addEventListener('blur', this.onBlur);\n\n // Redeclare document so venderprefix events exist as any.\n let doc: any = window.document;\n if (doc.exitFullscreen) {\n document.addEventListener('fullscreenchange', this.onFullscreen, false);\n } else if (doc.webkitExitFullscreen) {\n document.addEventListener('webkitfullscreenchange',\n this.onFullscreen, false);\n } else if (doc.mozExitFullscreen) {\n document.addEventListener('mozfullscreenchange',\n this.onFullscreen, false);\n } else if (doc.msExitFullscreen) {\n document.addEventListener('msfullscreenchange', this.onFullscreen, false);\n }\n\n this.areEventsAttached = true;\n }\n\n /**\n * Detaches FeaturedCard events.\n */\n private detachEvents(): void {\n if (!this.areEventsAttached) return;\n this.video.removeEventListener('click', this.onClick);\n this.core.bodyElem.removeEventListener('click', this.onOutsideClick);\n this.videoWrapper.removeEventListener('mouseenter', this.playLoop);\n this.videoWrapper.removeEventListener('mouseleave', this.pauseLoop);\n this.focus.removeEventListener('focus', this.onFocus);\n this.focus.removeEventListener('blur', this.onBlur);\n\n document.removeEventListener('fullscreenchange', this.onFullscreen, false);\n document.removeEventListener('webkitfullscreenchange',\n this.onFullscreen, false);\n document.removeEventListener('mozfullscreenchange',\n this.onFullscreen, false);\n document.removeEventListener('msfullscreenchange',\n this.onFullscreen, false);\n\n this.areEventsAttached = false;\n }\n\n /**\n * Click event. Toggles player state.\n */\n private onClick(): void {\n this.togglePlayerState();\n }\n\n /**\n * Fullscreenchange event. Assumes fullscreen state of false and toggles\n * accordingly. Removes scroll event listener when fullscreen to avoid scroll\n * event collisions.\n */\n private onFullscreen(e: Event): void {\n this.isFullScreen = !this.isFullScreen;\n\n if (this.isFullScreen) {\n window.removeEventListener('scroll', this.onScroll);\n this.isResizeDisabled = true;\n } else {\n window.addEventListener('scroll', this.onScroll);\n\n // Allows fullscreen to fully exit before reenabling resize event.\n setTimeout(() => {\n this.isResizeDisabled = false;\n }, TIMEOUT_DELAY);\n }\n }\n\n /**\n * Click event. Collapses player state if User clicks outside YouTube player\n * while its playing.\n */\n private onOutsideClick(): void {\n if (this.isExpanded && (event.target !== this.ytPlayer)) {\n this.collapsePlayer();\n };\n }\n\n /**\n * Resize event. Checks if events should be attached or detached and collapses\n * player state if it's expanded.\n */\n onResize(): void {\n if (this.isResizeDisabled) return;\n this.checkState();\n\n if (this.isExpanded && !this.isFullScreen) {\n this.togglePlayerState();\n }\n }\n\n /**\n * Scroll event. Checks if user has scrolled more than SCROLL_DISTANCE up or\n * down while video is playing, if they have the player state is collapsed.\n */\n private onScroll(): void {\n const yOffset = window.scrollY || window.pageYOffset;\n if ((yOffset > (this.intialScroll + SCROLL_DISTANCE))\n || (yOffset < (this.intialScroll - SCROLL_DISTANCE))) {\n this.collapsePlayer();\n }\n }\n\n /**\n * Focus event. Plays looping video when it has focus and adds a keypress\n * listener.\n */\n private onFocus(): void {\n this.playLoop();\n this.focus.addEventListener('keypress', this.onFocusKeypress);\n }\n\n /**\n * Blur event. Pauses looping video when it loses focus and removes the\n * keypress listener.\n */\n private onBlur(e: Event): void {\n this.pauseLoop();\n this.focus.removeEventListener('keypress', this.onFocusKeypress);\n }\n\n /**\n * Keyboard event. Listens for a keypress matching Enter and calls\n * togglePlayerState.\n */\n onFocusKeypress(e: KeyboardEvent): void {\n if (e.keyCode === ENTER_KEYCODE) {\n this.togglePlayerState();\n }\n }\n\n /**\n * Checks player and applies the opposite function to its current state.\n */\n togglePlayerState(): void {\n if (this.isExpanded) {\n this.collapsePlayer();\n } else {\n this.expandPlayer();\n }\n }\n\n /**\n * Animates player to expaned state.\n */\n private expandPlayer(): void {\n const tl = new TimelineMax();\n\n if (!this.core.isMobile) {\n const pageCenter = this.core.getDistanceFromPageTop(this.elem) -\n ((window.innerHeight / 2) - (this.elem.offsetHeight / 2));\n\n tl.to(window, ANIMATION_SPEED, {\n scrollTo: pageCenter,\n onStart: () => {\n this.core.header.forceHideHeader(true);\n },\n onComplete: () => {\n this.intialScroll = (window.scrollY || window.pageYOffset);\n window.addEventListener('scroll', this.onScroll);\n },\n ease: Expo.easeInOut,\n });\n\n tl.to([this.card, this.playIcon, this.video], ANIMATION_SPEED_SLOW, {\n autoAlpha: 0,\n onStart: () => {\n this.pauseLoop();\n },\n onComplete: () => {\n this.isLoopingHidden = true;\n },\n ease: Expo.easeInOut,\n });\n\n tl.to(this.videoWrapper, ANIMATION_SPEED_SLOW, {\n width: '100%',\n ease: Expo.easeOut,\n onStart: () => {\n TweenMax.to(this.videoOverflow, ANIMATION_SPEED_SLOW, {\n height: '100%',\n top: 0,\n ease: Expo.easeOut,\n });\n },\n });\n }\n\n tl.to(this.ytWrapper, ANIMATION_SPEED, {\n autoAlpha: 1,\n onComplete: () => {\n this.isExpanded = true;\n this.initializeVideo();\n },\n ease: Expo.easeInOut,\n });\n }\n\n /**\n * Animates player to collapsed state.\n */\n private collapsePlayer(): void {\n const tl = new TimelineMax();\n window.removeEventListener('scroll', this.onScroll);\n\n tl.to(this.ytWrapper, ANIMATION_SPEED_FAST, {\n autoAlpha: 0,\n onStart: () => {\n this.YtVideo.stop();\n },\n ease: Expo.easeInOut,\n onComplete: () => {\n this.isExpanded = false;\n },\n });\n\n if (!this.core.isMobile) {\n tl.to(this.videoWrapper, ANIMATION_SPEED_SLOW, {\n width: '90%',\n ease: Expo.easeOut,\n onStart: () => {\n TweenMax.to(this.videoOverflow, ANIMATION_SPEED_SLOW, {\n height: '90%',\n top: '5%',\n ease: Expo.easeOut,\n });\n },\n });\n\n tl.to([this.card, this.playIcon, this.video], ANIMATION_SPEED_SLOW, {\n autoAlpha: 1,\n onStart: () => {\n this.core.header.forceHideHeader(false);\n },\n onComplete: () => {\n this.pauseLoop();\n this.isLoopingHidden = false;\n },\n ease: Expo.easeInOut,\n });\n }\n }\n\n /**\n * Initializes YouTube player via Video module.\n */\n private initializeVideo(): void {\n if (!this.YtVideo) {\n this.YtVideo = new Video(this.core, this.videoId, this.ytPlayer);\n } else {\n this.YtVideo.play();\n }\n }\n\n /**\n * Plays looping HTML Video.\n */\n private playLoop(): void {\n if (!this.video.paused || this.isLoopingHidden) return;\n\n TweenMax.to(this.video, ANIMATION_SPEED_SLOW, {\n scale: 1,\n ease: Expo.easeInOut,\n onComplete: () => {\n this.video.play();\n },\n });\n }\n\n /**\n * Pauses looping HTML Video.\n */\n private pauseLoop(): void {\n if (this.isLoopingHidden) return;\n\n TweenMax.to(this.video, ANIMATION_SPEED_SLOW, {\n scale: 1.1,\n ease: Expo.easeInOut,\n onStart: () => {\n this.video.pause();\n },\n });\n }\n}\n","declare var TweenMax;\ndeclare var TimelineMax;\ndeclare var Expo;\nimport Core from '../Core';\n\nconst HEADER_SELECTOR = '.js-page-header';\nconst SUBHEADER_SECTION_SELECTOR = '.js-page-subheader-section';\nconst SUBHEADER_SELECTOR = '.js-page-subheader';\nconst SUBHEADER_FADE_SELECTOR = '.js-subheader-fade';\nconst MENU_OPEN_ICON = '.js-menu-open-icon';\nconst LOGO_SELECTOR = '.js-header-logo';\nconst SUB_LOGO_SELECTOR = '.js-header-sub-logo';\nconst LOGO_TEXT_SELECTOR = '.js-header-logo-text';\nconst LOGO_BG_SELECTOR = '.js-header-logo-background';\nconst CLEAR_CLASS = 'js-clear-header';\nconst HOME_CLASS = 'js-home-header';\nconst TOP_ANIMATION_SPEED = 0.1;\nconst CLEAR_ANIMATION_SPEED = 0.2;\nconst SUBNAV_ANIMATION_SPEED = 0.1;\nconst SUBNAV_FONT_SIZE = '18px';\nconst SUBNAV_STICKY_FONT_SIZE = '14px';\nconst HEADER_LIGHT_COLOR = '#fff';\nconst HEADER_DARK_COLOR = '#282828';\nconst BOX_SHADOW = '0 2px 4px 0 rgba(0, 0, 0, 0.15)';\nconst STICKY_CLASS = 'tabs__nav--sticky';\nconst TAB_NAV_CLASS = 'tabs__nav-button';\nconst HEADER_HEIGHT = '64px';\nconst BORDER_WIDTH = '1px 0 0 0';\nconst BORDER_COLOR = '#f5f5f5';\nconst BORDER_STYLE = 'solid';\nconst RED_COLOR = '#f00';\n\n/**\n * Header controller.\n */\nexport default class Header {\n private breakpointCache: boolean;\n private core: Core;\n elem: HTMLElement;\n headerHeight: number;\n private headerTimout: number;\n private initialScroll: number;\n isHeaderClear: boolean;\n private isHeaderForced: boolean;\n private isHeaderShown = true;\n private isHeaderScrolled = false;\n private isHome = false;\n private isInitialLoad = true;\n private isScrollingDown: boolean;\n private isSubnavPostSticky: boolean;\n private isSubnavPreSticky: boolean;\n private isSubnavSticking: boolean;\n isSubnavSticky: boolean;\n private logo: HTMLElement;\n private logoBackground: Array;\n private logoText: Array;\n private makeClear: boolean;\n private menuOpenIcon: HTMLElement;\n private sectionHeight: number;\n private sectionTop: number;\n private subHead: HTMLElement;\n private subHeadFade: HTMLElement;\n private subHeadHeight: number;\n private subHeadSection: HTMLElement;\n private subLogo: HTMLElement;\n\n constructor(core: Core) {\n this.core = core;\n this.breakpointCache = this.core.isMobile;\n this.elem = document.querySelector(HEADER_SELECTOR) as HTMLElement;\n if (!this.elem || !this.core) return;\n\n this.headerHeight = this.elem.offsetHeight;\n this.subHeadSection =\n document.querySelector(SUBHEADER_SECTION_SELECTOR) as HTMLElement;\n this.subHead = document.querySelector(SUBHEADER_SELECTOR) as HTMLElement;\n if (this.subHead) {\n this.subHeadHeight = this.subHead.offsetHeight as number;\n this.subHeadFade =\n this.subHead.querySelector(SUBHEADER_FADE_SELECTOR) as HTMLElement;\n }\n this.menuOpenIcon = document.querySelector(MENU_OPEN_ICON) as HTMLElement;\n this.logo = document.querySelector(LOGO_SELECTOR) as HTMLElement;\n this.subLogo = document.querySelector(SUB_LOGO_SELECTOR) as HTMLElement;\n this.logoText = Array.from(\n document.querySelectorAll(LOGO_TEXT_SELECTOR)) as Array;\n this.logoBackground = Array.from(\n document.querySelectorAll(LOGO_BG_SELECTOR)) as Array;\n\n this.makeClear = this.core.bodyElem.classList.contains(CLEAR_CLASS);\n this.isHome = this.core.bodyElem.classList.contains(HOME_CLASS);\n this.isHeaderClear = this.makeClear;\n this.toggleHeaderVisibility = this.toggleHeaderVisibility.bind(this);\n\n this.setMenuIconLight = this.setMenuIconLight.bind(this);\n this.setMenuIconDark = this.setMenuIconDark.bind(this);\n this.updateCache = this.updateCache.bind(this);\n }\n\n /**\n * Initializes Header. Header starts out hidden and is shown after its proper\n * state is set.\n */\n initialize(): void {\n if (!this.elem) return;\n this.toggleHeaderTransparency();\n\n TweenMax.fromTo(this.elem, CLEAR_ANIMATION_SPEED, {\n opacity: 0,\n }, {\n opacity: 1,\n delay: 1,\n onStart: () => {\n this.scrollEvents();\n },\n onComplete: () => {\n this.updateCache();\n this.initialScroll = window.scrollY || window.pageYOffset;\n },\n });\n }\n\n /**\n * Resize event. Checks that header has proper state for the size it is.\n */\n onResize(): void {\n if (!this.elem) return;\n this.updateCache();\n this.toggleHeaderTransparency();\n this.toggleHeaderVisibility();\n\n if (this.isSubnavSticky) {\n TweenMax.set(this.subHeadFade, {\n height: this.subHeadHeight - 1,\n });\n }\n }\n\n /**\n * Scroll event. Runs scrollEvents.\n */\n onScroll(): void {\n if (!this.elem) return;\n this.scrollEvents();\n }\n\n /**\n * Checks that header has proper state for its scroll position.\n */\n scrollEvents(): void {\n this.toggleHeaderTransparency();\n this.toggleHeaderVisibility();\n\n if (!this.subHead) return;\n this.setSubheadPosition();\n }\n\n /**\n * Caches values needed for scroll functions on load and on resize instead\n * of on each scroll event. Also called by Tabs.ts updateModuleHeight.\n */\n updateCache(): void {\n if (!this.elem) return;\n this.headerHeight = this.elem.offsetHeight;\n\n if (!this.subHead) return;\n this.sectionTop = this.subHeadSection.offsetTop;\n this.sectionHeight = this.subHeadSection.offsetHeight;\n this.subHeadHeight = this.subHead.offsetHeight;\n }\n\n /**\n * Toggles subnav's sticky state base on scroll position.\n */\n private setSubheadPosition(): void {\n const headerOffset = this.headerHeight - Math.abs(this.elem.offsetTop);\n const difference = this.isScrollingDown ? 0 : this.headerHeight;\n const scrollY = window.scrollY || window.pageYOffset;\n const preSticky = (scrollY + headerOffset) < this.sectionTop;\n const isSticky = (scrollY + headerOffset + difference) >\n this.sectionTop;\n const postSticky =\n (scrollY + headerOffset + this.subHeadHeight) >\n (this.sectionHeight + this.sectionTop);\n\n if (preSticky) this.subNavPreSticky();\n if (isSticky && !postSticky && !preSticky) this.subNavSticky();\n if (postSticky) this.subPostSticky();\n }\n\n /**\n * Sets subnav's state when its scrolled to before it becomes sticky.\n */\n private subNavPreSticky(): void {\n if (this.isSubnavPreSticky) return;\n\n TweenMax.set(this.subHead, {\n background: 'none',\n borderWidth: 0,\n left: 0,\n marginLeft: 0,\n marginTop: 0,\n position: 'absolute',\n top: 0,\n onComplete: () => {\n this.subHead.classList.remove(STICKY_CLASS);\n this.isSubnavPreSticky = true;\n this.isSubnavSticky = false;\n this.isSubnavPostSticky = false;\n },\n });\n\n TweenMax.set(this.subHeadFade, {\n boxShadow: 'none',\n height: 0,\n });\n\n if (this.core.tabs) {\n TweenMax.set(this.core.tabs.tabTriggers, {\n fontSize: this.core.isMobile ?\n SUBNAV_STICKY_FONT_SIZE : SUBNAV_FONT_SIZE,\n onComplete: () => {\n this.core.underlines.forEach((underline) => {\n if (underline.elem.classList.contains(TAB_NAV_CLASS)) {\n underline.setUnderlineWidth();\n }\n });\n },\n });\n }\n\n TweenMax.set(this.subHeadFade, {\n zIndex: 11,\n });\n\n if (!this.isHeaderScrolled) return;\n TweenMax.set(this.elem, {\n boxShadow: BOX_SHADOW,\n });\n }\n\n /**\n * Sets subnav's state when it scrolls into becomes sticky.\n */\n private subNavSticky(): void {\n if ((this.isSubnavSticky && (this.breakpointCache === this.core.isMobile))\n || this.isSubnavSticking) return;\n\n const tl = new TimelineMax();\n tl.set(this.subHead, {\n borderWidth: BORDER_WIDTH,\n borderColor: BORDER_COLOR,\n borderStyle: BORDER_STYLE,\n position: 'fixed',\n top: this.headerHeight,\n // top: this.core.isMobile ?\n // this.headerHeight - Math.abs(this.elem.offsetTop) : this.headerHeight,\n onComplete: () => {\n this.subHead.classList.add(STICKY_CLASS);\n this.core.tabs.updateModuleHeight();\n this.isSubnavSticking = true;\n },\n });\n\n tl.set(this.subHead, {\n marginTop: 0\n });\n\n tl.set(this.elem, {\n boxShadow: 'none',\n });\n\n tl.set(this.subHead, {\n marginTop: 0\n });\n\n if (!this.core.isMobile && (this.core.tabs && !this.isSubnavSticky)) {\n tl.set(this.core.tabs.tabTriggers, {\n opacity: 0,\n });\n }\n\n tl.to(this.subHeadFade, this.core.isMobile ? 0 : SUBNAV_ANIMATION_SPEED, {\n height: '100%',\n boxShadow: BOX_SHADOW,\n });\n\n if (this.core.tabs) {\n tl.set(this.core.tabs.tabTriggers, {\n fontSize: SUBNAV_STICKY_FONT_SIZE,\n onComplete: () => {\n this.core.underlines.forEach((underline) => {\n if (underline.elem.classList.contains(TAB_NAV_CLASS)) {\n underline.setUnderlineWidth();\n }\n });\n },\n });\n }\n\n tl.set(this.subHeadFade, {\n zIndex: 9,\n });\n\n if (this.core.tabs) {\n tl.to(this.core.tabs.tabTriggers, 0.3, {\n opacity: 1,\n delay: 0.2,\n });\n }\n\n // Ensure last timeline step sets onComplete variables.\n tl.set(window, {\n onComplete: () => {\n this.isSubnavPreSticky = false;\n this.isSubnavSticking = false;\n this.isSubnavSticky = true;\n this.isSubnavPostSticky = false;\n this.breakpointCache = this.core.isMobile;\n },\n });\n }\n\n /**\n * Sets subnav's state after it scrolls past being sticky.\n */\n private subPostSticky(): void {\n if (this.isSubnavPostSticky) return;\n TweenMax.set(this.subHead, {\n left: 0,\n marginLeft: 0,\n marginTop: `${this.subHeadSection.offsetHeight -\n this.subHeadHeight}px`,\n position: 'absolute',\n onComplete: () => {\n this.isSubnavPreSticky = false;\n this.isSubnavSticky = false;\n this.isSubnavPostSticky = true;\n },\n });\n }\n\n /**\n * Animates header position in and out of view on mobile with\n * scroll direction.\n */\n private toggleHeaderVisibility(): void {\n const scrollY = window.scrollY || window.pageYOffset;\n if (scrollY <= this.headerHeight || this.isHeaderForced) return;\n\n // Clear scroll progress if user sits in one place\n if (this.headerTimout) {\n clearTimeout(this.headerTimout);\n }\n this.headerTimout = setTimeout(() => {\n this.initialScroll = window.scrollY || window.pageYOffset;\n }, 500);\n\n if (Math.abs(this.initialScroll - scrollY) > 50 && this.core.isMobile) {\n this.isScrollingDown = scrollY > this.initialScroll;\n\n this.initialScroll = window.scrollY || window.pageYOffset;\n\n if (this.isScrollingDown) {\n if (!this.isHeaderShown) return;\n this.isHeaderShown = false;\n this.hideHeader();\n } else {\n if (this.isHeaderShown) return;\n this.isHeaderShown = true;\n this.showHeader();\n }\n } else if (!this.core.isMobile) {\n if (this.isHeaderShown) return;\n this.isHeaderShown = true;\n this.showHeader();\n }\n }\n\n /**\n * Forces header to hide or show and disables scroll toggling, used by\n * external functions that need to toggle the header state.\n */\n forceHideHeader(isExternal?: boolean): void {\n if (this.core.isMobile) return;\n this.isHeaderForced = isExternal;\n\n if (this.isHeaderForced) {\n this.hideHeader();\n } else {\n this.showHeader();\n }\n }\n\n /**\n * Resumes normal header scroll watchers.\n */\n resumeHeader(): void {\n this.initialScroll = window.scrollY || window.pageYOffset;\n this.isHeaderForced = false;\n }\n\n /**\n * Animates the header into its hidden state.\n */\n private hideHeader(): void {\n TweenMax.to(this.elem, TOP_ANIMATION_SPEED, {\n // top: `-${this.headerHeight}px`,\n top: 0,\n onUpdate: () => {\n this.animateSubHead();\n },\n });\n }\n\n /**\n * Animates the header into its visible state.\n */\n private showHeader(): void {\n TweenMax.to(this.elem, TOP_ANIMATION_SPEED, {\n top: 0,\n onUpdate: () => {\n this.animateSubHead();\n },\n });\n }\n\n /**\n * Sets subnav's position, while sticky, at bottom of header while the header\n * animates in and out.\n */\n private animateSubHead(): void {\n if (!this.isSubnavSticky) return;\n\n TweenMax.set(this.subHead, {\n // top: this.headerHeight - Math.abs(this.elem.offsetTop),\n top: this.headerHeight,\n });\n }\n\n /**\n * Toggles the Header's transparency state based on page scroll position.\n */\n private toggleHeaderTransparency(): void {\n if (this.core.isMobile && !this.isHome) {\n this.scrolledHeaderState();\n return;\n }\n\n const scrollY = window.scrollY || window.pageYOffset;\n const target = this.isHome ? this.subLogo.offsetTop +\n this.subLogo.offsetHeight : this.headerHeight;\n\n if (scrollY < target) {\n this.topHeaderState();\n } else {\n this.scrolledHeaderState();\n }\n }\n\n /**\n * Animates header and child elements into transparent state.\n */\n private topHeaderState(): void {\n if (!this.isHeaderScrolled && !this.isInitialLoad) return;\n\n if (this.isHome) {\n TweenMax.to(this.logo, CLEAR_ANIMATION_SPEED, {\n autoAlpha: 0,\n onComplete: () => {\n this.logo.setAttribute('aria-hidden', 'true');\n },\n });\n }\n\n // If page has a clear header animate those properties as well\n if (this.makeClear) {\n this.setMenuIconLight();\n\n TweenMax.to(this.elem, CLEAR_ANIMATION_SPEED, {\n backgroundColor: 'transparent',\n });\n\n TweenMax.to(this.logoText, CLEAR_ANIMATION_SPEED, {\n fill: HEADER_LIGHT_COLOR,\n });\n\n TweenMax.to(this.logoBackground, CLEAR_ANIMATION_SPEED, {\n fill: HEADER_LIGHT_COLOR,\n onComplete: () => {\n this.isHeaderClear = true;\n },\n });\n } else {\n TweenMax.to(this.elem, CLEAR_ANIMATION_SPEED, {\n backgroundColor: 'transparent',\n });\n }\n\n TweenMax.set(this.elem, {\n boxShadow: 'none',\n onComplete: () => {\n this.isHeaderScrolled = false;\n this.isInitialLoad = false;\n },\n });\n }\n\n /**\n * Animates menu into light state.\n * Separate function so can be called externally by Menu.ts.\n */\n setMenuIconLight(): void {\n if (!this.makeClear) return;\n TweenMax.to(this.menuOpenIcon, CLEAR_ANIMATION_SPEED, {\n fill: HEADER_LIGHT_COLOR,\n });\n }\n\n /**\n * Animates header and child elements into solid state.\n */\n private scrolledHeaderState(): void {\n if (this.isHeaderScrolled) return;\n\n if (this.isHome) {\n TweenMax.to(this.logo, CLEAR_ANIMATION_SPEED, {\n autoAlpha: 1,\n onComplete: () => {\n this.logo.setAttribute('aria-hidden', 'false');\n },\n });\n }\n\n // If page has a clear header animate those properties as well\n if (this.makeClear) {\n this.setMenuIconDark();\n\n TweenMax.to(this.elem, CLEAR_ANIMATION_SPEED, {\n backgroundColor: HEADER_LIGHT_COLOR,\n });\n\n TweenMax.to(this.logoText, CLEAR_ANIMATION_SPEED, {\n fill: HEADER_DARK_COLOR,\n });\n\n TweenMax.to(this.logoBackground, CLEAR_ANIMATION_SPEED, {\n fill: RED_COLOR,\n onComplete: () => {\n this.isHeaderClear = false;\n },\n });\n } else {\n TweenMax.to(this.elem, CLEAR_ANIMATION_SPEED, {\n backgroundColor: HEADER_LIGHT_COLOR,\n });\n }\n\n TweenMax.set(this.elem, {\n boxShadow: BOX_SHADOW,\n onComplete: () => {\n this.isHeaderScrolled = true;\n },\n });\n }\n\n /**\n * Animates menu into dark state.\n * Separate function so can be called externally by Menu.ts.\n */\n setMenuIconDark(): void {\n TweenMax.to(this.menuOpenIcon, CLEAR_ANIMATION_SPEED, {\n fill: HEADER_DARK_COLOR,\n });\n }\n}\n","declare var TweenMax;\ndeclare var TimelineMax;\ndeclare var Expo;\nimport Core from '../Core';\nimport Video from './Video';\n\nconst HERO_SELECTOR = '.js-hero-video';\nconst LOOP_SELECTOR = '.js-hero-video-loop';\nconst WRAPPER_SELECTOR = '.js-hero-video-wrapper';\nconst YT_SELECTOR = '.js-hero-video-yt';\nconst SVG_SELECTOR = '.js-hero-play-icon';\nconst SCROLL_DISTANCE = 400;\nconst ENTER_KEYCODE = 13;\nconst ANIMATION_SPEED = 0.5;\n\n/**\n * Hero controller.\n */\nexport default class Hero {\n private areEventsAttached = false;\n private core: Core;\n private elem: HTMLElement;\n private loop: HTMLVideoElement;\n private intialScroll: number;\n private isFullScreen = false;\n private isLoopHidden = false;\n private playIcon: HTMLElement;\n private video: Video;\n private videoElem: HTMLElement;\n private videoId: string;\n private videoWrapper: HTMLElement;\n\n constructor(core: Core) {\n this.core = core;\n this.elem = document.querySelector(HERO_SELECTOR) as HTMLElement;\n if (!this.elem || !this.core) return;\n this.loop = this.elem.querySelector(LOOP_SELECTOR) as HTMLVideoElement;\n\n this.playIcon = this.elem.querySelector(SVG_SELECTOR) as HTMLElement;\n this.videoWrapper = this.elem.querySelector(WRAPPER_SELECTOR) as HTMLElement;\n this.videoElem = this.elem.querySelector(YT_SELECTOR) as HTMLElement;\n this.videoId = this.videoElem.dataset['video'];\n\n this.onFullscreen = this.onFullscreen.bind(this);\n this.onClick = this.onClick.bind(this);\n this.onMouseEnter = this.onMouseEnter.bind(this);\n this.onMouseLeave = this.onMouseLeave.bind(this);\n this.onScroll = this.onScroll.bind(this);\n this.onFocus = this.onFocus.bind(this);\n this.onBlur = this.onBlur.bind(this);\n this.onFocusKeypress = this.onFocusKeypress.bind(this);\n this.togglePlayerState = this.togglePlayerState.bind(this);\n this.playLoop = this.playLoop.bind(this);\n this.pauseLoop = this.pauseLoop.bind(this);\n this.playVideo = this.playVideo.bind(this);\n this.stopVideo = this.stopVideo.bind(this);\n }\n\n /**\n * Initializes Hero.\n */\n initialize(): void {\n if (!this.elem) return;\n\n this.attachEvents();\n }\n\n /**\n * Attaches Hero events.\n */\n private attachEvents(): void {\n if (this.areEventsAttached) return;\n\n this.elem.addEventListener('mouseenter', this.onMouseEnter);\n this.elem.addEventListener('mouseleave', this.onMouseLeave);\n this.elem.addEventListener('focus', this.onFocus);\n this.elem.addEventListener('blur', this.onBlur);\n this.elem.addEventListener('click', this.onClick);\n\n // Redeclare document so venderprefix events exist as any.\n let doc: any = window.document;\n if (doc.exitFullscreen) {\n document.addEventListener('fullscreenchange', this.onFullscreen, false);\n } else if (doc.webkitExitFullscreen) {\n document.addEventListener('webkitfullscreenchange',\n this.onFullscreen, false);\n } else if (doc.mozExitFullscreen) {\n document.addEventListener('mozfullscreenchange',\n this.onFullscreen, false);\n } else if (doc.msExitFullscreen) {\n document.addEventListener('msfullscreenchange', this.onFullscreen, false);\n }\n\n this.areEventsAttached = true;\n }\n\n /**\n * Fullscreenchange event. Assumes fullscreen state of false and toggles\n * accordingly. Removes scroll event listener when fullscreen to avoid scroll\n * event collisions.\n */\n private onFullscreen(e: Event): void {\n this.isFullScreen = !this.isFullScreen;\n\n if (this.isFullScreen) {\n window.removeEventListener('scroll', this.onScroll);\n } else {\n window.addEventListener('scroll', this.onScroll);\n }\n }\n\n /**\n * Click event. Calls playVideo function.\n */\n private onClick(): void {\n this.playVideo();\n }\n\n /**\n * Mouseenter event. Calls playLoop function.\n */\n private onMouseEnter(): void {\n this.playLoop();\n }\n\n /**\n * Mouseleave event. Calls pauseLoop function.\n */\n private onMouseLeave(): void {\n this.pauseLoop();\n }\n\n /**\n * Scroll event. Checks if user has scrolled more than SCROLL_DISTANCE up or\n * down while video is playing, if they have the video is stopped.\n */\n private onScroll(): void {\n const yOffset = window.scrollY || window.pageYOffset;\n if ((yOffset > (this.intialScroll + SCROLL_DISTANCE))\n || (yOffset < (this.intialScroll - SCROLL_DISTANCE))) {\n this.stopVideo();\n }\n }\n\n /**\n * Focus event. When Hero video is focused the looping video is played and a\n * keypress event listener is added.\n */\n private onFocus(): void {\n this.playLoop();\n this.elem.addEventListener('keypress', this.onFocusKeypress);\n }\n\n /**\n * Blur event. When Hero video focus is blurred the looping video is stopper\n * and the keypress event listener is removed.\n */\n private onBlur(): void {\n this.pauseLoop();\n this.elem.removeEventListener('keypress', this.onFocusKeypress);\n }\n\n /**\n * Keyboard event. Listens for a keypress matching Enter and calls\n * togglePlayerState.\n */\n private onFocusKeypress(e: KeyboardEvent): void {\n if (e.keyCode === ENTER_KEYCODE) {\n this.togglePlayerState();\n }\n }\n\n /**\n * Checks to see if the Hero video is playing or stopped and applies the\n * oppisite state.\n */\n private togglePlayerState(): void {\n if (this.video && this.video.isPlaying) {\n this.stopVideo();\n } else {\n this.playVideo();\n }\n }\n\n /**\n * Plays looping HTML Video.\n */\n private playLoop(): void {\n if (!this.loop || this.isLoopHidden) return;\n\n TweenMax.to(this.loop, ANIMATION_SPEED, {\n scale: 1,\n ease: Expo.easeInOut,\n onComplete: () => {\n this.loop.play();\n },\n });\n }\n\n /**\n * Pauses looping HTML video.\n */\n private pauseLoop(): void {\n if (!this.loop || this.isLoopHidden) return;\n\n TweenMax.to(this.loop, ANIMATION_SPEED, {\n scale: 1.1,\n ease: Expo.easeInOut,\n onComplete: () => {\n this.loop.pause();\n },\n });\n }\n\n /**\n * Scrolls Hero video to center of page, hides the page header, adds a scroll\n * event listener, hides the looping video and play button, and shows and\n * plays the YouTube video.\n */\n private playVideo(): void {\n const tl = new TimelineMax();\n const pageCenter = this.core.getDistanceFromPageTop(this.elem) -\n ((window.innerHeight / 2) - (this.elem.offsetHeight / 2));\n\n tl.to(window, ANIMATION_SPEED, {\n scrollTo: pageCenter,\n onStart: () => {\n this.core.header.forceHideHeader(true);\n },\n onComplete: () => {\n this.intialScroll = (window.scrollY || window.pageYOffset);\n window.addEventListener('scroll', this.onScroll);\n },\n ease: Expo.easeInOut,\n });\n\n tl.to(this.playIcon, ANIMATION_SPEED, {\n autoAlpha: 0,\n onStart: () => {\n if (this.videoWrapper) {\n TweenMax.to(this.videoWrapper, ANIMATION_SPEED, {\n autoAlpha: 1,\n });\n }\n if (this.loop) {\n this.isLoopHidden = true;\n\n TweenMax.to(this.loop, ANIMATION_SPEED, {\n autoAlpha: 0,\n onStart: () => {\n this.pauseLoop();\n },\n onComplete: () => {\n this.loop.currentTime = 0;\n },\n });\n }\n },\n onComplete: () => {\n if (!this.video) {\n this.video = new Video(this.core, this.videoId, this.videoElem);\n } else {\n this.video.play();\n }\n },\n });\n }\n\n /**\n * Stops and hides the YouTube video, restores the page header, and shows\n * the looping video and play button.\n */\n private stopVideo(): void {\n this.video.stop();\n\n TweenMax.to(this.videoWrapper, ANIMATION_SPEED, {\n onStart: () => {\n this.core.header.forceHideHeader(false);\n },\n autoAlpha: 0,\n });\n\n TweenMax.to(this.playIcon, ANIMATION_SPEED, {\n autoAlpha: 1,\n onStart: () => {\n if (this.loop) {\n TweenMax.to(this.loop, ANIMATION_SPEED, {\n autoAlpha: 1,\n onComplete: () => {\n this.isLoopHidden = false;\n },\n });\n }\n },\n onComplete: () => {\n window.removeEventListener('scroll', this.onScroll);\n },\n });\n }\n}\n","declare var TweenMax;\ndeclare var Expo;\nimport Core from '../Core';\n\nconst MENU_SELECTOR = '.js-site-menu';\nconst MENU_WRAPPER_SELECTOR = '.js-menu-wrapper';\nconst MENU_BUTTON_SELECTOR = '.js-menu-btn';\nconst ESCAPE_KEY = 27;\nconst ANIMATION_SPEED = 0.2;\nconst ANIMATION_DELAY = 0.25;\nconst WRAPPER_ANIMATION_SPEED = 1;\nconst OPEN_ICON_SELECTOR = '.js-menu-open-icon';\nconst CLOSE_ICON_SELECTOR = '.js-menu-close-icon';\nconst OPEN_LABEL_SELECTOR = '.js-menu-open-label';\nconst CLOSE_LABEL_SELECTOR = '.js-menu-close-label';\n\n/**\n * Menu controller.\n */\nexport default class Menu {\n private areEventsAttached = false;\n private closeIcon: HTMLElement;\n private closeLabel: HTMLElement;\n private core: Core;\n private elem: HTMLElement;\n private isMenuOpen = false;\n private openIcon: HTMLElement;\n private openLabel: HTMLElement;\n private trigger: HTMLButtonElement;\n private wrapper: HTMLElement;\n\n constructor(core: Core) {\n this.core = core;\n this.elem = document.querySelector(MENU_SELECTOR) as HTMLElement;\n this.wrapper = document.querySelector(MENU_WRAPPER_SELECTOR) as HTMLElement;\n this.trigger =\n document.querySelector(MENU_BUTTON_SELECTOR) as HTMLButtonElement;\n this.openIcon =\n document.querySelector(OPEN_ICON_SELECTOR) as HTMLElement;\n this.closeIcon =\n document.querySelector(CLOSE_ICON_SELECTOR) as HTMLElement;\n this.openLabel =\n document.querySelector(OPEN_LABEL_SELECTOR) as HTMLElement;\n this.closeLabel =\n document.querySelector(CLOSE_LABEL_SELECTOR) as HTMLElement;\n this.onKeyUp = this.onKeyUp.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.showMenu = this.showMenu.bind(this);\n this.closeMenu = this.closeMenu.bind(this);\n }\n\n /**\n * Initializes Menu.\n */\n initialize(): void {\n this.attachEvents();\n }\n\n /**\n * Attaches Menu events.\n */\n private attachEvents(): void {\n if (this.areEventsAttached) return;\n this.areEventsAttached = true;\n this.trigger.addEventListener('click', this.toggleMenu);\n this.elem.addEventListener('click', this.closeMenu);\n }\n\n /**\n * Keyboard event. Listens for a keypress matching Escape and calls\n * closeMenu.\n */\n private onKeyUp(e: KeyboardEvent): void {\n if (e.keyCode === ESCAPE_KEY) {\n this.closeMenu();\n }\n }\n\n /**\n * Calls show or close menu functions depending on current menu state.\n */\n private toggleMenu(): void {\n if (this.isMenuOpen) {\n this.closeMenu();\n } else {\n this.showMenu();\n }\n }\n\n /**\n * Animates the menu into its open state.\n */\n private showMenu(): void {\n TweenMax.to(this.openIcon, ANIMATION_SPEED, {\n opacity: 0,\n });\n\n TweenMax.to(this.closeIcon, ANIMATION_SPEED, {\n opacity: 1,\n delay: ANIMATION_DELAY,\n });\n\n TweenMax.to(this.elem, ANIMATION_SPEED, {\n autoAlpha: 1,\n onStart: () => {\n this.showMenuWrapper();\n this.core.header.setMenuIconDark();\n },\n onComplete: () => {\n window.addEventListener('keyup', this.onKeyUp);\n this.core.disableScroll();\n this.isMenuOpen = true;\n this.trigger.setAttribute('aria-expanded', 'true');\n this.openLabel.setAttribute('aria-hidden', 'true');\n this.closeLabel.setAttribute('aria-hidden', 'false');\n },\n });\n }\n\n /**\n * Animates the menu inner wrapper into its visible state.\n */\n private showMenuWrapper(): void {\n TweenMax.fromTo(this.wrapper, WRAPPER_ANIMATION_SPEED, {\n autoAlpha: 0,\n y: 15,\n }, {\n autoAlpha: 1,\n y: 0,\n delay: .25,\n ease: Expo.easeOut,\n });\n }\n\n /**\n * Animates the menu into its closed state.\n */\n private closeMenu(): void {\n TweenMax.to(this.closeIcon, ANIMATION_SPEED, {\n opacity: 0,\n });\n\n TweenMax.to(this.openIcon, ANIMATION_SPEED, {\n opacity: 1,\n delay: 0.1,\n });\n\n TweenMax.to(this.elem, ANIMATION_SPEED, {\n autoAlpha: 0,\n onStart: () => {\n if (this.core.header.isHeaderClear) {\n this.core.header.setMenuIconLight();\n } else {\n this.core.header.setMenuIconDark();\n }\n this.trigger.blur();\n },\n onComplete: () => {\n this.hideMenuWrapper();\n window.removeEventListener('keyup', this.onKeyUp);\n this.core.enableScroll();\n this.isMenuOpen = false;\n this.trigger.setAttribute('aria-expanded', 'false');\n this.openLabel.setAttribute('aria-hidden', 'false');\n this.closeLabel.setAttribute('aria-hidden', 'true');\n },\n });\n }\n\n /**\n * Animates the menu into its hidden state.\n */\n private hideMenuWrapper(): void {\n TweenMax.to(this.wrapper, ANIMATION_SPEED, {\n autoAlpha: 0,\n y: 15,\n });\n }\n}\n","declare var TweenMax;\nimport Core from '../Core';\n\nconst BACKGROUND_SELECTOR = 'js-parallaxed-background';\n\n/**\n * Parallaxer controller.\n */\nexport default class Parallaxer {\n private core: Core;\n private elem: HTMLElement;\n private elemheight: number;\n private isBackground: boolean;\n private isParallaxed = false;\n private speed: number;\n\n private top: number;\n\n constructor(core: Core, elem: HTMLElement) {\n this.core = core;\n this.elem = elem;\n this.elemheight = this.elem.offsetHeight;\n this.speed = parseFloat(this.elem.dataset['speed']) || 0.15;\n this.isBackground = this.elem.classList.contains(BACKGROUND_SELECTOR);\n\n this.parallaxBackground = this.parallaxBackground.bind(this);\n this.parallaxElement = this.parallaxElement.bind(this);\n\n this.initialize();\n }\n\n /**\n * Initializes Parallaxer.\n */\n private initialize(): void {\n if (this.core.isMobile) return;\n this.updateElement();\n }\n\n /**\n * Scroll event.\n */\n onScroll() {\n if (this.core.isMobile) return;\n\n this.updateElement();\n }\n\n /**\n * Resize event. Updates variables that might only change on resize.\n */\n onResize() {\n if (this.core.isMobile) {\n // Remove parallax from element if on mobile.\n this.removeParallax();\n return;\n }\n\n this.elemheight = this.elem.offsetHeight;\n }\n\n /**\n * Checks to see if Parallax element is scrolled within the viewport, and\n * updates the parallax element's Y translation based on the current scroll\n * relative to the element's position on the page.\n */\n updateElement(): void {\n this.top = this.elem.getBoundingClientRect().top;\n\n const belowView = this.top < window.innerHeight;\n const aboveView = this.top > (-this.elemheight);\n\n if (belowView && aboveView) {\n if (this.isBackground) {\n requestAnimationFrame(this.parallaxBackground);\n } else {\n requestAnimationFrame(this.parallaxElement);\n }\n }\n }\n\n /**\n * Runs background image parallax animation inside requestAnimationFrame.\n */\n private parallaxBackground(): void {\n TweenMax.set(this.elem, {\n backgroundPositionY: `${this.top * this.speed}px`,\n onComplete: () => {\n this.isParallaxed = true;\n },\n });\n }\n\n /**\n * Runs element parallax animation inside requestAnimationFrame.\n */\n private parallaxElement(): void {\n TweenMax.set(this.elem, {\n y: ((this.top + (this.elemheight / 2)) - (window.innerHeight / 2)) * this.speed,\n onComplete: () => {\n this.isParallaxed = true;\n },\n });\n }\n\n /**\n * Removes parallax animation positioning from element.\n */\n private removeParallax(): void {\n if (!this.isParallaxed) return;\n\n TweenMax.set(this.elem, {\n y: 0,\n onComplete: () => {\n this.elem.removeAttribute('style');\n this.isParallaxed = false;\n },\n });\n }\n}\n","import Core from '../Core';\n\nconst RIBBON_SELECTOR = '.js-freedom-ribbon';\nconst ACTIVE_CLASS = 'freedoms__ribbon--active';\n\ninterface IRibbonProps {\n elem: HTMLElement;\n center: number;\n}\n\n/**\n * Ribbons controller.\n */\nexport default class Ribbons {\n private core: Core;\n private elem: HTMLElement;\n private ribbons: Array;\n\n constructor(core: Core, elem: HTMLElement) {\n this.core = core;\n this.elem = elem;\n const ribbons = Array.from(\n this.elem.querySelectorAll(RIBBON_SELECTOR)) as Array;\n\n // custom ribbon object\n this.ribbons = ribbons.map((ribbon) => {\n return {\n elem: ribbon,\n center: this.core.getDistanceFromPageTop(ribbon) -\n ((window.innerHeight / 2) - (ribbon.offsetHeight / 2)),\n };\n });\n\n this.initialize();\n }\n\n /**\n * Initializes Ribbons.\n */\n private initialize(): void {\n this.scrollCheck();\n }\n\n /**\n * Resize event. Loops through ribbons and updates center value as resizing\n * may have changed that.\n */\n onResize(): void {\n this.ribbons.forEach((ribbon) => {\n ribbon.center = this.core.getDistanceFromPageTop(ribbon.elem) -\n ((window.innerHeight / 2) - (ribbon.elem.offsetHeight / 2));\n });\n }\n\n /**\n * Scroll event.\n */\n onScroll() {\n this.scrollCheck();\n }\n\n /**\n * Checks to see which ribbons are above page center and adds the active class\n * if they are, and removes it if they are not.\n */\n private scrollCheck(): void {\n const yOffset = window.scrollY || window.pageYOffset;\n\n this.ribbons.forEach((ribbon) => {\n if (yOffset > ribbon.center) {\n if (!ribbon.elem.classList.contains(ACTIVE_CLASS)) {\n ribbon.elem.classList.add(ACTIVE_CLASS);\n }\n } else {\n if (ribbon.elem.classList.contains(ACTIVE_CLASS)) {\n ribbon.elem.classList.remove(ACTIVE_CLASS);\n }\n }\n });\n }\n}\n","declare var TweenMax;\ndeclare var Draggable;\nimport Core from '../Core';\n\ninterface ISlideProps {\n elem: HTMLElement;\n focuses: Array;\n}\n\n/**\n * Swipeable slideshow controller.\n */\nconst SLIDESHOW_SELECTOR = '.js-slideshow';\nconst SLIDE_SELECTOR = '.js-slideshow-slide';\nconst SLIDE_FOCUS_SELECTOR = '.js-slideshow-focus';\nconst YT_PLAYER_SELECTOR = '.js-youtube-player';\nconst APP_LINKS_CLASS = 'js-app-link';\nconst VIDEO_WRAPPER_CLASS = 'js-video-wrapper';\nconst ENTER_CODE = 13;\nconst ANIMATION_SPEED = 0.3;\n\nexport default class Slideshow {\n private areEventsAttached = false;\n private cardWidth: number;\n private core: Core;\n private dragggable: any;\n private elem: HTMLElement;\n private fullWidth: number;\n private isSetup: boolean;\n private slides: Array;\n private snapToSlide: number;\n private widths: Array;\n private isRTL: boolean;\n\n constructor(core: Core) {\n this.core = core;\n this.elem = document.querySelector(SLIDESHOW_SELECTOR) as HTMLElement;\n const slides = Array.from(\n document.querySelectorAll(SLIDE_SELECTOR)) as Array;\n\n // custom slide object\n this.slides = slides.map((slide) => {\n return {\n elem: slide,\n focuses: Array.from(\n slide.querySelectorAll(SLIDE_FOCUS_SELECTOR)) as Array,\n };\n });\n\n this.onClick = this.onClick.bind(this);\n this.onFocus = this.onFocus.bind(this);\n this.onFocusKeypress = this.onFocusKeypress.bind(this);\n this.isRTL = document.getElementsByTagName('html')[0].dir === 'rtl';\n }\n\n /**\n * Initialize Swipeable slideshow.\n */\n initialize(): void {\n if (!this.elem) return;\n this.check();\n }\n\n /**\n * Attaches slideshow events.\n */\n private attachEvents(): void {\n if (this.areEventsAttached) return;\n\n this.slides.forEach((slide, slideIndex) => {\n slide.elem.addEventListener('click', this.onClick);\n\n if (slide.focuses.length) {\n slide.focuses.forEach((focus) => {\n focus.addEventListener('focus', this.onFocus);\n focus.setAttribute('data-index', `${slideIndex}`);\n });\n } else {\n slide.elem.addEventListener('focus', this.onFocus);\n slide.elem.setAttribute('data-index', `${slideIndex}`);\n }\n });\n\n this.areEventsAttached = true;\n }\n\n /**\n * Detaches slideshow events.\n */\n private detachEvents(): void {\n if (!this.areEventsAttached) return;\n\n this.slides.forEach((slide, slideIndex) => {\n slide.elem.removeEventListener('click', this.onClick);\n\n if (slide.focuses.length) {\n slide.focuses.forEach((focus) => {\n focus.removeEventListener('focus', this.onFocus);\n focus.removeAttribute('data-index');\n });\n } else {\n slide.elem.removeEventListener('focus', this.onFocus);\n slide.elem.removeAttribute('data-index');\n }\n });\n\n this.areEventsAttached = false;\n }\n\n /**\n * Click event. Prevents default anchor click if on mobile and if anchor\n * contains the app link class.\n */\n private onClick(e: Event): void {\n if (!this.core.isMobile) return;\n\n if (e.srcElement.classList.contains(APP_LINKS_CLASS)) {\n e.preventDefault();\n }\n }\n\n /**\n * Resize event. Checks if slideshow needs to be added or removed from page,\n * and sizes slideshow slides if appropriate.\n */\n onResize(): void {\n if (!this.elem) return;\n\n // Check if resize means module should be added or removed.\n this.check();\n\n if (!this.isSetup) return;\n\n // Update slideshow card sizes.\n this.setSlideshowSize();\n\n // Update slide position to first.\n this.snapToSlide = 0;\n this.updateSlideshowPosition();\n\n this.core.featuredCards.forEach((card) => {\n if (card.isExpanded) {\n card.togglePlayerState();\n }\n });\n }\n\n /**\n * Focus event. Centers slideshow on focused slide.\n */\n onFocus(e: Event): void {\n // Property 'dataset' does not exist on type Event, reset to HTMLElement.\n const element = e.srcElement as HTMLElement;\n this.snapToSlide = parseInt(element.dataset['index'], 10);\n\n this.slides[this.snapToSlide].focuses.forEach((focus) => {\n focus.addEventListener('keypress', this.onFocusKeypress);\n });\n\n this.updateSlideshowPosition();\n }\n\n /**\n * Keypress Event. Listens for keyboard Enter code and calls onSlideClick.\n */\n onFocusKeypress(e: KeyboardEvent): void {\n if (e.keyCode === ENTER_CODE) {\n // Event type is not assignable to parameter of type 'HTMLElement', reset\n // to HTMLElement.\n const element = e.srcElement as HTMLElement;\n this.onSlideClick(element);\n }\n }\n\n /**\n * Checks if mobile and adds or removes slideshow.\n */\n private check(): void {\n if (this.core.isMobile) {\n this.add();\n } else {\n this.remove();\n }\n }\n\n /**\n * Sets individual slide widths and sets the total combined width of all the\n * slides on the slide container.\n */\n private setSlideshowSize(): void {\n this.cardWidth = this.slides[0].elem.classList.contains('card--image-full')\n ? this.slides[0].elem.offsetWidth : (window.innerWidth * .9);\n this.fullWidth = this.cardWidth * this.slides.length;\n\n this.slides.forEach((slide) => {\n TweenMax.set(slide.elem, {\n width: this.cardWidth,\n });\n });\n\n TweenMax.set(this.elem, {\n width: `${this.fullWidth}px`,\n onComplete: () => {\n this.widths = this.slides.map((slide, index) => {\n return (slide.elem.offsetWidth * index);\n });\n },\n });\n }\n\n /**\n * Adds Swipeable slideshow.\n */\n private add(): void {\n if (this.isSetup) return;\n this.setSlideshowSize();\n this.attachEvents();\n\n // The instance of Greensock Draggable.\n this.dragggable = Draggable.create(this.elem, {\n type: 'x',\n cursor: 'pointer',\n lockAxis: true,\n dragClickables: true,\n throwProps: true,\n zIndexBoost: false,\n snap: {\n x: (endValue) => {\n // On release, draggable 'snaps' to the closest card on the grid of\n // cards in the instance.\n return Math.round(endValue / this.cardWidth) * this.cardWidth;\n },\n },\n bounds: {\n minX: (this.isRTL ? (this.fullWidth - this.cardWidth) : -(this.fullWidth - this.cardWidth)),\n maxX: 0,\n },\n onClick: (e) => {\n this.onSlideClick(e.srcElement);\n },\n onDragStart: () => {\n this.core.disableScroll();\n\n // Resets expanded cards.\n this.core.featuredCards.forEach((card) => {\n if (card.isExpanded) {\n card.togglePlayerState();\n }\n });\n },\n onDragEnd: () => {\n this.core.enableScroll();\n },\n });\n\n this.isSetup = true;\n }\n\n /**\n * Captures slide click and toggles slide video if appropriate.\n */\n private onSlideClick(element: HTMLElement): void {\n // On mobile two separate clickable elements, an anchor and a clickable div,\n // are combined into a single card. This checks that the click happened on\n // the clickable div before running the card toggle state function.\n if (!element.classList.contains(VIDEO_WRAPPER_CLASS)) return;\n const videoElement =\n element.querySelector(YT_PLAYER_SELECTOR) as HTMLElement;\n\n this.core.featuredCards.forEach((card) => {\n if (card.videoId === videoElement.dataset['video']) {\n card.togglePlayerState();\n }\n });\n }\n\n /**\n * Animates active/focused slide postion.\n */\n updateSlideshowPosition() {\n TweenMax.to(this.elem, ANIMATION_SPEED, {\n x: `-${this.widths[this.snapToSlide]}`,\n delay: 0.1,\n });\n }\n\n /**\n * Removes Swipeable slideshow.\n */\n private remove(): void {\n if (this.isSetup) {\n this.detachEvents();\n\n this.slides.forEach((slide) => {\n TweenMax.set(slide.elem, {\n width: 'auto',\n });\n\n slide.focuses.forEach((focus) => {\n focus.removeEventListener('keypress', this.onFocusKeypress);\n });\n });\n\n if (this.dragggable) {\n this.dragggable[0].kill();\n }\n this.elem.setAttribute('style', '');\n this.isSetup = false;\n }\n }\n}\n","declare var TweenMax;\ndeclare var TimelineMax;\ndeclare var Expo;\nimport Core from '../Core';\n\n/**\n * Stats slideshow controller.\n */\nconst STATS_SELECTOR = '.js-carousel';\nconst SLIDE_SELECTOR = '.js-carousel-slide';\nconst BACK_SELECTOR = '.js-carousel-back';\nconst FOWARD_SELECTOR = '.js-carousel-forward';\nconst LINE_LEFT_SELECTOR = '.js-carousel-line-left';\nconst LINE_RIGHT_SELECTOR = '.js-carousel-line-right';\nconst LEFT_RIBBON_SELECTOR = '.js-carousel-left-ribbon';\nconst RIGHT_RIBBON_SELECTOR = '.js-carousel-right-ribbon';\nconst TEXTFADE_SELECTOR = '.js-carousel-text-fade';\nconst RIBBON_CLASS = 'stats-carousel__ribbon--active';\nconst ANIMATION_SPEED_FAST = 0.1;\nconst ANIMATION_SPEED_MEDIUM = 0.4;\nconst ANIMATION_SPEED_SLOW = 0.5;\nconst ANIMATION_DELAY = 0.25;\nconst TIMELINE_DELAY = 0.3;\nconst SWIPE_THRESHOLD = 150;\n\ninterface ISlideProps {\n back: HTMLElement;\n elem: HTMLElement;\n fades: Array;\n forward: HTMLElement;\n lineLeft: ILineProps;\n lineRight: ILineProps;\n}\n\ninterface ILineProps {\n elem?: HTMLElement;\n ribbon?: HTMLElement;\n}\n\nexport default class Stats {\n private areEventsAttached = false;\n private core: Core;\n private currentSlide: ISlideProps;\n private elem: HTMLElement;\n private initialScrollY: number;\n private initialTouchXPosition: number;\n private isSlideChanging = false;\n private previousSlide: ISlideProps;\n private slides: Array;\n private slideNumber = 0;\n\n constructor(core: Core) {\n this.core = core;\n this.elem = document.querySelector(STATS_SELECTOR) as HTMLElement;\n const slides = Array.from(\n document.querySelectorAll(SLIDE_SELECTOR)) as Array;\n\n // custom slide object\n this.slides = slides.map((slide) => {\n return {\n elem: slide,\n fades: Array.from(\n document.querySelectorAll(TEXTFADE_SELECTOR)) as Array,\n back: slide.querySelector(BACK_SELECTOR) as HTMLElement,\n forward: slide.querySelector(FOWARD_SELECTOR) as HTMLElement,\n lineLeft: {\n elem: slide.querySelector(LINE_LEFT_SELECTOR) as HTMLElement,\n ribbon: slide.querySelector(LEFT_RIBBON_SELECTOR) as HTMLElement,\n },\n lineRight: {\n elem: slide.querySelector(LINE_RIGHT_SELECTOR) as HTMLElement,\n ribbon: slide.querySelector(RIGHT_RIBBON_SELECTOR) as HTMLElement,\n },\n };\n });\n\n // set first slide as current on load.\n this.currentSlide = this.slides[0];\n\n this.slideshowBack = this.slideshowBack.bind(this);\n this.slideshowForward = this.slideshowForward.bind(this);\n this.setCurrent = this.setCurrent.bind(this);\n this.onTouchStart = this.onTouchStart.bind(this);\n this.onTouchEnd = this.onTouchEnd.bind(this);\n }\n\n /**\n * Initializes Stats slideshow.\n */\n initialize(): void {\n if (!this.elem) return;\n this.setCurrent();\n\n this.attachEvents();\n }\n\n /**\n * Attaches Stats slideshow events.\n */\n private attachEvents(): void {\n if (this.areEventsAttached) return;\n\n this.slides.forEach((slide) => {\n slide.back.addEventListener('click', this.slideshowBack);\n slide.forward.addEventListener('click', this.slideshowForward);\n });\n\n this.elem.addEventListener('touchstart', this.onTouchStart);\n this.elem.addEventListener('touchend', this.onTouchEnd);\n\n this.areEventsAttached = true;\n }\n\n /**\n * Touchstart event. Stores touchstart positions to compare to Touchend\n * position.\n */\n private onTouchStart(e: MouseEvent): void {\n this.initialTouchXPosition = e.layerX;\n this.initialScrollY = window.scrollY || window.pageYOffset;\n }\n\n /**\n * Compares touch start positions to touch end positions to determine\n * if a left or right swipe, and advances the slideshow accordingly.\n */\n private onTouchEnd(e: MouseEvent): void {\n const xDiff = this.initialTouchXPosition - e.layerX;\n const yDiff = Math.abs(this.initialScrollY - (window.scrollY || window.pageYOffset));\n\n if (Math.abs(xDiff) > yDiff) {\n if (((xDiff) > SWIPE_THRESHOLD) && (xDiff > 0)) {\n this.slideshowForward();\n } else {\n this.slideshowBack();\n }\n }\n }\n\n /**\n * Resize event. Calls function to update slideshow Height.\n */\n onResize(): void {\n if (!this.elem) return;\n\n this.setHeight();\n }\n\n /**\n * Sets Stats slideshow height based on current slide height.\n */\n private setHeight(): void {\n if (this.elem.offsetHeight === this.currentSlide.elem.offsetHeight) return;\n\n TweenMax.set(this.elem, {\n height: `${this.currentSlide.elem.offsetHeight}px`,\n });\n }\n\n /**\n * Updates Stats slideshow position backwards by one.\n */\n private slideshowBack(): void {\n if (this.isSlideChanging) return;\n this.hideCurrent();\n\n this.slideNumber = this.slideNumber === 0 ?\n this.slides.length - 1 : this.slideNumber - 1;\n }\n\n /**\n * Updates Stats slideshow position forward by one.\n */\n private slideshowForward(): void {\n if (this.isSlideChanging) return;\n this.hideCurrent();\n\n this.slideNumber = this.slideNumber === this.slides.length - 1 ?\n 0 : this.slideNumber + 1;\n }\n\n /**\n * Animates current slide out and sets state for new slide.\n */\n private hideCurrent(): void {\n const tl = new TimelineMax();\n this.previousSlide = this.currentSlide;\n tl.to(this.previousSlide.fades, 0.3, {\n opacity: 0,\n onStart: () => {\n this.isSlideChanging = true;\n },\n onComplete: () => {\n if (this.previousSlide.lineLeft.ribbon) {\n this.previousSlide.lineLeft.ribbon.classList.remove(RIBBON_CLASS);\n }\n if (this.previousSlide.lineRight.ribbon) {\n this.previousSlide.lineRight.ribbon.classList.remove(RIBBON_CLASS);\n }\n this.setCurrent();\n },\n });\n }\n\n /**\n * Animates current slide in.\n */\n private setCurrent(): void {\n this.currentSlide = this.slides[this.slideNumber];\n this.setHeight();\n\n const tl = new TimelineMax();\n\n tl.to(this.currentSlide.elem, ANIMATION_SPEED_FAST, {\n autoAlpha: 1,\n onComplete: () => {\n if (this.previousSlide) {\n TweenMax.to(this.previousSlide.elem, ANIMATION_SPEED_FAST, {\n autoAlpha: 0,\n });\n }\n },\n });\n\n tl.set(this.currentSlide.elem, {\n delay: TIMELINE_DELAY,\n });\n\n if (this.currentSlide.lineLeft.elem) {\n tl.fromTo(this.currentSlide.lineLeft.elem, ANIMATION_SPEED_MEDIUM, {\n x: '-20',\n ease: Expo.easeIn,\n }, {\n x: 0,\n }, TIMELINE_DELAY);\n }\n\n tl.set(this.currentSlide, {\n delay: ANIMATION_SPEED_FAST,\n onComplete: () => {\n if (this.currentSlide.lineLeft.ribbon) {\n this.currentSlide.lineLeft.ribbon.classList.add(RIBBON_CLASS);\n }\n },\n }, TIMELINE_DELAY);\n\n if (this.currentSlide.lineRight.elem) {\n tl.fromTo(this.currentSlide.lineRight.elem, ANIMATION_SPEED_MEDIUM, {\n x: '20',\n ease: Expo.easeIn,\n }, {\n x: 0,\n }, TIMELINE_DELAY);\n }\n\n tl.set(this.currentSlide, {\n delay: ANIMATION_DELAY,\n onComplete: () => {\n if (this.currentSlide.lineRight.ribbon) {\n this.currentSlide.lineRight.ribbon.classList.add(RIBBON_CLASS);\n }\n },\n }, TIMELINE_DELAY);\n\n tl.to(this.currentSlide.fades, ANIMATION_SPEED_SLOW, {\n opacity: 1,\n onComplete: () => {\n this.setHeight();\n this.isSlideChanging = false;\n },\n }, TIMELINE_DELAY);\n }\n}\n","declare var TweenMax;\ndeclare var Expo;\ndeclare var TimelineMax;\n\nimport Core from '../Core';\nimport CardHeight from '../components/CardHeight';\n\nconst TABS_SELECTOR = '.js-tabs';\nconst TAB_WRAPPER_SELECTOR = '.js-tab-nav-wrapper';\nconst TRIGGER_SELECTOR = '.js-tab-trigger';\nconst INLINE_TRIGGER_SELECTOR = '.js-tab-inline-trigger';\nconst TAB_SELECTOR = '.js-tab';\nconst ACTIVE_CLASS = 'tabs__nav-button--active';\nconst CONTAINER_SELECTOR = '.js-tab-container';\nconst NAV_SELECTOR = '.js-tab-nav';\nconst SCROLL_CONTAINER_SELECTOR = '.js-scroll-container';\nconst ARROW_SELECTOR = '.js-tab-arrow';\nconst CARDS_SELECTOR = '.js-cards';\nconst ANIMATION_DISTANCE = 40;\nconst LEFT_SCROLL_BUFFER = 10;\nconst SWIPE_THRESHOLD = 200;\nconst ANIMATIONS_SPEED_FAST = 0.1;\nconst ANIMATIONS_SPEED_MEDIUM = 0.25;\nconst ANIMATIONS_SPEED_SLOW = 0.3;\nconst ANIMATION_DELAY = 0.2;\n\n/**\n * Tabs controller.\n */\nexport default class Tabs {\n private animationSpeed: number;\n private areEventsAttached = false;\n private cardHeight: CardHeight;\n private cardsWrapper: HTMLElement;\n private container: HTMLElement;\n private core: Core;\n private currentIndex = 0;\n private elem: HTMLElement;\n private initialTouchXPosition: number;\n private initialScrollY: number;\n private inlineTriggers: Array;\n private isInitialLoad = true;\n private isUpdating = false;\n private nav: HTMLElement;\n private navWrapper: HTMLElement;\n private overflowArrows: Array;\n private previousIndex: number;\n private scrollContainer: HTMLElement;\n private tabs: Array;\n tabTriggers: Array;\n\n constructor(core: Core) {\n this.core = core;\n this.elem = document.querySelector(TABS_SELECTOR) as HTMLElement;\n if (!this.core || !this.elem) return;\n\n this.cardsWrapper = this.elem.querySelector(CARDS_SELECTOR) as HTMLElement;\n this.navWrapper =\n document.querySelector(TAB_WRAPPER_SELECTOR) as HTMLElement;\n this.container = document.querySelector(CONTAINER_SELECTOR) as HTMLElement;\n this.overflowArrows = Array.from(\n document.querySelectorAll(ARROW_SELECTOR)) as Array;\n this.tabTriggers = Array.from(\n document.querySelectorAll(\n TRIGGER_SELECTOR)) as Array;\n this.inlineTriggers = Array.from(\n document.querySelectorAll(\n INLINE_TRIGGER_SELECTOR)) as Array;\n this.tabs = Array.from(\n document.querySelectorAll(TAB_SELECTOR)) as Array;\n this.nav = document.querySelector(NAV_SELECTOR) as HTMLElement;\n this.scrollContainer =\n this.nav.querySelector(SCROLL_CONTAINER_SELECTOR) as HTMLElement;\n if (this.cardsWrapper) {\n this.cardHeight = new CardHeight(this.core, this.cardsWrapper);\n }\n\n this.onNavClick = this.onNavClick.bind(this);\n this.onInlineClick = this.onInlineClick.bind(this);\n this.onArrowClick = this.onArrowClick.bind(this);\n this.onResize = this.onResize.bind(this);\n this.onNavScroll = this.onNavScroll.bind(this);\n this.onTouchStart = this.onTouchStart.bind(this);\n this.onTouchEnd = this.onTouchEnd.bind(this);\n }\n\n /**\n * Initializes Tabs.\n */\n initialize(): void {\n if (!this.elem) return;\n this.animationSpeed = this.core.isMobile ?\n ANIMATIONS_SPEED_FAST : ANIMATIONS_SPEED_SLOW;\n\n TweenMax.set(this.tabs, {\n autoAlpha: 0,\n });\n\n TweenMax.set(this.navWrapper, {\n height: this.nav.offsetHeight,\n });\n\n this.toggleOverflowArrows();\n this.initialHashCheck();\n this.attachEvents();\n }\n\n /**\n * On load, checks if a hash exists in the url and redirects to the\n * appropriate tab if it matches, if not the first tab is loaded.\n */\n private initialHashCheck(): void {\n const hash = window.location.hash || this.tabTriggers[0].dataset['target'];\n\n this.tabTriggers.forEach((trigger, index) => {\n if (trigger.dataset['target'] === hash) {\n this.currentIndex = index;\n }\n });\n\n this.updateActiveTab(this.currentIndex);\n }\n\n /**\n * Attaches module event listeners.\n */\n private attachEvents(): void {\n if (this.areEventsAttached) return;\n\n this.tabTriggers.forEach((link) => {\n link.addEventListener('click', this.onNavClick);\n });\n this.inlineTriggers.forEach((link) => {\n link.addEventListener('click', this.onInlineClick);\n });\n this.overflowArrows.forEach((arrow) => {\n arrow.addEventListener('click', this.onArrowClick);\n });\n this.scrollContainer.addEventListener('scroll', this.onNavScroll);\n\n this.container.addEventListener('touchstart', this.onTouchStart);\n this.container.addEventListener('touchend', this.onTouchEnd);\n\n this.areEventsAttached = true;\n }\n\n /**\n * Gets the nav trigger index on click and passes\n * to updateActiveTab function.\n */\n private onNavClick(e: Event): void {\n const clicked = this.tabTriggers.indexOf(e.target as HTMLButtonElement);\n this.updateActiveTab(clicked);\n }\n\n /**\n * Gets the inline trigger data-rel on click and matches it to the nav\n * triggers to updateActiveTab function.\n */\n private onInlineClick(e: Event): void {\n // Type: Event must be redefined as HTMLElement to have dataset property.\n const el = e.target as HTMLElement;\n\n this.tabTriggers.forEach((trigger, index) => {\n if (el.dataset['target'] === trigger.dataset['target']) {\n this.updateActiveTab(index);\n }\n });\n }\n\n /**\n * Sets appropriate direction based on which over flow arrow was clicked\n * and passes to updateActiveTab function.\n */\n private onArrowClick(e: Event): void {\n const num = this.overflowArrows.indexOf(e.target as HTMLButtonElement);\n const targetIndex = num === 0 ? this.currentIndex - 1 : this.currentIndex + 1;\n\n this.updateActiveTab(targetIndex);\n }\n\n /**\n * On resize, sets module height as content height changes width page width,\n * and checks if overflow arrows should be shown.\n */\n onResize(): void {\n if (!this.elem) return;\n if (this.cardHeight) {\n this.cardHeight.onResize();\n }\n this.updateModuleHeight();\n this.toggleOverflowArrows();\n }\n\n /**\n * Scroll Event for nav scroll container.\n */\n onNavScroll(): void {\n this.checkNavScrollPosition();\n }\n\n /**\n * Stores intial touch positions on touchstart.\n */\n private onTouchStart(e: MouseEvent): void {\n this.initialTouchXPosition = e.layerX;\n this.initialScrollY = window.scrollY || window.pageYOffset;\n }\n\n /**\n * Compares touch start positions to touch end positions to determine\n * if a left or right swipe, and updates the active tab accordingly.\n */\n private onTouchEnd(e: MouseEvent): void {\n const xDiff = this.initialTouchXPosition - e.layerX;\n const yDiff = Math.abs(this.initialScrollY - (window.scrollY ||\n window.pageYOffset));\n\n if (Math.abs(xDiff) > yDiff) {\n const target =\n (((xDiff) > SWIPE_THRESHOLD) && (xDiff > 0)) ?\n this.currentIndex + 1 : this.currentIndex - 1;\n this.updateActiveTab(target);\n }\n }\n\n /**\n * Updates active Tab based on target parameter.\n */\n private updateActiveTab(targetIndex: number): void {\n if (this.isUpdating || targetIndex < 0 || targetIndex > this.tabs.length - 1 ||\n !this.isInitialLoad && targetIndex === this.currentIndex) return;\n\n this.previousIndex = this.currentIndex;\n this.currentIndex = targetIndex;\n window.location.hash =\n this.tabTriggers[this.currentIndex].dataset['target'];\n\n this.updateActiveNav();\n this.toggleActiveTab();\n }\n\n /**\n * Sets cards to uniform height and sets the height of current tab on the\n * module container.\n */\n updateModuleHeight(): void {\n if (this.cardHeight) {\n this.cardHeight.getTallestCard();\n }\n\n if (this.tabs[this.currentIndex].offsetHeight ===\n this.container.offsetHeight) return;\n\n TweenMax.set(this.container, {\n height: this.tabs[this.currentIndex].offsetHeight,\n onComplete: () => {\n this.core.header.updateCache();\n },\n });\n }\n\n /**\n * Sets the active tab's nav trigger to active. If mobile, scrolls nav to\n * appropriate position.\n */\n private updateActiveNav(): void {\n this.tabTriggers.forEach((elem, index) => {\n if (this.currentIndex === index) {\n elem.classList.add(ACTIVE_CLASS);\n } else {\n elem.classList.remove(ACTIVE_CLASS);\n }\n });\n\n if (!this.core.isMobile) return;\n this.checkNavScrollPosition();\n\n const centering = this.currentIndex > 0 && this.currentIndex <\n this.tabs.length - 1 ? (this.scrollContainer.offsetWidth -\n this.tabTriggers[this.currentIndex].offsetWidth) / 2 : 0;\n\n const distance = ((this.tabTriggers[this.currentIndex].offsetLeft) -\n this.overflowArrows[0].offsetWidth) - centering;\n\n TweenMax.to(this.scrollContainer, this.animationSpeed, {\n scrollTo: {x: distance},\n onComplete: () => {\n this.checkNavScrollPosition();\n },\n });\n }\n\n /**\n * Animates previous tab out and current tab in and decides\n * appropriate animation direction based on incoming and\n * outgoing indexes.\n */\n private toggleActiveTab(): void {\n this.isUpdating = true;\n const directionIn = this.previousIndex < this.currentIndex ? '-' : '+';\n const directionOut = this.previousIndex < this.currentIndex ? '+' : '-';\n const distance = this.isInitialLoad ? 0 : ANIMATION_DISTANCE;\n\n const tl = new TimelineMax();\n\n tl.fromTo(this.tabs[this.previousIndex], this.animationSpeed, {\n autoAlpha: 1,\n x: 0,\n }, {\n autoAlpha: 0,\n x: `${directionOut}${distance}`,\n ease: Expo.easeOut,\n onComplete: () => {\n this.isInitialLoad = false;\n },\n });\n\n if (!this.isInitialLoad && this.core.header.isSubnavSticky) {\n\n if (this.core.isMobile) {\n tl.set(window, {\n onComplete: () => {\n this.core.disableScroll();\n this.core.header.forceHideHeader(true);\n },\n });\n tl.set(window, {\n delay: ANIMATION_DELAY,\n onComplete: () => {\n window.scrollTo(0, this.elem.offsetTop);\n },\n });\n tl.set(window, {\n onComplete: () => {\n this.core.enableScroll();\n this.core.header.resumeHeader();\n },\n });\n } else {\n tl.to(window, this.animationSpeed, {\n scrollTo: this.elem.offsetTop,\n });\n }\n }\n\n tl.to(this.container, ANIMATIONS_SPEED_MEDIUM, {\n height: this.tabs[this.currentIndex].offsetHeight,\n onComplete: () => {\n this.core.header.updateCache();\n },\n });\n\n tl.fromTo(this.tabs[this.currentIndex], this.animationSpeed, {\n autoAlpha: 0,\n x: `${directionIn}${distance}`,\n }, {\n autoAlpha: 1,\n x: 0,\n ease: Expo.easeOut,\n onComplete: () => {\n this.isUpdating = false;\n },\n });\n }\n\n /**\n * Shows the overflow arrows if the nav button's combined\n * width exceeds the nav's width.\n */\n private toggleOverflowArrows(): void {\n const arrowWidth = this.overflowArrows.reduce((total, item) => {\n return total + item.offsetWidth;\n }, 0);\n\n const buttonWidth = this.tabTriggers.reduce((total, item) => {\n return total + item.offsetWidth;\n }, 0);\n\n const arrowAlpha = buttonWidth > (this.nav.offsetWidth - arrowWidth) ?\n 1 : 0;\n\n TweenMax.set(this.overflowArrows, {\n autoAlpha: arrowAlpha,\n });\n }\n\n /**\n * Toggles overflow arrow's opacity and functionality based on scroll\n * position. Arrows are disabled if there is nothing further to scroll\n * in the direction they are pointing.\n */\n checkNavScrollPosition(): void {\n const isLeft = this.scrollContainer.scrollLeft < LEFT_SCROLL_BUFFER;\n const leftOpacity = isLeft ? 0.2 : 1;\n\n const isRight = this.scrollContainer.scrollLeft >=\n this.scrollContainer.scrollWidth - this.scrollContainer.offsetWidth;\n const rightOpacity = isRight ? 0.2 : 1;\n\n TweenMax.to(this.overflowArrows[0], this.animationSpeed, {\n opacity: leftOpacity,\n onStart: () => {\n if (isLeft) {\n this.overflowArrows[0].setAttribute('disabled', 'true');\n } else {\n this.overflowArrows[0].removeAttribute('disabled');\n }\n },\n });\n\n TweenMax.to(this.overflowArrows[1], this.animationSpeed, {\n opacity: rightOpacity,\n onStart: () => {\n if (isRight) {\n this.overflowArrows[1].setAttribute('disabled', 'true');\n } else {\n this.overflowArrows[1].removeAttribute('disabled');\n }\n },\n });\n }\n}\n","declare var TweenMax;\nimport Core from '../Core';\n\nconst WIDTH_SELECTOR = '.js-underline-width';\nconst LINE_SELECTOR = '.js-underline-line';\n\n/**\n * Underline controller. Sets width of animated underline to the exact width of\n * the inline text element's width, which was not possible in CSS. Nesting an\n * element in the inline text element changed its width so that it became full\n * width and no longer matched the design.\n */\nexport default class Underline {\n private core: Core;\n elem: HTMLElement;\n private line: HTMLElement;\n private text: HTMLElement;\n\n constructor(core: Core, elem: HTMLElement) {\n this.core = core;\n this.elem = elem as HTMLElement;\n this.text = this.elem.querySelector(WIDTH_SELECTOR) as HTMLElement;\n this.line = this.elem.querySelector(LINE_SELECTOR) as HTMLElement;\n\n this.onResize = this.onResize.bind(this);\n\n this.setUnderlineWidth();\n }\n\n /**\n * Resize event. Calls setUnderlineWidth.\n */\n onResize(): void {\n this.setUnderlineWidth();\n }\n\n /**\n * Sets underline width based on the width of the inline text element.\n */\n setUnderlineWidth(): void {\n TweenMax.set(this.line, {\n width: this.text.offsetWidth,\n });\n }\n}\n","declare var TweenMax;\ndeclare var YT;\nimport Core from '../Core';\n\n/**\n * YouTube video API controller.\n */\nexport default class Video {\n private core: Core;\n isPlaying = false;\n private player: any;\n private videoElem: HTMLElement;\n private videoId: string;\n private videoLoaded = false;\n\n constructor(core: Core, videoId: string, elem: HTMLElement) {\n this.core = core;\n this.videoId = videoId;\n this.videoElem = elem as HTMLElement;\n\n this.onPlayerReady = this.onPlayerReady.bind(this);\n this.play = this.play.bind(this);\n this.stop = this.stop.bind(this);\n\n this.initialize();\n }\n\n /**\n * Initializes YouTube video API.\n */\n initialize(): void {\n this.loadVideo();\n }\n\n /**\n * Loads YouTube iframe API, and loads appropriate video.\n */\n private loadVideo(): void {\n if (this.videoLoaded) {\n this.player.playVideo();\n return;\n }\n\n this.player = new YT.Player(this.videoElem, {\n height: '390',\n iv_load_policy: 3,\n showinfo: 0,\n videoId: this.videoId,\n width: '640',\n events: {\n onReady: this.onPlayerReady,\n },\n });\n }\n\n /**\n * Event listener to autoplay video onces it has been loaded.\n */\n private onPlayerReady(event): void {\n this.videoLoaded = true;\n\n // Prevent autoplay on mobile, autoplay on most devices will stall the\n // video load.\n if (this.core.isMobile) return;\n this.play();\n }\n\n /**\n * Plays YouTube video.\n */\n play(): void {\n this.player.playVideo();\n this.isPlaying = true;\n }\n\n /**\n * Stops YouTube video.\n */\n stop(): void {\n this.player.stopVideo();\n this.isPlaying = false;\n }\n}\n","declare var YT;\n\nconst window_ = ():any => {\n return window;\n};\n\nconst ClassNames:any = {\n ACTIVE_DESCRIPTION: 'video-gallery__description--active',\n ACTIVE_THUMB: 'video-gallery__thumb--active',\n};\n\nconst Selectors:any = {\n DESCRIPTIONS: '.js-video-descriptions',\n THUMBS: '.js-video-thumbs',\n};\n\nconst Attributes: any = {\n DESCRIPTION_ID: 'description-id',\n THUMB_ID: 'thumb-id',\n VIDEO_ID: 'video-id',\n};\n\nexport default class VideoGallery {\n private player:any;\n private videoId:string;\n private allDescriptions:Array;\n private allThumbs:Array;\n\n constructor(private playerEl:Element) {\n this.videoId = playerEl.getAttribute(Attributes.VIDEO_ID);\n this.allDescriptions = document.querySelectorAll(Selectors.DESCRIPTIONS);\n this.allThumbs = document.querySelectorAll(Selectors.THUMBS);\n this.init();\n }\n\n init():void {\n this.player = new YT.Player('player', {\n videoId: this.videoId,\n events: {\n 'onReady': this.setUpVideoDetails.bind(this)\n }\n });\n this.registerVideoGalleryEvents();\n }\n\n setUpVideoDetails() {\n this.setDetails('descriptions');\n this.setDetails('thumbs');\n }\n\n setDetails(type:string):void {\n const elements = type == 'thumbs' ?\n this.allThumbs : this.allDescriptions;\n const attr = type == 'thumbs' ?\n Attributes.THUMB_ID : Attributes.DESCRIPTION_ID;\n const activeClassName = type == 'thumbs' ?\n ClassNames.ACTIVE_THUMB : ClassNames.ACTIVE_DESCRIPTION;\n\n elements.forEach((el:Element) => {\n el.classList.remove(activeClassName);\n });\n\n const element = document.querySelector(`[${attr}='${this.videoId}']`);\n element.classList.add(activeClassName);\n }\n\n changeVideo(e:any) {\n console.log('click');\n e.preventDefault();\n this.videoId = e.currentTarget.getAttribute(Attributes.THUMB_ID);\n this.player.cueVideoById(this.videoId);\n this.setUpVideoDetails();\n\n }\n\n registerVideoGalleryEvents() {\n this.allThumbs.forEach((thumb:Element) => {\n thumb.addEventListener('click', this.changeVideo.bind(this));\n });\n }\n}\n","declare var Element:any;\n\ninterface Utils {\n delegate: Function;\n matches: Function;\n debounce: Function;\n}\n\nconst utils:Utils = {\n /**\n * Sets up event delegation. Listens for events on a parent that are bubbled\n * up from children that match the given query selector.\n * @param {!Element} element Parent element to listen on.\n * @param {string} selector Query selector for children.\n * @param {string} eventName Name of event to listen for (first argument of\n * addEventListener).\n * @param {!Function} handler Function to call. Receives the event as an\n * argument.\n */\n delegate(element, selector, eventName, handler):void {\n element.addEventListener(eventName, (e) => {\n let target = e.target;\n while (target) {\n if (utils.matches(target, selector)) {\n handler(target);\n break;\n }\n target = target.parentElement;\n }\n }, false);\n },\n\n /**\n * Determines whether the given element matches the given query selector.\n * Polyfill for the native Element.prototype.matches.\n * @param {!Element} element\n * @param {string} selector\n * @return {boolean}\n */\n matches(element, selector):boolean {\n if (Element.prototype.matches) {\n return element.matches(selector);\n } else {\n const matches = Element.prototype.matchesSelector ||\n Element.prototype.mozMatchesSelector ||\n Element.prototype.msMatchesSelector ||\n Element.prototype.oMatchesSelector ||\n Element.prototype.webkitMatchesSelector;\n return matches.call(element, selector);\n }\n },\n\n /**\n * Waits the given amount of time before applying the given function.\n * @param {!Function} callback Function to apply after the given time has\n * been reached.\n * @param {number} threshold The amount of time in milliseconds to wait before\n * applying the callback.\n * @param {boolean} execAsap Whether to apply the callback immediately or not.\n * @return {!Function}\n */\n debounce(callback, threshold, execAsap):Function {\n let timeout;\n return () => {\n const obj = this;\n const args = arguments;\n const delayed = () => {\n if (!execAsap) callback.apply(obj, args);\n timeout = null;\n };\n if (timeout) {\n clearTimeout(timeout);\n } else if (execAsap) {\n callback.apply(obj, args);\n }\n timeout = setTimeout(delayed, threshold || 100);\n };\n },\n};\n\n\n/** @enum {string} */\nconst Selectors = {\n CONTENT: '.yt-js-accordion-content',\n EXPANDABLE: '.yt-js-accordion-expandable',\n TOGGLE: '.yt-js-accordion-toggle'\n};\n\n/** @const {string} */\nconst EXPANDED_CLASSNAME = 'yt-accordion__expandable--is-expanded';\n\n/** @const {string} */\nconst ARIA = 'aria-expanded';\n\n/** @const {number} */\nconst ESC_KEYCODE = 27;\n\n\nexport default class YTAccordion {\n private root: Element;\n private toggleBtn: Element;\n private content: HTMLElement;\n private children: Array;\n private contentHeight: number;\n private hash: string;\n\n /**\n * @param {!Element} root The root element of the expandable content.\n * @struct @final\n */\n constructor(root) {\n this.root = root;\n\n /** @const {!Element} */\n this.toggleBtn = this.root.querySelector(Selectors.TOGGLE);\n\n /** @const {!Element} */\n this.content = this.root.querySelector(Selectors.CONTENT) as HTMLElement;\n\n /** @const {!Array} */\n this.children = Array.from(this.content.children);\n\n /** @type {number} */\n this.contentHeight = 0;\n\n /** @const {?string} */\n this.hash = window.location.hash;\n\n this.setContentMaxHeight();\n this.registerAccordionEvents();\n this.deepLink();\n }\n\n /**\n * Expands the expandable that has a 'hash' attribute value that matches the\n * URL hash.\n */\n deepLink():void {\n if (this.hash == this.root.getAttribute('hash')) {\n this.toggleContent();\n }\n }\n\n /** @return {boolean} */\n isExpanded():boolean {\n return this.root.classList.contains(EXPANDED_CLASSNAME);\n }\n\n // Gets the height of all the content container's children and their margins.\n getContentHeight() {\n this.contentHeight = 0;\n\n this.children.forEach((child:HTMLElement) => {\n let style = getComputedStyle(child);\n let height = child.offsetHeight;\n\n height += parseInt(style.marginTop) + parseInt(style.marginBottom);\n this.contentHeight += height;\n });\n }\n\n // Sets the max-height of the content in order to use the CSS transition to\n // take effect. Pure CSS transitions do not work in this case, since the\n // height of the content vary.\n setContentMaxHeight():void {\n this.getContentHeight();\n this.content.style.maxHeight =\n this.isExpanded() ? this.contentHeight + 'px': '0';\n }\n\n debounceContentHeight():void {\n utils.debounce(this.setContentMaxHeight.bind(this), 300)();\n }\n\n toggleContent():void {\n this.root.classList.toggle(EXPANDED_CLASSNAME);\n this.content.setAttribute(ARIA, this.isExpanded().toString());\n this.setContentMaxHeight();\n }\n\n // Collapses the accordion if the ESC key is pressed.\n handleKeyEvents(e):void {\n if (e.keyCode == ESC_KEYCODE) this.collpaseAll();\n }\n\n collpaseAll():void {\n this.root.classList.remove(EXPANDED_CLASSNAME);\n this.content.setAttribute(ARIA, 'false');\n this.content.style.maxHeight = '0';\n }\n\n registerAccordionEvents() {\n window.addEventListener('resize', this.debounceContentHeight.bind(this));\n window.addEventListener('keyup', this.handleKeyEvents.bind(this));\n utils.delegate(this.toggleBtn, Selectors.TOGGLE, 'click',\n this.toggleContent.bind(this));\n }\n}\n","import Core from './Core';\nimport './util/array-from-polyfill';\n\nconst tag = document.createElement('script');\ntag.src = \"https://www.youtube.com/iframe_api\";\nconst firstScriptTag = document.getElementsByTagName('script')[0];\nfirstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n\nconst isIOS = () => {\n if (navigator.userAgent.match(/iPhone/i)\n || navigator.userAgent.match(/iPad/i)\n || navigator.userAgent.match(/iPod/i))\n {\n return true;\n } else {\n return false;\n }\n};\n\nif (isIOS()) document.body.classList.add('is-ios');\n\nconst core = new Core();\ncore.initialize();\n\n\n/**\n * The logic below gets the latest posts from the given blogs.\n */\nconst BLOG_IDS_ = [\n ['developers', '1109038746813902833'],\n ['trends', '809117824184018876'],\n ['youtube', '8913912091036362264'],\n];\n\nclass Blog {\n private url:string;\n constructor(private type:string, private id:string) {\n this.url = this.getRequestUrl_(id);\n this.getBlogPosts_(this.url, type);\n }\n\n getRequestUrl_(blogID) {\n return 'https://web.archive.org./web/20180403130820/https://www.googleapis.com/blogger/v3/blogs/' + blogID + '/posts?' +\n 'key=AIzaSyCnnV-4khfrShrJadT2pNpuNz7kvn8jo5U';\n };\n\n getBlogPosts_(url, type) {\n const http = new XMLHttpRequest();\n http.onreadystatechange = () => {\n if (http.readyState == 4 && http.status == 200) {\n const response = JSON.parse(http.responseText);\n const headline = document.querySelector(\n '.js-' + type + '-blog-headline');\n const postLink = document.querySelector(\n '.js-' + type + '-blog-post-link');\n if (headline) {\n headline.textContent = '\"' + response.items[0].title + '\"';\n }\n if (postLink) {\n postLink.setAttribute('href', response.items[0].url);\n }\n }\n }\n http.open('GET', url, true);\n http.send();\n }\n}\n\nif (document.querySelector('.js-blogs')) {\n BLOG_IDS_.forEach((blog) => new Blog(blog[0], blog[1]));\n};\n","// Production steps of ECMA-262, Edition 6, 22.1.2.1\nif (!Array.from) {\n Array.from = (function () {\n var toStr = Object.prototype.toString;\n var isCallable = function (fn) {\n return typeof fn === 'function' || toStr.call(fn) === '[object Function]';\n };\n var toInteger = function (value) {\n var number = Number(value);\n if (isNaN(number)) { return 0; }\n if (number === 0 || !isFinite(number)) { return number; }\n return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));\n };\n var maxSafeInteger = Math.pow(2, 53) - 1;\n var toLength = function (value) {\n var len = toInteger(value);\n return Math.min(Math.max(len, 0), maxSafeInteger);\n };\n\n // The length property of the from method is 1.\n return function from(arrayLike/*, mapFn, thisArg */) {\n // 1. Let C be the this value.\n var C = this;\n\n // 2. Let items be ToObject(arrayLike).\n var items = Object(arrayLike);\n\n // 3. ReturnIfAbrupt(items).\n if (arrayLike == null) {\n throw new TypeError('Array.from requires an array-like object - not null or undefined');\n }\n\n // 4. If mapfn is undefined, then let mapping be false.\n var mapFn = arguments.length > 1 ? arguments[1] : void undefined;\n var T;\n if (typeof mapFn !== 'undefined') {\n // 5. else\n // 5. a If IsCallable(mapfn) is false, throw a TypeError exception.\n if (!isCallable(mapFn)) {\n throw new TypeError('Array.from: when provided, the second argument must be a function');\n }\n\n // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined.\n if (arguments.length > 2) {\n T = arguments[2];\n }\n }\n\n // 10. Let lenValue be Get(items, \"length\").\n // 11. Let len be ToLength(lenValue).\n var len = toLength(items.length);\n\n // 13. If IsConstructor(C) is true, then\n // 13. a. Let A be the result of calling the [[Construct]] internal method\n // of C with an argument list containing the single item len.\n // 14. a. Else, Let A be ArrayCreate(len).\n var A = isCallable(C) ? Object(new C(len)) : new Array(len);\n\n // 16. Let k be 0.\n var k = 0;\n // 17. Repeat, while k < len… (also steps a - h)\n var kValue;\n while (k < len) {\n kValue = items[k];\n if (mapFn) {\n A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k);\n } else {\n A[k] = kValue;\n }\n k += 1;\n }\n // 18. Let putStatus be Put(A, \"length\", len, true).\n A.length = len;\n // 20. Return A.\n return A;\n };\n }());\n}\n"],"sourceRoot":"/source/"}