{"version":3,"sources":["services/timelineService.js","images/ribbons/5year.svg","images/ribbons/10year.svg","images/ribbons/15year.svg","images/ribbons/20year.svg","images/ribbons/25year.svg","images/ribbons/30year.svg","images/ribbons/35year.svg","images/ribbons/40year.svg","images/ribbons/45year.svg","images/service_award_message_icon.svg","components/EmployeeCard.js","components/Modal.js","components/List.js","images/cornerLogo.svg","images/magGlass.svg","components/SearchForm.js","components/Music.js","components/NavBar.js","screens/Search.js","components/Timeline/FlyingIn.js","components/Timeline/ProgressBar/SampleYear.js","components/Timeline/ProgressBar/Progress.js","components/Timeline/HeroVideo.js","screens/Timeline.js","images/serviceAwards.svg","screens/Splash.js","webpack:///./src/images/ribbons/5year.svg?9063","screens/Test.js","screens/RotateScreen.js","App.js","serviceWorker.js","index.js"],"names":["sampleData","require","years","Object","keys","sort","a","b","reverse","animationSettings","overlapDuration","timeScale","componentSettings","totalCycle","scaleDuration","opacityDuration","opacityOutOffset","Math","max","EmployeeCard","props","useState","showTopFade","setShowTopFade","showBottomFade","setShowBottomFade","scrollRef","useRef","person","value","ribbon","yearsCelebrating","FiveYearRibbon","TenYearRibbon","FifteenYearRibbon","TwentyYearRibbon","TwentyfiveYearRibbon","ThirtyYearRibbon","ThirtyfiveYearRibbon","FortyYearRibbon","FortyfiveYearRibbon","className","src","process","parseInt","alt","fullName","onClick","e","onClose","ref","onScroll","current","scrollTop","clientHeight","scrollHeight","dept","Boolean","notes","href","target","rel","YearBookIcon","width","firstName","contentBio","split","map","p","i","lastName","Modal","preventDefault","show","showConfetti","window","innerWidth","height","innerHeight","colors","children","defaultProps","title","gsap","registerPlugin","ScrollToPlugin","List","showModal","setShowModal","selectedPerson","setSelectedPerson","colHeight","setColHeight","showLeftFade","setShowLeftFade","showRightFade","setShowRightFade","listDivRef","listItemRef","listTitleRef","listScrollRef","useEffect","floor","document","addEventListener","fadeDisplay","getElementsByClassName","getBoundingClientRect","length","list","selectRibbon","year","handleCloseModal","listStyle","currentSegment","opacity","leftBox","rightBox","scrollBox","console","log","left","right","style","onWheel","currentTarget","scrollTo","scrollLeft","deltaY","isNaN","id","margin","columns","ceil","ee","filter","ea","to","duration","x","reduce","out","curr","getElementById","y","ease","onComplete","generateNav","people","SearchForm","searchVal","setSearchVal","modalOpen","setModalOpen","findPeople","toLowerCase","startsWith","onSubmit","event","type","name","placeholder","onChange","MagGlass","handleNameClick","Music","muted","setMuted","values","music","musicName","musicLink","musicCue","musicVideoUrl","musicVolume","url","includes","playing","musicPlaying","volume","parseFloat","NavBar","location","useLocation","pathname","state","prevPath","CornerLogo","Search","sortList","facet","facetedList","forEach","SampleComponent","animEl","tl","pointerEvents","scale","getChildren","onStart","heroTl","play","SampleYear","active","scrubTo","Progress","progressRef","heroVideo","fromTo","yearList","HeroVideo","redirectSearch","setRedirectSearch","heroRef","nextCue","isMobile","navigator","userAgent","match","bookend","setupPlayer","player","controls","playsinline","qualityMenu","defaultResolution","setTimeout","currentTime","cue","cards","song","contentCues","startTime","start","animation","timeline","set","end","push","setMusicPlaying","animateVideoBackCenter","introDuration","animateVideoPIP","animationCues","on","handleHeroComplete","identifier","top","onSuccess","success","setPlayer","videoData","videoDuration","handleHeroLoad","delay","animateVideo","mediainfo","bcLink","splitLink","parseBCLink","link","accountId","videoId","playerId","embedId","attribution","generatePlayer","Timeline","setCurrentSegment","cleaningUp","vidPlayer","setVidPlayer","paused","vidPlayerPaused","setVidPlayerPaused","showAdvancer","setShowAdvancer","showControls","setShowControls","useMemo","pause","componentTl","childPlayer","toString","segmentIndex","findIndex","restartSegment","globalTimeline","componentList","FlyingIn","label","peopleList","buildTimeline","Splash","_defs","_g","showInstruction","shouldRedirectTl","setShouldRedirectTl","shouldRedirectFind","setShouldRedirectFind","confettiRef","horizontal","vertical","yearTl","repeat","random","handleSplashOld","handleSplashClick","fadedYears","display","stagger","clickLink","EventLogo","welcome","copy","cta","_excluded","_extends","assign","arguments","source","key","prototype","hasOwnProperty","call","apply","this","_objectWithoutProperties","excluded","sourceKeys","indexOf","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","Svg5Year","_ref","svgRef","titleId","viewBox","xmlns","xmlnsXlink","undefined","points","x1","y1","x2","y2","stopColor","offset","stroke","strokeWidth","fill","fillRule","xlinkHref","d","mask","ForwardRef","Test","setTestComponent","RotateScreen","smoothscroll","polyfill","App","screen","orientation","msOrientation","exact","path","component","hostname","ReactDOM","render","StrictMode","serviceWorker","ready","then","registration","unregister","catch","error","message"],"mappings":"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","file":"static/js/main.eb6915a5.chunk.js","sourcesContent":["const sampleData = require(\"../fixtures/content.json\")\n\n// this would be a fetch with real data...\nexport const years = Object.keys(sampleData.years).sort((a, b) => a === \"close\" ? -1 : 1).reverse()\n\nexport const animationSettings = {\n overlapDuration: 1.5,\n timeScale: 0.6,\n}\n\nexport const componentSettings = {\n scaleDuration: 2,\n scale: 8,\n opacityDuration: 1,\n opacityOutOffset: 1.5,\n videoOptions: {\n height: \"390\",\n width: \"640\",\n },\n}\n\n/**\n * Calculates one full component animation duration\n */\nexport const totalCycle = () => {\n let { scaleDuration, opacityDuration, opacityOutOffset } = componentSettings\n return Math.max(\n scaleDuration,\n opacityDuration * 2 + (opacityOutOffset - opacityDuration)\n )\n}\n\n// export const progressSettings = {\n// // needs to be based on number of pieces of content\n// duration:\n// // One half-cycle to first year\n// // # content * (cycle - overlap) per year thereafter\n// //\n\n// (years.reduce((out, curr) => out + sampleData.years[curr].cards.length, 0) +\n// 3 * years.length) *\n// (totalCycle() - animationSettings.overlapDuration) +\n// totalCycle() / 2,\n// // years.length * (totalCycle() - animationSettings.overlapDuration) +\n// // animationSettings.overlapDuration,\n// }\n\n/**\n * each year should be 1/10 of the above\n * above = 10 * (2.5 - 1.5) + 1.5 = 10 * 1 + 1.5 = 11.5\n * eachYear = 11.5 / 10 = 1.15s in duration\n * halfway = 0.575, 0.575 + 1.15, 0.575 + 1.15 * 2, etc.\n *\n * Each component should be 2.5 total duration\n * You want the middle of the component to be 1.15 apart - current 1.25, 1.25 + 1, 1.25 + 2, etc.\n * That means each component would need to be 1.15 long, NOT 2.5.\n * The duration between years needs to === duration between components\n * But the total timeline length also needs to be the same\n *\n * I need to shorten the middle length and tack on a front and back to fill in\n */\n","export default __webpack_public_path__ + \"static/media/5year.8d9ba7f6.svg\";","export default __webpack_public_path__ + \"static/media/10year.339c30a4.svg\";","export default __webpack_public_path__ + \"static/media/15year.bbb13623.svg\";","export default __webpack_public_path__ + \"static/media/20year.ce1c00b7.svg\";","export default __webpack_public_path__ + \"static/media/25year.2a20043a.svg\";","export default __webpack_public_path__ + \"static/media/30year.aa77b91d.svg\";","export default __webpack_public_path__ + \"static/media/35year.ef05d19d.svg\";","export default __webpack_public_path__ + \"static/media/40year.4b7dffe8.svg\";","export default __webpack_public_path__ + \"static/media/45year.48dbacf1.svg\";","export default __webpack_public_path__ + \"static/media/service_award_message_icon.971efe09.svg\";","import React, { useState, useEffect, useRef } from \"react\"\nimport PropTypes from \"prop-types\"\nimport { FaTimes } from \"react-icons/fa\"\n\nimport FiveYearRibbon from \"../images/ribbons/5year.svg\"\nimport TenYearRibbon from \"../images/ribbons/10year.svg\"\nimport FifteenYearRibbon from \"../images/ribbons/15year.svg\"\nimport TwentyYearRibbon from \"../images/ribbons/20year.svg\"\nimport TwentyfiveYearRibbon from \"../images/ribbons/25year.svg\"\nimport ThirtyYearRibbon from \"../images/ribbons/30year.svg\"\nimport ThirtyfiveYearRibbon from \"../images/ribbons/35year.svg\"\nimport FortyYearRibbon from \"../images/ribbons/40year.svg\"\nimport FortyfiveYearRibbon from \"../images/ribbons/45year.svg\"\nimport YearBookIcon from \"../images/service_award_message_icon.svg\"\n\nfunction EmployeeCard(props) {\n const [showTopFade, setShowTopFade] = useState(false)\n const [showBottomFade, setShowBottomFade] = useState(true)\n\n const scrollRef = useRef(null)\n\n const handleScroll = (ref) => {\n setShowTopFade(!(ref.scrollTop === 0))\n setShowBottomFade(!(ref.scrollTop + ref.clientHeight === ref.scrollHeight))\n }\n\n const onClose = (e) => {\n if (props.onClose) {\n props.onClose(e)\n }\n }\n\n if (props.person) {\n const person =\n props.person && props.person.value ? props.person.value : props.person\n\n let ribbon = null\n switch (person.yearsCelebrating) {\n case \"5\":\n ribbon = FiveYearRibbon\n break\n case \"10\":\n ribbon = TenYearRibbon\n break\n case \"15\":\n ribbon = FifteenYearRibbon\n break\n\n case \"20\":\n ribbon = TwentyYearRibbon\n break\n case \"25\":\n ribbon = TwentyfiveYearRibbon\n break\n case \"30\":\n ribbon = ThirtyYearRibbon\n break\n case \"35\":\n ribbon = ThirtyfiveYearRibbon\n break\n case \"40\":\n ribbon = FortyYearRibbon\n break\n case \"45\":\n ribbon = FortyfiveYearRibbon\n break\n default:\n ribbon = null\n }\n\n return (\n <div className='ee-card__wrapper'>\n {/* <div className=\"ee-card__inner-border\"></div> */}\n <div className='ee-card__image'>\n <div className='ee-card__image__ribbon'>\n {person.src ? (\n <img\n src={`${process.env.PUBLIC_URL}/assets/images/people/${\n 2020 - 1 - parseInt(person.yearsCelebrating)\n }/${person.src}`}\n alt={person.fullName}\n />\n ) : (\n <img src={ribbon} alt='ribbon' />\n )}\n </div>\n <h1 className='ee-card__image__copy'>Congratulations!</h1>\n </div>\n <div className='ee-card__copy__wrapper'>\n {showTopFade && (\n <div className='ee-card__copy__scroll ee-card__copy__scroll--top'></div>\n )}\n {showBottomFade && (\n <div className='ee-card__copy__scroll ee-card__copy__scroll--bottom'></div>\n )}\n <FaTimes className='ee-card__close' onClick={onClose} />\n <div\n className='ee-card__copy'\n ref={scrollRef}\n onScroll={() => handleScroll(scrollRef.current)}\n >\n \n <h1>{person.fullName}</h1>\n\n <p>\n {person.dept}\n {Boolean(person.notes) ? ` | ${person.notes}` : null}\n </p>\n <a\n href='https://vision.appreciatehub.com/ui/anniversary/list/8FYVKnwcia-SOhIGxtAkOC5S4ewzi3xiWnKYP8z7fHTScGG_OeqKM_rq_ON3L72Mx2f_-ywHFSCu0dyhrOkyqu3DsASHor9_YGVJdCyQJauUzTwTMfnDnRzt3GhzbaMpJEqYL2MP'\n target='_blank'\n rel='noopener noreferrer'\n >\n <span className='ee-card__copy__yb-link'>\n <img\n src={YearBookIcon}\n alt='mail icon'\n width='100%'\n className='ee-card__copy__yb-link__icon'\n />\n Leave a message for {person.firstName} in the yearbook\n </span>\n </a>\n <hr />\n {person.contentBio &&\n person.contentBio\n .split(\"\\n\\n\")\n .map((p, i) => (\n <p\n key={`ee-card-${person.firstName}-${person.lastName}-${i}`}\n >\n {p}\n </p>\n ))}\n </div>\n </div>\n </div>\n )\n } else {\n return null\n }\n}\n\nEmployeeCard.propTypes = {\n onClose: PropTypes.func,\n person: PropTypes.object.isRequired,\n}\n\nexport default EmployeeCard\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\nimport { Close24 } from \"@carbon/icons-react\"\nimport Confetti from \"react-confetti\"\n\nconst Modal = (props) => {\n const onClose = (e) => {\n e.preventDefault()\n if (props.onClose) {\n props.onClose(e)\n }\n }\n return (\n <div className={`modal modal--${props.show ? \"visible\" : \"hidden\"}`}>\n <div className='modal__bg' onClick={onClose}>\n {props.showConfetti && props.show ? (\n <Confetti\n width={window.innerWidth}\n height={window.innerHeight}\n colors={[\"#FFEF64\"]}\n onClick={onClose}\n />\n ) : (\n null\n )}\n </div>\n <div className='modal__content'>\n <div className='modal__body'>{props.children}</div>\n </div>\n </div>\n )\n}\n\nModal.propTypes = {\n show: PropTypes.bool.isRequired,\n title: PropTypes.string.isRequired,\n children: PropTypes.node.isRequired,\n onClose: PropTypes.func.isRequired,\n}\n\nModal.defaultProps = {\n show: false,\n title: \"\",\n}\n\nexport default Modal\n","import React, { useEffect, useRef, useState } from \"react\"\nimport PropTypes from \"prop-types\"\n\nimport { years } from \"../services/timelineService\"\nimport FiveYearRibbon from \"../images/ribbons/5year.svg\"\nimport TenYearRibbon from \"../images/ribbons/10year.svg\"\nimport FifteenYearRibbon from \"../images/ribbons/15year.svg\"\nimport TwentyYearRibbon from \"../images/ribbons/20year.svg\"\nimport TwentyfiveYearRibbon from \"../images/ribbons/25year.svg\"\nimport ThirtyYearRibbon from \"../images/ribbons/30year.svg\"\nimport ThirtyfiveYearRibbon from \"../images/ribbons/35year.svg\"\nimport FortyYearRibbon from \"../images/ribbons/40year.svg\"\nimport FortyfiveYearRibbon from \"../images/ribbons/45year.svg\"\n\nimport EmployeeCard from \"./EmployeeCard\"\nimport Modal from \"./Modal\"\n\nimport { gsap } from \"gsap\"\nimport { ScrollToPlugin } from \"gsap/ScrollToPlugin\"\nimport { FaAngleRight, FaAngleLeft } from \"react-icons/fa\"\n\ngsap.registerPlugin(ScrollToPlugin)\nfunction List(props) {\n const [showModal, setShowModal] = useState(false)\n const [selectedPerson, setSelectedPerson] = useState({})\n const [colHeight, setColHeight] = useState(0)\n const [showLeftFade, setShowLeftFade] = useState(false)\n const [showRightFade, setShowRightFade] = useState(false)\n\n const listDivRef = useRef(null)\n const listItemRef = useRef(null)\n const listTitleRef = useRef(null)\n const listScrollRef = useRef(null)\n\n useEffect(() => {\n setColHeight(\n Math.floor(\n (listDivRef.current.clientHeight - listTitleRef.current.clientHeight) /\n listItemRef.current.clientHeight\n ) - 1\n )\n document.addEventListener(\"resize\", () => {\n setColHeight(\n Math.floor(\n (listDivRef.current.clientHeight -\n listTitleRef.current.clientHeight) /\n listItemRef.current.clientHeight\n ) - 1\n )\n })\n\n fadeDisplay(\n document\n .getElementsByClassName(\"anniversary-list__list__year\")[0]\n .getBoundingClientRect(),\n document\n .getElementsByClassName(\"anniversary-list__list__year\")\n [\n document.getElementsByClassName(\"anniversary-list__list__year\")\n .length - 1\n ].getBoundingClientRect(),\n listScrollRef.current.getBoundingClientRect()\n )\n }, [])\n\n const selectRibbon = (year) => {\n let ribbon = null\n switch (year) {\n case \"5\":\n ribbon = FiveYearRibbon\n break\n case \"10\":\n ribbon = TenYearRibbon\n break\n case \"15\":\n ribbon = FifteenYearRibbon\n break\n case \"20\":\n ribbon = TwentyYearRibbon\n break\n case \"25\":\n ribbon = TwentyfiveYearRibbon\n break\n case \"30\":\n ribbon = ThirtyYearRibbon\n break\n case \"35\":\n ribbon = ThirtyfiveYearRibbon\n break\n case \"40\":\n ribbon = FortyYearRibbon\n break\n case \"45\":\n ribbon = FortyfiveYearRibbon\n break\n default:\n ribbon = null\n }\n return ribbon\n }\n\n const handleListClick = (item) => {\n setSelectedPerson(item)\n setShowModal(true)\n }\n\n const handleCloseModal = () => {\n setShowModal(false)\n }\n\n const listStyle =\n typeof props.currentSegment !== \"number\" ? { opacity: 1 } : null\n\n const fadeDisplay = (leftBox, rightBox, scrollBox) => {\n console.log(\"Left: \", leftBox)\n console.log(\"Right: \", rightBox)\n console.log(\"Scroll: \", scrollBox)\n // if (leftBox.left === rightBox.left && leftBox.right === rightBox.right) {\n // setShowLeftFade(false)\n // setShowRightFade(false)\n // } else {\n setShowLeftFade(leftBox.left !== scrollBox.left)\n setShowRightFade(!(rightBox.right - 2 < scrollBox.right))\n // }\n }\n\n const generateYearLists = (list) => {\n return Object.keys(list)\n .map((year) => {\n if (!isNaN(2020 - year - 1)) {\n return (\n <div\n className='anniversary-list__list__year'\n key={`anniversary-list-list-${year}`}\n id={`${2020 - 1 - year}`}\n ref={listDivRef}\n style={\n typeof props.currentSegment === \"number\"\n ? { margin: \"0 auto\" }\n : {}\n }\n >\n <div\n className='anniversary-list__list__year__title'\n ref={listTitleRef}\n >\n <img\n src={selectRibbon(year)}\n alt='ribbon'\n className='anniversary-list__list__year__title__ribbon'\n />\n Class of {2020 - year - 1}\n </div>\n <ul style={{ columns: Math.ceil(list[year].length / colHeight) }}>\n {list[year].map((ee, i) => {\n return (\n <li\n key={`list-ee-${ee.value.firstName}-${ee.value.lastName}-${i}`}\n className='list-item'\n ref={listItemRef}\n >\n <span onClick={() => handleListClick(ee)}>\n {ee.value.firstName} {ee.value.lastName}\n </span>\n </li>\n )\n })}\n </ul>\n </div>\n )\n } else {\n return null\n }\n })\n .filter((ea) => ea !== null)\n }\n\n const generateNav = (list) => {\n return Object.keys(list).map((year) => {\n return (\n <span\n className='anniversary-list__nav__button'\n onClick={() => {\n gsap.to(listScrollRef.current, {\n duration: 1,\n scrollTo: {\n x: Object.keys(list).reduce((out, curr) => {\n if (parseInt(curr) < parseInt(year)) {\n return (\n out +\n document\n .getElementById(`${2020 - 1 - parseInt(curr)}`)\n .getBoundingClientRect().width\n )\n } else {\n return out\n }\n }, 0),\n y: 0,\n },\n ease: \"circ.inOut\",\n onComplete: () => {\n fadeDisplay(\n document\n .getElementsByClassName(\"anniversary-list__list__year\")[0]\n .getBoundingClientRect(),\n document\n .getElementsByClassName(\"anniversary-list__list__year\")\n [\n document.getElementsByClassName(\n \"anniversary-list__list__year\"\n ).length - 1\n ].getBoundingClientRect(),\n listScrollRef.current.getBoundingClientRect()\n )\n }\n })\n\n // listScrollRef.current.scrollTo(\n // Object.keys(list).reduce((out, curr) => {\n // if (parseInt(curr) < parseInt(year)) {\n // return (\n // out +\n // document\n // .getElementById(`${2020 - 1 - parseInt(curr)}`)\n // .getBoundingClientRect().width\n // )\n // } else {\n // return out\n // }\n // }, 0),\n // 0\n // )\n fadeDisplay(\n document\n .getElementsByClassName(\"anniversary-list__list__year\")[0]\n .getBoundingClientRect(),\n document\n .getElementsByClassName(\"anniversary-list__list__year\")\n [\n document.getElementsByClassName(\n \"anniversary-list__list__year\"\n ).length - 1\n ].getBoundingClientRect(),\n listScrollRef.current.getBoundingClientRect()\n )\n }}\n >\n {2020 - 1 - year}\n </span>\n )\n })\n }\n\n return (\n <div\n className='anniversary-list__container anniversary-list--anim'\n style={listStyle} // set opacity based on whether it's in a timeline or not\n >\n <Modal\n show={showModal}\n onClose={handleCloseModal}\n title='List modal'\n showConfetti={true}\n >\n <EmployeeCard onClose={handleCloseModal} person={selectedPerson} />\n </Modal>\n\n <div\n className='anniversary-list__list'\n onWheel={(e) => {\n e.currentTarget.scrollTo(e.currentTarget.scrollLeft + e.deltaY, 0)\n fadeDisplay(\n document\n .getElementsByClassName(\"anniversary-list__list__year\")[0]\n .getBoundingClientRect(),\n document\n .getElementsByClassName(\"anniversary-list__list__year\")\n [\n document.getElementsByClassName(\"anniversary-list__list__year\")\n .length - 1\n ].getBoundingClientRect(),\n listScrollRef.current.getBoundingClientRect()\n )\n }}\n ref={listScrollRef}\n >\n {showLeftFade && (\n // <div className='anniversary-list__fade anniversary-list__fade--left'></div>\n <FaAngleLeft className='anniversary-list__fade anniversary-list__fade--left'/>\n )}\n {showRightFade && (\n // <div className='anniversary-list__fade anniversary-list__fade--right'></div>\n <FaAngleRight className='anniversary-list__fade anniversary-list__fade--right'/>\n )}\n {generateYearLists(props.list)}\n </div>\n {typeof props.currentSegment !== \"number\" && (\n <div className='anniversary-list__nav'>{generateNav(props.list)}</div>\n )}\n </div>\n )\n}\n\nList.propTypes = {\n currentSegment: PropTypes.number, // only passed when part of a timeline animation\n setCurrentSegment: PropTypes.func, // only passed when part of a timeline animation\n list: PropTypes.oneOfType([PropTypes.array, PropTypes.object]).isRequired,\n advanceSegment: PropTypes.func,\n}\n\nexport default List\n","export default __webpack_public_path__ + \"static/media/cornerLogo.f9fda7eb.svg\";","export default __webpack_public_path__ + \"static/media/magGlass.51582e2a.svg\";","import React, { useState } from \"react\"\n\nimport MagGlass from \"../images/magGlass.svg\"\nimport Modal from \"./Modal\"\nimport EmployeeCard from \"./EmployeeCard\"\n\nconst people = require(\"../fixtures/people.json\")\nfunction SearchForm() {\n const [searchVal, setSearchVal] = useState(\"\")\n const [modalOpen, setModalOpen] = useState(false)\n const [selectedPerson, setSelectedPerson] = useState({})\n\n const handleChange = (event) => {\n setSearchVal(event.currentTarget.value)\n }\n\n const handleSubmit = (event) => {\n event.preventDefault()\n if (people.filter(findPeople).length > 0) {\n setSelectedPerson(people.filter(findPeople)[0])\n setModalOpen(true)\n }\n }\n\n const handleCloseModal = () => {\n setModalOpen(false)\n setSelectedPerson({})\n }\n\n const handleNameClick = (person) => {\n setSelectedPerson(person)\n setModalOpen(true)\n }\n\n const findPeople = (person) => {\n if (searchVal.length > 0) {\n return (\n person.lastName.toLowerCase().startsWith(searchVal.toLowerCase()) ||\n person.firstName.toLowerCase().startsWith(searchVal.toLowerCase()) ||\n `${person.firstName} ${person.lastName}`\n .toLowerCase()\n .startsWith(searchVal.toLowerCase())\n )\n } else {\n return false\n }\n }\n\n return (\n <div className='search-form'>\n <Modal\n show={modalOpen}\n onClose={handleCloseModal}\n title='Search form'\n showConfetti={true}\n >\n <EmployeeCard onClose={handleCloseModal} person={selectedPerson} />\n </Modal>\n <form onSubmit={handleSubmit} className=\"search-form__form\">\n <input\n className=\"search-form__form__input\"\n type='text'\n id='search'\n name='search'\n placeholder='Search by name'\n value={searchVal}\n onChange={handleChange}\n />\n <div className='search-form__icon'>\n <img src={MagGlass} alt='mag glass' />\n </div>\n </form>\n <div\n className={`search-form__results search-form__results--${\n searchVal.length > 0 ? \"visible\" : \"invisible\"\n }`}\n >\n <ul className=\"search-form__results__list\">\n {people.filter(findPeople).map((person, i) => {\n if (i < 7) {\n return (\n <li\n className='search-form__results__list__item'\n onClick={() => handleNameClick(person)}\n key={`search-result-${person.firstName}-${person.lastName}-${i}`}\n >\n {person.firstName} {person.lastName}\n </li>\n )\n }\n })}\n </ul>\n </div>\n </div>\n )\n}\n\nexport default SearchForm\n","import React, { useState } from \"react\"\nimport PropTypes from \"prop-types\"\nimport { FaVolumeUp, FaVolumeMute } from \"react-icons/fa\"\nimport ReactPlayer from \"react-player\"\n\nimport { years } from \"../services/timelineService\"\n\nconst sampleData = require(\"../fixtures/content.json\")\nfunction Music(props) {\n const [muted, setMuted] = useState(false)\n\n if (Object.values(sampleData.years[years[props.currentSegment]].music).length > 0) {\n const [\n musicName,\n musicLink,\n musicStartTime,\n musicCue,\n musicVideoUrl,\n musicVolume\n ] = Object.values(sampleData.years[years[props.currentSegment]].music)\n return (\n <div className='music-player__wrapper' key={`music-player-${props.currentSegment}-${musicLink}`}>\n <ReactPlayer\n url={\n musicLink.includes(\"youtube\")\n ? `${musicLink}&t=${musicCue}`\n : musicLink\n }\n height={0}\n width={0}\n playing={props.musicPlaying}\n volume={parseFloat(musicVolume)}\n muted={muted}\n />\n {props.musicPlaying && (\n <>\n {musicVideoUrl ? (\n <a\n href={`${musicLink}`}\n target='_blank'\n rel='noopener noreferrer'\n >\n {musicName}\n </a>\n ) : (\n <p>{musicName}</p>\n )}\n {muted ? (\n <FaVolumeMute onClick={() => setMuted(!muted)} />\n ) : (\n <FaVolumeUp onClick={() => setMuted(!muted)} />\n )}\n </>\n )}\n </div>\n )\n } else {\n return null\n }\n}\n\nMusic.propTypes = {\n musicPlaying: PropTypes.bool.isRequired,\n currentSegment: PropTypes.number.isRequired,\n}\n\nexport default Music\n","import React from 'react'\nimport { Link, useLocation } from \"react-router-dom\"\n\nimport SearchForm from \"../components/SearchForm\"\n\nimport {\n years,\n} from \"../services/timelineService\"\nimport CornerLogo from \"../images/cornerLogo.svg\"\nimport Music from './Music'\n\nconst sampleData = require(\"../fixtures/content.json\")\nfunction NavBar(props) {\n const location = useLocation()\n\n return (\n <div className='top-bar'>\n <div className='top-bar__logo'>\n <Link to={{ pathname: \"/\", state: { prevPath: location.pathname } }}>\n <img src={CornerLogo} className='corner-logo' alt='corner-logo' />\n </Link>\n </div>\n <div className=\"top-bar__music\">\n { typeof props.currentSegment === \"number\" && sampleData.years[years[props.currentSegment]].music &&\n <Music musicPlaying={props.musicPlaying} currentSegment={props.currentSegment} />}\n </div>\n <div className='top-bar__nav'>\n <Link\n to={{ pathname: location.pathname.includes(\"timeline\") ? \"/search\" : \"/timeline\", state: { prevPath: location.pathname } }}\n className='top-bar__nav__link'\n >\n {location.pathname.includes(\"timeline\") ? \"List of honorees\" : \"Explore the timeline\"}\n </Link>\n <a className='top-bar__nav__link'\n href='https://vision.appreciatehub.com/ui/anniversary/list/8FYVKnwcia-SOhIGxtAkOC5S4ewzi3xiWnKYP8z7fHTScGG_OeqKM_rq_ON3L72Mx2f_-ywHFSCu0dyhrOkyqu3DsASHor9_YGVJdCyQJauUzTwTMfnDnRzt3GhzbaMpJEqYL2MP'\n target='_blank'\n rel='noopener noreferrer'\n >\n Visit the yearbook\n </a>\n </div>\n <div className=\"top-bar__search\">\n <SearchForm />\n </div>\n </div>\n )\n}\n\nexport default NavBar\n","import React from \"react\"\nimport { Link, useLocation } from \"react-router-dom\"\n\nimport List from \"../components/List\"\nimport CornerLogo from \"../images/cornerLogo.svg\"\n\nimport SearchForm from \"../components/SearchForm\"\nimport NavBar from \"../components/NavBar\"\n\nconst people = require(\"../fixtures/people.json\")\nfunction Search() {\n const location = useLocation()\n\n const sortList = (list, facet = \"name\") => {\n if (facet === \"name\" || !Boolean(facet)) {\n return list\n .sort((a, b) => {\n if (a.lastName > b.lastName) {\n return 1\n } else if (a.lastName < b.lastName) {\n return -1\n } else {\n if (a.firstName > b.firstName) {\n return 1\n } else if (a.firstName < b.firstName) {\n return -1\n } else {\n return 0\n }\n }\n })\n .map((ea) => {\n return { type: \"ee\", value: ea }\n })\n } else {\n let facetedList = list.reduce((out, curr) => {\n if (Object.keys(out).includes(curr[facet])) {\n return {\n ...out,\n [curr[facet]]: [...out[curr[facet]], curr],\n }\n } else {\n return {\n ...out,\n [curr[facet]]: [curr],\n }\n }\n }, {})\n Object.keys(facetedList)\n .sort()\n .forEach((ea) => {\n facetedList[ea] = sortList(facetedList[ea])\n })\n return facetedList\n }\n }\n\n return (\n <div className='search'>\n <NavBar />\n <List list={sortList(people, \"yearsCelebrating\")} />\n </div>\n )\n}\n\nexport default Search\n","import React, { useRef, useEffect } from \"react\"\nimport PropTypes from \"prop-types\"\n\nimport {\n animationSettings,\n componentSettings,\n totalCycle,\n} from \"../../services/timelineService\"\n\nconst SampleComponent = (props) => {\n // grab reference to containing div for animation\n const animEl = useRef(null)\n // add animations to timeline on component mount - timelineService to keep consistent with other timelines\n useEffect(() => {\n props.tl\n .to(\n animEl.current,\n {\n pointerEvents: \"none\",\n scale: componentSettings.scale,\n ease: \"power4.in\",\n duration: componentSettings.scaleDuration,\n },\n props.tl.getChildren().length === 0 ? null : `-=${animationSettings.overlapDuration}`\n )\n .to(\n animEl.current,\n {\n opacity: 1,\n ease: \"power4.in\",\n duration: componentSettings.opacityDuration,\n onStart: () => {\n if(props.heroTl){\n props.heroTl.play()\n }\n },\n },\n \"<\"\n )\n .to(\n animEl.current,\n {\n opacity: 0,\n ease: \"power4.out\",\n duration: componentSettings.opacityDuration,\n // onStart: () => {\n // if(props.heroTl){\n // props.heroTl.play()\n // }\n // },\n },\n `<${componentSettings.opacityOutOffset}`\n )\n .to(animEl.current, {\n pointerEvents: \"none\", // pointerEvents: 'none'\n opacity: 0,\n scale: 1,\n })\n }, [])\n\n return (\n <div ref={animEl} className='card' id={props.id ? props.id : null}>\n {props.children}\n </div>\n )\n}\n\nSampleComponent.propTypes = {\n id: PropTypes.string,\n children: PropTypes.element.isRequired,\n tl: PropTypes.object.isRequired,\n // onComplete: PropTypes.func,\n}\n\nexport default SampleComponent\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\nimport { FaCircle } from \"react-icons/fa\"\n\nconst SampleYear = (props) => {\n return (\n <div\n style={{ width: `${props.width}%` }}\n className={`progress-year ${props.active ? 'progress-year--active' : null}`}\n onClick={() => props.scrubTo(props.year)}\n >\n {props.active && <div className=\"progress-year--active__indicator\"><FaCircle width='100%' height='100%' /></div>}\n <div className=\"progress-year__year\">{props.year}</div>\n </div>\n )\n}\n\nSampleYear.propTypes = {\n width: PropTypes.number,\n year: PropTypes.string,\n}\n\nexport default SampleYear\n","import React, { useEffect, useRef } from \"react\"\nimport { gsap } from \"gsap\"\nimport { IoIosArrowBack, IoIosArrowForward } from \"react-icons/io\"\nimport PropTypes from \"prop-types\"\n\nimport {\n animationSettings,\n progressSettings,\n totalCycle,\n years,\n} from \"../../../services/timelineService\"\n\n\nimport SampleYear from \"./SampleYear\"\nconst Progress = (props) => {\n const progressRef = useRef(null)\n\n let { scrubTo, sampleData } = props\n useEffect(() => {\n console.log(\n 'from width: ',(window.innerWidth / years.length) * props.currentSegment,' to width: ',(window.innerWidth / years.length) * (props.currentSegment + 1), ' duration: ',parseFloat(sampleData.years[years[props.currentSegment]].heroVideo.duration)\n )\n gsap.fromTo(\n progressRef.current,\n {\n width: `${(window.innerWidth / years.length) * props.currentSegment}px`, //+ // do this as a % instead of px\n // window.innerWidth / years.length / 2, //# segments + 1/2 segment\n },\n {\n width: `${(window.innerWidth / years.length) * (props.currentSegment + 1)}px`, // +\n // window.innerWidth / years.length / 2,\n duration:\n parseFloat(sampleData.years[years[props.currentSegment]].heroVideo.duration), //+\n // totalCycle(),\n ease: \"none\",\n }\n )\n }, [props.currentSegment])\n\n const yearList = years.map((ea, i) => {\n return (\n <SampleYear\n key={`year-${ea}-${i}`}\n width={100 / years.length}\n year={ea}\n animationSettings={animationSettings}\n scrubTo={scrubTo}\n active={ea === years[props.currentSegment]}\n />\n )\n })\n\n return (\n <>\n <div id='progress-bar__indicator' ref={progressRef}></div>\n <div id='progress-year-container'>\n {yearList}\n </div>\n </>\n )\n}\n\nProgress.propTypes = {\n progressTl: PropTypes.object,\n scrubTo: PropTypes.func,\n sampleData: PropTypes.object,\n currentSegment: PropTypes.number,\n}\n\nexport default Progress\n","import React, { useRef, useEffect, useState } from \"react\"\nimport { Redirect } from \"react-router-dom\"\nimport ReactPlayerLoader from \"@brightcove/react-player-loader\"\nimport gsap from \"gsap/gsap-core\"\nimport PropTypes from \"prop-types\"\n\nimport {\n years,\n componentSettings,\n totalCycle,\n} from \"../../services/timelineService\"\n\nconst sampleData = require(\"../../fixtures/content.json\")\nfunction HeroVideo(props) {\n const [redirectSearch, setRedirectSearch] = useState(false)\n const heroRef = useRef(null)\n let nextCue = 0\n const isMobile = navigator.userAgent.toLowerCase().match(/mobile/i)\n\n useEffect(() => {\n if (props.bookend) {\n props.heroTl.play()\n }\n })\n /**\n * Intro and close videos use the Brightcove player\n * No subcomponents, no PIP animation - just play, maybe fullscreen?\n */\n\n /**\n * pause video when tab loses focus:\n * window.addEventListener('blur', () => pauseVideo())\n *\n * play it again when it comes back\n * window.addEventListener('focus', () => playVideo())\n */\n\n /**\n * Generates supporting content components for hero video to be animated\n * @param {array} cards Array of objects detailing items to animate\n * @return {array} Returns array of React components\n */\n const generateSubcomponents = (cards) => {\n return cards.map((ea, i) => {\n return (\n <div\n // key={`subcomponent-${years[props.currentSegment]}-${props.currentSegment}-${i}-${ea.src}`}\n key={`subcomponent-${years[props.currentSegment]}-${i}`}\n className={`card subcomponent subcomponent-${years[props.currentSegment]}-${i}`}\n >\n <img\n src={`${process.env.PUBLIC_URL}${ea.src}`}\n alt={`${ea.alt} - ${ea.attribution}`}\n />\n </div>\n )\n })\n }\n\n /**\n * Generate animation cues paired with animation\n * @param {array} cards Array of card objects to animate\n * @return {array} Returns array of objects including cue time and animation function\n */\n const animationCues = (cards, song) => {\n // build animation/timing objects based on json data\n let contentCues = cards.map((ea, i) => {\n return {\n startTime: ea.start,\n animation: () => {\n // hand this in as a prop\n console.log(\"Animation triggered\")\n // props.subComponentTl // add to the tl instead of building it here\n const subComponentTl = gsap.timeline() // add to the tl instead of building it here\n subComponentTl\n .set(`.subcomponent-${years[props.currentSegment]}-${i}`, {\n opacity: 0,\n scale: 1,\n onComplete: () => console.log(`Set: `, i),\n })\n .to(`.subcomponent-${years[props.currentSegment]}-${i}`, {\n scale: 2,\n opacity: 1,\n ease: \"power1.in\",\n duration: 1,\n onComplete: () => console.log(`Scale: `, i),\n })\n .to(`.subcomponent-${years[props.currentSegment]}-${i}`, {\n scale: 2.25,\n opacity: 0.8,\n ease: \"none\",\n duration: ea.end ? ea.end - ea.start : 15,\n onComplete: () => console.log(`Hold: `, i),\n })\n .to(`.subcomponent-${years[props.currentSegment]}-${i}`, {\n opacity: 0,\n scale: componentSettings.scale,\n ease: \"power1.out\",\n duration: 0.4,\n onComplete: () => console.log(`Out: `, i),\n })\n .to(`.subcomponent-${years[props.currentSegment]}-${i}`, {\n opacity: 0,\n scale: 1,\n })\n },\n }\n })\n contentCues.push({\n startTime: song.startTime,\n animation: () => {\n props.setMusicPlaying(true)\n animateVideoBackCenter(\".hero-video__container\")\n },\n })\n contentCues.push({\n startTime:\n sampleData.years[years[props.currentSegment]].heroVideo.introDuration,\n animation: () => animateVideoPIP(heroRef.current),\n })\n\n contentCues = contentCues.sort((a, b) =>\n parseInt(a.startTime) < parseInt(b.startTime) ? -1 : 1\n )\n console.log(\"contentCues\", contentCues)\n\n return contentCues\n }\n\n /**\n * Set video back to defaults\n * @param {object} identifier class or id string, or Ref object of what to animate\n */\n const cleanUpPlayer = (identifier) => {\n gsap.set(identifier, {\n scale: 0.5,\n opacity: 0,\n pointerEvents: \"none\",\n })\n }\n\n /**\n * Create basic player attributes, cue points, and video end actions\n * @param {object} player Player object built by Brightcove library\n */\n const setupPlayer = (player) => {\n player.controls(isMobile)\n player.playsinline(true)\n const playerWidthMult = 0.5\n player.width(window.innerWidth * playerWidthMult)\n player.height(((window.innerWidth * playerWidthMult) / 16) * 9)\n player.qualityMenu({\n defaultResolution: '720p'\n })\n\n setTimeout(() => {\n if (player.currentTime === 0) {\n player.controls(true)\n }\n }, 1000)\n\n \n let cue = animationCues(\n sampleData.years[years[props.currentSegment]].cards,\n sampleData.years[years[props.currentSegment]].music\n )\n\n player.on(\"timeupdate\", () => {\n // make this your check for when to run animations - this runs ~4x/sec.\n // console.log(player.currentTime())\n\n cue.forEach((ea, i) => {\n if (player.currentTime() === 0) {\n nextCue = 0\n }\n if (player.currentTime() > ea.startTime && nextCue === i) {\n console.log(`Trigger cue ${i}`, ea)\n nextCue++\n console.log(\"Next Cue #\", nextCue)\n return ea.animation()\n }\n })\n })\n\n player.on(\"ended\", () => {\n gsap.to(heroRef.current, {\n onStart: () => {\n props.handleHeroComplete()\n },\n // scale: 8,\n opacity: 0,\n duration: 1,\n onComplete: () => {\n cleanUpPlayer(\".hero-video__container\")\n if (props.bookend && props.currentSegment === 0) {\n props.scrubTo(\"2014\")\n } else if (\n props.bookend &&\n props.currentSegment === years.length - 1\n ) {\n setRedirectSearch(true)\n }\n },\n })\n })\n }\n\n /**\n * Animate the hero video\n * @param {object} tl A timeline object from gsap to add animations to\n * @param {string || object} identifier A class or id string, or a ref object identifying what should be animated\n * @param {object} videoData Imported data about the video to aid in animation, esp. intro and outro durations\n * @param {number} videoDuration Overall duration of the video, from video metadata, to time outro\n * @param {object} player Player object built by Brightcove library\n */\n const animateVideo = (\n tl,\n identifier,\n videoData,\n videoDuration,\n player,\n bookend\n ) => {\n if (bookend) {\n tl.set(identifier, {\n scale: 0.5,\n opacity: 0,\n left: \"50%\",\n top: \"50%\",\n pointerEvents: \"all\",\n }).to(identifier, {\n scale: 1,\n opacity: 1,\n duration: 0.75,\n ease: \"power1.inOut\",\n onComplete: () => {\n props.handleHeroLoad()\n if (!isMobile) {\n player.play()\n }\n },\n })\n } else {\n tl.set(identifier, {\n scale: 0.5,\n opacity: 0,\n left: \"50%\",\n top: \"50%\",\n pointerEvents: \"all\",\n })\n .to(identifier, {\n scale: 1,\n duration: componentSettings.scaleDuration,\n ease: \"power1.inOut\",\n delay: totalCycle() * 1.5,\n })\n .to(\n identifier,\n {\n opacity: 1,\n ease: \"power1.inOut\",\n duration: componentSettings.opacityDuration,\n onStart: () => {\n if (!isMobile) {\n player.play()\n }\n },\n onComplete: () => props.handleHeroLoad(),\n },\n \"<\"\n )\n }\n }\n\n const animateVideoPIP = (identifier) => {\n gsap.to(identifier, {\n scale: 0.5,\n top: \"30%\",\n left: \"85%\",\n duration: 3,\n })\n }\n\n const animateVideoBackCenter = (identifier) => {\n gsap.to(identifier, {\n scale: 1,\n duration: 3,\n left: \"50%\",\n top: \"50%\",\n })\n }\n\n /**\n * Setup player and animate it\n * @param {object} success Success object generated by Brightcove on successful video load\n */\n const onSuccess = (success) => {\n const player = success.ref\n props.setPlayer(player)\n console.log(player)\n player.on(\"loadedmetadata\", () => {\n // video has finished fetching\n console.log(\"video loaded\")\n setupPlayer(player)\n\n // window.addEventListener(\"visibilitychange\", () => {\n // if(window.hidden){\n // gsap.ticker.lagSmoothing(false)\n // } else {\n // gsap.ticker.lagSmoothing(500,33)\n // }\n // })\n\n // window.addEventListener('blur', () => {\n // player.pause()\n // gsap.globalTimeline.pause()\n // }, false);\n // window.addEventListener('focus', () => {\n // player.play()\n // gsap.globalTimeline.play()\n // }, false);\n\n animateVideo(\n props.heroTl,\n \".hero-video__container\",\n sampleData.years[years[props.currentSegment]].heroVideo,\n player.mediainfo.duration,\n player,\n props.bookend\n )\n })\n }\n\n /**\n * Parse link provided by Brightcove to use in player component\n * @param {string} bcLink Link provided by BMC team\n * @return {array} Array of link portions: accountId, videoId, playerId, embedId\n */\n const parseBCLink = (bcLink) => {\n let splitLink = bcLink.split(\"/\")\n return [\n splitLink[3],\n splitLink[5].split(\"=\")[1],\n splitLink[4].split(\"_\")[0],\n splitLink[4].split(\"_\")[1],\n ]\n }\n\n const [accountId, videoId, playerId, embedId] = parseBCLink(\n sampleData.years[years[props.currentSegment]].heroVideo.link\n )\n\n /**\n * Create the player and its supporting content/subcomponents\n * @return {Element} Player and subcomponents\n */\n const generatePlayer = () => {\n return (\n <div className='hero-video__wrapper'>\n <div ref={heroRef} className='hero-video__container'>\n <div className='hero-video__player'>\n <ReactPlayerLoader\n key={`${accountId}-${videoId}-${playerId}-${embedId}`}\n accountId={accountId}\n videoId={videoId}\n playerId={playerId}\n embedId={embedId}\n onSuccess={onSuccess}\n />\n </div>\n </div>\n {generateSubcomponents(\n sampleData.years[years[props.currentSegment]].cards\n )}\n </div>\n )\n }\n\n if (redirectSearch) {\n return <Redirect to={\"/search\"} />\n }\n\n return generatePlayer()\n}\n\nHeroVideo.propTypes = {\n currentSegment: PropTypes.number.isRequired,\n handleHeroComplete: PropTypes.func,\n handleHeroLoad: PropTypes.func,\n heroTl: PropTypes.object.isRequired,\n cleaningUp: PropTypes.bool,\n}\n\nexport default HeroVideo\n","import React, { useEffect, useMemo, useState, useRef } from \"react\"\nimport { gsap } from \"gsap\"\nimport PropTypes from \"prop-types\"\nimport { Link, useLocation } from \"react-router-dom\"\nimport { FaAngleDoubleRight, FaPauseCircle, FaPlayCircle } from \"react-icons/fa\"\n\nimport {\n animationSettings,\n progressSettings,\n totalCycle,\n years,\n} from \"../services/timelineService\"\n\nimport FlyingIn from \"../components/Timeline/FlyingIn\"\nimport Progress from \"../components/Timeline/ProgressBar/Progress\"\nimport Music from \"../components/Music\"\nimport HeroVideo from \"../components/Timeline/HeroVideo\"\nimport List from \"../components/List\"\nimport NavBar from \"../components/NavBar\"\n\nimport FiveYearRibbon from \"../images/ribbons/5year.svg\"\nimport TenYearRibbon from \"../images/ribbons/10year.svg\"\nimport FifteenYearRibbon from \"../images/ribbons/15year.svg\"\nimport TwentyYearRibbon from \"../images/ribbons/20year.svg\"\nimport TwentyfiveYearRibbon from \"../images/ribbons/25year.svg\"\nimport ThirtyYearRibbon from \"../images/ribbons/30year.svg\"\nimport ThirtyfiveYearRibbon from \"../images/ribbons/35year.svg\"\nimport FortyYearRibbon from \"../images/ribbons/40year.svg\"\nimport FortyfiveYearRibbon from \"../images/ribbons/45year.svg\"\n\nconst people = require(\"../fixtures/people.json\")\nconst sampleData = require(\"../fixtures/content.json\")\nconst Timeline = () => {\n const [currentSegment, setCurrentSegment] = useState(0)\n const [musicPlaying, setMusicPlaying] = useState(false)\n const [cleaningUp, setCleaningUp] = useState(false)\n const [vidPlayer, setVidPlayer] = useState({})\n const [vidPlayerPaused, setVidPlayerPaused] = useState(vidPlayer.paused)\n const [showAdvancer, setShowAdvancer] = useState(false)\n const [showControls, setShowControls] = useState(true)\n\n let heroTl = useMemo(() => gsap.timeline().pause(), [])\n let componentTl = useMemo(\n () => gsap.timeline().timeScale(animationSettings.timeScale).pause(),\n []\n )\n\n const setPlayer = (childPlayer) => {\n setVidPlayer(childPlayer)\n }\n\n useEffect(() => {\n gsap.set(\"#content-container\", {\n opacity: 1,\n duration: 1,\n onComplete: () => componentTl.play(),\n })\n }, [currentSegment])\n\n let ribbon = null\n switch ((2020 - 1 - years[currentSegment]).toString()) {\n case \"5\":\n ribbon = FiveYearRibbon\n break\n case \"10\":\n ribbon = TenYearRibbon\n break\n case \"15\":\n ribbon = FifteenYearRibbon\n break\n\n case \"20\":\n ribbon = TwentyYearRibbon\n break\n case \"25\":\n ribbon = TwentyfiveYearRibbon\n break\n case \"30\":\n ribbon = ThirtyYearRibbon\n break\n case \"35\":\n ribbon = ThirtyfiveYearRibbon\n break\n case \"40\":\n ribbon = FortyYearRibbon\n break\n case \"45\":\n ribbon = FortyfiveYearRibbon\n break\n default:\n ribbon = null\n }\n\n /**\n * Build the components on their respective timelines\n * @return {array} Array of components on timeline to render\n */\n const buildTimeline = () => {\n let componentList = []\n\n if (!isNaN(parseInt(years[currentSegment]))) {\n // First the year of hire\n componentList.push(\n <FlyingIn\n key={`component-${years[currentSegment]}-${currentSegment}`}\n tl={componentTl}\n label={years[currentSegment]}\n animationSettings={animationSettings}\n className='card--title-year--anim'\n >\n <h1 className='card--title-year'>{years[currentSegment]}</h1>\n </FlyingIn>\n )\n\n // Then an anniversary card\n componentList.push(\n <FlyingIn\n key={`component-${years[currentSegment]}-${currentSegment}`}\n tl={componentTl}\n label={years[currentSegment]}\n animationSettings={animationSettings}\n className='card--anniversary-year--anim'\n heroTl={heroTl}\n >\n <div className='card--anniversary-year'>\n <div className='card--anniversary-year__ribbon'>\n <img src={ribbon} alt='ribbon' />\n </div>\n <div className='card--anniversary-year__copy'>\n <p>{2020 - years[currentSegment] - 1} Year Service Awards</p>\n </div>\n </div>\n </FlyingIn>\n )\n }\n // Then the CEO Hero Video with supporting content\n componentList.push(\n <HeroVideo\n currentSegment={currentSegment}\n scrubTo={scrubTo}\n handleHeroLoad={handleHeroLoad}\n handleHeroComplete={handleHeroComplete}\n heroTl={heroTl}\n cleaningUp={cleaningUp}\n bookend={isNaN(parseInt(years[currentSegment]))}\n setMusicPlaying={setMusicPlaying}\n setPlayer={setPlayer}\n />\n )\n if (!isNaN(parseInt(years[currentSegment]))) {\n // Then the list of honorees for that year\n const peopleList = people\n .filter(\n (ea) =>\n parseInt(ea.yearsCelebrating) === 2020 - years[currentSegment] - 1\n )\n .sort((a, b) => {\n if (a.lastName > b.lastName) {\n return 1\n } else if (a.lastName < b.lastName) {\n return -1\n } else {\n if (a.firstName > b.firstName) {\n return 1\n } else if (a.firstName < b.firstName) {\n return -1\n } else {\n return 0\n }\n }\n })\n .map((person) => {\n return {\n type: \"ee\",\n value: person,\n }\n })\n componentList.push(\n <List\n list={{ [2020 - years[currentSegment] - 1]: peopleList }}\n currentSegment={currentSegment}\n // className='anniversary-list--anim'\n scrubTo={scrubTo}\n />\n )\n }\n return componentList\n }\n\n /**\n * Fade in the list for that year\n * @param {string || object} identifier class or id string, or ref object to identify list to animate\n */\n const showItem = (identifier) => {\n gsap.to(identifier, {\n opacity: 1,\n duration: 1,\n ease: \"power1.inOut\",\n })\n }\n\n /**\n * Fade out the list for that year\n * @param {string || object} identifier class or id string, or ref object to identify list to animate\n */\n const hideItem = (identifier) => {\n gsap.set(identifier, {\n opacity: 0,\n duration: 0.5,\n })\n }\n\n /**\n * Pause component timeline when Hero video finishes loading\n */\n const handleHeroLoad = () => {\n console.log(\"Hero Loaded\")\n }\n\n /**\n * Bring in the anniversary list when hero video completes and cue the music\n */\n const handleHeroComplete = () => {\n console.log(\"Hero Complete\")\n showItem(\".anniversary-list--anim\")\n setShowControls(false)\n setShowAdvancer(true)\n }\n\n /**\n * Clean up the currently playing timelines and 'jump' to a new segment\n * @param {number} year Year clicked on\n */\n const scrubTo = (year) => {\n console.log(year)\n const segmentIndex = years.findIndex((ea) => ea === year)\n // gsap.globalTimeline.restart()\n gsap.to(\"#content-container\", {\n onStart: () => {\n hideItem(\".anniversary-list--anim\")\n // hideItem(\".hero-video__container\")\n setMusicPlaying(false)\n setShowControls(true)\n setShowAdvancer(false)\n },\n opacity: 0,\n duration: 0.5,\n onComplete: () => {\n // gsap.set(\".hero-video__container\", {\n // scale: 1,\n // opacity: 1,\n // top: \"50%\",\n // left: \"50%\",\n // })\n if (segmentIndex !== currentSegment) {\n setCurrentSegment(segmentIndex)\n } else {\n restartSegment(vidPlayer)\n }\n },\n })\n }\n\n const restartSegment = (vidPlayer) => {\n vidPlayer.currentTime(0)\n vidPlayer.pause()\n gsap.globalTimeline.pause(0, true)\n \n gsap.globalTimeline.play()\n gsap.to(\"#content-container\", {\n opacity: 1,\n duration: 0.5,\n onComplete: () => componentTl.play(),\n })\n gsap.set(\".hero-video__container\", {\n scale: 1,\n opacity: 1,\n top: \"50%\",\n left: \"50%\",\n })\n heroTl.play()\n vidPlayer.play()\n }\n\n return (\n <div className='app-container'>\n <NavBar musicPlaying={musicPlaying} currentSegment={currentSegment} />\n <div id='content-container'>{buildTimeline()}</div>\n <div className='timeline-controls'>\n {Object.values(vidPlayer).length > 0 && showControls ? (\n vidPlayerPaused ? (\n <FaPlayCircle\n onClick={() => {\n gsap.globalTimeline.play()\n vidPlayer.play()\n setVidPlayerPaused(false)\n }}\n />\n ) : (\n <FaPauseCircle\n onClick={() => {\n gsap.globalTimeline.pause()\n vidPlayer.pause()\n setVidPlayerPaused(true)\n }}\n />\n )\n ) : null}\n\n {typeof currentSegment === \"number\" && showAdvancer && (\n <div\n className='anniversary-list__advance'\n onClick={() => {\n scrubTo(years[currentSegment + 1])\n setShowAdvancer(false)\n setShowControls(true)\n }}\n >\n <span>To {years[currentSegment + 1]} {`>`}</span>\n </div>\n )}\n </div>\n\n <div id='progress-bar'>\n <Progress\n currentSegment={currentSegment}\n scrubTo={scrubTo}\n sampleData={sampleData}\n />\n </div>\n </div>\n )\n}\n\nexport default Timeline\n","export default __webpack_public_path__ + \"static/media/serviceAwards.c01c01e9.svg\";","import React, { useEffect, useRef, useState } from \"react\"\nimport { gsap } from \"gsap\"\nimport Confetti from \"react-confetti\"\nimport { Redirect } from \"react-router-dom\"\n\nimport EventLogo from \"../images/serviceAwards.svg\"\nimport { years } from \"../services/timelineService\"\nimport { PropTypes } from \"prop-types\"\nconst sampleData = require(\"../fixtures/content.json\")\nfunction Splash(props) {\n const showInstruction = useRef(false)\n const [shouldRedirectTl, setShouldRedirectTl] = useState(false)\n const [shouldRedirectFind, setShouldRedirectFind] = useState(false)\n const confettiRef = useRef(null)\n\n const horizontal = [\n 0.25 * window.innerWidth,\n -0.25 * window.innerWidth,\n 0.5 * window.innerWidth,\n -0.5 * window.innerWidth,\n 0.75 * window.innerWidth,\n -0.75 * window.innerWidth,\n 1 * window.innerWidth,\n 1 * window.innerWidth,\n 1.25 * window.innerWidth,\n -1.25 * window.innerWidth,\n 1.5 * window.innerWidth,\n -1.5 * window.innerWidth,\n 1.75 * window.innerWidth,\n -1.75 * window.innerWidth,\n 2 * window.innerWidth,\n 2 * window.innerWidth,\n ]\n const vertical = [\n 1.25 * window.innerHeight,\n -1.25 * window.innerHeight,\n 1.5 * window.innerHeight,\n -1.5 * window.innerHeight,\n 1.75 * window.innerHeight,\n -1.75 * window.innerHeight,\n ]\n const yearTl = gsap.timeline({\n repeat: -1,\n })\n useEffect(() => {\n ;[\n ...document.getElementsByClassName(\"splash-container__years__year\"),\n ].forEach((ea) => {\n gsap.set(ea, { opacity: 0, scale: 1 })\n yearTl\n .to(\n ea,\n {\n scale: 8,\n x: horizontal[Math.floor(Math.random() * horizontal.length)],\n y: vertical[Math.floor(Math.random() * vertical.length)],\n duration: 20,\n ease: \"power1.in\",\n },\n \"-=17\"\n )\n .to(\n ea,\n {\n opacity: 0.5,\n delay: 3,\n duration: 17,\n },\n \"<\"\n )\n })\n\n gsap.set(\".splash-container__welcome\", {\n opacity: 0,\n })\n\n if (props.location.state) {\n handleSplashOld()\n } else {\n setTimeout(() => {\n if (!showInstruction.current) {\n handleSplashClick()\n }\n }, 2500)\n }\n // handleSplashOld()\n })\n\n let fadedYears = years\n .filter((ea) => !isNaN(parseInt(ea)))\n .map((ea) => {\n return (\n <div className='splash-container__years__year'>\n <h1>{ea}</h1>\n </div>\n )\n })\n\n const handleSplashOld = () => {\n gsap.set(\".splash-container__logo__wrapper\", {\n y: \"-35%\",\n scale: 0.5,\n })\n gsap.set(confettiRef.current, {\n opacity: 0,\n display: \"none\",\n })\n gsap.set(\n [\".splash-container__welcome\", \".splash-container__welcome__child\"],\n { opacity: 1 }\n )\n showInstruction.current = true\n }\n\n const handleSplashClick = () => {\n gsap.to(\".splash-container__logo__wrapper\", {\n y: \"-35%\",\n scale: 0.5,\n ease: \"power3.inOut\",\n duration: 2,\n })\n gsap.to(confettiRef.current, {\n opacity: 0,\n duration: 2,\n onComplete: () => {\n gsap.set(confettiRef.current, {\n display: \"none\",\n })\n },\n })\n gsap.set(\".splash-container__welcome\", { opacity: 1 })\n gsap.fromTo(\n \".splash-container__welcome__child\",\n { opacity: 0 },\n {\n opacity: 1,\n stagger: 0.3,\n duration: 1,\n delay: 1,\n }\n )\n\n showInstruction.current = true\n }\n\n const clickLink = (location) => {\n gsap.to(\n [\n \".splash-container__logo__wrapper\",\n \".splash-container__welcome\",\n \".splash-container__years\",\n ],\n {\n opacity: 0,\n duration: 0.5,\n onComplete: () => {\n if (location === \"/timeline\") {\n setShouldRedirectTl(true)\n } else if (location === \"/search\") {\n setShouldRedirectFind(true)\n }\n },\n }\n )\n }\n\n if (shouldRedirectTl) {\n return <Redirect to='/timeline' />\n }\n\n if (shouldRedirectFind) {\n return <Redirect to='/search' />\n }\n\n return (\n <>\n <Confetti\n width={window.innerWidth}\n height={window.innerHeight}\n colors={[\"#FFEF64\"]}\n ref={confettiRef}\n />\n <div\n className='splash-container'\n onClick={() => {\n if (props.location.state || showInstruction.current) {\n handleSplashOld()\n } else {\n handleSplashClick()\n }\n }}\n >\n <div className='splash-container__logo__wrapper'>\n <img src={EventLogo} className='splash-container__logo' alt='event logo' />\n </div>\n <div className='splash-container__welcome'>\n <h1 className='splash-container__welcome__child splash-container__welcome__head'>\n {sampleData.welcome.title}\n </h1>\n <p className='splash-container__welcome__child splash-container__welcome__copy'>\n {sampleData.welcome.copy}\n </p>\n <p className='splash-container__welcome__child splash-container__welcome__copy splash-container__welcome__cta'>\n {sampleData.welcome.cta}\n </p>\n <button\n onClick={(e) => {\n e.preventDefault()\n clickLink(\"/timeline\")\n }}\n className='splash-container__welcome__child splash-container__welcome__tl-button splash-container__welcome__link-button'\n >\n Explore the timeline\n </button>\n <button\n onClick={(e) => {\n e.preventDefault()\n clickLink(\"/search\")\n }}\n className='splash-container__welcome__child splash-container__welcome__list-button splash-container__welcome__link-button'\n >\n Find Someone\n </button>\n </div>\n <div className='splash-container__years'>{fadedYears}</div>\n </div>\n </>\n )\n}\n\nSplash.propTypes = {\n location: PropTypes.object.isRequired\n}\n\nexport default Splash\n","var _defs, _g;\n\nvar _excluded = [\"title\", \"titleId\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction Svg5Year(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, _excluded);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: \"233px\",\n height: \"443px\",\n viewBox: \"0 0 233 443\",\n xmlns: \"http://www.w3.org/2000/svg\",\n xmlnsXlink: \"http://www.w3.org/1999/xlink\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title === undefined ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, \"Group 3\") : title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"polygon\", {\n id: \"path-1\",\n points: \"0.0004 0.0004 232.7794 0.0004 232.7794 442.05 0.0004 442.05\"\n }), /*#__PURE__*/React.createElement(\"linearGradient\", {\n x1: \"42.3939549%\",\n y1: \"41.6579861%\",\n x2: \"59.9222405%\",\n y2: \"123.871528%\",\n id: \"linearGradient-3\"\n }, /*#__PURE__*/React.createElement(\"stop\", {\n stopColor: \"#E3C250\",\n offset: \"0%\"\n }), /*#__PURE__*/React.createElement(\"stop\", {\n stopColor: \"#FFF767\",\n offset: \"30.8974016%\"\n }), /*#__PURE__*/React.createElement(\"stop\", {\n stopColor: \"#A58536\",\n offset: \"37.7817399%\"\n }), /*#__PURE__*/React.createElement(\"stop\", {\n stopColor: \"#F0C059\",\n offset: \"100%\"\n })))), _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n id: \"Page-1\",\n stroke: \"none\",\n strokeWidth: 1,\n fill: \"none\",\n fillRule: \"evenodd\"\n }, /*#__PURE__*/React.createElement(\"g\", {\n id: \"Group-3\"\n }, /*#__PURE__*/React.createElement(\"mask\", {\n id: \"mask-2\",\n fill: \"white\"\n }, /*#__PURE__*/React.createElement(\"use\", {\n xlinkHref: \"#path-1\"\n })), /*#__PURE__*/React.createElement(\"g\", {\n id: \"Clip-2\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M133.2944,160.1994 C133.2224,160.6924 133.0904,161.1064 132.8984,161.4434 C132.6814,161.7804 132.3804,162.0384 131.9964,162.2194 C131.6114,162.3984 131.0954,162.4884 130.4454,162.4884 L128.3554,162.4884 L128.3554,154.4844 L130.2664,154.4844 C131.5394,154.4844 132.4044,154.8214 132.8614,155.4944 C133.0784,155.8544 133.2224,156.2814 133.2944,156.7744 C133.3664,157.2664 133.4024,157.8384 133.4024,158.4864 C133.4024,159.1364 133.3664,159.7074 133.2944,160.1994 L133.2944,160.1994 Z M136.3774,162.4174 C136.8464,161.3594 137.0804,160.0734 137.0804,158.5584 C137.0804,153.5354 134.9164,151.0234 130.5904,151.0234 L124.6774,151.0234 L124.6774,176.6944 L128.3554,176.6944 L128.3554,165.7334 L130.5544,165.7334 L133.9804,176.6944 L137.8734,176.6944 L133.9074,164.9764 C135.0844,164.3274 135.9084,163.4744 136.3774,162.4174 L136.3774,162.4174 Z M113.7534,167.7174 L115.5564,158.4144 L115.6284,158.4144 L117.4314,167.7174 L113.7534,167.7174 Z M114.0774,151.0234 L108.3454,176.6944 L112.0234,176.6944 L113.1044,171.1784 L118.1154,171.1784 L119.1974,176.6944 L122.8754,176.6944 L117.1424,151.0234 L114.0774,151.0234 Z M148.3114,151.3114 C147.5544,150.9754 146.7194,150.8064 145.8054,150.8064 C144.7244,150.8064 143.7924,150.9934 143.0114,151.3664 C142.2304,151.7384 141.5874,152.2374 141.0824,152.8624 C140.5534,153.4874 140.1564,154.2324 139.8924,155.0974 C139.6274,155.9634 139.4954,156.8774 139.4954,157.8384 C139.4954,159.4484 139.7664,160.7884 140.3074,161.8574 C140.8484,162.9284 141.9114,163.7874 143.4974,164.4354 L146.1304,165.5174 C146.5864,165.7104 146.9524,165.8904 147.2304,166.0584 C147.5054,166.2264 147.7284,166.4434 147.8974,166.7074 C148.0404,166.9714 148.1374,167.3204 148.1854,167.7534 C148.2324,168.1854 148.2574,168.7384 148.2574,169.4114 C148.2574,169.9884 148.2384,170.5114 148.2034,170.9794 C148.1674,171.4484 148.0534,171.8514 147.8604,172.1874 C147.6684,172.5244 147.3984,172.7824 147.0494,172.9634 C146.7004,173.1424 146.2144,173.2334 145.5894,173.2334 C144.6514,173.2334 143.9844,172.9634 143.5884,172.4224 C143.1914,171.8814 142.9934,171.2744 142.9934,170.6004 L142.9934,169.4474 L139.3154,169.4474 L139.3154,170.8174 C139.3154,171.6824 139.4784,172.4824 139.8024,173.2154 C140.1264,173.9484 140.5654,174.5924 141.1184,175.1434 C141.6714,175.6974 142.3314,176.1304 143.1014,176.4424 C143.8704,176.7544 144.6994,176.9114 145.5894,176.9114 C146.7674,176.9114 147.7644,176.7184 148.5814,176.3344 C149.3984,175.9494 150.0604,175.4214 150.5654,174.7474 C151.0454,174.0984 151.3944,173.3114 151.6104,172.3864 C151.8264,171.4614 151.9354,170.4574 151.9354,169.3754 C151.9354,168.4374 151.8864,167.6024 151.7904,166.8694 C151.6934,166.1364 151.5144,165.4814 151.2494,164.9044 C150.9614,164.3514 150.5654,163.8654 150.0604,163.4444 C149.5554,163.0244 148.8944,162.6574 148.0764,162.3454 L145.2654,161.2264 C144.7834,161.0354 144.4044,160.8434 144.1294,160.6504 C143.8524,160.4584 143.6424,160.2294 143.4974,159.9654 C143.3544,159.7014 143.2644,159.4004 143.2284,159.0634 C143.1914,158.7274 143.1734,158.3064 143.1734,157.8024 C143.1734,157.3694 143.2094,156.9544 143.2814,156.5574 C143.3544,156.1614 143.4854,155.8064 143.6784,155.4944 C143.8704,155.2064 144.1224,154.9664 144.4354,154.7734 C144.7474,154.5814 145.1564,154.4844 145.6614,154.4844 C146.5994,154.4844 147.2664,154.7914 147.6624,155.4044 C148.0594,156.0164 148.2574,156.7444 148.2574,157.5854 L148.2574,158.4144 L151.9354,158.4144 L151.9354,156.6114 C151.9354,155.1224 151.3814,153.8004 150.2754,152.6454 C149.7234,152.0934 149.0684,151.6484 148.3114,151.3114 L148.3114,151.3114 Z M96.6624,176.6944 L107.6234,176.6944 L107.6234,173.0164 L100.3404,173.0164 L100.3404,165.4814 L106.6864,165.4814 L106.6864,162.0204 L100.3404,162.0204 L100.3404,154.4844 L107.6234,154.4844 L107.6234,151.0234 L96.6624,151.0234 L96.6624,176.6944 Z M87.9744,161.2264 L87.9024,161.2264 L84.9454,151.0234 L81.0524,151.0234 L86.1004,165.8424 L86.1004,176.6944 L89.7764,176.6944 L89.7764,165.8424 L94.8244,151.0234 L90.9314,151.0234 L87.9744,161.2264 Z M147.9134,110.2994 C147.9134,100.6484 145.2914,93.1624 140.0474,87.8424 C134.8044,82.5234 127.4324,79.8624 117.9334,79.8624 L116.6794,79.8624 C116.2234,79.8624 115.7284,79.9014 115.1964,79.9764 C114.4374,80.1304 113.8474,80.0194 113.4304,79.6474 C113.0124,79.2744 112.8784,78.7924 113.0314,78.2014 C113.1834,77.6114 113.5444,77.0954 114.1144,76.6514 C114.6844,76.2104 115.3494,75.9874 116.1084,75.9874 L140.5034,75.9874 C141.2624,75.9874 141.9084,75.7204 142.4414,75.1854 C142.9724,74.6514 143.2394,74.0014 143.2394,73.2374 L143.2394,57.5344 C143.2394,56.7724 142.9724,56.1224 142.4414,55.5884 C141.9084,55.0534 141.2624,54.7844 140.5034,54.7844 L97.5284,54.7844 C96.7684,54.7844 96.0834,55.0324 95.4764,55.5254 C94.8674,56.0204 94.4874,56.6474 94.3364,57.4064 L87.3834,94.7964 C87.2304,95.5564 87.3634,96.2974 87.7814,97.0184 C88.1984,97.7414 88.7884,98.2164 89.5494,98.4434 L99.8084,102.4334 C100.4924,102.7374 101.2714,102.8144 102.1454,102.6614 C103.0184,102.5104 103.7594,102.1684 104.3674,101.6354 C105.7354,100.4954 107.2924,99.5264 109.0414,98.7284 C110.7884,97.9304 113.1064,97.6454 115.9954,97.8734 C117.8944,98.0264 119.5284,98.4634 120.8974,99.1844 C122.2654,99.9074 123.3484,100.7624 124.1464,101.7494 C124.9434,102.7374 125.5314,103.8014 125.9124,104.9414 C126.2914,106.0814 126.4824,107.2204 126.4824,108.3604 C126.4824,111.2504 125.4934,113.6434 123.5194,115.5424 C121.5414,117.4424 118.7314,118.3924 115.0834,118.3924 C112.9544,118.3924 111.0174,118.1464 109.2704,117.6514 C107.5214,117.1584 105.9244,116.5314 104.4824,115.7704 C103.0374,115.0114 101.8034,114.2144 100.7764,113.3764 C99.7514,112.5414 98.8964,111.7804 98.2124,111.0964 C97.6034,110.5654 96.9764,110.2814 96.3314,110.2414 C95.6854,110.2044 95.0954,110.4524 94.5654,110.9824 L85.2174,120.9004 C84.6854,121.5094 84.4374,122.1934 84.4764,122.9524 C84.5134,123.7124 84.7984,124.3594 85.3314,124.8894 C87.1544,126.7144 89.1104,128.5194 91.2014,130.3044 C93.2914,132.0914 95.6074,133.6864 98.1554,135.0924 C100.7004,136.4994 103.4934,137.6384 106.5334,138.5124 C109.5724,139.3854 112.9174,139.8224 116.5654,139.8224 C120.5924,139.8224 124.4684,139.1384 128.1924,137.7704 C131.9144,136.4034 135.2214,134.5044 138.1094,132.0714 C141.3014,129.2614 143.7324,125.9724 145.4044,122.2114 C147.0754,118.4494 147.9134,114.4784 147.9134,110.2994 L147.9134,110.2994 Z M157.6004,238.8494 L157.6004,418.3404 L123.4204,395.6894 L122.7504,395.2504 L122.7504,264.0694 L124.6094,262.5004 L153.2204,238.2694 L157.6004,238.8494 Z M110.0294,395.2204 L109.0904,395.8704 L78.0204,417.6104 L78.0204,238.4704 L79.5604,238.2694 L108.1594,262.5004 L110.0294,264.0694 L110.0294,395.2204 Z M116.3904,252.7804 L83.4804,224.9094 L65.2894,227.3194 L65.2894,442.0504 L116.3904,406.3004 L170.3304,442.0504 L170.3304,227.6894 L149.3004,224.9094 L116.3904,252.7804 Z M185.1494,165.5794 L180.0504,167.9794 L178.3994,173.3704 L170.9494,197.7204 L145.7094,194.3804 L140.1194,193.6394 L135.8194,197.2804 L116.3904,213.7294 L96.9594,197.2804 L92.6594,193.6394 L87.0694,194.3804 L61.8304,197.7204 L54.3794,173.3704 L52.7304,167.9794 L47.6294,165.5794 L24.6004,154.7394 L31.4894,130.2394 L33.0204,124.8094 L30.0294,120.0304 L16.5104,98.4604 L35.5504,81.5794 L39.7704,77.8404 L39.8404,72.2004 L40.1294,46.7394 L65.2794,42.8294 L70.8504,41.9704 L73.9594,37.2604 L87.9594,16.0004 L111.2304,26.3094 L116.3904,28.5994 L121.5504,26.3094 L144.8194,16.0004 L158.8304,37.2604 L161.9304,41.9704 L167.5004,42.8294 L192.6494,46.7394 L192.9404,72.2004 L193.0104,77.8404 L197.2204,81.5794 L216.2704,98.4604 L202.7504,120.0304 L199.7604,124.8094 L201.2894,130.2394 L208.1804,154.7394 L185.1494,165.5794 Z M232.7794,96.0904 L205.6704,72.0504 L205.2604,35.8194 L169.4494,30.2604 L149.5204,0.0004 L116.3904,14.6794 L83.2604,0.0004 L63.3304,30.2604 L27.5204,35.8194 L27.1094,72.0504 L0.0004,96.0904 L19.2394,126.7904 L9.4304,161.6704 L42.2094,177.0994 L52.8194,211.7394 L88.7394,207.0004 L116.3904,230.4094 L144.0394,207.0004 L179.9594,211.7394 L190.5694,177.0994 L223.3504,161.6704 L213.5394,126.7904 L232.7794,96.0904 Z\",\n id: \"Fill-1\",\n fill: \"url(#linearGradient-3)\",\n mask: \"url(#mask-2)\"\n })))));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(Svg5Year);\nexport default __webpack_public_path__ + \"static/media/5year.8d9ba7f6.svg\";\nexport { ForwardRef as ReactComponent };","import React, { useEffect, useRef, useState } from \"react\"\nimport { gsap } from \"gsap\"\n\nimport Search from \"./Search\"\nimport Splash from \"./Splash\"\nimport List from \"../components/List\"\nimport HeroVideo from \"../components/Timeline/HeroVideo\"\nimport EmployeeCard from \"../components/EmployeeCard\"\nimport Music from \"../components/Music\"\nimport { ReactComponent as FiveYearRibbon } from \"../images/ribbons/5year.svg\"\n\nimport { years } from \"../services/timelineService\"\n\nconst people = require(\"../fixtures/people.json\")\nfunction Test() {\n // Test vars\n const [testComponent, setTestComponent] = useState(\"List\")\n const testTl = gsap.timeline()\n\n // List vars\n const [currentSegment, setCurrentSegment] = useState(0)\n const animateList = () => {\n gsap.to(\".anniversary-list--anim\", {\n opacity: 1,\n duration: 2,\n ease: \"power1.inOut\",\n })\n }\n\n // HeroVideo Vars\n const handleHeroLoad = () => {\n console.log(\"hero loaded\")\n }\n const handleHeroComplete = () => {\n console.log(\"hero complete\")\n }\n\n // Search Vars\n // const testList = people.sort((a, b) => {\n // if(a.lastName > b.lastName){\n // return 1\n // } else if(a.lastName < b.lastName){\n // return -1\n // } else {\n // if(a.firstName > b.firstName){\n // return 1\n // } else if(a.firstName < b.firstName){\n // return -1\n // } else {\n // return 0\n // }\n // }\n // })\n\n // Employee Card Vars\n\n // Music Vars\n const [musicPlaying, setMusicPlaying] = useState(false)\n\n return (\n <div>\n <button onClick={() => setTestComponent(\"HeroVideo\")}>HeroVideo</button>\n <button\n onClick={() => {\n setTestComponent(\"List\")\n animateList()\n }}\n >\n List\n </button>\n <button onClick={() => setTestComponent(\"Splash\")}>Splash</button>\n <button onClick={() => setTestComponent(\"Search\")}>Search</button>\n <button onClick={() => setTestComponent(\"EmployeeCard\")}>\n EmployeeCard\n </button>\n <button onClick={() => setTestComponent(\"Music\")}>Music</button>\n {/* {testComponent === \"HeroVideo\" && (\n <HeroVideo\n currentSegment={currentSegment}\n handleHeroComplete={handleHeroComplete}\n handleHeroLoad={handleHeroLoad}\n />\n )} */}\n {/* {testComponent === \"List\" && <List list={people}/>}\n {testComponent === \"Splash\" && <Splash />}\n {testComponent === \"Search\" && <Search />}\n {testComponent === \"EmployeeCard\" && <EmployeeCard />}\n {testComponent === \"Music\" && <Music currentSegment={currentSegment} musicPlaying={musicPlaying} setMusicPlaying={setMusicPlaying}/>} */}\n <div className='card' style={{opacity: 1}}>\n <div className='card--anniversary-year'>\n <div className='card--anniversary-year__ribbon'>\n <FiveYearRibbon width='100%' height='100%' />\n </div>\n <div className='card--anniversary-year__copy'>\n <p>{2020 - years[currentSegment] - 1} Year Service Awards</p>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nexport default Test\n","import React from 'react'\nimport {MdScreenRotation} from \"react-icons/md\"\n\nfunction RotateScreen() {\n return (\n <div className=\"rotate__wrapper\">\n <div className=\"rotate__icon\">\n <MdScreenRotation />\n </div>\n <p className=\"rotate__copy\">Please rotate your screen to landscape or view on desktop.</p>\n </div>\n )\n}\n\nexport default RotateScreen\n","import React, { useEffect, useState } from \"react\"\nimport { HashRouter, Route, Switch } from \"react-router-dom\"\nimport smoothscroll from 'smoothscroll-polyfill'\nimport Search from \"./screens/Search\" // can probably move this to App\nimport Timeline from \"./screens/Timeline\"\nimport Splash from \"./screens/Splash\"\nimport Test from \"./screens/Test\"\nimport RotateScreen from \"./screens/RotateScreen\"\nimport Modal from \"./components/Modal\"\n\nsmoothscroll.polyfill()\n\nconst App = (props) => {\n /**\n * Make this your router:\n * - lands on splash screen, scroll to Welcome ('/')\n * - Button links to Search page ('/search')\n * - Button links to Timeline page ('/timeline')\n * - Dynamic route to individual? ('/honoree/:id')\n */\n\n const [showModal, setShowModal] = useState(false)\n\n useEffect(() => {\n if (\n window.innerWidth < window.innerHeight ||\n (window.screen.orientation &&\n window.screen.orientation.type.includes(\"portrait\")) ||\n (window.screen.msOrientation &&\n window.screen.msOrientation.includes(\"portrait\"))\n ) {\n setShowModal(true)\n } else {\n setShowModal(false)\n }\n window.addEventListener(\"resize\", () => {\n if (\n window.innerWidth < window.innerHeight ||\n (window.screen.orientation &&\n window.screen.orientation.type.includes(\"portrait\")) ||\n (window.screen.msOrientation &&\n window.screen.msOrientation.includes(\"portrait\"))\n ) {\n setShowModal(true)\n } else {\n setShowModal(false)\n }\n })\n })\n\n return (\n <>\n <Modal show={showModal} title='Rotate your screen' showConfetti={false}>\n <RotateScreen />\n </Modal>\n <HashRouter>\n <Switch>\n <Route exact path='/' component={Splash} />\n <Route exact path='/timeline' component={Timeline} />\n <Route exact path='/search' component={Search} />\n <Route exact path='/test' component={Test} />\n </Switch>\n </HashRouter>\n </>\n )\n}\n\nexport default App\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === \"localhost\" ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === \"[::1]\" ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n)\n\nexport function register(config) {\n if (process.env.NODE_ENV === \"production\" && \"serviceWorker\" in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href)\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return\n }\n\n window.addEventListener(\"load\", () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config)\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n \"This web app is being served cache-first by a service \" +\n \"worker. To learn more, visit https://bit.ly/CRA-PWA\"\n )\n })\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config)\n }\n })\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing\n if (installingWorker == null) {\n return\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === \"installed\") {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n \"New content is available and will be used when all \" +\n \"tabs for this page are closed. See https://bit.ly/CRA-PWA.\"\n )\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration)\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log(\"Content is cached for offline use.\")\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration)\n }\n }\n }\n }\n }\n })\n .catch((error) => {\n console.error(\"Error during service worker registration:\", error)\n })\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { \"Service-Worker\": \"script\" },\n })\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get(\"content-type\")\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf(\"javascript\") === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister().then(() => {\n window.location.reload()\n })\n })\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config)\n }\n })\n .catch(() => {\n console.log(\n \"No internet connection found. App is running in offline mode.\"\n )\n })\n}\n\nexport function unregister() {\n if (\"serviceWorker\" in navigator) {\n navigator.serviceWorker.ready\n .then((registration) => {\n registration.unregister()\n })\n .catch((error) => {\n console.error(error.message)\n })\n }\n}\n","import 'core-js/stable'\nimport React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport \"./index.scss\"\nimport App from \"./App\"\nimport * as serviceWorker from \"./serviceWorker\"\n\nReactDOM.render(\n <React.StrictMode>\n <App />\n </React.StrictMode>,\n document.getElementById(\"root\")\n)\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister()\n"],"sourceRoot":""}