{"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":""}