{"version":3,"file":"static/js/233.c06aba0e.chunk.js","mappings":"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","sources":["components/article/ArticleHeader/ArticleHeader.js","components/article/ArticleTextBlock/ArticleTextBlock.js","components/common/ContentPageLayout/ContentPageLayout.js","webpack://wddse-spa/./src/components/common/ContentPageLayout/ContentPageNav.scss?4dc9","components/common/ContentPageLayout/ContentPageNav.js","components/common/FeaturedContentList/FeaturedContentList.js","webpack://wddse-spa/./src/scss/_variables.scss?aaf3","components/layout/ScrollSpy/ScrollSpy.js","components/navigationalTopic/RelatedDatasetsList/RelatedDatasetsList.js","components/navigationalTopic/RelatedLinks/RelatedLinks.js","components/navigationalTopic/SubTopicHero/SubTopicHero.js","assets/allDatasetsBg.svg","webpack://wddse-spa/./src/components/navigationalTopic/TopicDatasetsCarousel/TopicDatasetsCarousel.scss?cc8f","components/navigationalTopic/TopicDatasetsCarousel/TopicDatasetsCarousel.js","components/pages/NavigationalTopicPage/SubTopicPage.js","components/navigationalTopic/MoreTopicCarousel/MoreTopicCarousel.js","components/navigationalTopic/TopicHero/TopicHero.js","components/navigationalTopic/TopicSubTopicList/TopicSubTopic.js","components/navigationalTopic/TopicSubTopicList/TopicSubTopicList.js","components/pages/NavigationalTopicPage/TopicPage.js","utilities/navigationalTopicApiWrappers.js","components/pages/NavigationalTopicPage/NavigationalTopicContainer.js"],"sourcesContent":["\nimport React from 'react'\nimport PropTypes from 'prop-types'\nimport Text from '../../common/Text/Text'\nimport ComponentShell from '../../common/ComponentShell/ComponentShell'\n\nimport './ArticleHeader.scss'\n\nconst ArticleHeader = ({\n header,\n leftColOffset\n}) => (\n <div className='ArticleHeader'>\n <ComponentShell leftColOffset={leftColOffset}>\n <Text typeFace='02 H2/Black/L' className='ArticleHeader__text'>{header}</Text>\n </ComponentShell>\n </div>\n)\n\nArticleHeader.propTypes = {\n header: PropTypes.string.isRequired,\n leftColOffset: PropTypes.number\n}\n\nArticleHeader.defaultProps = {\n leftColOffset: 0\n}\n\nexport default ArticleHeader\n","\nimport React from 'react'\nimport PropTypes from 'prop-types'\nimport Container from 'react-bootstrap/Container'\nimport Row from 'react-bootstrap/Row'\nimport Col from 'react-bootstrap/Col'\nimport Text from '../../common/Text/Text'\nimport RichTextField from '../../common/RichTextField/RichTextField'\nimport { removeEmptyHtmlElement } from '../../../utilities/displayUtilities'\n\nimport './ArticleTextBlock.scss'\n\nconst ArticleTextBlock = ({\n text,\n footnotes,\n subtitle = '',\n leftColOffset\n}) => (\n <div className='ArticleTextBlock'>\n <Container>\n <Row>\n <Col lg={{ offset: leftColOffset }}>\n {subtitle && subtitle.trim().length > 0 &&\n <Text typeFace='05 H5/Black/Regular/L' className='ArticleTextBlock__subtitle'>{subtitle}</Text>}\n <RichTextField className='ArticleTextBlock__body' content={removeEmptyHtmlElement(text, 'p')} />\n {footnotes && (\n <Text domElement='div' typeFace='Small Text/MedGray'>\n <RichTextField className='ArticleTextBlock__footnotes' content={footnotes} />\n </Text>\n )}\n </Col>\n </Row>\n </Container>\n </div>\n)\n\nArticleTextBlock.propTypes = {\n subtitle: PropTypes.string,\n text: PropTypes.node.isRequired,\n footnotes: PropTypes.string,\n leftColOffset: PropTypes.number\n}\n\nArticleTextBlock.defaultProps = {\n leftColOffset: 0\n}\nexport default ArticleTextBlock\n","import React, { createRef, useMemo } from 'react'\nimport PropTypes from 'prop-types'\nimport cx from 'classnames'\nimport useDisplayContext from '../../../hooks/useDisplayContext'\nimport ScrollSpy from '../../layout/ScrollSpy/ScrollSpy'\n\nimport './ContentPageLayout.scss'\n\nexport const REPOSITION_EVENT = 'ContentPageLayout:reposition'\n\nexport const TETHER_TARGET_CLASSNAME = 'tetherHeaderTarget'\nexport const NAV_CONTAINER_CLASSNAME = 'ContentPageLayout__nav-container'\n\n/**\n * IMPORTANT: number of sections (with unique id's) must be known before rendering this component\n */\n\nclass ContentPageLayout extends React.PureComponent {\n constructor (props) {\n super(props)\n this.state = {\n isSectionsMounted: false,\n currentSectionId: props.sections[0].id,\n isNavStickyTop: false,\n isNavStickyBottom: false,\n contentPageLayoutTotalHeight: 0\n }\n this.tether = null\n this.preRenderSetup()\n }\n\n preRenderSetup () {\n const { sections } = this.props\n\n this.containerRef = { current: null }\n this.navRef = { current: null }\n this.sectionObservers = {}\n this.sectionObservationEntries = new Array(sections.length)\n this.sectionRefs = {}\n\n sections.forEach((section, index) => {\n this.sectionRefs[section.id] = createRef()\n })\n }\n\n componentDidMount () {\n window.addEventListener('scroll', this.listenToScroll)\n document.addEventListener(REPOSITION_EVENT, this.reposition, false)\n }\n\n componentWillUnmount () {\n window.removeEventListener('scroll', this.listenToScroll)\n }\n\n listenToScroll = () => {\n // dynamically change position from absolute to fixed based on where the user is on the page\n if (window.pageYOffset > this.containerRef.current.offsetTop) {\n // hardcoded 100 to account for the bottom margin and padding\n if (this.navRef.current && (window.pageYOffset > (this.containerRef.current.offsetTop + this.containerRef.current.clientHeight) - this.navRef.current.clientHeight - 100)) {\n this.setState({\n isNavStickyTop: false,\n isNavStickyBottom: true\n })\n } else {\n this.setState({\n isNavStickyTop: true,\n isNavStickyBottom: false\n })\n }\n } else {\n this.setState({\n isNavStickyTop: false,\n isNavStickyBottom: false\n })\n }\n }\n\n reposition = (_e) => {\n if (this.tether && this.tether.getTetherInstance()) {\n this.tether.position()\n }\n }\n\n handleSectionsMounted = () => {\n this.setState({\n isSectionsMounted: true\n })\n }\n\n handleSectionsUnmounted = () => {\n document.removeEventListener(REPOSITION_EVENT, this.reposition)\n }\n\n handleSectionActive = (sectionId) => {\n this.setState({ currentSectionId: sectionId })\n }\n\n handleRef = (ref) => {\n this.containerRef.current = ref\n\n this.handleSectionsMounted()\n\n if (ref === null) {\n // logging shows that ref is only null when the component is being unmounted,\n // so we can use this trigger the observer disconnects\n this.handleSectionsUnmounted()\n }\n }\n\n renderSections () {\n const { sections, renderSection, renderNav } = this.props\n\n return (\n <div\n className={cx({\n ContentPageLayout__sections: true,\n withNav: !!(renderNav)\n })}\n >\n {sections.map((section, i) => {\n const rendered = renderSection(section)\n\n // assume we should not render a section if the parent returns null/undefined\n if (!rendered) {\n return null\n } else {\n return (\n <section\n className={section.className}\n style={section.style}\n key={`${section.id}-${i}`}\n id={section.id}\n ref={this.sectionRefs[section.id]}\n >\n {rendered}\n </section>\n )\n }\n })}\n </div>\n )\n }\n\n renderNav = (ref) => {\n const {\n isSectionsMounted,\n currentSectionId\n } = this.state\n\n const {\n sections,\n renderNav\n } = this.props\n if (isSectionsMounted && renderNav) {\n return (\n <div\n className={`${NAV_CONTAINER_CLASSNAME} ${this.state.isNavStickyTop ? 'fixedTop' : ''} ${this.state.isNavStickyBottom ? 'fixedBottom' : ''}`}\n ref={_ref => { this.navRef.current = _ref }}\n >\n {renderNav({\n currentSectionId: currentSectionId,\n sectionRefs: this.sectionRefs,\n sections: sections.map(section => {\n return {\n ...section,\n ref: this.sectionRefs[section.id],\n isCurrentSection: currentSectionId === section.id\n }\n })\n })}\n </div>\n )\n } else {\n return null\n }\n }\n\n render () {\n const {\n className,\n sections\n } = this.props\n\n return (\n <div className={`${cx('ContentPageLayout', className)}`} ref={this.handleRef}>\n <ScrollSpy\n sections={sections}\n onSectionActive={this.handleSectionActive}\n />\n {this.renderNav()}\n {this.renderSections()}\n </div>\n )\n }\n}\n\nContentPageLayout.propTypes = {\n sections: PropTypes.arrayOf(PropTypes.shape({\n id: PropTypes.string.isRequired,\n /* This is used for nav label */\n label: PropTypes.string,\n className: PropTypes.string,\n style: PropTypes.object,\n /* optional string selector instead of generating internal ref */\n selector: PropTypes.string,\n /* since some sections have top padding and some do not, this prop lets the\n ContentPageNav know to how much offset when a section link is clicked */\n scrollTopOffset: PropTypes.number\n })),\n renderNav: PropTypes.func,\n renderSection: PropTypes.func,\n className: PropTypes.string\n}\n\n/**\n * Dispatch event to trigger refreshing the position of nav\n * for any mounted ContentPageLayout components\n */\nfunction dispatchRepositionEvent () {\n const event = new window.CustomEvent(REPOSITION_EVENT)\n document.dispatchEvent(event)\n}\n\nexport default function Enhanced (props) {\n const { sections } = props\n const { windowWidth } = useDisplayContext()\n // detect if sections changed; if so, force re-render (and restart of\n // component lifecycle) by setting a new key\n const key = useMemo(() => {\n return JSON.stringify(sections)\n }, [sections])\n\n return (\n <ContentPageLayout\n {...props}\n key={key}\n windowWidth={windowWidth}\n />\n )\n}\n\nEnhanced.propTypes = {\n sections: PropTypes.array\n}\n\nexport {\n ContentPageLayout,\n dispatchRepositionEvent\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"mobileHeaderHeight\":\"77px\",\"mobileNavHeight\":\"51px\"};","import React, { Component, createRef } from 'react'\nimport ReactDOM from 'react-dom'\nimport get from 'lodash/get'\nimport PropTypes from 'prop-types'\nimport classNames from 'classnames'\nimport Select from 'react-select'\nimport { ReactComponent as ChevronUpIcon } from '../../../assets/fontawesome/solid/chevron-up.svg'\nimport { ReactComponent as ChevronDownIcon } from '../../../assets/fontawesome/solid/chevron-down.svg'\nimport { trackAnchorClick } from '../../../utilities/analyticsEventHelpers'\n\nimport scssVar from './ContentPageNav.scss'\n\nconst mobileHeaderHeight = parseInt(scssVar.mobileHeaderHeight || '77px', 10)\nconst mobileNavHeight = parseInt(scssVar.mobileNavHeight || '51px', 10)\nconst mobileOffset = mobileHeaderHeight + mobileNavHeight\n\nclass ContentPageNav extends Component {\n constructor (props) {\n super(props)\n\n // we expose the constructor in-order\n // to have this happen before render\n this.sectionsWithLinkRefs = props.sections.map(section => {\n const sectionWithLinkRef = {\n ...section,\n aRef: createRef()\n }\n\n return sectionWithLinkRef\n })\n }\n\n componentDidMount () {\n this.inverseActions()\n document.addEventListener('scroll', this.inverseActions)\n }\n\n componentWillUnmount () {\n // this is essential for site performance\n document.removeEventListener('scroll', this.inverseActions)\n }\n\n inverseActions = () => {\n const { inverseRefs } = this.props\n const sectionsWithLinkRefs = this.sectionsWithLinkRefs\n\n const inverseTopBottom = inverseRefs.map((ref) => {\n // default values are super high in case there is no bounding\n // client rect for some reason - this way we will not get a false\n // pos on inverse status\n let top = 99999999999\n let bottom = 99999999999\n\n // using lodash's safe get method to check if the function\n // exists - if the current object does not exist this would\n // cause the page to crash\n if (get(ref, 'current.getBoundingClientRect')) {\n const bounding = ref.current.getBoundingClientRect()\n top = bounding.top\n bottom = bounding.bottom\n }\n\n return {\n top,\n bottom\n }\n })\n\n const linksTopBottom = sectionsWithLinkRefs.map(({ aRef }) => {\n // we do not need to run the check here since we know the\n // elements are already rendered as this function is called\n // within component did mount\n const { top, bottom, height } = aRef.current.getBoundingClientRect()\n return {\n ref: aRef,\n top,\n bottom,\n height\n }\n })\n\n inverseTopBottom.every(({\n top: iTop,\n bottom: iBottom\n }) => {\n let shouldContinue = true\n linksTopBottom.forEach(({\n ref,\n top,\n bottom,\n height\n }) => {\n // ref is not actually a element so we need to find it\n const node = ReactDOM.findDOMNode(ref.current)\n\n if (top + (height / 2) >= iTop && bottom < iBottom) {\n // add will not trigger an error\n // or add class if it already exists\n node.classList.add('is-inverse')\n shouldContinue = false\n } else {\n // remove will not trigger an error\n // if class does not exist\n node.classList.remove('is-inverse')\n }\n })\n return shouldContinue\n })\n }\n\n goTo = (ref, scrollTopOffset = 100) => {\n if (!ref.current) {\n return\n }\n\n const currentScrollTop = window.pageYOffset\n const refNodeTop = ref.current.getBoundingClientRect().top\n\n window.scrollTo({\n top: refNodeTop + currentScrollTop - scrollTopOffset,\n behavior: 'smooth'\n })\n }\n\n handleDropdownChange = ({ value: section }) => {\n const { ref, onClick } = section\n // add in fixed mobile header height to the scroll offset; we can assume\n // dropdown will only be used in mobile\n if (onClick) {\n onClick()\n } else {\n this.goTo(ref, mobileOffset)\n }\n }\n\n render () {\n const { currentSectionId, className } = this.props\n\n const dropdownOpts = []\n let currentValue = {}\n\n this.sectionsWithLinkRefs.forEach(section => {\n dropdownOpts.push({\n label: section.label,\n value: section\n })\n\n if (section.id === currentSectionId) {\n currentValue = {\n label: section.label,\n value: section\n }\n }\n })\n\n return (\n <>\n {/* Mobile */}\n <div className='ContentPageNav__dropdown'>\n <Select\n className='ContentPageNav__dropdown__root'\n label={null}\n value={currentValue}\n options={dropdownOpts}\n classNamePrefix='ContentPageNav__dropdown'\n isSearchable={false}\n isClearable={false}\n components={{ DropdownIndicator }}\n onChange={this.handleDropdownChange}\n />\n </div>\n\n {/* Desktop */}\n <div className={classNames('ContentPageNav', className)}>\n {/* Default Menu */}\n <ul className='ContentPageNav__list'>\n {this.sectionsWithLinkRefs.map(({\n label,\n id,\n ref,\n aRef, // this is applied to a due to padding/margin\n color,\n bold,\n onClick,\n scrollTopOffset\n }, i) => {\n return (\n <li key={i} className={classNames({ 'ContentPageNav__list-item-active': id === currentSectionId })}>\n <a\n ref={aRef}\n href={`#${id}`}\n className={classNames({\n 'ContentPageNav__list-item-link-blue': color === 'blue',\n 'ContentPageNav__list-item-link-bold': bold\n })}\n onClick={(e) => {\n // prevent link action\n e.preventDefault()\n e.stopPropagation()\n trackAnchorClick(label, window.utag)\n if (onClick) {\n onClick()\n } else if (ref) {\n this.goTo(ref, scrollTopOffset)\n }\n }}\n >{label}\n </a>\n </li>\n )\n })}\n </ul>\n </div>\n </>\n )\n }\n}\n\nContentPageNav.propTypes = {\n className: PropTypes.string,\n inverseRefs: PropTypes.array, // array of Ref messes up for some reason\n currentSectionId: PropTypes.string,\n sections: PropTypes.arrayOf(PropTypes.shape({\n id: PropTypes.string,\n label: PropTypes.string,\n ref: PropTypes.object, // DOM node ref\n color: PropTypes.string,\n onClick: PropTypes.func,\n scrollTopOffset: PropTypes.number\n }))\n}\n\nContentPageNav.defaultProps = {\n sections: {},\n inverseRefs: []\n}\n\nfunction DropdownIndicator (props) {\n const { selectProps: { menuIsOpen } } = props\n const className = menuIsOpen ? 'DropdownIndicator isOpen' : 'DropdownIndicator'\n\n return (\n <span className={className}>\n <ChevronUpIcon className='chevron-up' />\n <ChevronDownIcon className='chevron-down' />\n </span>\n )\n}\n\nDropdownIndicator.propTypes = {\n selectProps: PropTypes.shape({\n menuIsOpen: PropTypes.bool\n })\n}\n\nexport default ContentPageNav\n\nconst ContentPageNavLoading = ({ items }) => (\n <div className='ContentPageNavLoading'>\n {Array(items).fill({}).map((v, i) => (\n <div key={i} className='skeleton-box' />\n ))}\n </div>\n)\n\nContentPageNavLoading.propTypes = {\n items: PropTypes.number\n}\n\nContentPageNavLoading.defaultProps = {\n items: 5\n}\n\nexport {\n ContentPageNavLoading\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport Text from '../Text/Text'\nimport ComponentShell from '../ComponentShell/ComponentShell'\nimport config from '../../../config'\nimport LinkHandler from '../../common/LinkHandler/LinkHandler'\nimport cx from 'classnames'\nimport isEmpty from 'lodash/isEmpty'\nimport useDisplayContext from '../../../hooks/useDisplayContext'\nimport placeholderImage1 from '../../../assets/featuredContentPlaceholder1.jpg'\nimport placeholderImage2 from '../../../assets/featuredContentPlaceholder2.jpg'\nimport placeholderImage3 from '../../../assets/featuredContentPlaceholder3.jpg'\nimport { getContactHref } from '../../../utilities/linkHelpers'\nimport './FeaturedContentList.scss'\n\nconst placeholderImages = [placeholderImage1, placeholderImage2, placeholderImage3]\n\nconst { createCaseStudySubjectLine } = config\n\n// additional classes to apply to various Text objects\nconst defaultTextClasses = {\n subheader: null,\n header: null,\n title: null,\n description: null,\n spotlightCard: {\n header: null,\n description: null\n }\n}\n\nconst getCtaLink = (isCaseStudy, data) => {\n const { cta } = data\n const label = cta.label\n const href = isCaseStudy ? getContactHref(cta.url, createCaseStudySubjectLine) : cta.url\n\n return <a href={href} target='_blank' rel='noopener noreferrer'>{label}</a>\n}\n\nconst FeaturedContentList = (props) => {\n const {\n subheader,\n header,\n headerTypeface: passedHeaderTypeFace,\n textClasses: passedTextClasses,\n className,\n leftColOffset,\n featuredContentItems,\n hasDarkBackground,\n isCaseStudy,\n spotlightCard\n } = props\n\n const { isMobile } = useDisplayContext()\n\n // merge class defaults with passed props for full safety\n const textClasses = {\n ...defaultTextClasses,\n ...passedTextClasses\n }\n\n const defaultHeaderTypeFace = isMobile ? '03 H3/Mobile/Black' : '01 H1/Desktop/Black'\n const headerTypeface = passedHeaderTypeFace || defaultHeaderTypeFace\n\n return (\n <div\n className={cx({\n FeaturedContentList: true,\n hasDarkBackground\n }, className)}\n >\n <ComponentShell leftColOffset={leftColOffset}>\n\n {\n subheader &&\n <Text\n className={textClasses.subheader}\n typeFace='Small Text/MedGray'\n >\n {subheader}\n </Text>\n }\n\n <Text\n className={cx('FeaturedContentList__header', textClasses.header)}\n domElement='h2'\n typeFace={headerTypeface}\n >\n {header}\n </Text>\n\n <div className='FeaturedContentList__inner'>\n {featuredContentItems.map((featuredContentItem, i) => {\n const {\n title,\n description,\n link\n } = featuredContentItem\n\n return (\n <div className='FeaturedContentItem' key={i}>\n <div className='FeaturedContentItem_image'>\n <img\n src={link.imgSrc || placeholderImages[i]}\n alt={link.imgAlt}\n />\n </div>\n <Text\n className={cx('FeaturedContentItem_title', textClasses.title)}\n typeFace='06 H3/Black'\n >\n {title}\n </Text>\n <Text\n className={cx('FeaturedContentItem_description', textClasses.description)}\n typeFace='Small Text/Black'\n >\n {description}\n </Text>\n <LinkHandler\n className={cx({\n FeaturedContentItem_link: true,\n hasDarkBackground\n })}\n href={link.url}\n label={link.label}\n />\n </div>\n )\n })}\n {!isEmpty(spotlightCard) &&\n <div\n className={cx({\n FeaturedContentItem: true,\n FeaturedContentItem__spotlight: true,\n hasDarkBackground\n })}\n >\n {/* header */}\n <Text\n className={textClasses.spotlightCard.header}\n typeFace={isMobile ? '03 H3/Mobile/Black' : '03 H3/Black/L'}\n >\n {spotlightCard.header}\n </Text>\n {/* description */}\n <Text\n className={cx('FeaturedContentItem_spotlight-description', textClasses.spotlightCard.description)}\n typeFace='Small Text/Black'\n >\n {spotlightCard.description}\n </Text>\n {/* link for Case Studies */}\n {isCaseStudy &&\n <div className='FeaturedContentItem_link'>\n {getCtaLink(isCaseStudy, spotlightCard)}\n </div>}\n {/* link for all other content types */}\n {!isCaseStudy &&\n <LinkHandler\n className='FeaturedContentItem_link'\n href={spotlightCard.cta.url}\n label={spotlightCard.cta.label}\n noBs\n />}\n </div>}\n </div>\n </ComponentShell>\n </div>\n )\n}\n\nFeaturedContentList.propTypes = {\n subheader: PropTypes.string,\n className: PropTypes.string,\n header: PropTypes.string.isRequired,\n /* allow disparate consumers to specify header styling */\n headerTypeface: PropTypes.string,\n textClasses: PropTypes.shape({\n subheader: PropTypes.string,\n header: PropTypes.string,\n title: PropTypes.string,\n description: PropTypes.string,\n spotlightCard: PropTypes.shape({\n header: PropTypes.string,\n description: PropTypes.string\n })\n }),\n leftColOffset: PropTypes.number,\n featuredContentItems: PropTypes.arrayOf(PropTypes.shape({\n title: PropTypes.string,\n description: PropTypes.string,\n link: PropTypes.shape({\n label: PropTypes.string,\n url: PropTypes.string,\n imgSrc: PropTypes.string,\n imgAlt: PropTypes.string\n })\n })),\n spotlightCard: PropTypes.shape({\n header: PropTypes.string,\n description: PropTypes.string,\n cta: PropTypes.shape({\n label: PropTypes.string,\n url: PropTypes.string\n })\n }),\n hasDarkBackground: PropTypes.bool,\n isCaseStudy: PropTypes.bool\n}\n\nFeaturedContentList.defaultProps = {\n leftColOffset: 0,\n hasDarkBackground: false,\n isCaseStudy: true\n}\n\nexport default FeaturedContentList\n","// extracted by mini-css-extract-plugin\nexport default {};","import React, { useEffect, useCallback, useRef, useMemo } from 'react'\nimport PropTypes from 'prop-types'\nimport useDisplayContext from '../../../hooks/useDisplayContext'\nimport Gumshoe from 'gumshoejs'\nimport uuid from 'uuid'\nimport scssVar from '../../../scss/_variables.scss'\n\nconst mobileHeaderHeight = parseInt((scssVar.mobileHeaderHeight || '77px').split('px')[0], 10)\nconst mobileNavHeight = parseInt((scssVar.mobileNavHeight || '51px').split('px')[0], 10)\nconst desktopOffset = parseInt((scssVar.globalHeaderHeight || '100px').split('px')[0], 10)\n\nconst mobileOffset = mobileHeaderHeight + mobileNavHeight\nconst defaultOptions = {\n // Active classes\n navClass: 'active', // applied to the nav list item\n contentClass: 'active', // applied to the content\n\n // Nested navigation\n nested: false, // if true, add classes to parents of active link\n nestedClass: 'active', // applied to the parent items\n\n // Offset & reflow\n offset: desktopOffset, // how far from the top of the page to activate a content area\n reflow: false, // if true, listen for reflows\n\n // Event support\n events: true // if true, emit custom events\n}\n\nconst ScrollSpy = (props) => {\n const { sections, onSectionActive } = props\n const { isMobile } = useDisplayContext()\n const spyRef = useRef(null)\n const thisId = useRef(uuid())\n const id = useMemo(() => `ScrollSpy-hidden-nav-${thisId.current}`, [])\n\n const eventHandler = useCallback((e) => {\n onSectionActive(e.detail.content.id)\n }, [onSectionActive])\n\n useEffect(() => {\n document.addEventListener('gumshoeActivate', eventHandler)\n\n return () => {\n // destroy reference and unlisten upon unmount\n if (spyRef.current) {\n spyRef.current.destroy()\n }\n document.removeEventListener('gumshoeActivate', eventHandler)\n }\n // eslint-disable-next-line\n }, [])\n\n useEffect(() => {\n if (spyRef.current) {\n // if changing between desktop/mobile, destroy previous instance\n // before instantiating new one\n spyRef.current.destroy()\n }\n\n spyRef.current = new Gumshoe(`#${id} a`, {\n ...defaultOptions,\n // use the plugin's offset option to account for fixed\n // header and nav when in mobile\n offset: isMobile\n ? mobileOffset\n : desktopOffset\n })\n }, [isMobile, id])\n\n // render hidden nav that is used by the gumshoe plugin to detect active section\n return (\n <ul id={id} style={{ display: 'none' }}>\n {sections.map(section => {\n return <li key={section.id}><a href={`#${section.id}`}>{section.id}</a></li>\n })}\n </ul>\n )\n}\n\nScrollSpy.propTypes = {\n /** section objects with unique ids, used for scrollspy selectors */\n sections: PropTypes.arrayOf(PropTypes.shape({ id: PropTypes.string })),\n /** calllback for when section becomes active */\n onSectionActive: PropTypes.func.isRequired\n}\n\nexport default ScrollSpy\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport cx from 'classnames'\nimport dayjs from 'dayjs'\nimport take from 'lodash/take'\nimport config from '../../../config'\nimport Text from '../../common/Text/Text'\nimport DatasetCard from '../../common/Resource/DatasetCard'\nimport ResourceSmallCarousel from '../../common/Resource/ResourceSmallCarousel'\nimport useDisplayContext from '../../../hooks/useDisplayContext'\n\nimport './RelatedDatasetsList.scss'\n\nconst {\n topicRelatedDatasetsDisplayLimit\n} = config\n\nfunction RelatedDatasetsList (props) {\n const {\n datasets,\n subHeading,\n datasetDisplayLimit,\n cardOptions,\n className\n } = props\n const { isMobile } = useDisplayContext()\n\n const datasetsToDisplay = take(datasets, datasetDisplayLimit)\n const renderedResourceCards = datasetsToDisplay.map((dataset, i) => (\n <DatasetCard\n key={i}\n {...cardOptions}\n heading={dataset.heading}\n slug={dataset.slug}\n footer={dataset.date ? dayjs(dataset.date).format('MMMM D, YYYY') : 'N/A'}\n />\n ))\n\n return (\n <div className={cx('RelatedDatasetsList', className)}>\n <Text\n className='RelatedDatasetsList--subheading'\n typeFace='Small Text/MedGray'\n >\n {subHeading}\n </Text>\n {!isMobile && (\n <ul className='RelatedDatasetsList--list'>\n {renderedResourceCards.map((renderedResourceCard, i) => (\n <li key={i}>\n {renderedResourceCard}\n </li>\n ))}\n </ul>\n )}\n {isMobile && (\n <ResourceSmallCarousel\n isDatasetCarousel\n renderedResources={renderedResourceCards}\n />\n )}\n </div>\n )\n}\n\nRelatedDatasetsList.propTypes = {\n datasets: PropTypes.arrayOf(PropTypes.shape({\n heading: PropTypes.string.isRequired,\n slug: PropTypes.string.isRequired,\n date: PropTypes.string\n })),\n subHeading: PropTypes.string,\n datasetDisplayLimit: PropTypes.number,\n cardOptions: PropTypes.shape({\n isDark: PropTypes.bool,\n classes: PropTypes.object\n }),\n className: PropTypes.string\n}\n\nRelatedDatasetsList.defaultProps = {\n datasetDisplayLimit: topicRelatedDatasetsDisplayLimit\n}\n\nexport default RelatedDatasetsList\n","import React, { useState } from 'react'\nimport PropTypes from 'prop-types'\nimport cx from 'classnames'\nimport Collapse from 'react-bootstrap/Collapse'\nimport Text from '../../common/Text/Text'\nimport ComponentShell from '../../common/ComponentShell/ComponentShell'\nimport { ReactComponent as ChevronDownIcon } from '../../../assets/fontawesome/solid/chevron-down.svg'\nimport { ReactComponent as ChevronUpIcon } from '../../../assets/fontawesome/solid/chevron-up.svg'\nimport useDisplayContext from '../../../hooks/useDisplayContext'\nimport LinkHandler from '../../common/LinkHandler/LinkHandler'\n\nimport './RelatedLinks.scss'\n\nconst RelatedLinks = (props) => {\n const {\n header,\n linkGroups,\n leftColOffset,\n isMobile\n } = props\n\n const [expandedGroupIndex, setExpandedGroupIndex] = useState(null)\n\n function renderLinks (links) {\n return links.map(({ name, url }, i) => {\n return (\n <h4 className='RelatedLink__linkGroup-link' key={i}>\n <LinkHandler noBs href={url}>{name}</LinkHandler>\n </h4>\n )\n })\n }\n\n function handleExpandCollapseClick (index) {\n if (!isMobile) {\n return\n }\n\n if (index === expandedGroupIndex) {\n setExpandedGroupIndex(null)\n } else {\n setExpandedGroupIndex(index)\n }\n }\n\n return (\n linkGroups.length ? (\n <div className='RelatedLinks'>\n <ComponentShell leftColOffset={leftColOffset}>\n <Text\n className='RelatedLinks__header'\n typeFace={isMobile ? '02 H2/Mobile/Black' : '02 H2/Black/L'}\n >\n {header}\n </Text>\n <div className='RelatedLinks__linkGroups'>\n {linkGroups.map(({ header: linkGroupHeader, links }, i) => {\n return (\n links.length !== 0 &&\n <div key={i} className='RelatedLink__linkGroup'>\n <div\n className='RelatedLink__linkGroup-header'\n onClick={() => handleExpandCollapseClick(i)}\n >\n <Text\n className='RelatedLink__linkGroup-header-text'\n domElement='h3'\n typeFace='05 H5/Black/Regular/L'\n >\n {linkGroupHeader}\n </Text>\n {isMobile && <ExpandCollapseIcon isOpen={i === expandedGroupIndex} />}\n </div>\n {!isMobile && renderLinks(links)}\n {isMobile && (\n <Collapse in={i === expandedGroupIndex}>\n <div>\n {renderLinks(links)}\n </div>\n </Collapse>\n )}\n </div>\n )\n })}\n </div>\n </ComponentShell>\n </div>\n )\n : null\n )\n}\n\nfunction ExpandCollapseIcon ({ isOpen }) {\n return (\n <span className={cx('RelatedLink__expand-collapse-icon', { isOpen: isOpen })}>\n {isOpen ? <ChevronUpIcon /> : <ChevronDownIcon />}\n </span>\n )\n}\n\nExpandCollapseIcon.propTypes = {\n isOpen: PropTypes.bool\n}\n\nRelatedLinks.propTypes = {\n header: PropTypes.string.isRequired,\n linkGroups: PropTypes.arrayOf(PropTypes.shape({\n header: PropTypes.string,\n links: PropTypes.arrayOf(PropTypes.shape({\n name: PropTypes.string.isRequired,\n url: PropTypes.string.isRequired\n })\n )\n })),\n leftColOffset: PropTypes.number,\n isMobile: PropTypes.bool\n}\n\nRelatedLinks.defaultProps = {\n header: 'Related Datasets',\n links: [],\n leftColOffset: 0\n}\n\nexport { RelatedLinks }\n\nexport default (props) => {\n const { isMobile } = useDisplayContext()\n\n return (\n <RelatedLinks\n {...props}\n isMobile={isMobile}\n />\n )\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport get from 'lodash/get'\nimport ComponentShell from '../../common/ComponentShell/ComponentShell'\nimport Text from '../../common/Text/Text'\nimport LinkHandler from '../../common/LinkHandler/LinkHandler'\nimport CaretLeftRightIcon from '../../icons/CaretLeftRightIcon'\nimport useDisplayContext from '../../../hooks/useDisplayContext'\n\nimport './SubTopicHero.scss'\n\nfunction CrumbGrandparent ({ name = '' }) {\n if (name) {\n return (\n <>\n {name}\n <span className='SubTopicHero__crumb-divider'>/</span>\n </>\n )\n }\n\n return null\n}\n\nfunction CrumbParent ({ name, slug }) {\n return (\n <LinkHandler\n className='SubTopicHero__link'\n href={slug}\n label={name}\n noBs\n />\n )\n}\n\n// build crumb w/link to display consisting of subtopic's parent & grandparent\n// else empty string\nfunction NavCrumb ({ parents }) {\n const { isMobile } = useDisplayContext()\n // these return the normal text for parent(s) but not useful slugs\n const parent = get(parents, '[0]', null)\n const grandparent = parent ? get(parent, 'fieldRefNavigationalCategory.name', null) : null\n // check for slug in alias\n const parentSlug = get(parent, 'path.alias', null)\n\n if (parent) {\n return (\n <span>\n {!isMobile && <CrumbGrandparent name={grandparent} />}\n {isMobile && <CaretLeftRightIcon color='currentColor' direction='left' />}\n {parentSlug ? <CrumbParent name={parent.name} slug={parentSlug} /> : parent.name}\n </span>\n )\n }\n\n return ''\n}\n\nfunction SubTopicHero ({\n heading,\n parents,\n description,\n leftColOffset\n}) {\n return (\n <ComponentShell leftColOffset={leftColOffset}>\n <div className='SubTopicHero'>\n <Text className='SubTopicHero__crumbs' typeFace='Small Text/Black'>\n <NavCrumb parents={parents} />\n </Text>\n <Text className='SubTopicHero__heading' typeFace='00 Display/Black'>\n {heading}\n </Text>\n <p className='SubTopicHero__description'>\n {description}\n </p>\n </div>\n </ComponentShell>\n )\n}\n\nSubTopicHero.propTypes = {\n heading: PropTypes.string.isRequired,\n parents: PropTypes.arrayOf(PropTypes.shape({\n name: PropTypes.string,\n parent: PropTypes.arrayOf(PropTypes.shape({\n name: PropTypes.string\n })),\n path: PropTypes.shape({\n alias: PropTypes.string\n })\n })).isRequired,\n description: PropTypes.string.isRequired,\n leftColOffset: PropTypes.number.isRequired\n}\n\nCrumbParent.propTypes = {\n name: PropTypes.string.isRequired,\n slug: PropTypes.string.isRequired\n}\n\nCrumbGrandparent.propTypes = {\n name: PropTypes.string\n}\n\nNavCrumb.propTypes = {\n parents: PropTypes.array\n}\n\nexport default SubTopicHero\n","var _g;\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); }\nimport * as React from \"react\";\nfunction SvgAllDatasetsBg(_ref, svgRef) {\n let {\n title,\n titleId,\n ...props\n } = _ref;\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 1280,\n height: 1688,\n viewBox: \"0 0 1280 1688\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n fill: \"#C4C2C3\",\n fillRule: \"evenodd\",\n opacity: 0.15\n }, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M456 376a25 25 0 1 1-50 0 25 25 0 0 1 50 0\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M431.5 334.26a41.3 41.3 0 0 0-41.24 41.24 41.3 41.3 0 0 0 41.24 41.24 41.29 41.29 0 0 0 41.24-41.24 41.29 41.29 0 0 0-41.24-41.24m0 87.74a46.55 46.55 0 0 1-46.5-46.5 46.55 46.55 0 0 1 46.5-46.5 46.55 46.55 0 0 1 46.5 46.5 46.55 46.55 0 0 1-46.5 46.5M727 463a32 32 0 1 1-64 0 32 32 0 0 1 64 0M916.73 627.55a31.99 31.99 0 1 1 32.53-55.1 31.99 31.99 0 0 1-32.53 55.1M937.81 983.94a22 22 0 1 1 22.38-37.88 22 22 0 0 1-22.38 37.88M243.73 611.55a32 32 0 1 1 32.54-55.1 32 32 0 0 1-32.54 55.1M551.26 819a57.5 57.5 0 1 1 58.48-99 57.5 57.5 0 0 1-58.48 99\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M581.67 671.22a97.97 97.97 0 0 0-24.4 3.1 96.6 96.6 0 0 0-59.5 44.73 96.58 96.58 0 0 0-10.44 73.68 96.58 96.58 0 0 0 44.72 59.5 96.62 96.62 0 0 0 73.68 10.44 96.6 96.6 0 0 0 59.5-44.72 96.59 96.59 0 0 0 10.44-73.68 96.58 96.58 0 0 0-44.71-59.5 96.67 96.67 0 0 0-49.3-13.55M581.34 871c-18.1 0-35.94-4.83-51.94-14.28a101.8 101.8 0 0 1-47.12-62.69 101.79 101.79 0 0 1 11.01-77.64 101.79 101.79 0 0 1 62.69-47.11c26.5-6.83 54.07-2.91 77.64 11a101.8 101.8 0 0 1 47.12 62.69 101.8 101.8 0 0 1-11.01 77.64 101.79 101.79 0 0 1-62.69 47.12 103.06 103.06 0 0 1-25.7 3.27M80.73 964.55a31.99 31.99 0 1 1 32.53-55.1 31.99 31.99 0 0 1-32.53 55.1M558.73 1326.55a31.99 31.99 0 1 1 32.53-55.1 31.99 31.99 0 0 1-32.53 55.1\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M494.71 720L288 602.27l1.29-2.27L496 717.73zM127.94 931l-.94-2.43L483.06 791l.94 2.43zM676.21 741l-1.21-2.31L907.79 617l1.21 2.31zM928.75 955L670 813.29l1.26-2.29L930 952.71zM575.66 1299l-2.66-.1L590.34 868l2.66.1zM554.6 671L446 414.01l2.4-1.01L557 669.98zM634.46 682l-2.46-.82L693.54 495l2.46.82zM254.88 467.51a22 22 0 1 1-23.76-37.02 22 22 0 0 1 23.76 37.02M-184.55 643.84a98.15 98.15 0 0 0-8.16 23.18 96.98 96.98 0 0 0 13.08 73.21 96.04 96.04 0 0 0 60.74 42.47 95.62 95.62 0 0 0 72.83-13.15A96.55 96.55 0 0 0-3.8 708.48a96.96 96.96 0 0 0-13.08-73.21 96.06 96.06 0 0 0-60.74-42.47 95.61 95.61 0 0 0-72.83 13.15 96.4 96.4 0 0 0-34.1 37.9M-7.33 734a101.62 101.62 0 0 1-35.91 39.93A100.77 100.77 0 0 1-120 787.8a101.2 101.2 0 0 1-64-44.75 102.2 102.2 0 0 1-13.8-77.14 101.73 101.73 0 0 1 44.53-64.34 100.75 100.75 0 0 1 76.73-13.86 101.21 101.21 0 0 1 64 44.76 102.19 102.19 0 0 1 13.8 77.14A103.26 103.26 0 0 1-7.34 734M388.28 958.93a32 32 0 1 1-34.56-53.87 32 32 0 0 1 34.56 53.87\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M225 461.13L-17.52 627l-1.48-2.13L223.52 459zM373 931.72l-1.26 2.28L-5 725.28l1.26-2.28zM902.03 1143.86a18 18 0 1 1 15.94 32.28 18 18 0 0 1-15.94-32.28M1187.2 954.19c23.45-11.5 51.83-1.94 63.4 21.36a46.93 46.93 0 0 1-21.48 63.03c-23.44 11.5-51.82 1.94-63.4-21.36a46.93 46.93 0 0 1 21.49-63.03\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M1274.68 1039.73a79.35 79.35 0 0 0 8.78-17.98c6.81-20 5.39-41.43-4.01-60.36a78.83 78.83 0 0 0-45.77-39.85 79.4 79.4 0 0 0-60.71 3.99 78.67 78.67 0 0 0-40.1 45.49 78.1 78.1 0 0 0 4.01 60.35 78.84 78.84 0 0 0 45.77 39.86 79.38 79.38 0 0 0 60.7-3.99 78.92 78.92 0 0 0 31.33-27.5m-136.6-89.03a83.11 83.11 0 0 1 33-28.99 83.67 83.67 0 0 1 63.97-4.2 83.06 83.06 0 0 1 48.22 42 82.29 82.29 0 0 1 4.23 63.6 82.88 82.88 0 0 1-42.25 47.93 83.68 83.68 0 0 1-63.97 4.2 83.06 83.06 0 0 1-48.22-42 82.29 82.29 0 0 1-4.23-63.6 83.51 83.51 0 0 1 9.25-18.94M839.5 732.7a26 26 0 1 1 23.01 46.6 26 26 0 0 1-23.02-46.6\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M1299.91 616l2.09.44L1237.09 920l-2.09-.44zM927 1150.13L1139 1037l1 1.87L928 1152zM849 757.73l1.23-1.73L1136 959.27l-1.23 1.73zM696.8 1361.23a18 18 0 1 1 26.4-24.46 18 18 0 0 1-26.4 24.46M434.04 1143.25a46.86 46.86 0 0 1 2.56-66.5 47.53 47.53 0 0 1 66.9 2.55 46.86 46.86 0 0 1-2.57 66.5 47.53 47.53 0 0 1-66.89-2.55\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M491.64 1035.56a80.45 80.45 0 0 0-19.84-3.25 79.24 79.24 0 0 0-57.06 21 78.31 78.31 0 0 0-25.41 54.94 78.23 78.23 0 0 0 21.12 56.73 79.19 79.19 0 0 0 55.28 25.26 79.24 79.24 0 0 0 57.06-20.99 78.32 78.32 0 0 0 25.42-54.96 78.25 78.25 0 0 0-21.12-56.72 79.1 79.1 0 0 0-35.45-22.01m-46.98 155.5a83.38 83.38 0 0 1-37.35-23.2 82.45 82.45 0 0 1-22.25-59.77 82.52 82.52 0 0 1 26.78-57.9 83.52 83.52 0 0 1 60.13-22.12 83.43 83.43 0 0 1 58.25 26.62 82.44 82.44 0 0 1 22.25 59.77 82.54 82.54 0 0 1-26.78 57.9 83.49 83.49 0 0 1-60.12 22.12 84.73 84.73 0 0 1-20.91-3.42M33.93 1146.67a26 26 0 1 1 38.15-35.34 26 26 0 0 1-38.15 35.34M321.93 1540.67a26 26 0 1 1 38.15-35.34 26 26 0 0 1-38.15 35.34\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M78.16 1131l-.16-2.14L387.83 1104l.17 2.15zM696.49 1336L528 1165.49l1.51-1.49L698 1334.51zM342 1522l-2-.69L453 1190l2 .68zM927.55 370.4a18 18 0 1 1-29.1 21.2 18 18 0 0 1 29.1-21.2M1162.06 618.1a46.87 46.87 0 0 1-10.4 65.74 47.52 47.52 0 0 1-66.13-10.34 46.88 46.88 0 0 1 10.4-65.74 47.52 47.52 0 0 1 66.13 10.34\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M1092.13 718.33a80.33 80.33 0 0 0 19.32 5.54 79.36 79.36 0 0 0 59.15-14.18 78.45 78.45 0 0 0 31.73-51.62 78.14 78.14 0 0 0-14.27-58.79 79.05 79.05 0 0 0-51.91-31.55 79.33 79.33 0 0 0-59.15 14.19 78.43 78.43 0 0 0-31.73 51.6 78.15 78.15 0 0 0 14.27 58.8 78.96 78.96 0 0 0 32.6 26m65.02-148.93a83.15 83.15 0 0 1 34.35 27.4 82.33 82.33 0 0 1 15.04 61.94 82.64 82.64 0 0 1-33.44 54.38 83.6 83.6 0 0 1-62.32 14.95 83.27 83.27 0 0 1-54.7-33.24 82.35 82.35 0 0 1-15.04-61.95 82.65 82.65 0 0 1 33.44-54.38 83.6 83.6 0 0 1 62.32-14.95 84.7 84.7 0 0 1 20.35 5.85M1321.02 236.7a26 26 0 1 1-42.03 30.6 26 26 0 0 1 42.03-30.6\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M1515 670.9l-.08 2.1L1205 661.1l.08-2.1zM923.67 395L1071 583.7l-1.67 1.3L922 396.3zM1298.09 252l1.91.92L1148.9 569l-1.9-.92zM48.7 349.83c25.47-5.86 50.9 9.91 56.8 35.23 5.9 25.32-9.97 50.6-35.44 56.46-25.47 5.86-50.9-9.91-56.8-35.23-5.9-25.32 9.97-50.6 35.44-56.46\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M114.13 453.02a79.75 79.75 0 0 0 12.7-15.5 78.1 78.1 0 0 0 10-59.67 78.53 78.53 0 0 0-35.37-49.22 79.37 79.37 0 0 0-60.01-9.94 78.96 78.96 0 0 0-49.51 35.15 78.11 78.11 0 0 0-10.01 59.67 78.55 78.55 0 0 0 35.37 49.21 79.36 79.36 0 0 0 60.01 9.95 79.16 79.16 0 0 0 36.82-19.65M1.7 335.26a83.45 83.45 0 0 1 38.8-20.7 83.64 83.64 0 0 1 63.23 10.47 82.71 82.71 0 0 1 37.26 51.87c5.05 21.66 1.3 44-10.54 62.86a83.2 83.2 0 0 1-52.17 37.04 83.63 83.63 0 0 1-63.23-10.48 82.75 82.75 0 0 1-37.27-51.86 82.32 82.32 0 0 1 10.55-62.86 83.94 83.94 0 0 1 13.37-16.34M244.14.68a26 26 0 1 1 11.72 50.65A26 26 0 0 1 244.14.68\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M234.09 47l1.91.91L103.91 329l-1.91-.91zM1194.41 1237.67a18 18 0 1 1-6.83-35.34 18 18 0 0 1 6.83 35.34M869.55 1345.24c-25.67 4.92-50.5-11.77-55.45-37.28-4.96-25.52 11.83-50.2 37.5-55.13 25.66-4.93 50.5 11.76 55.45 37.28 4.96 25.52-11.83 50.2-37.5 55.13\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M807.97 1239.74a79.68 79.68 0 0 0-13.25 15.03 78.13 78.13 0 0 0-12.2 59.25 78.48 78.48 0 0 0 33.52 50.48 79.36 79.36 0 0 0 59.61 12.12 79.01 79.01 0 0 0 50.78-33.32 78.13 78.13 0 0 0 12.2-59.26 78.49 78.49 0 0 0-33.53-50.47 79.35 79.35 0 0 0-59.6-12.13 79.21 79.21 0 0 0-37.53 18.3M916 1361.5a83.46 83.46 0 0 1-39.54 19.28 83.62 83.62 0 0 1-62.8-12.78 82.7 82.7 0 0 1-35.33-53.18 82.33 82.33 0 0 1 12.85-62.44 83.23 83.23 0 0 1 53.5-35.11 83.64 83.64 0 0 1 62.82 12.77 82.7 82.7 0 0 1 35.32 53.19 82.32 82.32 0 0 1-12.86 62.44A83.86 83.86 0 0 1 916 1361.5M661.93 1687.52a26 26 0 1 1-9.86-51.04 26 26 0 0 1 9.86 51.04M1146.93 1651.52a26 26 0 1 1-9.86-51.05 26 26 0 0 1 9.86 51.05\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M673.88 1641l-1.88-.97L814.12 1365l1.88.97zM1174 1225.07L940.47 1278l-.47-2.07 233.53-52.93zM1144 1624.66l-1.64 1.34L921 1355.34l1.64-1.34z\"\n }))));\n}\nconst ForwardRef = /*#__PURE__*/React.forwardRef(SvgAllDatasetsBg);\nexport default __webpack_public_path__ + \"static/media/allDatasetsBg.92969c5404668ae4f8ade75ed2d4c21a.svg\";\nexport { ForwardRef as ReactComponent };","// extracted by mini-css-extract-plugin\nexport default {\"topicDatasetsCarouselCellMarginDesktop\":\"19px\",\"topicDatasetsCarouselCellMarginMobile\":\"24px\",\"datasetCardWidthDesktop\":\"246px\",\"datasetCardWidthMobile\":\"222px\",\"datasetCardHeightDesktop\":\"328px\",\"datasetCardHeightMobile\":\"274px\"};","import React, { forwardRef } from 'react'\nimport cx from 'classnames'\nimport PropTypes from 'prop-types'\nimport Container from 'react-bootstrap/Container'\nimport Row from 'react-bootstrap/Row'\nimport Col from 'react-bootstrap/Col'\nimport chunk from 'lodash/chunk'\nimport dayjs from 'dayjs'\n\nimport {\n CarouselProvider,\n Slider,\n Slide,\n ButtonBack,\n ButtonNext,\n DotGroup,\n WithStore\n} from 'pure-react-carousel'\nimport SelectMaterialUi from 'react-select-material-ui'\nimport Text from '../../common/Text/Text'\nimport CarouselArrow from '../../icons/CarouselArrow'\nimport DatasetCard from '../../common/Resource/DatasetCard'\nimport useDisplayContext from '../../../hooks/useDisplayContext'\n\nimport allDatasetsBg from '../../../assets/allDatasetsBg.svg'\n\nimport scssVar from './TopicDatasetsCarousel.scss'\n\nconst datasetCardWidthDesktop = parseInt(scssVar.datasetCardWidthDesktop || '251px', 10)\nconst datasetCardWidthMobile = parseInt(scssVar.datasetCardWidthMobile || '222px', 10)\nconst datasetCardHeightDesktop = parseInt(scssVar.datasetCardHeightDesktop || '328px', 10)\nconst datasetCardHeightMobile = parseInt(scssVar.datasetCardHeightMobile || '274px', 10)\nconst topicDatasetsCarouselCellMarginDesktop = parseInt(scssVar.topicDatasetsCarouselCellMarginDesktop || '24px', 10)\nconst topicDatasetsCarouselCellMarginMobile = parseInt(scssVar.topicDatasetsCarouselCellMarginMobile || '24px', 10)\n\nconst SelectProps = {\n classNamePrefix: 'TopicDatasetsCarousel__header-filters-select',\n isSearchable: false,\n isClearable: false\n}\n\nexport const TopicDatasetsCarouselItemLoading = () => (\n <div className='TopicDatasetsCarouselItemLoading'>\n <div className='TopicDatasetsCarouselItemLoading__inner'>\n <div className='TopicDatasetsCarouselItemLoading__headings'>\n <div className='TopicDatasetsCarouselItemLoading__heading skeleton-box skeleton-box-inverse' />\n <div className='TopicDatasetsCarouselItemLoading__heading skeleton-box skeleton-box-inverse' />\n </div>\n <div className='TopicDatasetsCarouselItemLoading__date skeleton-box skeleton-box-inverse' />\n </div>\n </div>\n)\n\nconst TopicDatasetsCarousel = forwardRef((props, ref) => {\n const {\n loading,\n activeFilter,\n activeSort,\n datasets,\n filters,\n onFilterChange,\n onSortChange,\n sorts\n } = props\n const {\n isMobile = false,\n windowWidth = 1280\n } = useDisplayContext()\n\n const topicDatasetsCarouselCellWidth = isMobile\n ? datasetCardWidthMobile + topicDatasetsCarouselCellMarginMobile\n : datasetCardWidthDesktop + topicDatasetsCarouselCellMarginDesktop\n\n const topicDatasetsCarouselCellHeight = isMobile\n ? datasetCardHeightMobile + topicDatasetsCarouselCellMarginMobile\n : datasetCardHeightDesktop + topicDatasetsCarouselCellMarginDesktop\n\n // describes number of x-axis cells per slide; desktop is hardcoded at 4\n const datasetSlideRowSize = isMobile ? Math.floor(windowWidth / topicDatasetsCarouselCellWidth) : 4\n // describes number of y-axis cells per slide\n const datasetSlideColSize = 2\n\n // this is the width/height used for the 'naturalWidth'/'natrualHeight' prop for aspect ratio;\n // desktop ratio is always 2:1 width:height, mobile is dynamic\n const widthPerSlide = isMobile ? datasetSlideRowSize * topicDatasetsCarouselCellWidth : 2\n const heightPerSlide = isMobile ? topicDatasetsCarouselCellHeight * datasetSlideColSize : 1\n\n // each chunk should fill the grid, so multiply rowSize x colSize to obtain chunk size\n const datasetSlideChunkSize = datasetSlideRowSize * datasetSlideColSize\n const slides = loading ? [Array(datasetSlideChunkSize).fill({})] : chunk(datasets, datasetSlideChunkSize)\n\n const sliderStyle = isMobile ? { width: `${widthPerSlide}px` } : {}\n const slideStyle = isMobile ? { width: `${widthPerSlide}px`, height: `${heightPerSlide}px` } : {}\n\n // one default filter exists; if no more filters exist then don't display\n const isFilterByVisible = filters.length > 1\n\n return (\n <div\n ref={ref}\n className='TopicDatasetsCarousel'\n style={{ backgroundImage: `url(${allDatasetsBg})` }}\n >\n <CarouselProvider\n naturalSlideWidth={widthPerSlide}\n naturalSlideHeight={heightPerSlide}\n totalSlides={slides.length}\n visibleSlides={1}\n step={1}\n dragEnabled={isMobile}\n >\n <Container>\n <Row>\n <Col>\n {/* Header */}\n <div className='TopicDatasetsCarousel__header'>\n {/* Header Info */}\n <div className='TopicDatasetsCarousel__header-info'>\n <Text\n domElement='h2'\n typeFace={isMobile ? '03 H3/Mobile/White' : '03 H3/Desktop/White'}\n >\n All datasets\n </Text>\n {loading ? (\n <div className='TopicDatasetsCarousel__header-dataset-count-loading skeleton-box skeleton-box-inverse' />\n ) : (\n <Text typeFace='Small Text/White'>({datasets.length} datasets)</Text>\n )}\n </div>\n {/* Filters */}\n <div className='TopicDatasetsCarousel__header-filters'>\n {/* Need the following two hidden labels for hidden dummy input from materia */}\n <label htmlFor='react-select-2-input' className='visually-hidden'>Sort By Hidden Field, do not enter anything here.</label>\n <label htmlFor='react-select-3-input' className='visually-hidden'>Filter By Hidden Field, do not enter anything here.</label>\n {!loading && sorts && onSortChange && (\n <SelectMaterialUi\n className='TopicDatasetsCarousel__header-filters-select sortBy'\n label='Sort by'\n value={activeSort}\n options={sorts}\n SelectProps={SelectProps}\n onChange={onSortChange}\n />\n )}\n {!loading && filters && onFilterChange && isFilterByVisible && (\n <SelectMaterialUi\n className='TopicDatasetsCarousel__header-filters-select filterBy'\n label='Filter by'\n onChange={onFilterChange}\n value={activeFilter}\n options={filters}\n SelectProps={SelectProps}\n />\n )}\n </div>\n </div>\n {/* Fake Slider For Loading */}\n {loading && (\n <div className='TopicDatasetsCarousel__slider'>\n <div className='TopicDatasetsCarousel__slider-slide'>\n <div className='TopicDatasetsCarousel__slider-slide-inner'>\n {slides[0].map((dataset, i) => (\n <TopicDatasetsCarouselItemLoading key={i} />\n ))}\n </div>\n </div>\n </div>\n )}\n {/* Real Slider */}\n {!loading && (\n <Slider\n className='TopicDatasetsCarousel__slider'\n classNameTray='TopicDatasetsCarousel__slider-tray'\n style={sliderStyle}\n >\n {slides.map((datasets, i) => (\n <Slide\n className='TopicDatasetsCarousel__slider-slide'\n innerClassName='TopicDatasetsCarousel__slider-slide-inner'\n key={i}\n index={i}\n style={slideStyle}\n >\n {datasets.map((dataset, i) => (\n <DatasetCard\n key={i}\n heading={dataset.heading}\n footer={dayjs(dataset.date).format('MMM D, YYYY')}\n slug={dataset.slug}\n classes={{\n container: cx('TopicDatasetsCarousel__DatasetCard', {\n 'last-in-row': (i + 1) % datasetSlideRowSize === 0\n })\n }}\n />\n ))}\n </Slide>\n ))}\n </Slider>\n )}\n {/* Footer */}\n {(loading || slides.length > 1) && (\n <CarouselFooter\n totalSlides={slides.length}\n isMobile={isMobile}\n loading={loading}\n />\n )}\n </Col>\n </Row>\n </Container>\n </CarouselProvider>\n </div>\n )\n})\n\nconst CarouselFooter = WithStore((props) => {\n const {\n loading,\n isMobile,\n currentSlide,\n totalSlides\n } = props\n\n return (\n <div className={`TopicDatasetsCarousel__footer${loading ? ' TopicDatasetsCarousel__footer--is-loading' : ''}`}>\n <ButtonBack className='TopicDatasetsCarousel__footer-btn'>\n <CarouselArrow size='large' direction='left' />\n </ButtonBack>\n {!isMobile && <DotGroup className='TopicDatasetsCarousel__footer-dot-group' />}\n {isMobile && <Text domElement='span' typeFace='Body/18pt/White/L'>{currentSlide + 1} of {totalSlides}</Text>}\n <ButtonNext className='TopicDatasetsCarousel__footer-btn'>\n <CarouselArrow size='large' direction='right' />\n </ButtonNext>\n </div>\n )\n}, state => {\n return {\n currentSlide: state.currentSlide\n }\n})\n\nTopicDatasetsCarousel.propTypes = {\n loading: PropTypes.bool,\n activeFilter: PropTypes.string,\n activeSort: PropTypes.string,\n datasets: PropTypes.array,\n filters: PropTypes.array,\n onFilterChange: PropTypes.func,\n onSortChange: PropTypes.func,\n sorts: PropTypes.array\n}\n\nTopicDatasetsCarousel.defaultProps = {\n datasets: [],\n subTopics: [],\n filters: [],\n loading: false\n}\n\nexport default TopicDatasetsCarousel\n","import React, { useEffect, useRef, useState } from 'react'\nimport PropTypes from 'prop-types'\nimport get from 'lodash/get'\nimport isEmpty from 'lodash/isEmpty'\nimport RelatedLinks from '../../navigationalTopic/RelatedLinks/RelatedLinks'\nimport ContactBanner from '../../common/ContactBanner/ContactBanner'\nimport SubTopicHero from '../../navigationalTopic/SubTopicHero/SubTopicHero'\nimport ArticleHeader from '../../article/ArticleHeader/ArticleHeader'\nimport ArticleTextBlock from '../../article/ArticleTextBlock/ArticleTextBlock'\nimport FeaturedContentList from '../../common/FeaturedContentList/FeaturedContentList'\nimport TopicDatasetsCarousel from '../../navigationalTopic/TopicDatasetsCarousel/TopicDatasetsCarousel'\nimport MetaHead from '../../layout/MetaHead/MetaHead'\nimport Footer from '../../layout/Footer/Footer'\nimport config from '../../../config'\nimport {\n checkPageReferrer,\n scrollToRef,\n sortDatasets\n} from '../../../utilities/topicSubtopicPageHelpers'\n\nimport './SubTopicPage.scss'\n\nconst LEFT_COL_OFFSET = 0\nconst { metaOrganizationName, topicSubtopicSort } = config\n\n// clean data for consumer\nconst buildDatasetList = (datasets) => {\n return datasets.map(dataset => (\n {\n heading: get(dataset, 'name', ''),\n slug: dataset.slug,\n date: dataset.last_updated,\n parent: dataset.topic,\n views: dataset.views\n }\n ))\n}\n\nconst SubTopicPage = ({ data, datasets, siblings, history }) => {\n const [{ activeSort, displayDatasets }, setSortState] = useState({\n activeSort: topicSubtopicSort[0],\n displayDatasets: []\n })\n const datasetCarouselRef = useRef()\n\n // init dataset state on load, formatting dataset data first\n useEffect(() => {\n const formattedDatasets = buildDatasetList(datasets)\n\n setSortState(state => (\n {\n ...state,\n displayDatasets: sortDatasets(state.activeSort, formattedDatasets)\n }\n ))\n }, [datasets])\n\n // scroll to the dataset carousel on load if referred\n // from the Related Dataset section on DatasetDetail page\n useEffect(() => {\n if (datasetCarouselRef.current) {\n checkPageReferrer(history, () => scrollToRef(datasetCarouselRef))\n }\n\n // exhaustive deps rule marks .current expression as unnecessary\n // but removing does not trigger effect\n // eslint-disable-next-line\n }, [datasetCarouselRef.current, history]) \n\n const handleSortChange = (sortType) => {\n setSortState(state => (\n {\n activeSort: sortType,\n displayDatasets: sortDatasets(sortType, state.displayDatasets)\n }\n ))\n }\n\n const {\n pageTitle,\n header,\n relatedLinks: relatedLinksWithoutLinkGroups,\n contact,\n textSections,\n caseStudies,\n caseStudyData,\n metaTags\n } = data\n\n const relatedLinks = {\n ...relatedLinksWithoutLinkGroups,\n linkGroups: siblings\n }\n\n const carouselData = {\n sorts: topicSubtopicSort,\n activeSort,\n datasets: displayDatasets,\n onSortChange: handleSortChange\n }\n\n return (\n <div className='SubTopicPage'>\n <MetaHead metaTags={metaTags}>\n <title>{`${pageTitle}${metaOrganizationName}`}</title>\n </MetaHead>\n\n <SubTopicHero\n {...header}\n leftColOffset={LEFT_COL_OFFSET}\n />\n\n {\n !isEmpty(displayDatasets) &&\n <TopicDatasetsCarousel {...carouselData} ref={datasetCarouselRef} />\n }\n\n {!isEmpty(textSections) &&\n <div className='SubTopicPages__body-sections'>\n {\n textSections.map((section, i) => (\n <div key={i} className='SubTopicPage__component'>\n {/* section header */}\n <ArticleHeader\n header={section.header}\n leftColOffset={LEFT_COL_OFFSET}\n />\n {/* paragraph sections */}\n {!isEmpty(section.paragraphs) &&\n section.paragraphs.map((p, i) => (\n <ArticleTextBlock\n key={i}\n subtitle={p.subtitle && p.subtitle}\n text={!isEmpty(p.text) && p.text}\n footnotes={p.footnotes}\n leftColOffset={LEFT_COL_OFFSET}\n />\n ))}\n </div>\n ))\n }\n </div>}\n\n {!isEmpty(caseStudies) &&\n <div className='SubTopicPage__component caseStudies'>\n <FeaturedContentList\n leftColOffset={LEFT_COL_OFFSET}\n {...caseStudyData}\n />\n </div>}\n\n <div className='SubTopicPage__component relatedLinks'>\n <RelatedLinks\n {...relatedLinks}\n leftColOffset={LEFT_COL_OFFSET}\n />\n </div>\n\n <div className='SubTopicPage__component contact'>\n <ContactBanner\n {...contact}\n leftColOffset={LEFT_COL_OFFSET}\n />\n </div>\n <Footer />\n </div>\n )\n}\n\nSubTopicPage.propTypes = {\n data: PropTypes.object,\n datasets: PropTypes.array,\n siblings: PropTypes.array,\n history: PropTypes.object\n}\n\nexport default SubTopicPage\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport cx from 'classnames'\nimport Container from 'react-bootstrap/Container'\nimport chunk from 'lodash/chunk'\nimport get from 'lodash/get'\nimport { CarouselProvider, Slider, Slide, ButtonBack, ButtonNext } from 'pure-react-carousel'\nimport Text from '../../common/Text/Text'\nimport CarouselArrow from '../../icons/CarouselArrow'\nimport withDisplayContext from '../../../hocs/withDisplayContext/withDisplayContext'\nimport placeholderImage1 from '../../../assets/moreTopicsPlaceholder1.jpg'\nimport placeholderImage2 from '../../../assets/moreTopicsPlaceholder2.jpg'\nimport placeholderImage3 from '../../../assets/moreTopicsPlaceholder3.jpg'\n\nimport './MoreTopicCarousel.scss'\n\nconst placeholderImages = [placeholderImage1, placeholderImage2, placeholderImage3]\n\nconst MoreTopicCarouselCard = ({\n datasetCount,\n countText,\n imageSource,\n name,\n path,\n position,\n isMobile\n}) => {\n const slug = get(path, 'alias', '')\n const imageUrl = imageSource || placeholderImages[position]\n const backgroundImage = `url(${imageUrl})`\n const handleCarouselSelection = (event = null) => {\n if (!event.key || event.key === 'Enter' || event.key === ' ') {\n window.open(slug, '_self')\n }\n }\n return (\n <div className='MoreTopicCarouselCard'>\n <div className='MoreTopicCarouselCard__inner'>\n <div\n className='MoreTopicCarouselCard__heading' tabIndex={0}\n onClick={handleCarouselSelection}\n onKeyPress={handleCarouselSelection}\n aria-label={`Open ${name}`}\n >\n <Text typeFace={isMobile ? '03 H3/Mobile/White' : '03 H3/Desktop/White'}>\n {name}\n </Text>\n <Text\n className='MoreTopicCarouselCard__count'\n typeFace='05 H5/Desktop/Regular/White'\n >\n {datasetCount} {countText}\n </Text>\n </div>\n <div\n className='MoreTopicCarouselCard__bg'\n style={{ backgroundImage }}\n />\n </div>\n </div>\n )\n}\n\nMoreTopicCarouselCard.propTypes = {\n datasetCount: PropTypes.number.isRequired,\n countText: PropTypes.string.isRequired,\n imageSource: PropTypes.string,\n name: PropTypes.string.isRequired,\n path: PropTypes.shape({\n alias: PropTypes.string.isRequired\n }).isRequired,\n position: PropTypes.number.isRequired,\n isMobile: PropTypes.bool.isRequired\n}\n\nMoreTopicCarouselCard.defaultProps = {\n countText: 'Datasets'\n}\n\nconst MoreTopicCarouselCardGroup = ({ slides, countText, isMobile }) => (\n <div className='MoreTopicCarouselCardGroup'>\n {slides.map((slide, i) => (\n <MoreTopicCarouselCard key={i} {...slide} position={i} countText={countText} isMobile={isMobile} />\n ))}\n </div>\n)\n\nMoreTopicCarouselCardGroup.propTypes = {\n slides: PropTypes.array,\n countText: PropTypes.string,\n isMobile: PropTypes.bool.isRequired\n}\n\nMoreTopicCarouselCardGroup.defaultProps = {\n slides: []\n}\n\nfunction MoreTopicCarousel (props) {\n const {\n heading,\n className,\n slides,\n countText,\n currentTopicId,\n isMobile\n } = props\n\n // determine # of slides to show per page\n const determineSlidesPerPage = () => {\n const { isDesktop, isMobile, isTablet } = props\n\n // full desktop\n if (isDesktop && !isTablet) return 3\n // mid range\n if (isTablet && !isMobile) return 2\n // true mobile\n if (isMobile && !isTablet) return 1\n }\n\n const slidesPerPage = determineSlidesPerPage()\n const filteredSlides = slides.filter(slide => slide.id !== currentTopicId && slide.datasetCount > 0)\n const chunkedSlides = chunk(filteredSlides, slidesPerPage)\n\n return (\n <div className={cx('MoreTopicCarousel', className)}>\n <Container>\n <CarouselProvider\n naturalSlideWidth={slidesPerPage}\n naturalSlideHeight={1}\n totalSlides={chunkedSlides.length}\n visibleSlides={1}\n step={1}\n dragEnabled={false}\n >\n <div className='MoreTopicCarousel__header'>\n <Text typeFace={isMobile ? '02 H2/Mobile/White' : '02 H2/White/L'}>\n {heading}\n </Text>\n {chunkedSlides.length > 1 && (\n <div\n className='MoreTopicCarousel__nav-controls' id='MoreTopicCarousel__top-nav'\n >\n <ButtonBack>\n <CarouselArrow size='large' direction='left' />\n </ButtonBack>\n <ButtonNext>\n <CarouselArrow size='large' direction='right' />\n </ButtonNext>\n </div>\n )}\n </div>\n <Slider className='MoreTopicCarousel__slider' trayTag='div'>\n {chunkedSlides.map((slides, i) => (\n <Slide className='MoreTopicCarousel__slide' tag='div' innerClassName='MoreTopicCarousel__slide-inner' index={i} key={i}>\n <MoreTopicCarouselCardGroup\n slides={slides}\n countText={countText}\n isMobile\n />\n </Slide>\n ))}\n </Slider>\n {chunkedSlides.length > 1 && (\n <div\n className='MoreTopicCarousel__nav-controls' id='MoreTopicCarousel__bottom-nav'\n >\n <ButtonBack>\n <CarouselArrow size='large' direction='left' />\n </ButtonBack>\n <ButtonNext>\n <CarouselArrow size='large' direction='right' />\n </ButtonNext>\n </div>\n )}\n </CarouselProvider>\n </Container>\n </div>\n )\n}\n\nMoreTopicCarousel.propTypes = {\n className: PropTypes.string,\n heading: PropTypes.string,\n slides: PropTypes.array,\n countText: PropTypes.string,\n currentTopicId: PropTypes.string,\n isDesktop: PropTypes.bool,\n isMobile: PropTypes.bool,\n isTablet: PropTypes.bool\n}\n\nMoreTopicCarousel.defaultProps = {\n heading: 'More topics',\n slides: []\n}\n\nexport default withDisplayContext(MoreTopicCarousel)\n\nexport { MoreTopicCarousel }\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport Text from '../../common/Text/Text'\nimport useDisplayContext from '../../../hooks/useDisplayContext'\nimport './TopicHero.scss'\n\nconst TopicHero = ({\n imgSrc: imagePath,\n imgAlt,\n heading,\n crumb,\n desc,\n onImageLoad\n}) => {\n const imgSrc = `${imagePath}`\n const { isMobile } = useDisplayContext()\n\n return (\n <div className='TopicHero'>\n <div className='TopicHero__info-container'>\n <Text className='TopicHero__crumb' typeFace='Small Text/Black'>{crumb}</Text>\n <Text className='TopicHero__heading' typeFace={isMobile ? '02 H2/Black/L' : '00 Display/Black'}>{heading}</Text>\n <Text className='TopicHero__desc' typeFace='Body/16pt/Black/L'>{desc}</Text>\n </div>\n <div className='TopicHero__img-container'>\n <img\n alt={imgAlt}\n src={imgSrc}\n id='TopicHero__img'\n onLoad={onImageLoad}\n />\n </div>\n </div>\n )\n}\n\nTopicHero.propTypes = {\n imgSrc: PropTypes.string.isRequired,\n imgAlt: PropTypes.string,\n heading: PropTypes.string.isRequired,\n crumb: PropTypes.string.isRequired,\n desc: PropTypes.string.isRequired,\n onImageLoad: PropTypes.func.isRequired\n}\n\nexport default TopicHero\n","import React, { PureComponent } from 'react'\nimport PropTypes from 'prop-types'\nimport Text from '../../common/Text/Text'\nimport RelatedDatasetsList from '../RelatedDatasetsList/RelatedDatasetsList'\nimport RichTextField from '../../common/RichTextField/RichTextField'\nimport isEmpty from 'lodash/isEmpty'\nimport LinkHandler from '../../common/LinkHandler/LinkHandler'\nimport withDisplayContext from '../../../hocs/withDisplayContext/withDisplayContext'\n\nimport './TopicSubTopic.scss'\n\nclass TopicSubTopic extends PureComponent {\n constructor (props) {\n super(props)\n\n this.state = {\n navRef: null\n }\n }\n\n componentDidMount () {\n const { navRef } = this.props\n\n this.setState({\n navRef\n })\n }\n\n render () {\n const { navRef } = this.state\n const {\n btnText,\n desc,\n heading,\n relatedDatasets,\n slug,\n subHeading,\n isMobile\n } = this.props\n\n return (\n <div className='TopicSubTopic' ref={navRef}>\n {subHeading && (\n <Text className='TopicSubTopic__sub-heading' typeFace='Small Text/MedGray'>{subHeading}</Text>\n )}\n <Text\n className='TopicSubTopic__heading'\n typeFace={isMobile ? '02 H2/Mobile/Black' : '02 H2/Black/L'}\n >\n {heading}\n </Text>\n <RichTextField\n className='TopicSubTopic__desc'\n content={desc}\n />\n {slug && btnText && (\n <LinkHandler\n className='TopicSubTopic__btn'\n href={slug}\n label={btnText}\n variant='primary'\n />\n )}\n {\n !isEmpty(relatedDatasets) &&\n <RelatedDatasetsList\n cardOptions={{\n classes: {\n container: 'TopicSubTopic__DatasetCard'\n }\n }}\n datasets={relatedDatasets}\n subHeading='Featured datasets'\n />\n }\n </div>\n )\n }\n}\n\nTopicSubTopic.propTypes = {\n btnText: PropTypes.string,\n desc: PropTypes.string.isRequired,\n heading: PropTypes.string.isRequired,\n navRef: PropTypes.object,\n relatedDatasets: PropTypes.array,\n subHeading: PropTypes.string,\n slug: PropTypes.string,\n isMobile: PropTypes.bool\n}\n\nTopicSubTopic.defaultProps = {\n btnText: 'Read More',\n relatedDatasets: []\n}\n\nexport default withDisplayContext(TopicSubTopic)\n\nexport { TopicSubTopic }\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport ComponentShell from '../../common/ComponentShell/ComponentShell'\nimport ContentPageLayout from '../../common/ContentPageLayout/ContentPageLayout'\nimport ContentPageNav from '../../common/ContentPageLayout/ContentPageNav'\nimport TopicSubTopic from './TopicSubTopic'\nimport get from 'lodash/get'\nimport isEmpty from 'lodash/isEmpty'\nimport withAllDatasets from '../../../hocs/withAllDatasets/withAllDatasets'\n\nimport './TopicSubTopicList.scss'\n\nfunction buildRelatedDatasets (datasetList = [], allDatasets = []) {\n return datasetList.map(featuredDataset => {\n // BE is missing correct date field 😞\n const foundDataset = allDatasets.find(dataset => dataset.uuid === featuredDataset.id)\n return {\n heading: get(featuredDataset, 'name'),\n slug: get(featuredDataset, 'path.alias'),\n date: get(foundDataset, 'last_updated', '')\n }\n })\n}\n\nconst TopicSubTopicList = (props) => {\n const { sections, allDatasets } = props\n\n function buildSections () {\n return sections.map((section, i) => {\n return {\n id: section.id,\n desc: get(section, 'fieldWysiwygParagraph.value'),\n heading: get(section, 'fieldComponentTitle'),\n label: get(section, 'fieldComponentTitle'),\n relatedDatasets: buildRelatedDatasets(get(section, 'fieldRefFeaturedDatasets'), allDatasets),\n slug: get(section, 'fieldRefSubtopic.path.alias'),\n subHeading: !isEmpty(section.fieldRefSubtopic) ? 'Subtopic' : null\n }\n })\n }\n\n function renderSection (subtopic) {\n return (\n <ComponentShell leftColOffset={3}>\n <TopicSubTopic {...subtopic} />\n </ComponentShell>\n )\n }\n\n function renderNav (navSectionData) {\n const { sections, currentSectionId } = navSectionData\n return (\n <ContentPageNav\n sections={sections}\n currentSectionId={currentSectionId}\n />\n )\n }\n\n const subTopicList = buildSections()\n\n return (\n <div className='TopicPage__subtopic-sections'>\n <ContentPageLayout\n className='TopicPage__ContentPageLayout'\n sections={subTopicList}\n renderNav={e => renderNav(e)}\n renderSection={e => renderSection(e)}\n />\n </div>\n )\n}\n\nTopicSubTopicList.propTypes = {\n sections: PropTypes.arrayOf(PropTypes.shape({\n fieldWysiwygParagraph: PropTypes.shape({\n value: PropTypes.string\n }),\n fieldComponentTitle: PropTypes.string,\n fieldRefFeaturedDatasets: PropTypes.arrayOf(PropTypes.object),\n fieldRefSubtopic: PropTypes.object\n })).isRequired,\n allDatasets: PropTypes.arrayOf(PropTypes.object)\n}\n\nexport { TopicSubTopicList }\n\nexport default withAllDatasets(TopicSubTopicList, { displayName: 'TopicSubTopicList' })\n","import React, { createRef, PureComponent } from 'react'\nimport PropTypes from 'prop-types'\nimport isEmpty from 'lodash/isEmpty'\nimport MoreTopicCarousel from '../../navigationalTopic/MoreTopicCarousel/MoreTopicCarousel'\nimport TopicHero from '../../navigationalTopic/TopicHero/TopicHero'\nimport ContactBanner from '../../common/ContactBanner/ContactBanner'\nimport TopicDatasetsCarousel from '../../navigationalTopic/TopicDatasetsCarousel/TopicDatasetsCarousel'\nimport FeaturedContentList from '../../common/FeaturedContentList/FeaturedContentList'\nimport TopicSubTopicList from '../../navigationalTopic/TopicSubTopicList/TopicSubTopicList'\nimport VisualizationList from '../../common/VisualizationList/VisualizationList'\nimport MetaHead from '../../layout/MetaHead/MetaHead'\nimport Footer from '../../layout/Footer/Footer'\nimport config from '../../../config'\nimport {\n buildCaseStudies,\n buildDatasetLists,\n checkPageReferrer,\n scrollToRef,\n sortDatasets\n} from '../../../utilities/topicSubtopicPageHelpers'\n\nimport './TopicPage.scss'\n\nconst {\n metaOrganizationName,\n topicSubtopicFilters,\n topicSubtopicSort\n} = config\n\nconst DEFAULT_SORT = 'Last updated'\n\nclass TopicPage extends PureComponent {\n state = {\n filters: [...topicSubtopicFilters],\n sorts: [...topicSubtopicSort],\n activeFilter: topicSubtopicFilters[0],\n activeSort: topicSubtopicSort[0],\n allDatasets: [],\n displayDatasets: [],\n loadingTopicDatasets: true,\n allDatasetsSectionRef: createRef()\n }\n\n componentDidMount () {\n const { datasets } = this.props\n\n // check for dataset loaded\n const areDatasetsLoaded = datasets && datasets.length !== 0\n\n if (areDatasetsLoaded) {\n this.initData()\n }\n }\n\n componentDidUpdate (prevProps) {\n const { datasets: oldDatasets } = prevProps\n const { datasets } = this.props\n\n if (oldDatasets !== datasets) {\n this.initData()\n }\n }\n\n // handle basic data setup for children\n initData () {\n const { datasets } = this.props\n const data = buildDatasetLists(datasets)\n\n this.setState({\n loadingTopicDatasets: false,\n allDatasets: data.cleanDatasets,\n displayDatasets: sortDatasets(DEFAULT_SORT, data.cleanDatasets),\n filters: data.filters\n })\n }\n\n // user clicked a new filter, filter then sort the datasets\n handleFilterChange = (filter) => {\n const { allDatasets, filters, activeSort } = this.state\n // handle the 'all' option\n const filteredDatasets = filter === filters[0] ? allDatasets : allDatasets.filter(dataset => dataset.parent === filter)\n const displayDatasets = sortDatasets(activeSort, filteredDatasets)\n\n this.setState({\n activeFilter: filter,\n displayDatasets\n })\n }\n\n /**\n * Callback to register the hero image has loaded\n * page scroll functionality impacted by loading b/c of dynamic height styling\n */\n handleHeroImageLoad = () => {\n const { history } = this.props\n const { allDatasetsSectionRef } = this.state\n\n checkPageReferrer(history, () => scrollToRef(allDatasetsSectionRef))\n }\n\n // user clicked a new sort\n handleSortChange = (sort) => {\n const { displayDatasets } = this.state\n const newDisplayOrder = sortDatasets(sort, displayDatasets)\n\n this.setState({\n activeSort: sort,\n displayDatasets: newDisplayOrder\n })\n }\n\n render () {\n const {\n data,\n siblings\n } = this.props\n const {\n activeFilter,\n activeSort,\n filters,\n sorts,\n loadingTopicDatasets,\n displayDatasets,\n allDatasetsSectionRef\n } = this.state\n\n const {\n pageTitle,\n currentTopicId,\n header: rawHeader,\n visualizationList,\n caseStudies,\n included,\n textSections,\n contact,\n metaTags\n } = data\n\n const datasets = {\n loadingTopicDatasets,\n activeFilter,\n activeSort,\n datasets: displayDatasets,\n filters,\n sorts,\n onFilterChange: this.handleFilterChange,\n onSortChange: this.handleSortChange\n }\n\n const caseStudyData = buildCaseStudies(caseStudies, included)\n\n // decorate API data object with req'd method prop\n const header = {\n ...rawHeader,\n onImageLoad: this.handleHeroImageLoad\n }\n\n return (\n <div className='TopicPage'>\n <MetaHead metaTags={metaTags}>\n <title>{`${pageTitle}${metaOrganizationName}`}</title>\n </MetaHead>\n\n <TopicHero {...header} />\n\n {!isEmpty(displayDatasets) &&\n <div className='TopicPage__component fullWidth'>\n <TopicDatasetsCarousel {...datasets} ref={allDatasetsSectionRef} />\n </div>}\n\n {!isEmpty(visualizationList.visualizations) &&\n <VisualizationList\n {...visualizationList}\n />}\n\n {!isEmpty(textSections) &&\n <TopicSubTopicList sections={textSections} />}\n\n {!isEmpty(caseStudies) &&\n <div className='TopicPage__component fullWidth relatedCaseStudies'>\n <FeaturedContentList\n {...caseStudyData}\n />\n </div>}\n {\n !isEmpty(siblings) &&\n <div className='TopicPage__component fullWidth'>\n <MoreTopicCarousel\n currentTopicId={currentTopicId}\n slides={siblings}\n />\n </div>\n }\n {\n !isEmpty(contact.contactLink) &&\n <div className='TopicPage__component fullWidth'>\n <ContactBanner {...contact} />\n </div>\n }\n <Footer />\n </div>\n )\n }\n}\n\nTopicPage.propTypes = {\n data: PropTypes.object.isRequired,\n siblings: PropTypes.array.isRequired,\n datasets: PropTypes.array.isRequired,\n getUserAgreementStatus: PropTypes.func,\n history: PropTypes.object\n}\n\nexport default TopicPage\n","import groupBy from 'lodash/groupBy'\nimport {\n getDatasetsAssociatedWithTopic,\n getDatasetsAssociatedWithSubtopic,\n getTopicPages,\n getChildTopicsOfCategory,\n getSubtopicData,\n getTopicData,\n getSubtopicsOfTopic\n} from '../services/api'\nimport log from '../log'\n\n/**\n * @typedef {object} NavigationalTopicPageData\n * @property {object} data - main data for topic or subtopic page (structure varies depending on topic/subtopic)\n * @property {object[]} datasets - list datasets associated with the taxonomy topic of subtopic\n * @property {object[]} siblings - list of sibling topic/subtopics (structure varies depending on topic/subtopic)\n */\n\n/**\n * fetchDataForTopicPage\n * This is the data loading function for populating the entire TopicPage. It is composed of a few\n * different API calls; first, it retrieves the core topic page data, then makes a series of parallel calls for:\n * 1) its its topic siblings and its own datasets (including descendant subtopics), then\n * 2) a call for the topic pages its siblings and the datasets of those siblings\n *\n * @param {string} topicUuid - taxonomy topic uuid that is related to the topic page\n * @return {NavigationalTopicPageData}\n */\nexport async function fetchDataForTopicPage (topicUuid) {\n try {\n // retrieve main topic page data\n const data = await getTopicData(topicUuid)\n const { currentTopicId, categoryId } = data\n\n const [\n datasets,\n siblingTopics\n ] = await Promise.all([\n // retrieve datasets pertaining to this particular topic (including its descendant subtopic datasets)\n getDatasetsAssociatedWithTopic(currentTopicId),\n // retrieve sibling topics\n getChildTopicsOfCategory(categoryId, { excludeTopicId: currentTopicId })\n ])\n\n const siblingTopicIds = siblingTopics.map(topic => topic.id)\n\n const [\n topicPages,\n siblingTopicDatasets\n ] = await Promise.all([\n // retrieve sibling topic pages to grab header images for More Topic cards\n getTopicPages(siblingTopicIds),\n // retrieve all associated datasets of the sibling topics (and their subtopic descendants)\n getDatasetsAssociatedWithTopic(siblingTopicIds)\n ])\n\n const datasetCountsByTopic = siblingTopicDatasets.reduce((counts, dataset) => {\n // skip over datasets w/o a current version\n if (!dataset.latest_version_uuid) { return counts }\n\n return {\n ...counts,\n [dataset.topic_uuid]: counts[dataset.topic_uuid]\n ? counts[dataset.topic_uuid] + 1\n : 1\n }\n }, {})\n\n const siblings = topicPages.map(topicPage => ({\n name: topicPage.fieldRefTopic.name,\n path: topicPage.fieldRefTopic.path,\n datasetCount: datasetCountsByTopic[topicPage.fieldRefTopic.id],\n imageSource: topicPage.imageSource\n }))\n\n return {\n data,\n datasets,\n siblings\n }\n } catch (e) {\n log.error('fetchDataForTopicPage error', e)\n throw e\n }\n}\n\n/**\n * fetchDataForSubtopicPage\n * This is the data loading function for populating the entire SubtpicPage. It is composed of a few\n * different API calls; first, it retrieves the core subtopic page data, then makes a series of calls for:\n * 1) its its subtopic siblings and its own datasets (in parallel), then\n * 2) a call for the datasets of those siblings\n *\n * @param {string} subtopicUuid - taxonomy topic (subtopic) uuid that is related to the topic page\n * @return {NavigationalTopicPageData}\n */\nexport async function fetchDataForSubtopicPage (subtopicUuid) {\n try {\n const data = await getSubtopicData(subtopicUuid)\n const { currentTopicId, parentId } = data\n\n const [\n datasets,\n subtopicSiblings\n ] = await Promise.all([\n getDatasetsAssociatedWithSubtopic(currentTopicId),\n getSubtopicsOfTopic(parentId, { excludeTopicId: subtopicUuid })\n ])\n\n const subtopicSiblingIds = subtopicSiblings.map(subtopic => subtopic.id)\n const siblingSubtopicDatasets = await getDatasetsAssociatedWithSubtopic(subtopicSiblingIds)\n const datasetsBySubtopic = groupBy(siblingSubtopicDatasets, dataset => dataset.subtopic_uuid)\n\n const siblings = subtopicSiblings.map(subtopic => {\n return {\n header: subtopic.name,\n links: (datasetsBySubtopic[subtopic.id] || []).reduce((current, dataset) => {\n if (!dataset.latest_version_uuid) { return current }\n return [\n ...current,\n { id: dataset.uuid, name: dataset.name, url: dataset.slug }\n ]\n }, [])\n }\n }).filter(linkGroup => linkGroup.links.length > 0) // ensure empty link groups are removed\n\n return {\n data,\n datasets,\n siblings\n }\n } catch (e) {\n console.error('fetchDataForSubtopicPage error', e)\n throw e\n }\n}\n","import React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport LoadingCover from '../../common/LoadingCover/LoadingCover'\nimport ErrorPage from '../ErrorPage/ErrorPage'\n// for display\nimport SubTopicPage from './SubTopicPage'\nimport TopicPage from './TopicPage'\n// top level error handling, reusable data\nimport compose from '../../../hocs/compose'\nimport withBoundary from '../../../hocs/withBoundary/withBoundary'\nimport {\n fetchDataForTopicPage,\n fetchDataForSubtopicPage\n} from '../../../utilities/navigationalTopicApiWrappers'\n\nclass NavigationalTopicContainer extends Component {\n constructor (props) {\n super(props)\n\n this.state = {\n isLoading: true,\n error: null,\n data: {},\n siblings: [],\n datasets: []\n }\n }\n\n // determine whether at Topic or subtopic based on parent prop\n get hasParent () {\n const {\n slugResolveData: {\n parent_drupal_id: parentId\n }\n } = this.props\n\n return parseInt(parentId) !== 0\n }\n\n async componentDidMount () {\n const {\n slugResolveData: {\n uuid: topicUuid\n }\n } = this.props\n\n const fetchMethod = this.hasParent\n ? fetchDataForSubtopicPage\n : fetchDataForTopicPage\n\n try {\n this.setState({ isLoading: true, error: null })\n\n const { data, datasets, siblings } = await fetchMethod(topicUuid)\n\n this.setState({\n isLoading: false,\n error: null,\n data,\n datasets,\n siblings\n })\n } catch (e) {\n this.setState({ isLoading: false, error: e })\n }\n }\n\n render () {\n const {\n isLoading,\n error,\n data,\n siblings,\n datasets\n } = this.state\n\n const {\n history\n } = this.props\n\n if (isLoading) {\n return <LoadingCover />\n } else if (error) {\n return <ErrorPage error={error} />\n }\n\n return (\n <div className='pageAnimation'>\n {this.hasParent && (\n <SubTopicPage\n data={data}\n datasets={datasets}\n siblings={siblings}\n history={history}\n />\n )}\n {!this.hasParent && (\n <TopicPage\n data={data}\n siblings={siblings}\n datasets={datasets}\n history={history}\n />\n )}\n </div>\n )\n }\n}\n\nNavigationalTopicContainer.propTypes = {\n slugResolveData: PropTypes.shape({\n /** name of (sub) topic */\n name: PropTypes.string.isRequired,\n parent_drupal_id: PropTypes.string.isRequired,\n uuid: PropTypes.string.isRequired\n }),\n history: PropTypes.object\n}\n\nexport default compose(withBoundary)(NavigationalTopicContainer)\nexport { NavigationalTopicContainer }\n"],"names":["ArticleHeader","_ref","header","leftColOffset","_jsx","className","children","ComponentShell","Text","typeFace","defaultProps","ArticleTextBlock","text","footnotes","subtitle","Container","Row","_jsxs","Col","lg","offset","trim","length","RichTextField","content","removeEmptyHtmlElement","domElement","REPOSITION_EVENT","TETHER_TARGET_CLASSNAME","NAV_CONTAINER_CLASSNAME","ContentPageLayout","React","constructor","props","super","listenToScroll","window","pageYOffset","this","containerRef","current","offsetTop","navRef","clientHeight","setState","isNavStickyTop","isNavStickyBottom","reposition","_e","tether","getTetherInstance","position","handleSectionsMounted","isSectionsMounted","handleSectionsUnmounted","document","removeEventListener","handleSectionActive","sectionId","currentSectionId","handleRef","ref","renderNav","state","sections","sectionRefs","map","section","id","isCurrentSection","contentPageLayoutTotalHeight","preRenderSetup","sectionObservers","sectionObservationEntries","Array","forEach","index","createRef","componentDidMount","addEventListener","componentWillUnmount","renderSections","renderSection","cx","ContentPageLayout__sections","withNav","i","rendered","style","render","ScrollSpy","onSectionActive","dispatchRepositionEvent","event","CustomEvent","dispatchEvent","Enhanced","windowWidth","useDisplayContext","key","useMemo","JSON","stringify","_createElement","mobileOffset","parseInt","scssVar","ContentPageNav","Component","inverseActions","inverseRefs","sectionsWithLinkRefs","inverseTopBottom","top","bottom","get","bounding","getBoundingClientRect","linksTopBottom","aRef","height","every","_ref2","iTop","iBottom","shouldContinue","_ref3","node","ReactDOM","classList","add","remove","goTo","scrollTopOffset","arguments","undefined","currentScrollTop","refNodeTop","scrollTo","behavior","handleDropdownChange","_ref4","value","onClick","dropdownOpts","currentValue","push","label","_Fragment","Select","options","classNamePrefix","isSearchable","isClearable","components","DropdownIndicator","onChange","classNames","_ref5","color","bold","href","e","preventDefault","stopPropagation","trackAnchorClick","utag","selectProps","menuIsOpen","ChevronUpIcon","ChevronDownIcon","ContentPageNavLoading","_ref6","items","fill","v","placeholderImages","placeholderImage1","placeholderImage3","createCaseStudySubjectLine","config","defaultTextClasses","subheader","title","description","spotlightCard","getCtaLink","isCaseStudy","data","cta","getContactHref","url","target","rel","FeaturedContentList","headerTypeface","passedHeaderTypeFace","textClasses","passedTextClasses","featuredContentItems","hasDarkBackground","isMobile","featuredContentItem","link","src","imgSrc","alt","imgAlt","LinkHandler","FeaturedContentItem_link","isEmpty","FeaturedContentItem","FeaturedContentItem__spotlight","noBs","mobileHeaderHeight","split","mobileNavHeight","desktopOffset","globalHeaderHeight","defaultOptions","navClass","contentClass","nested","nestedClass","reflow","events","spyRef","useRef","thisId","uuid","eventHandler","useCallback","detail","useEffect","destroy","Gumshoe","display","topicRelatedDatasetsDisplayLimit","RelatedDatasetsList","datasets","subHeading","datasetDisplayLimit","cardOptions","renderedResourceCards","take","dataset","DatasetCard","heading","slug","footer","date","dayjs","format","renderedResourceCard","ResourceSmallCarousel","isDatasetCarousel","renderedResources","RelatedLinks","linkGroups","expandedGroupIndex","setExpandedGroupIndex","useState","renderLinks","links","name","linkGroupHeader","handleExpandCollapseClick","ExpandCollapseIcon","isOpen","Collapse","in","CrumbGrandparent","CrumbParent","NavCrumb","parents","parent","grandparent","parentSlug","CaretLeftRightIcon","direction","datasetCardWidthDesktop","datasetCardWidthMobile","datasetCardHeightDesktop","datasetCardHeightMobile","topicDatasetsCarouselCellMarginDesktop","topicDatasetsCarouselCellMarginMobile","SelectProps","TopicDatasetsCarouselItemLoading","TopicDatasetsCarousel","forwardRef","loading","activeFilter","activeSort","filters","onFilterChange","onSortChange","sorts","topicDatasetsCarouselCellWidth","topicDatasetsCarouselCellHeight","datasetSlideRowSize","Math","floor","widthPerSlide","heightPerSlide","datasetSlideChunkSize","slides","chunk","sliderStyle","width","slideStyle","isFilterByVisible","backgroundImage","allDatasetsBg","CarouselProvider","naturalSlideWidth","naturalSlideHeight","totalSlides","visibleSlides","step","dragEnabled","htmlFor","SelectMaterialUi","Slider","classNameTray","Slide","innerClassName","classes","container","CarouselFooter","WithStore","currentSlide","ButtonBack","CarouselArrow","size","DotGroup","ButtonNext","subTopics","metaOrganizationName","topicSubtopicSort","siblings","history","displayDatasets","setSortState","datasetCarouselRef","formattedDatasets","last_updated","topic","views","buildDatasetList","sortDatasets","checkPageReferrer","scrollToRef","pageTitle","relatedLinks","relatedLinksWithoutLinkGroups","contact","textSections","caseStudies","caseStudyData","metaTags","carouselData","sortType","MetaHead","SubTopicHero","paragraphs","p","ContactBanner","Footer","MoreTopicCarouselCard","datasetCount","countText","imageSource","path","handleCarouselSelection","open","tabIndex","onKeyPress","MoreTopicCarouselCardGroup","slide","MoreTopicCarousel","currentTopicId","slidesPerPage","determineSlidesPerPage","isDesktop","isTablet","filteredSlides","filter","chunkedSlides","trayTag","tag","withDisplayContext","imagePath","crumb","desc","onImageLoad","onLoad","TopicSubTopic","PureComponent","btnText","relatedDatasets","variant","buildRelatedDatasets","allDatasets","featuredDataset","foundDataset","find","withAllDatasets","subTopicList","fieldRefSubtopic","navSectionData","subtopic","displayName","topicSubtopicFilters","TopicPage","loadingTopicDatasets","allDatasetsSectionRef","handleFilterChange","filteredDatasets","handleHeroImageLoad","handleSortChange","sort","newDisplayOrder","initData","componentDidUpdate","prevProps","oldDatasets","buildDatasetLists","cleanDatasets","rawHeader","visualizationList","included","buildCaseStudies","TopicHero","visualizations","VisualizationList","TopicSubTopicList","contactLink","async","fetchDataForTopicPage","topicUuid","getTopicData","categoryId","siblingTopics","Promise","all","getDatasetsAssociatedWithTopic","getChildTopicsOfCategory","excludeTopicId","siblingTopicIds","topicPages","siblingTopicDatasets","getTopicPages","datasetCountsByTopic","reduce","counts","latest_version_uuid","topic_uuid","topicPage","fieldRefTopic","log","error","fetchDataForSubtopicPage","subtopicUuid","getSubtopicData","parentId","subtopicSiblings","getDatasetsAssociatedWithSubtopic","getSubtopicsOfTopic","subtopicSiblingIds","siblingSubtopicDatasets","datasetsBySubtopic","groupBy","subtopic_uuid","linkGroup","console","NavigationalTopicContainer","isLoading","hasParent","slugResolveData","parent_drupal_id","fetchMethod","LoadingCover","ErrorPage","SubTopicPage","compose","withBoundary"],"sourceRoot":""}