{"version":3,"sources":["webpack:///./config/modern-polyfills.js","webpack:///./app/scripts/kickstart.js","webpack:///./app/scripts/components/PartyPill.tsx","webpack:///./app/scripts/components/CandidateRow.tsx","webpack:///./app/scripts/components/EmptyTable.js","webpack:///./app/scripts/components/Contest.tsx","webpack:///./app/scripts/components/SeatPartyDivider.tsx","webpack:///./app/scripts/components/Portal.js","webpack:///./app/scripts/utils/debounce.js","webpack:///./app/scripts/utils/noop.js","webpack:///./app/scripts/components/Typeahead.js","webpack:///./app/scripts/components/CountyInfo.js","webpack:///./app/scripts/components/AsyncComponent.js","webpack:///./app/scripts/components/YourRaces.js","webpack:///./app/scripts/utils/load-asset-url.js","webpack:///./app/scripts/utils/legislative-districts.js","webpack:///./app/scripts/components/Ad.js","webpack:///./app/scripts/BallotApp.tsx","webpack:///./app/scripts/endpoints.ts","webpack:///./app/scripts/packs/main.js","webpack:///./app/scripts/utils/load-json-script.js","webpack:///./app/scripts/packs/ballot-sticky-nav-bar.js","webpack:///./app/scripts/election-utils.ts","webpack:///./app/scripts/utils/get-json.js","webpack:///./app/scripts/utils/shallow-equal.ts","webpack:///./app/scripts/components/PureComponent.tsx"],"names":["require","window","ttData","relatedContentContainer","document","getElementById","related_category","then","_ref","RelatedContent","default","render","h","title","_ref2","AdLoader","delay","init","PartyPill","excludeInitial","party","style","partyPrefix","slice","toLowerCase","partyInitial","toUpperCase","classes","cx","concat","class","capfirst","defaultProps","memoize","CandidateRow","Component","_this$props","this","props","ballotName","isIncumbent","rowClass","IsAsterisk","_defineProperty","contestIsCalled","isViewable","Header","colSpan","columnCount","EmptyTable","converter","PreactHTMLConverter","Contest","onePrimaryParty","directory_slug","contest","contestTitle","isShowcaseRace","redistrictingNote","notes","renderParty","children","onePrimary","length","IsNoted","get_directory_slug","office","href","xlinkHref","map","index","convert","value","includeCountyRundown","SeatPartyDivider","constructor","super","state","viewAllCandidates","partyName","annotations","partyBallot","tableHeader","renderCandidate","candidates","sort_candidates_alphabetically","candidacies","candidate","idx","isHomepage","Portal","componentDidMount","renderPortal","componentWillUnmount","defaultNode","body","removeChild","node","portal","componentDidUpdate","createElement","appendChild","debounce","func","wait","immediate","timeout","args","context","timestamp","result","later","last","Date","now","setTimeout","apply","arguments","callNow","Typeahead","highlightedIndex","isOpen","handleOnBlur","bind","handleOnClear","handleOnFocus","handleOnInput","debouncedHandleOnInput","debounceDuration","handleKeyDown","setInputRef","setMenuRef","setItemRef","listRefs","_","prevState","count","getFilteredItems","Boolean","setState","maybeScrollItemIntoView","element","inputRef","menuRef","_this$state","itemNode","menuNode","scrollIntoView","onlyScrollIfNeeded","items","shouldItemRender","sortItems","filter","item","sort","a","b","highlightItemOnMouseEnter","selectItemOnClick","getItemValue","onSelect","blur","renderList","ref","onMouseDown","event","preventDefault","cloneElement","renderItem","onClick","onMouseEnter","el","renderAttribution","onClear","onBlur","inputProps","onFocus","target","onChange","keyEvents","key","call","_this$props2","renderInput","_objectSpread","role","String","autocomplete","onInput","onKeyDown","type","aria-label","aria-hidden","noop","ArrowDown","itemsCount","newIndex","ArrowUp","Enter","keyCode","_this$state2","select","setSelectionRange","Escape","CountyInfo","PureComponent","data","isLoaded","fetchAddress","prevProps","fips","slug","county","replace","getJSON","process","getElementsByClassName","display","admin_title","name","web_site","phone_number","asyncComponent","importComponent","PreactComponent","component","m","elementId","AsyncDistrictMap","AsyncDistrictStats","googleIMG","getAttribute","JSON","parse","textContent","asset_url","PlacesLib","bounds","east","west","south","north","YourRaces","contests","coordinates","lookupError","lookupPending","lookedFoundStored","results","bodyWidth","width","handleGeocode","debouncedHandleGeocode","getContainerWidth","sessionToken","innerWidth","AutocompleteSessionToken","input","async","trim","request","locationRestriction","includedPrimaryTypes","region","AutocompleteSuggestion","fetchAutocompleteSuggestions","suggestions","s","id","placePrediction","placeId","description","text","toString","place_id","_prediction","getPredictions","e","latitude","longitude","place","toPlace","Place","fetchFields","fields","latLng","location","lat","lng","includeGeography","LOOKUP_URL","catch","google","maps","importLibrary","addEventListener","removeEventListener","addressFeedback","directoryUrl","matches","sboe","noteMatches","office_division","us_house","district","tx_senate","tx_house","for","placeholder","isHighlighted","src","alt","_extends","counties","_resultsPortal","office_slug","determineContestTitleYourRaces","candidateId","is_incumbent","point","Ad","App","fetchData","seats_mapped","number","array","propertyName","texasHouseGroups","usHouseGroups","unique_seats","i","findIndex","texasHouse","usHouse","chunk","_yourPortal","querySelector","_usPortal","contestGroup","determineContestTitle","_supremePortal","_sboePortal","_crimPortal","_senatePortal","_housePortal","loadJsonScript","isMobile","offsetWidth","selectedItem","sessionStorage","getItem","y","elem","setItem","getBoundingClientRect","top","pageYOffset","scrollTo","behavior","left","IntersectionObserver","_slicedToArray","toggleAttribute","intersectionRatio","threshold","observe","roundThousands","num","intcomma","Math","round","intword","timer","arr","size","reduce","acc","push","callback","ms","clearTimeout","TT_directory_slugs","sort_name","localeCompare","determineDistrictTitle","division_type","jsonResponse","res","ok","Error","status","statusText","json","fetch","hOP","Object","prototype","hasOwnProperty","is","x","shallowEqual","objA","objB","keysA","keys","keysB","shouldComponentUpdate"],"mappings":"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","file":"main.c29221a178.mjs","sourcesContent":["'use strict';\n\n// We depend on intersection-observer enough that it should just be assumed as necessary\nrequire('intersection-observer');\n","import { h, render } from 'preact';\nimport { delay } from './election-utils';\n\n// just in case this gets removed\nwindow.ttData = window.ttData || {};\n\n// related content\nconst relatedContentContainer = document.getElementById(\n  'related-content-container'\n);\n\nif (relatedContentContainer && window.ttData.related_category) {\n  import(\n    /* webpackChunkName: \"RelatedContent\" */ './components/RelatedContent'\n  ).then(({ default: RelatedContent }) =>\n    render(\n      <RelatedContent\n        title={'Read more'}\n        related_category={window.ttData.related_category}\n      />,\n      relatedContentContainer\n    )\n  );\n}\n\nimport(/* webpackChunkName: \"ads\" */ './utils/ad-loader').then(\n  ({ default: AdLoader }) => {\n    delay(function() {\n      const ads = new AdLoader();\n      ads.init();\n    }, 600); // end delay\n  }\n);\n","// packages\nimport cx from 'classnames';\nimport { capfirst } from 'journalize';\nimport memoize from 'lodash.memoize';\nimport { h } from 'preact';\n\ntype Props = {\n  excludeInitial?: boolean;\n  party: string;\n  style: string;\n};\n\nfunction PartyPill({ excludeInitial, party, style }: Props) {\n  const partyPrefix = party.slice(0, 3).toLowerCase();\n  const partyInitial = party[0].toUpperCase();\n\n  const classes = cx('circle-pill', `pill--${partyPrefix}`);\n\n  return (\n    <span class={classes} style={style} title={capfirst(party)}>\n      {!excludeInitial && partyInitial}\n    </span>\n  );\n}\n\nPartyPill.defaultProps = {\n  excludeInitial: false,\n};\n\nexport default memoize(PartyPill, ({ party, style }) => ({\n  party: party,\n  style: style,\n}));\n","import cx from 'classnames';\nimport { Component, h, VNode } from 'preact';\n\nimport PartyPill from './PartyPill';\n\ninterface Props {\n  ballotName: string;\n  candidateId: string;\n  isIncumbent: boolean;\n  party: string;\n}\n\nclass CandidateRow extends Component<Props> {\n  static Header: VNode;\n  static columnCount: number;\n\n  render() {\n    const { ballotName, isIncumbent, party } = this.props;\n\n    let divStyle;\n\n    let rowClass = cx('candidate', 'contest__candidate-row');\n\n    const IsAsterisk =\n      ballotName == 'Andrew White' || ballotName == 'Jay Nagy' ? true : false;\n\n    return (\n      <tr class={rowClass}>\n        <td class=\"candidate__cell candidate__party\">\n          <PartyPill party={party} />\n        </td>\n        <th class=\"candidate__cell candidate__name\">\n          {ballotName}\n          {IsAsterisk && <span class=\"asterisk_out\">*</span>}{' '}\n          {isIncumbent && (\n            <span class=\"pill pill--basic\" title=\"Currently holds this seat\">\n              Incumbent\n            </span>\n          )}\n        </th>\n      </tr>\n    );\n  }\n}\n\nCandidateRow.defaultProps = {\n  contestIsCalled: false,\n  isViewable: true,\n};\n\nCandidateRow.Header = (\n  <thead>\n    <tr>\n      <th class=\"contest__candidate-header\" colSpan={2}>\n        Candidates\n      </th>\n    </tr>\n  </thead>\n);\n\nCandidateRow.columnCount = 2;\n\nexport default CandidateRow;\n","import { h } from 'preact';\nimport cx from 'classnames';\nimport CandidateRow from './CandidateRow';\n\nconst EmptyTable = ({ party }) => {\n  const rowClass = cx('seat__race', {\n    'seat__race--Democrat': party == 'Democrat',\n    'seat__race--Republican': party == 'Republican',\n  });\n  return (\n    <div class={rowClass}>\n      <div class=\"race\">\n        <span>\n          <h4 class=\"race__title\">{party} </h4>\n        </span>\n      </div>\n      <table class=\"race__candidates\">{CandidateRow.Header}</table>\n      <div class=\"no_primary no_primary_candidates\">\n        No primary candidates running\n      </div>\n    </div>\n  );\n};\n\nexport default EmptyTable;\n","import cx from 'classnames';\nimport { Component, h } from 'preact';\nimport { PreactHTMLConverter } from 'preact-html-converter';\n\n// components\nimport EmptyTable from './EmptyTable';\n\n// internal\nimport { get_directory_slug } from '../election-utils';\n\nconst converter = PreactHTMLConverter();\n\ntype Props = {\n  contest: { [key: string]: any };\n  notes: { [key: string]: any };\n  columnCount: number;\n  contestTitle: string;\n  renderParty: any;\n  renderCandidate: any;\n  children?: any;\n};\n\nclass Contest extends Component<Props> {\n  render() {\n    const {\n      contest,\n      columnCount,\n      contestTitle,\n      isShowcaseRace,\n      redistrictingNote,\n      notes,\n      renderParty,\n      children,\n    } = this.props;\n\n    const onePrimary = contest.length == 1;\n\n    let onePrimaryParty;\n\n    if (onePrimary) {\n      onePrimaryParty = contest[0].party;\n    }\n\n    // The Republic API slugs don't match the directory url slugs so we need to get them\n\n    let directory_slug;\n\n    const IsNoted = notes && notes.length > 0 ? true : false;\n\n    if (contest[0]) {\n      directory_slug = get_directory_slug(contest[0].office);\n    }\n\n    return (\n      <div class=\"seat\">\n        {!isShowcaseRace && contest && (\n          <h3 class=\"seat__title\">\n            <span>{contestTitle}</span>\n            {directory_slug[0] != null && (\n              <a\n                class=\"t-links-unset\"\n                href={`https://directory.texastribune.org/districts/${directory_slug[0]['directory-slug']}/${contest[0]['office_division']}/`}\n              >\n                <span\n                  class=\"icon-div\"\n                  title=\"Click to learn more about this district\"\n                >\n                  <svg class=\"icon icon-info\">\n                    <use xlinkHref=\"#icon-info\"></use>\n                  </svg>\n                </span>\n              </a>\n            )}\n            {redistrictingNote && contest && (\n              <div class=\"redistrictingNote\">\n                Newly drawn{' '}\n                <a href=\"https://www.texastribune.org/2025/09/04/2025-texas-redistricting-maps/\">\n                  in 2025\n                </a>\n              </div>\n            )}\n          </h3>\n        )}\n\n        <div class={cx('seat__races', { 'seat__races--single': onePrimary })}>\n          {onePrimary && onePrimaryParty == 'Republican' && (\n            <EmptyTable party={'Democrat'} />\n          )}\n          {contest.map((party: any, index) => renderParty(party, index))}\n          {onePrimary && onePrimaryParty == 'Democrat' && (\n            <EmptyTable party={'Republican'} />\n          )}\n        </div>\n        {IsNoted == true && (\n          <p class=\"note__text note__text__both-parties\">\n            {converter.convert(notes[0].value)}\n          </p>\n        )}\n        {children}\n      </div>\n    );\n  }\n}\n\nContest.defaultProps = {\n  isShowcaseRace: false,\n  includeCountyRundown: false,\n};\n\nexport default Contest;\n","import cx from 'classnames';\nimport { Component, h } from 'preact';\n\nimport { PreactHTMLConverter } from 'preact-html-converter';\n\n// internal\nimport { sort_candidates_alphabetically } from '../election-utils';\n\ninterface Props {\n  partyName: string;\n  tableHeader: JSX.Element;\n  notes: { [key: string]: any };\n  columnCount: number;\n  partyBallot: { [key: string]: any };\n  renderCandidate: any;\n  contestTitle: string;\n}\n\nclass SeatPartyDivider extends Component {\n  constructor() {\n    super();\n\n    this.state = {\n      viewAllCandidates: false,\n    };\n  }\n\n  render() {\n    const {\n      partyName,\n      annotations,\n      notes,\n      partyBallot,\n      tableHeader,\n      columnCount,\n      renderCandidate,\n      contestTitle,\n    } = this.props;\n\n    const { viewAllCandidates } = this.state;\n\n    const converter = PreactHTMLConverter();\n\n    const candidates = sort_candidates_alphabetically(partyBallot.candidacies);\n\n    const rowClass = cx('seat__race', {\n      'seat__race--Democrat': partyName == 'Democrat',\n      'seat__race--Republican': partyName == 'Republican',\n    });\n\n    const IsNoted = notes && notes.length > 0 ? true : false;\n\n    return (\n      <div class={rowClass}>\n        {partyName && (\n          <div class=\"race\">\n            <span>\n              <h4 class=\"race__title\">{partyName} </h4>\n            </span>\n          </div>\n        )}\n\n        <table class=\"race__candidates\">\n          {tableHeader}\n          <tbody>\n            {candidates.map((candidate: any, idx: any) =>\n              renderCandidate(candidate, idx)\n            )}\n          </tbody>\n        </table>\n\n        {IsNoted == true && (\n          <p class=\"note__text\">{converter.convert(notes[0].value)}</p>\n        )}\n      </div>\n    );\n  }\n}\n\nSeatPartyDivider.defaultProps = {\n  isShowcaseRace: false,\n  isHomepage: false,\n};\n\nexport default SeatPartyDivider;\n","import { Component, h, render } from 'preact';\n\nclass Portal extends Component {\n  componentDidMount() {\n    this.renderPortal();\n  }\n\n  componentWillUnmount() {\n    if (this.defaultNode) {\n      document.body.removeChild(this.defaultNode);\n    } else {\n      // Unmount the children rendered in custom node\n      render(null, this.props.node, this.portal);\n    }\n\n    this.defaultNode = null;\n    this.portal = null;\n  }\n\n  componentDidUpdate() {\n    this.renderPortal();\n  }\n\n  renderPortal() {\n    if (!this.props.node && !this.defaultNode) {\n      this.defaultNode = document.createElement('div');\n      document.body.appendChild(this.defaultNode);\n    }\n\n    const children = this.props.children;\n\n    this.portal = render(\n      (children && children[0]) || null,\n      this.props.node || this.defaultNode,\n      this.portal\n    );\n  }\n\n  render() {\n    return null;\n  }\n}\n\nexport default Portal;\n","export default function debounce(func, wait, immediate) {\n  var timeout, args, context, timestamp, result;\n\n  var later = function() {\n    var last = Date.now() - timestamp;\n\n    if (last < wait && last >= 0) {\n      timeout = setTimeout(later, wait - last);\n    } else {\n      timeout = null;\n      if (!immediate) {\n        result = func.apply(context, args);\n        if (!timeout) context = args = null;\n      }\n    }\n  };\n\n  return function() {\n    context = this;\n    args = arguments;\n    timestamp = Date.now();\n    var callNow = immediate && !timeout;\n    if (!timeout) timeout = setTimeout(later, wait);\n    if (callNow) {\n      result = func.apply(context, args);\n      context = args = null;\n    }\n\n    return result;\n  };\n}\n","export default () => {};\n","// packages\nimport { cloneElement, Component, h } from 'preact';\nimport scrollIntoView from 'dom-scroll-into-view';\n\n// internal\nimport debounce from '../utils/debounce';\nimport noop from '../utils/noop';\n\nclass Typeahead extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      highlightedIndex: null,\n      isOpen: false,\n    };\n\n    this.handleOnBlur = this.handleOnBlur.bind(this);\n    this.handleOnClear = this.handleOnClear.bind(this);\n    this.handleOnFocus = this.handleOnFocus.bind(this);\n    this.handleOnInput = this.handleOnInput.bind(this);\n    this.debouncedHandleOnInput = debounce(\n      this.handleOnInput,\n      this.props.debounceDuration\n    );\n    this.handleKeyDown = this.handleKeyDown.bind(this);\n    this.setInputRef = this.setInputRef.bind(this);\n    this.setMenuRef = this.setMenuRef.bind(this);\n    this.setItemRef = this.setItemRef.bind(this);\n\n    this.listRefs = {};\n  }\n\n  static getDerivedStateFromProps(_, prevState) {\n    if (prevState.highlightedIndex == null) {\n      return { highlightedIndex: 0 };\n    }\n  }\n\n  componentDidUpdate() {\n    const { highlightedIndex } = this.state;\n    const count = this.getFilteredItems(this.props).length;\n\n    if (Boolean(highlightedIndex) && highlightedIndex >= count) {\n      this.setState({ highlightedIndex: 0 });\n    }\n\n    this.maybeScrollItemIntoView();\n  }\n\n  setInputRef(element) {\n    this.inputRef = element;\n  }\n\n  setMenuRef(element) {\n    this.menuRef = element;\n  }\n\n  setItemRef(element, idx) {\n    this.listRefs[`item-${idx}`] = element;\n  }\n\n  maybeScrollItemIntoView() {\n    const { highlightedIndex, isOpen } = this.state;\n\n    if (isOpen && highlightedIndex != null) {\n      const itemNode = this.listRefs[`item-${this.state.highlightedIndex}`];\n      const menuNode = this.menuRef;\n\n      if (itemNode && menuNode) {\n        scrollIntoView(itemNode, menuNode, {\n          onlyScrollIfNeeded: true,\n        });\n      }\n    }\n  }\n\n  getFilteredItems(props) {\n    let { items } = props;\n\n    const { shouldItemRender, sortItems } = props;\n\n    if (shouldItemRender) {\n      items = items.filter(item => shouldItemRender(item, props.value));\n    }\n\n    if (sortItems) {\n      items = items.sort((a, b) => sortItems(a, b, props.value));\n    }\n\n    return items;\n  }\n\n  highlightItemOnMouseEnter(highlightedIndex) {\n    this.setState({ highlightedIndex });\n  }\n\n  selectItemOnClick(item) {\n    const { getItemValue, onSelect } = this.props;\n\n    const value = getItemValue(item);\n\n    this.setState(\n      {\n        highlightedIndex: null,\n        isOpen: false,\n      },\n      () => {\n        this.inputRef.blur();\n        onSelect(value, item);\n      }\n    );\n  }\n\n  renderList() {\n    const { highlightedIndex } = this.state;\n    const props = this.props;\n\n    if (!props.value) return null;\n\n    const items = this.getFilteredItems(props);\n\n    return (\n      <ul\n        class=\"listbox\"\n        ref={this.setMenuRef}\n        onMouseDown={event => event.preventDefault()}\n      >\n        {items.map((item, idx) => {\n          return cloneElement(\n            props.renderItem(item, idx === highlightedIndex),\n            {\n              onClick: () => this.selectItemOnClick(item),\n              onMouseEnter: () => this.highlightItemOnMouseEnter(idx),\n              ref: el => this.setItemRef(el, idx),\n            }\n          );\n        })}\n        {items.length > 0 && props.renderAttribution()}\n      </ul>\n    );\n  }\n\n  handleOnClear(event) {\n    this.setState({ isOpen: false });\n\n    this.props.onClear(event);\n  }\n\n  handleOnBlur() {\n    this.setState({ isOpen: false });\n\n    const { onBlur } = this.props.inputProps;\n    if (onBlur) onBlur(event);\n  }\n\n  handleOnFocus(event) {\n    const { value } = this.props;\n\n    if (value.length > 0) this.setState({ isOpen: true });\n\n    const { onFocus } = this.props.inputProps;\n    if (onFocus) onFocus(event);\n  }\n\n  handleOnInput(event) {\n    const { value } = event.target;\n\n    this.props.onChange(value, event);\n\n    if (value.length <= 0) {\n      this.setState({ highlightedIndex: null });\n    }\n  }\n\n  handleKeyDown(event) {\n    const { isOpen } = this.state;\n\n    if (isOpen && Typeahead.keyEvents[event.key]) {\n      Typeahead.keyEvents[event.key].call(this, event);\n    } else if (!isOpen) {\n      this.setState({ isOpen: true });\n    }\n  }\n\n  render() {\n    const { inputProps, onClear, renderInput, value } = this.props;\n    const { isOpen } = this.state;\n\n    return (\n      <div class=\"typeahead\">\n        <div class=\"typeahead__input-wrapper\">\n          {renderInput({\n            ...inputProps,\n            role: 'combobox',\n            'aria-autocomplete': 'list',\n            'aria-expanded': String(isOpen),\n            autocomplete: 'off',\n            onBlur: this.handleOnBlur,\n            onFocus: this.handleOnFocus,\n            onInput: this.handleOnInput,\n            onKeyDown: this.handleKeyDown,\n            value,\n            ref: this.setInputRef,\n          })}\n          {onClear && value && (\n            <button\n              onClick={this.handleOnClear}\n              type=\"button\"\n              class=\"close\"\n              aria-label=\"Clear\"\n            >\n              <span aria-hidden=\"true\">&times;</span>\n            </button>\n          )}\n        </div>\n        {isOpen && this.renderList()}\n      </div>\n    );\n  }\n}\n\nTypeahead.defaultProps = {\n  debounceDuration: 150,\n  inputProps: {},\n  onChange: noop,\n  onClear: noop,\n  onSelect: noop,\n  renderInput: props => <input {...props} />,\n  value: '',\n};\n\nTypeahead.keyEvents = {\n  ArrowDown(event) {\n    event.preventDefault();\n\n    const items = this.getFilteredItems(this.props);\n    const itemsCount = items.length;\n    if (itemsCount < 1) return;\n\n    const { highlightedIndex } = this.state;\n\n    const newIndex =\n      highlightedIndex < itemsCount - 1\n        ? highlightedIndex + 1\n        : highlightedIndex;\n\n    this.setState({ highlightedIndex: newIndex });\n  },\n\n  ArrowUp(event) {\n    event.preventDefault();\n\n    const items = this.getFilteredItems(this.props);\n    const itemsCount = items.length;\n    if (itemsCount < 1) return;\n\n    const { highlightedIndex } = this.state;\n\n    const newIndex =\n      highlightedIndex > 0 ? highlightedIndex - 1 : highlightedIndex;\n\n    this.setState({ highlightedIndex: newIndex });\n  },\n\n  Enter(event) {\n    // not the right kind of Enter, abort\n    if (event.keyCode !== 13) return;\n\n    const { highlightedIndex, isOpen } = this.state;\n\n    if (!isOpen) {\n      // the menu is not open\n      return;\n    } else if (highlightedIndex == null) {\n      // input has control, but there's nothing selected\n      this.setState({ isOpen: false }, () => this.inputRef.select());\n    } else {\n      // the input has control and we have an item\n      event.preventDefault();\n\n      const item = this.getFilteredItems(this.props)[highlightedIndex];\n      const value = this.props.getItemValue(item);\n\n      this.setState(\n        {\n          highlightedIndex: null,\n          isOpen: false,\n        },\n        () => {\n          this.inputRef.setSelectionRange(value.length, value.length);\n          this.props.onSelect(value, item);\n        }\n      );\n    }\n  },\n\n  Escape() {\n    this.setState({\n      highlightedIndex: null,\n      isOpen: false,\n    });\n  },\n};\n\nexport default Typeahead;\n","import { h } from 'preact';\nimport getJSON from '../utils/get-json';\nimport PureComponent from './PureComponent';\n\nimport { PreactHTMLConverter } from 'preact-html-converter';\n\nconst converter = PreactHTMLConverter();\n\nclass CountyInfo extends PureComponent {\n  constructor() {\n    super();\n\n    this.state = { data: null, isLoaded: false };\n  }\n\n  componentDidMount() {\n    this.fetchAddress();\n  }\n\n  componentDidUpdate(prevProps) {\n    if (this.props.fips !== prevProps.fips) {\n      this.fetchAddress();\n    }\n  }\n\n  fetchAddress() {\n    const { county } = this.props;\n    const slug = county.toLowerCase().replace(/\\s+/g, '');\n\n    getJSON(`${process.env.PUBLIC_PATH}api/counties/${slug}.json`).then(\n      data => {\n        this.setState({ data, isLoaded: true });\n      }\n    );\n  }\n\n  render() {\n    const { county } = this.props;\n    const { data, isLoaded } = this.state;\n\n    if (!isLoaded) return null;\n\n    document.getElementsByClassName('intro-prose')[0].style.display = 'none';\n\n    return (\n      <div class=\"t-serif t-links-underlined has-page-padding\">\n        <p class=\"t-copy\">\n          Because you shared your location with us, we were able to determine\n          you are in <span class=\"font-weight-bold\">{county} County</span>. Your\n          primary election contact is{' '}\n          <span class=\"font-weight-bold\">\n            {data.admin_title} {converter.convert(data.name)}\n          </span>\n          . To learn more about your local and county races and see a sample\n          ballot,{' '}\n          <a class=\"t-links-underlined\" href={data.web_site}>\n            you can visit the county's website\n          </a>\n          , or call the election office at{' '}\n          <span class=\"font-weight-bold\">{data.phone_number}</span>.\n        </p>\n      </div>\n    );\n  }\n}\n\nexport default CountyInfo;\n","import { Component as PreactComponent, h } from 'preact';\n\nfunction resolve(m) {\n  return m && m.default ? m.default : m;\n}\n\nfunction asyncComponent(importComponent) {\n  return class extends PreactComponent {\n    constructor() {\n      super();\n\n      this.state = { component: null };\n    }\n\n    componentDidMount() {\n      importComponent().then(component =>\n        this.setState({ component: resolve(component) })\n      );\n    }\n\n    render() {\n      const { component: Component } = this.state;\n\n      return Component ? <Component {...this.props} /> : null;\n    }\n  };\n}\n\nexport default asyncComponent;\n","// packages\nimport cx from 'classnames';\nimport { h } from 'preact';\n\n// components\nimport CandidateRow from './CandidateRow';\nimport Contest from './Contest';\nimport SeatPartyDivider from './SeatPartyDivider';\nimport Portal from './Portal';\nimport PureComponent from './PureComponent';\nimport Typeahead from './Typeahead';\nimport CountyInfo from './CountyInfo';\nimport asyncComponent from './AsyncComponent';\n\n// Lazy-loaded so the district map code (d3, turf, etc.) isn't in the initial bundle\nconst AsyncDistrictMap = asyncComponent(() =>\n  import(\n    /* webpackPrefetch: true, webpackChunkName: \"DistrictMap\" */ './DistrictMapNew'\n  )\n);\n\n// Lazy-loaded district demographics/turnout stats (eligible voters, race\n// breakdown, 2024 turnout, previous-results chart)\nconst AsyncDistrictStats = asyncComponent(() =>\n  import(\n    /* webpackPrefetch: true, webpackChunkName: \"DistrictStats\" */ './DistrictStatsNew'\n  )\n);\n\n// internal\nimport debounce from '../utils/debounce';\nimport { determineContestTitleYourRaces } from '../election-utils';\nimport { lookup } from '../utils/legislative-districts';\nimport loadAssetURL from '../utils/load-asset-url';\n\nconst googleIMG = loadAssetURL('powered-by-google');\n\nlet PlacesLib = null; // { AutocompleteSessionToken, AutocompleteSuggestion, Place } loaded via importLibrary()\n\nconst bounds = {\n  east: -93.514764,\n  west: -106.662177,\n  south: 25.843902,\n  north: 36.500199,\n};\n\nconst toLocationRestriction = b => ({\n  west: b.west,\n  east: b.east,\n  south: b.south,\n  north: b.north,\n});\n\nconst getPredictions = async (input, sessionToken) => {\n  if (!input || input.trim().length < 2) return [];\n\n  const request = {\n    input,\n    locationRestriction: toLocationRestriction(bounds),\n    includedPrimaryTypes: ['street_address', 'premise', 'route'],\n    region: 'us',\n    sessionToken,\n  };\n\n  const {\n    suggestions,\n  } = await PlacesLib.AutocompleteSuggestion.fetchAutocompleteSuggestions(\n    request\n  );\n\n  return suggestions.map(s => ({\n    id: s.placePrediction.placeId,\n    description: s.placePrediction.text.toString(),\n    place_id: s.placePrediction.placeId,\n    _prediction: s.placePrediction,\n  }));\n};\n\n// always render what's provided, the geocoder decides\nconst shouldItemRender = () => true;\n\nclass YourRaces extends PureComponent {\n  constructor() {\n    super();\n\n    this.state = {\n      contests: [],\n      coordinates: null,\n      data: null,\n      lookupError: false,\n      lookupPending: false,\n      lookedFoundStored: false,\n      results: [],\n      value: '',\n      bodyWidth: null,\n      width: null,\n    };\n\n    this.handleGeocode = this.handleGeocode.bind(this);\n    this.debouncedHandleGeocode = debounce(this.handleGeocode, 300);\n    this.onChange = this.onChange.bind(this);\n    this.onClear = this.onClear.bind(this);\n    this.onSelect = this.onSelect.bind(this);\n    this.getContainerWidth = this.getContainerWidth.bind(this);\n    this.sessionToken = null;\n  }\n\n  // Calculate responsive widths for the district map, based on browser size\n  getContainerWidth() {\n    const bodyWidth = window.innerWidth;\n    const width =\n      bodyWidth > 543 ? 220 : bodyWidth > 330 ? 280 : bodyWidth - 70;\n    this.setState({\n      width: width,\n      bodyWidth: bodyWidth,\n    });\n  }\n\n  onClear(value) {\n    this.setState({ value: '' });\n  }\n\n  onChange(value) {\n    this.setState({ value }, this.debouncedHandleGeocode);\n    // Start a new autocomplete session when the user begins typing\n    if (!this.sessionToken && PlacesLib) {\n      this.sessionToken = new PlacesLib.AutocompleteSessionToken();\n    }\n  }\n\n  async handleGeocode() {\n    if (!PlacesLib) return;\n    const { value: input } = this.state;\n    try {\n      const results = await getPredictions(input, this.sessionToken);\n      this.setState({ results });\n    } catch (e) {\n      this.setState({ results: [] });\n    }\n  }\n\n  async onSelect({ name, placeId, _prediction }) {\n    this.setState({ lookupError: false, lookupPending: true, value: name });\n\n    try {\n      // New flow: prediction -> Place -> fetchFields({ fields: ['location'] })\n      const place = _prediction\n        ? _prediction.toPlace()\n        : new PlacesLib.Place({ id: placeId });\n\n      await place.fetchFields({ fields: ['location'] }); // ends the session\n\n      const latLng = place.location;\n      const coordinates = {\n        latitude: typeof latLng.lat === 'function' ? latLng.lat() : latLng.lat,\n        longitude: typeof latLng.lng === 'function' ? latLng.lng() : latLng.lng,\n      };\n\n      // Reset session so the next keystroke starts a fresh token\n      this.sessionToken = null;\n\n      lookup(coordinates)\n        .then(({ data }) => {\n          this.setState({\n            coordinates,\n            data,\n            lookupPending: false,\n            lookedFoundStored: false,\n          });\n        })\n        .catch(() =>\n          this.setState({\n            data: null,\n            lookupError: true,\n            lookupPending: false,\n          })\n        );\n    } catch (e) {\n      this.setState({\n        data: null,\n        lookupError: true,\n        lookupPending: false,\n      });\n      this.sessionToken = null;\n    }\n  }\n\n  async componentDidMount() {\n    // New: load the modern Places library classes\n    // eslint-disable-next-line no-undef\n    PlacesLib = await google.maps.importLibrary('places');\n\n    // Set initial responsive width for the district map, and keep it updated\n    this.getContainerWidth();\n    window.addEventListener('resize', this.getContainerWidth);\n\n    // // If we ever wanted to show a default location, coordinates for Governor mansion in Austin\n    // let latitude = 30.2730665;\n    // let longitude = -97.74341629999999;\n    // let coordinates = { latitude, longitude };\n\n    // lookup(coordinates)\n    //   .then(({ data }) => {\n    //     this.setState({\n    //       coordinates,\n    //       data,\n    //       lookupPending: false,\n    //       lookedFoundStored: false,\n    //     });\n    //   })\n    //   .catch(() =>\n    //     this.setState({\n    //       data: null,\n    //       lookupError: true,\n    //       lookupPending: false,\n    //     })\n    //   );\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener('resize', this.getContainerWidth);\n  }\n\n  render() {\n    const { contests, notes } = this.props;\n    const {\n      coordinates,\n      data,\n      lookupError,\n      lookupPending,\n      results,\n      value,\n      bodyWidth,\n      width,\n    } = this.state;\n\n    let addressFeedback = null;\n\n    let directoryUrl = `https://directory.texastribune.org/districts/`;\n\n    const matches = {\n      'us-house': null,\n      sboe: null,\n      'tx-senate': null,\n      'tx-house': null,\n    };\n\n    const noteMatches = {\n      'us-house': null,\n      sboe: null,\n      'tx-senate': null,\n      'tx-house': null,\n    };\n\n    if (data) {\n      matches['us-house'] = contests.filter(\n        contest =>\n          contest.office === 'U.S. House' &&\n          contest.office_division === data.us_house.district\n      );\n\n      matches['sboe'] = contests.filter(\n        contest =>\n          contest.office === 'State Board of Education' &&\n          contest.office_division === data.sboe.district\n      );\n\n      matches['tx-senate'] = contests.filter(\n        contest =>\n          contest.office === 'Texas Senate' &&\n          contest.office_division === data.tx_senate.district\n      );\n\n      matches['tx-house'] = contests.filter(\n        contest =>\n          contest.office === 'Texas House' &&\n          contest.office_division === data.tx_house.district\n      );\n\n      noteMatches['us-house'] = notes.filter(\n        contest =>\n          contest.type === 'us-house-district-' + data.us_house.district\n      );\n\n      noteMatches['sboe'] = notes.filter(\n        contest =>\n          contest.type ===\n          'state-board-of-education-district-' + data.sboe.district\n      );\n\n      noteMatches['tx-senate'] = notes.filter(\n        contest =>\n          contest.type === 'texas-senate-district-' + data.tx_senate.district\n      );\n\n      noteMatches['tx-house'] = notes.filter(\n        contest =>\n          contest.type === 'texas-house-district-' + data.tx_house.district\n      );\n    }\n\n    if (lookupPending) {\n      addressFeedback = (\n        <p class=\"has-padding t-serif t-weight-bold t-align-center\">\n          Finding your details...{' '}\n          <svg class=\"icon icon-spinner animate-pulse\">\n            <use xlinkHref=\"#icon-spinner\" />\n          </svg>\n        </p>\n      );\n    }\n\n    if (lookupError) {\n      addressFeedback = (\n        <p class=\"has-padding t-serif t-weight-bold t-align-center\">\n          Hmm... we were unable to find you in Texas. Please check your address\n          and try again!\n        </p>\n      );\n    }\n\n    if (coordinates && !lookupPending && !lookupError) {\n      addressFeedback = (\n        <p class=\"has-padding t-serif t-weight-bold t-align-center\">\n          We found your information! These races have been personalized for you.\n        </p>\n      );\n    }\n\n    const inputProps = {\n      id: 'address-input',\n      class: 'address-input__input',\n      placeholder: '1010 Colorado St, Austin, TX, 78701',\n    };\n\n    return (\n      <div class=\"address-input t-sans\">\n        <svg class=\"icon icon-drawn-left-arrow\">\n          <use xlinkHref=\"#icon-drawn-left-arrow\"></use>\n        </svg>\n        <label class=\"address-input__label\" for=\"address-input\">\n          Enter your address\n        </label>\n        <Typeahead\n          inputProps={inputProps}\n          items={results}\n          getItemValue={item => ({\n            name: item.description,\n            placeId: item.place_id,\n            _prediction: item._prediction,\n          })}\n          value={value}\n          onChange={this.onChange}\n          onClear={this.onClear}\n          onSelect={this.onSelect}\n          renderItem={(item, isHighlighted) => (\n            <li\n              class={cx('listbox__item', {\n                'listbox__item--highlighted': isHighlighted,\n              })}\n              key={item.id}\n            >\n              {item.description}\n            </li>\n          )}\n          renderAttribution={() => (\n            <li class=\"listbox__item listbox__item--attribution\">\n              <img src={googleIMG} alt=\"Powered by Google\" />\n            </li>\n          )}\n          shouldItemRender={shouldItemRender}\n          renderInput={props => (\n            <input\n              {...props}\n              ref={el => {\n                props.ref(el);\n                this.inputRef = el;\n              }}\n            />\n          )}\n        />\n        {addressFeedback}\n\n        {data && data.counties && (\n          <Portal node={document.getElementById('local-candidates-info')}>\n            <span>\n              <CountyInfo\n                key={data.counties.fips}\n                county={data.counties.name}\n                fips={data.counties.fips}\n              />\n            </span>\n          </Portal>\n        )}\n\n        {data && contests.length > 0 && (\n          <Portal\n            node={document.getElementById('your-races-results')}\n            ref={ref => (this._resultsPortal = ref)}\n          >\n            <div class=\"representative-districts contest-list\">\n              <Contest\n                key={matches['us-house'][0].office_slug}\n                contest={matches['us-house']}\n                contestTitle={determineContestTitleYourRaces(\n                  matches['us-house'][0]\n                )}\n                notes={noteMatches['us-house'].filter(\n                  item => item.type === matches['us-house'][0].office_slug\n                )}\n                redistrictingNote\n                tableHeader={CandidateRow.Header}\n                columnCount={CandidateRow.columnCount}\n                renderParty={party => (\n                  <SeatPartyDivider\n                    partyName={party.party}\n                    partyBallot={party}\n                    tableHeader={CandidateRow.Header}\n                    notes={noteMatches['us-house'].filter(\n                      contest =>\n                        contest.type === party.office_slug + '-' + party.party\n                    )}\n                    columnCount={CandidateRow.columnCount}\n                    renderCandidate={(candidate, idx) => (\n                      <CandidateRow\n                        key={candidate.id}\n                        ballotName={candidate.name}\n                        candidateId={candidate.id}\n                        isIncumbent={candidate.is_incumbent}\n                        party={candidate.party}\n                      />\n                    )}\n                  />\n                )}\n              >\n                <h4 class=\"district-grid__title\">About this district</h4>\n                <div class=\"district-grid\">\n                  <AsyncDistrictStats\n                    name=\"U.S. House\"\n                    district={data['us_house'].district}\n                    slug=\"us-house\"\n                    width={width}\n                  />\n                  <AsyncDistrictMap\n                    slug=\"us-house\"\n                    district={data['us_house'].district}\n                    point={coordinates}\n                    width={width}\n                  />\n                </div>\n              </Contest>\n              {matches['tx-senate'].length > 0 ? (\n                <Contest\n                  key={matches['tx-senate'].id}\n                  contest={matches['tx-senate']}\n                  tableHeader={CandidateRow.Header}\n                  columnCount={CandidateRow.columnCount}\n                  notes={noteMatches['tx-senate'].filter(\n                    item => item.type === matches['tx-senate'][0].office_slug\n                  )}\n                  contestTitle={determineContestTitleYourRaces(\n                    matches['tx-senate'][0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      notes={noteMatches['tx-senate'].filter(\n                        contest =>\n                          contest.type === party.office_slug + '-' + party.party\n                      )}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(candidate, idx) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          isIncumbent={candidate.is_incumbent}\n                          party={candidate.party}\n                        />\n                      )}\n                    />\n                  )}\n                >\n                  <h4 class=\"district-grid__title\">About this district</h4>\n                  <div class=\"district-grid\">\n                    <AsyncDistrictStats\n                      name=\"Texas Senate\"\n                      district={data['tx_senate'].district}\n                      slug=\"texas-senate\"\n                      width={width}\n                    />\n                    <AsyncDistrictMap\n                      slug=\"texas-senate\"\n                      district={data['tx_senate'].district}\n                      point={coordinates}\n                      width={width}\n                    />\n                  </div>\n                </Contest>\n              ) : (\n                <div class=\"seat\">\n                  <span>\n                    <h3 class=\"seat__title\">\n                      Texas Senate {data['tx_senate']['district']}{' '}\n                      <a\n                        class=\"t-links-unset\"\n                        href={`${directoryUrl}tx-senate/${data['tx_senate']['district']}/`}\n                      >\n                        <span\n                          class=\"icon-div\"\n                          title=\"Click to learn more about this district\"\n                        >\n                          <svg class=\"icon icon-info\">\n                            <use xlinkHref=\"#icon-info\"></use>\n                          </svg>\n                        </span>\n                      </a>\n                    </h3>\n                  </span>\n\n                  <table class=\"race__candidates\">{CandidateRow.Header}</table>\n                  <div class=\"no_primary\">\n                    Seat is not up for election this year.\n                  </div>\n\n                  <h4 class=\"district-grid__title\">About this district</h4>\n                  <div class=\"district-grid\">\n                    <AsyncDistrictStats\n                      name=\"Texas Senate\"\n                      district={data['tx_senate'].district}\n                      slug=\"texas-senate\"\n                      width={width}\n                    />\n                    <AsyncDistrictMap\n                      slug=\"texas-senate\"\n                      district={data['tx_senate'].district}\n                      point={coordinates}\n                      width={width}\n                    />\n                  </div>\n                </div>\n              )}\n              <Contest\n                key={matches['tx-house'].id}\n                contest={matches['tx-house']}\n                tableHeader={CandidateRow.Header}\n                columnCount={CandidateRow.columnCount}\n                notes={noteMatches['tx-house'].filter(\n                  item => item.type === matches['tx-house'][0].office_slug\n                )}\n                contestTitle={determineContestTitleYourRaces(\n                  matches['tx-house'][0]\n                )}\n                renderParty={party => (\n                  <SeatPartyDivider\n                    partyName={party.party}\n                    partyBallot={party}\n                    tableHeader={CandidateRow.Header}\n                    notes={noteMatches['tx-house'].filter(\n                      contest =>\n                        contest.type === party.office_slug + '-' + party.party\n                    )}\n                    columnCount={CandidateRow.columnCount}\n                    renderCandidate={(candidate, idx) => (\n                      <CandidateRow\n                        key={candidate.id}\n                        ballotName={candidate.name}\n                        candidateId={candidate.id}\n                        isIncumbent={candidate.is_incumbent}\n                        party={candidate.party}\n                      />\n                    )}\n                  />\n                )}\n              >\n                <h4 class=\"district-grid__title\">About this district</h4>\n                <div class=\"district-grid\">\n                  <AsyncDistrictStats\n                    name=\"Texas House\"\n                    district={data['tx_house'].district}\n                    slug=\"texas-house\"\n                    width={width}\n                  />\n                  <AsyncDistrictMap\n                    slug=\"texas-house\"\n                    district={data['tx_house'].district}\n                    point={coordinates}\n                    width={width}\n                  />\n                </div>\n              </Contest>\n              {matches['sboe'].length > 0 ? (\n                <Contest\n                  key={matches['sboe'][0].office_slug}\n                  contest={matches['sboe']}\n                  tableHeader={CandidateRow.Header}\n                  columnCount={CandidateRow.columnCount}\n                  notes={noteMatches['sboe'].filter(\n                    item => item.type === matches['sboe'][0].office_slug\n                  )}\n                  contestTitle={determineContestTitleYourRaces(\n                    matches['sboe'][0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      notes={noteMatches['sboe'].filter(\n                        contest =>\n                          contest.type === party.office_slug + '-' + party.party\n                      )}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(candidate, idx) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          isIncumbent={candidate.is_incumbent}\n                          party={candidate.party}\n                        />\n                      )}\n                    />\n                  )}\n                >\n                  <h4 class=\"district-grid__title\">About this district</h4>\n                  <div class=\"district-grid\">\n                    <AsyncDistrictStats\n                      name=\"State Board Of Education\"\n                      district={data['sboe'].district}\n                      slug=\"state-board-of-education\"\n                      width={width}\n                    />\n                    <AsyncDistrictMap\n                      slug=\"state-board-of-education\"\n                      district={data['sboe'].district}\n                      point={coordinates}\n                      width={width}\n                    />\n                  </div>\n                </Contest>\n              ) : (\n                <div class=\"seat\">\n                  <span>\n                    <h3 class=\"seat__title\">\n                      State Board of Education {data['sboe']['district']}{' '}\n                      <a\n                        class=\"t-links-unset\"\n                        href={`${directoryUrl}sboe/${data['sboe']['district']}`}\n                      >\n                        <span\n                          class=\"icon-div\"\n                          title=\"Click to learn more about this district\"\n                        >\n                          <svg class=\"icon icon-info\">\n                            <use xlinkHref=\"#icon-info\"></use>\n                          </svg>\n                        </span>\n                      </a>\n                    </h3>\n                  </span>\n\n                  <table class=\"race__candidates\">{CandidateRow.Header}</table>\n                  <div class=\"no_primary\">\n                    Seat is not up for election this year.\n                  </div>\n\n                  <h4 class=\"district-grid__title\">About this district</h4>\n                  <div class=\"district-grid\">\n                    <AsyncDistrictStats\n                      name=\"State Board Of Education\"\n                      district={data['sboe'].district}\n                      slug=\"state-board-of-education\"\n                      width={width}\n                    />\n                    <AsyncDistrictMap\n                      slug=\"state-board-of-education\"\n                      district={data['sboe'].district}\n                      point={coordinates}\n                      width={width}\n                    />\n                  </div>\n                </div>\n              )}\n            </div>\n          </Portal>\n        )}\n      </div>\n    );\n  }\n}\n\nexport default YourRaces;\n","/**\n * Grabs the contents of a `jsonScript` created JSON inline string and returns\n * it as a JSON object. If the element does not exist, or if the script\n * element does not have the JSON MIME type, null is returned instead.\n *\n * @param  {String} elementId the ID of the JSON script element\n * @return {Object|null}\n */\nexport default function loadAssetURL(elementId) {\n  const element = document.getElementById(elementId);\n\n  if (element && element.getAttribute('type') === 'application/json') {\n    return JSON.parse(element.textContent).asset_url;\n  } else {\n    return null;\n  }\n}\n","import getJSON from './get-json';\n\nconst LOOKUP_URL = ({ latitude, longitude, includeGeography = false }) =>\n  `https://dv-dev.texastribune.org/legislative-lookup-2025/?latitude=${latitude}&longitude=${longitude}`;\n\nexport function lookup({ latitude, longitude }) {\n  return getJSON(LOOKUP_URL({ latitude, longitude }));\n}\n","import cx from 'classnames';\nimport { h } from 'preact';\n\nfunction Ad() {\n  const classes = cx('c-ad-flex_bg--gray preact__ad');\n\n  return (\n    <div class=\"plugin plugin--centered\">\n      <div class={classes}>\n        <div class=\"c-ad-flex__inner\">\n          <p class=\"c-ad-flex__thanks\">\n            The Texas Tribune thanks its sponsors.\n            <a href=\"https://mediakit.texastribune.org/\">\n              <strong>Become one</strong>\n            </a>\n            .\n          </p>\n          <div class=\"c-ad-flex__unit\">\n            <div class=\"dv-gpt-ad\"></div>\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n\nexport default Ad;\n","// packages\nimport cx from 'classnames';\nimport { Component, h } from 'preact';\n\n// components\nimport CandidateRow from './components/CandidateRow';\nimport Contest from './components/Contest';\nimport YourRaces from './components/YourRaces';\nimport Portal from './components/Portal';\nimport SeatPartyDivider from './components/SeatPartyDivider';\nimport Ad from './components/Ad';\n\nimport { determineContestTitle, chunk } from './election-utils';\nimport { FLAT_BALLOT_URL } from './endpoints';\nimport getJSON from './utils/get-json';\n\ntype State = {\n  data: { [key: string]: any };\n};\n\nclass App extends Component<{}, State> {\n  constructor() {\n    super();\n\n    this.state = {\n      data: [],\n    };\n\n    this.fetchData = this.fetchData.bind(this);\n  }\n\n  fetchData() {\n    getJSON(FLAT_BALLOT_URL).then(data => this.setState({ data }));\n  }\n\n  componentDidMount() {\n    this.fetchData();\n  }\n\n  componentWillUnmount() {}\n\n  componentDidUpdate() {}\n\n  render() {\n    const { notes } = this.props;\n    const { data } = this.state;\n\n    const seats_mapped = data.map(number => ({\n      office: number.office,\n      office_slug: number.office_slug,\n    }));\n\n    function unique(array, propertyName) {\n      return array.filter(\n        (e, i) =>\n          array.findIndex(a => a[propertyName] === e[propertyName]) === i\n      );\n    }\n\n    let unique_seats = unique(seats_mapped, 'office_slug');\n\n    // In order to sprinkle ads between races in sections where there a lot of races like the Texas House, we need to divide them into groups of nth races to make it into different divs\n\n    const texasHouse = unique_seats.filter(\n      contest => contest.office === 'Texas House'\n    );\n\n    const usHouse = unique_seats.filter(\n      contest => contest.office === 'U.S. House'\n    );\n\n    let texasHouseGroups, usHouseGroups;\n\n    if (texasHouse.length) {\n      texasHouseGroups = chunk(texasHouse, 30);\n      usHouseGroups = chunk(usHouse, 24);\n    }\n\n    return (\n      <div class=\"ballot-list\">\n        <Portal\n          node={document.getElementById('lookup-select')}\n          ref={ref => (this._yourPortal = ref)}\n        >\n          <YourRaces contests={data} notes={notes} />\n        </Portal>\n\n        <Portal\n          node={document.querySelector('#us-house .contests')}\n          ref={ref => (this._usPortal = ref)}\n        >\n          <div class=\"office__contests\">\n            {usHouse.length > 0 &&\n              usHouseGroups.map(contestGroup => (\n                <div class=\"contest-group\">\n                  <div class=\"seat__contests-double\">\n                    {contestGroup.map(contest => (\n                      <Contest\n                        key={contest.id}\n                        contest={data.filter(\n                          item => item.office_slug === contest.office_slug\n                        )}\n                        tableHeader={CandidateRow.Header}\n                        columnCount={CandidateRow.columnCount}\n                        notes={notes.filter(\n                          item => item.type === contest.office_slug\n                        )}\n                        contestTitle={determineContestTitle(\n                          data.filter(\n                            item => item.office_slug === contest.office_slug\n                          )[0]\n                        )}\n                        renderParty={party => (\n                          <SeatPartyDivider\n                            partyName={party.party}\n                            partyBallot={party}\n                            tableHeader={CandidateRow.Header}\n                            notes={notes.filter(\n                              item =>\n                                item.type ===\n                                contest.office_slug + '-' + party.party\n                            )}\n                            columnCount={CandidateRow.columnCount}\n                            renderCandidate={(candidate, idx) => (\n                              <CandidateRow\n                                key={candidate.id}\n                                ballotName={candidate.name}\n                                candidateId={candidate.id}\n                                isIncumbent={candidate.is_incumbent}\n                                party={candidate.party}\n                              />\n                            )}\n                          />\n                        )}\n                      />\n                    ))}\n                  </div>\n                  <Ad />\n                </div>\n              ))}\n          </div>\n        </Portal>\n\n        <Portal\n          node={document.querySelector('#governor .contests')}\n          ref={ref => (this._supremePortal = ref)}\n        >\n          <div class=\"office__contests\">\n            {unique_seats\n              .filter(contest => contest.office === 'Governor')\n              .map(contest => (\n                <Contest\n                  key={contest.id}\n                  contest={data.filter(\n                    item => item.office_slug === contest.office_slug\n                  )}\n                  notes={notes.filter(\n                    item => item.type === contest.office_slug\n                  )}\n                  isShowcaseRace // These are big races that don't need headers because the headers are already in the text, we can just show the candidates\n                  tableHeader={CandidateRow.Header}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitle(\n                    data.filter(\n                      item => item.office_slug === contest.office_slug\n                    )[0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      notes={notes.filter(\n                        item =>\n                          item.type === contest.office_slug + '-' + party.party\n                      )}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(candidate, idx) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          isIncumbent={candidate.is_incumbent}\n                          party={candidate.party}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              ))}\n          </div>\n        </Portal>\n        <Portal\n          node={document.querySelector('#lieutenant-governor .contests')}\n          ref={ref => (this._supremePortal = ref)}\n        >\n          <div class=\"office__contests\">\n            {unique_seats\n              .filter(contest => contest.office === 'Lieutenant Governor')\n              .map(contest => (\n                <Contest\n                  key={contest.id}\n                  contest={data.filter(\n                    item => item.office_slug === contest.office_slug\n                  )}\n                  notes={notes.filter(\n                    item => item.type === contest.office_slug\n                  )}\n                  isShowcaseRace\n                  tableHeader={CandidateRow.Header}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitle(\n                    data.filter(\n                      item => item.office_slug === contest.office_slug\n                    )[0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      notes={notes.filter(\n                        item =>\n                          item.type === contest.office_slug + '-' + party.party\n                      )}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(candidate, idx) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          isIncumbent={candidate.is_incumbent}\n                          party={candidate.party}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              ))}\n          </div>\n        </Portal>\n        <Portal\n          node={document.querySelector('#attorney-general .contests')}\n          ref={ref => (this._supremePortal = ref)}\n        >\n          <div class=\"office__contests\">\n            {unique_seats\n              .filter(contest => contest.office === 'Attorney General')\n              .map(contest => (\n                <Contest\n                  key={contest.id}\n                  contest={data.filter(\n                    item => item.office_slug === contest.office_slug\n                  )}\n                  notes={notes.filter(\n                    item => item.type === contest.office_slug\n                  )}\n                  isShowcaseRace\n                  tableHeader={CandidateRow.Header}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitle(\n                    data.filter(\n                      item => item.office_slug === contest.office_slug\n                    )[0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      notes={notes.filter(\n                        item =>\n                          item.type === contest.office_slug + '-' + party.party\n                      )}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(candidate, idx) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          isIncumbent={candidate.is_incumbent}\n                          party={candidate.party}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              ))}\n          </div>\n        </Portal>\n        <Portal\n          node={document.querySelector('#land-commissioner .contests')}\n          ref={ref => (this._supremePortal = ref)}\n        >\n          <div class=\"office__contests\">\n            {unique_seats\n              .filter(contest => contest.office === 'Land Commissioner')\n              .map(contest => (\n                <Contest\n                  key={contest.id}\n                  contest={data.filter(\n                    item => item.office_slug === contest.office_slug\n                  )}\n                  notes={notes.filter(\n                    item => item.type === contest.office_slug\n                  )}\n                  isShowcaseRace\n                  tableHeader={CandidateRow.Header}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitle(\n                    data.filter(\n                      item => item.office_slug === contest.office_slug\n                    )[0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      notes={notes.filter(\n                        item =>\n                          item.type === contest.office_slug + '-' + party.party\n                      )}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(candidate, idx) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          isIncumbent={candidate.is_incumbent}\n                          party={candidate.party}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              ))}\n          </div>\n        </Portal>\n        <Portal\n          node={document.querySelector('#comptroller .contests')}\n          ref={ref => (this._supremePortal = ref)}\n        >\n          <div class=\"office__contests\">\n            {unique_seats\n              .filter(contest => contest.office === 'Comptroller')\n              .map(contest => (\n                <Contest\n                  key={contest.id}\n                  contest={data.filter(\n                    item => item.office_slug === contest.office_slug\n                  )}\n                  notes={notes.filter(\n                    item => item.type === contest.office_slug\n                  )}\n                  isShowcaseRace\n                  tableHeader={CandidateRow.Header}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitle(\n                    data.filter(\n                      item => item.office_slug === contest.office_slug\n                    )[0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      notes={notes.filter(\n                        item =>\n                          item.type === contest.office_slug + '-' + party.party\n                      )}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(candidate, idx) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          isIncumbent={candidate.is_incumbent}\n                          party={candidate.party}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              ))}\n          </div>\n        </Portal>\n        <Portal\n          node={document.querySelector('#agriculture-commissioner .contests')}\n          ref={ref => (this._supremePortal = ref)}\n        >\n          <div class=\"office__contests\">\n            {unique_seats\n              .filter(contest => contest.office === 'Agriculture Commissioner')\n              .map(contest => (\n                <Contest\n                  key={contest.id}\n                  contest={data.filter(\n                    item => item.office_slug === contest.office_slug\n                  )}\n                  notes={notes.filter(\n                    item => item.type === contest.office_slug\n                  )}\n                  isShowcaseRace\n                  tableHeader={CandidateRow.Header}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitle(\n                    data.filter(\n                      item => item.office_slug === contest.office_slug\n                    )[0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      notes={notes.filter(\n                        item =>\n                          item.type === contest.office_slug + '-' + party.party\n                      )}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(candidate, idx) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          isIncumbent={candidate.is_incumbent}\n                          party={candidate.party}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              ))}\n          </div>\n        </Portal>\n        <Portal\n          node={document.querySelector('#us-senate .contests')}\n          ref={ref => (this._supremePortal = ref)}\n        >\n          <div class=\"office__contests\">\n            {unique_seats\n              .filter(contest => contest.office === 'U.S. Senate')\n              .map(contest => (\n                <Contest\n                  key={contest.id}\n                  contest={data.filter(\n                    item => item.office_slug === contest.office_slug\n                  )}\n                  notes={notes.filter(\n                    item => item.type === contest.office_slug\n                  )}\n                  isShowcaseRace\n                  tableHeader={CandidateRow.Header}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitle(\n                    data.filter(\n                      item => item.office_slug === contest.office_slug\n                    )[0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      notes={notes.filter(\n                        item =>\n                          item.type === contest.office_slug + '-' + party.party\n                      )}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(candidate, idx) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          isIncumbent={candidate.is_incumbent}\n                          party={candidate.party}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              ))}\n          </div>\n        </Portal>\n        <Portal\n          node={document.querySelector('#railroad-commissioner .contests')}\n          ref={ref => (this._supremePortal = ref)}\n        >\n          <div class=\"office__contests\">\n            {unique_seats\n              .filter(contest => contest.office === 'Texas Railroad Commission')\n              .map(contest => (\n                <Contest\n                  key={contest.id}\n                  contest={data.filter(\n                    item => item.office_slug === contest.office_slug\n                  )}\n                  notes={notes.filter(\n                    item => item.type === contest.office_slug\n                  )}\n                  tableHeader={CandidateRow.Header}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitle(\n                    data.filter(\n                      item => item.office_slug === contest.office_slug\n                    )[0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      notes={notes.filter(\n                        item =>\n                          item.type === contest.office_slug + '-' + party.party\n                      )}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(candidate, idx) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          isIncumbent={candidate.is_incumbent}\n                          party={candidate.party}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              ))}\n          </div>\n        </Portal>\n        <Portal\n          node={document.querySelector('#state-board-of-education .contests')}\n          ref={ref => (this._sboePortal = ref)}\n        >\n          <div class=\"office__contests office__contests--grid\">\n            {unique_seats\n              .filter(contest => contest.office === 'State Board of Education')\n              .map(contest => (\n                <Contest\n                  key={contest.id}\n                  contest={data.filter(\n                    item => item.office_slug === contest.office_slug\n                  )}\n                  notes={notes.filter(\n                    item => item.type === contest.office_slug\n                  )}\n                  tableHeader={CandidateRow.Header}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitle(\n                    data.filter(\n                      item => item.office_slug === contest.office_slug\n                    )[0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      notes={notes.filter(\n                        item =>\n                          item.type === contest.office_slug + '-' + party.party\n                      )}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(candidate, idx) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          isIncumbent={candidate.is_incumbent}\n                          party={candidate.party}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              ))}\n          </div>\n        </Portal>\n        <Portal\n          node={document.querySelector('#texas-supreme-court .contests')}\n          ref={ref => (this._supremePortal = ref)}\n        >\n          <div class=\"office__contests office__contests--grid\">\n            {unique_seats\n              .filter(contest => contest.office === 'Texas Supreme Court')\n              .map(contest => (\n                <Contest\n                  key={contest.id}\n                  contest={data.filter(\n                    item => item.office_slug === contest.office_slug\n                  )}\n                  notes={notes.filter(\n                    item => item.type === contest.office_slug\n                  )}\n                  tableHeader={CandidateRow.Header}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitle(\n                    data.filter(\n                      item => item.office_slug === contest.office_slug\n                    )[0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      notes={notes.filter(\n                        item =>\n                          item.type === contest.office_slug + '-' + party.party\n                      )}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(candidate, idx) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          isIncumbent={candidate.is_incumbent}\n                          party={candidate.party}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              ))}\n          </div>\n        </Portal>\n        <Portal\n          node={document.querySelector(\n            '#texas-court-of-criminal-appeals .contests'\n          )}\n          ref={ref => (this._crimPortal = ref)}\n        >\n          <div class=\"office__contests office__contests--grid\">\n            {unique_seats\n              .filter(\n                contest => contest.office === 'Texas Court of Criminal Appeals'\n              )\n              .map(contest => (\n                <Contest\n                  key={contest.id}\n                  contest={data.filter(\n                    item => item.office_slug === contest.office_slug\n                  )}\n                  notes={notes.filter(\n                    item => item.type === contest.office_slug\n                  )}\n                  tableHeader={CandidateRow.Header}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitle(\n                    data.filter(\n                      item => item.office_slug === contest.office_slug\n                    )[0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      notes={notes.filter(\n                        item =>\n                          item.type === contest.office_slug + '-' + party.party\n                      )}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(candidate, idx) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          isIncumbent={candidate.is_incumbent}\n                          party={candidate.party}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              ))}\n          </div>\n        </Portal>\n        <Portal\n          node={document.querySelector('#texas-senate .contests')}\n          ref={ref => (this._senatePortal = ref)}\n        >\n          <div class=\"office__contests office__contests--grid\">\n            {unique_seats\n              .filter(contest => contest.office === 'Texas Senate')\n              .map(contest => (\n                <Contest\n                  key={contest.id}\n                  contest={data.filter(\n                    item => item.office_slug === contest.office_slug\n                  )}\n                  notes={notes.filter(\n                    item => item.type === contest.office_slug\n                  )}\n                  tableHeader={CandidateRow.Header}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitle(\n                    data.filter(\n                      item => item.office_slug === contest.office_slug\n                    )[0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      notes={notes.filter(\n                        item =>\n                          item.type === contest.office_slug + '-' + party.party\n                      )}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(candidate, idx) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          isIncumbent={candidate.is_incumbent}\n                          party={candidate.party}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              ))}\n          </div>\n        </Portal>\n\n        <Portal\n          node={document.querySelector('#texas-house .contests')}\n          ref={ref => (this._housePortal = ref)}\n        >\n          <div class=\"office__contests\">\n            {texasHouse.length > 0 &&\n              texasHouseGroups.map(contestGroup => (\n                <div class=\"contest-group\">\n                  <div class=\"seat__contests-double\">\n                    {contestGroup.map(contest => (\n                      <Contest\n                        key={contest.id}\n                        contest={data.filter(\n                          item => item.office_slug === contest.office_slug\n                        )}\n                        notes={notes.filter(\n                          item => item.type === contest.office_slug\n                        )}\n                        tableHeader={CandidateRow.Header}\n                        columnCount={CandidateRow.columnCount}\n                        contestTitle={determineContestTitle(\n                          data.filter(\n                            item => item.office_slug === contest.office_slug\n                          )[0]\n                        )}\n                        renderParty={party => (\n                          <SeatPartyDivider\n                            partyName={party.party}\n                            partyBallot={party}\n                            tableHeader={CandidateRow.Header}\n                            notes={notes.filter(\n                              item =>\n                                item.type ===\n                                contest.office_slug + '-' + party.party\n                            )}\n                            columnCount={CandidateRow.columnCount}\n                            renderCandidate={(candidate, idx) => (\n                              <CandidateRow\n                                key={candidate.id}\n                                ballotName={candidate.name}\n                                candidateId={candidate.id}\n                                isIncumbent={candidate.is_incumbent}\n                                party={candidate.party}\n                              />\n                            )}\n                          />\n                        )}\n                      />\n                    ))}\n                  </div>\n                  <Ad />\n                </div>\n              ))}\n          </div>\n        </Portal>\n      </div>\n    );\n  }\n}\n\nexport default App;\n","// JSON updated by Republic\nconst FLAT_BALLOT_URL =\n  'https://s3.us-east-1.amazonaws.com/sos-test-2.texastribune.org/2026_general/ballot_page/results_FLAT_for_ballot.json';\n\nexport {\n  FLAT_BALLOT_URL\n};\n","// import JS files\nimport '../kickstart';\nimport './ballot-sticky-nav-bar';\n\nimport { h, render } from 'preact';\n\n// Components\nimport App from '../BallotApp';\nimport loadJsonScript from '../utils/load-json-script';\n\nconst notes = loadJsonScript('notes_data');\n\nrender(<App notes={notes} />, document.getElementById('app'));\n","/**\n * Grabs the contents of a `jsonScript` created JSON inline string and returns\n * it as a JSON object. If the element does not exist, or if the script\n * element does not have the JSON MIME type, null is returned instead.\n *\n * @param  {String} elementId the ID of the JSON script element\n * @return {Object|null}\n */\nexport default function loadJsonScript(elementId) {\n  const element = document.getElementById(elementId);\n\n  if (element && element.getAttribute('type') === 'application/json') {\n    return JSON.parse(element.textContent);\n  } else {\n    return null;\n  }\n}\n","let input = document.querySelector('#select-office');\n\nlet MOBILE_THRESHOLD = 544;\n\nlet containerWidth = document.getElementsByClassName('results-container')\n  .offsetWidth;\n\nlet isMobile = containerWidth <= MOBILE_THRESHOLD ? true : false;\n\nvar selectedItem = sessionStorage.getItem('SelectedItem');\nif (selectedItem) {\n  document.getElementById('select-office').value = selectedItem;\n}\n\ninput.addEventListener('change', function() {\n  const elem = document.getElementById(this.value);\n  sessionStorage.setItem('SelectedItem', this.value);\n\n  scrollIt(elem);\n});\n\nfunction scrollIt(element) {\n  const y =\n    element.getBoundingClientRect().top +\n    window.pageYOffset -\n    (isMobile ? 115 : 75);\n\n  window.scrollTo({\n    behavior: 'smooth',\n    left: 0,\n    top: y,\n  });\n}\n\n// Added a function to tell when the sticky bar is stuck so that we can hide the \"See who's running for:\" for mobile.\n\nconst observer = new IntersectionObserver(\n  ([e]) => e.target.toggleAttribute('stuck', e.intersectionRatio < 1),\n  { threshold: [1] }\n);\n\nobserver.observe(document.querySelector('#sticky-bar'));\n","var journalize = require('journalize');\n\nimport { capfirst, intcomma, intword } from 'journalize';\n\nexport function roundThousands(num) {\n  var integer = 1000;\n  if (num < 1000000) return intcomma(Math.round(num / integer) * integer);\n  else return intword(num);\n}\n\nexport const chunk = (arr, size) =>\n  arr.reduce((acc, _, i) => {\n    if (i % size === 0) acc.push(arr.slice(i, i + size));\n    return acc;\n  }, []);\n\nexport const delay = (function() {\n  var timer = 0;\n  return function(callback, ms) {\n    clearTimeout(timer);\n    timer = setTimeout(callback, ms);\n  };\n})();\n\nconst TT_directory_slugs = [\n  { office: 'Texas House', 'directory-slug': 'tx-house' },\n  { office: 'Texas Senate', 'directory-slug': 'tx-senate' },\n  { office: 'U.S. House', 'directory-slug': 'us-house' },\n  { office: 'State Board of Education', 'directory-slug': 'sboe' },\n];\n\nexport function get_directory_slug(office) {\n  return TT_directory_slugs.filter(slug => slug.office == office);\n}\n\nexport function sort_candidates_alphabetically(candidates) {\n  return candidates.sort((a, b) =>\n    (a.sort_name || a.name || '').localeCompare(b.sort_name || b.name || '')\n  );\n}\n\nexport function determineDistrictTitle(contest) {\n  return `${contest.office} ${\n    contest.office === 'President' ||\n    contest.division_type === 'class' ||\n    contest.division_type === 'statewide'\n      ? ''\n      : contest.division_type === 'place' && contest.office_division === 1\n      ? 'Chief Justice'\n      : capfirst(contest.division_type) + ' ' + contest.office_division\n  }`.trim();\n}\n\nexport function determineContestTitle(contest) {\n  if (contest.division_type === 'statewide' || contest.division_type === 'seat')\n    return '';\n\n  return determineDistrictTitle(contest);\n}\n\nexport function determineContestTitleYourRaces(contest) {\n  return determineDistrictTitle(contest);\n}\n","/**\n * A wrapper for the initial response from a fetch call that funnels to\n * res.json().\n *\n * @private\n * @param {Response} res\n * @returns {Promise}\n */\nfunction jsonResponse(res) {\n  if (!res.ok) throw new Error(`${res.status}: ${res.statusText}`);\n\n  return res.json();\n}\n\n/**\n * A light wrapper around fetch that assumes you're seeking a JSON response.\n *\n * @param {String|Request} input\n * @param {Object} init\n * @returns {Promise}\n */\nexport default function getJSON(input, init) {\n  return fetch(input, init).then(jsonResponse);\n}\n","const hOP = Object.prototype.hasOwnProperty;\n\n/**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\nfunction is(x: any, y: any): boolean {\n  // SameValue algorithm\n  if (x === y) {\n    // Steps 1-5, 7-10\n    // Steps 6.b-6.e: +0 != -0\n    // Added the nonzero y check to make Flow happy, but it is redundant\n    return x !== 0 || y !== 0 || 1 / x === 1 / y;\n  }\n  // Step 6.a: NaN == NaN\n  return x !== x && y !== y;\n}\n\n/**\n * Performs equality by iterating through keys on an object and returning false\n * when any key has values which are not strictly equal between the arguments.\n * Returns true when the values of all keys are strictly equal.\n */\nfunction shallowEqual(objA: object, objB: object): boolean {\n  if (is(objA, objB)) {\n    return true;\n  }\n\n  if (\n    typeof objA !== 'object' ||\n    objA === null ||\n    typeof objB !== 'object' ||\n    objB === null\n  ) {\n    return false;\n  }\n\n  const keysA = Object.keys(objA);\n  const keysB = Object.keys(objB);\n\n  if (keysA.length !== keysB.length) {\n    return false;\n  }\n\n  // Test for A's keys different from B.\n  for (let i = 0; i < keysA.length; i++) {\n    if (!hOP.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nexport default shallowEqual;\n","// packages\nimport { Component } from 'preact';\n\n// internal\nimport shallowEqual from '../utils/shallow-equal';\n\nabstract class PureComponent<P = {}, S = {}> extends Component<P, S> {\n  shouldComponentUpdate(props, state) {\n    const check =\n      shallowEqual(props, this.props) && shallowEqual(state, this.state);\n    // if (props.projection)\n    //   console.log(\n    //     'projection check:',\n    //     props.projection === this.props.projection,\n    //     !check\n    //   );\n    return !check;\n  }\n}\n\nexport default PureComponent;\n"],"sourceRoot":""}