{"version":3,"sources":["webpack:///./config/modern-polyfills.js","webpack:///./app/scripts/election-utils.ts","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/shallow-equal.ts","webpack:///./app/scripts/components/PureComponent.tsx","webpack:///./app/scripts/utils/debounce.js","webpack:///./app/scripts/utils/noop.js","webpack:///./app/scripts/components/Typeahead.js","webpack:///./app/scripts/utils/get-json.js","webpack:///./app/scripts/components/CountyInfo.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"],"names":["require","timer","chunk","arr","size","reduce","acc","_","i","push","slice","delay","callback","ms","clearTimeout","setTimeout","PARTY_SORT_ORDER","TT_directory_slugs","office","determineDistrictTitle","contest","concat","division_type","office_division","capfirst","trim","determineContestTitle","determineContestTitleYourRaces","window","ttData","relatedContentContainer","document","getElementById","related_category","then","_ref","default","RelatedContent","render","h","title","_ref2","AdLoader","init","PartyPill","excludeInitial","party","style","partyPrefix","toLowerCase","partyInitial","toUpperCase","classes","cx","class","defaultProps","memoize","CandidateRow","Component","ballotName","isIncumbent","this","props","rowClass","IsAsterisk","_defineProperty","contestIsCalled","isViewable","Header","colSpan","columnCount","EmptyTable","converter","PreactHTMLConverter","Contest","onePrimaryParty","directory_slug","contestTitle","isShowcaseRace","redistrictingNote","notes","renderParty","onePrimary","length","IsNoted","filter","slug","href","xlinkHref","map","index","convert","value","includeCountyRundown","SeatPartyDivider","constructor","super","state","viewAllCandidates","partyName","annotations","partyBallot","tableHeader","renderCandidate","candidates","candidacies","sort","a","b","indexOf","sort_candidates_by_party","candidate","idx","isHomepage","Portal","componentDidMount","renderPortal","componentWillUnmount","defaultNode","body","removeChild","node","portal","componentDidUpdate","createElement","appendChild","children","hOP","Object","prototype","hasOwnProperty","is","x","y","shallowEqual","objA","objB","keysA","keys","keysB","call","PureComponent","shouldComponentUpdate","debounce","func","wait","immediate","timeout","args","context","timestamp","result","later","last","Date","now","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","itemNode","menuNode","scrollIntoView","onlyScrollIfNeeded","items","shouldItemRender","sortItems","item","highlightItemOnMouseEnter","selectItemOnClick","getItemValue","onSelect","blur","renderList","ref","onMouseDown","event","preventDefault","cloneElement","renderItem","onClick","onMouseEnter","el","renderAttribution","onClear","onBlur","inputProps","onFocus","target","onChange","keyEvents","key","renderInput","_objectSpread","role","String","autocomplete","onInput","onKeyDown","type","aria-label","aria-hidden","noop","ArrowDown","itemsCount","newIndex","ArrowUp","Enter","keyCode","select","setSelectionRange","Escape","jsonResponse","res","ok","Error","status","statusText","json","getJSON","input","fetch","CountyInfo","data","isLoaded","fetchAddress","prevProps","fips","county","replace","counties","getElementsByClassName","display","admin_title","name","web_site","phone_number","elementId","googleIMG","getAttribute","JSON","parse","textContent","asset_url","PlacesLib","bounds","east","west","south","north","YourRaces","contests","coordinates","lookupError","lookupPending","lookedFoundStored","results","handleGeocode","debouncedHandleGeocode","sessionToken","AutocompleteSessionToken","async","request","locationRestriction","includedPrimaryTypes","region","suggestions","AutocompleteSuggestion","fetchAutocompleteSuggestions","s","id","placePrediction","placeId","description","text","toString","place_id","_prediction","getPredictions","e","place","toPlace","Place","fetchFields","fields","latLng","location","latitude","lat","longitude","lng","includeGeography","LOOKUP_URL","lookup","catch","google","maps","importLibrary","addressFeedback","directoryUrl","matches","sboe","noteMatches","us_house","district","tx_senate","tx_house","for","placeholder","isHighlighted","src","alt","_extends","_resultsPortal","office_slug","candidateId","is_incumbent","Ad","App","fetchData","seats_mapped","number","array","propertyName","texasHouseGroups","usHouseGroups","unique_seats","findIndex","texasHouse","usHouse","_yourPortal","querySelector","_usPortal","contestGroup","_supremePortal","_sboePortal","_crimPortal","_senatePortal","_housePortal","loadJsonScript","isMobile","offsetWidth","selectedItem","sessionStorage","getItem","addEventListener","elem","setItem","getBoundingClientRect","top","pageYOffset","scrollTo","behavior","left","IntersectionObserver","toggleAttribute","intersectionRatio","threshold","observe"],"mappings":"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","file":"main.56bc14f893.mjs","sourcesContent":["'use strict';\n\n// We depend on intersection-observer enough that it should just be assumed as necessary\nrequire('intersection-observer');\n","var journalize = require('journalize');\n\nimport { capfirst } from 'journalize';\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 \n\nconst PARTY_SORT_ORDER = [\n  'democrat',\n  'republican',\n  'libertarian',\n  'independent',\n  'write-in',\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_by_party(candidates) {\n  return candidates.sort(\n    (a, b) =>\n      PARTY_SORT_ORDER.indexOf(a.party) - PARTY_SORT_ORDER.indexOf(b.party)\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}","import { h, render } from 'preact';\nimport {\n  delay,\n} 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 title={'Read more'} related_category={window.ttData.related_category} />,\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}));","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 {\n      ballotName,\n      isIncumbent,\n      party,\n    } = this.props;\n\n    let divStyle;\n\n    let rowClass = cx('candidate', 'contest__candidate-row');\n\n    const IsAsterisk =\n      ballotName == 'Andrew White' ||\n      ballotName == 'Jay Nagy'\n        ? true\n        : false;\n\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\n\nCandidateRow.columnCount = 2;\n\nexport default CandidateRow;","import { h } from 'preact';\nimport cx from 'classnames';\n// import 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\"></table> */}\n        <div class=\"no_primary no_primary_candidates\">No primary candidates running</div>\n      </div>\n  \n    \n  );\n};\n\nexport default EmptyTable;","import { Component, h } from 'preact';\nimport { PreactHTMLConverter } from 'preact-html-converter';\n\n// components\nimport EmptyTable from './EmptyTable';\n\n// internal\nimport {\n  get_directory_slug,\n} from '../election-utils';\n\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};\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    } = 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\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\n    return (\n      <div class=\"seat\">\n        \n         {!isShowcaseRace && contest && (\n              <h3 class=\"seat__title\">\n                <span>{contestTitle}</span>\n                {/* Let's not show U.S. House directory links because the redistricting boundaries have changed and will be reflected in our directory in 2027 */}\n                {directory_slug[0] != null && contest[0].office != 'U.S. House'  && (\n              <a class=\"t-links-unset\"\n                href={`https://directory.texastribune.org/districts/${directory_slug[0]['directory-slug']}/${contest[0]['office_division']}/`}\n              >\n                <span class=\"icon-div\" title=\"Click to learn more about this district\">\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\">Newly drawn <a href=\"https://www.texastribune.org/2025/09/04/2025-texas-redistricting-maps/\">in 2025</a></div>\n            )}\n              </h3>\n              \n            )}\n            \n        <div class='seat__races'>\n          {onePrimary && onePrimaryParty == 'Republican' && (\n            <EmptyTable party={'Democrat'}/>       )}\n          {contest.map((party: any, index) => renderParty(party, index))}\n          {onePrimary && onePrimaryParty == 'Democrat' && (\n            <EmptyTable party={'Republican'}/>       )}\n        </div>\n        {IsNoted == true && (\n            <p class=\"note__text note__text__both-parties\">{converter.convert(notes[0].value)}</p>\n          )}\n      </div>\n      \n    );\n  }\n}\n\nContest.defaultProps = {\n  isShowcaseRace: false,\n  includeCountyRundown: false,\n};\n\nexport default Contest;","import cx from 'classnames';\nimport { Component, h } from 'preact';\n\nimport { PreactHTMLConverter } from 'preact-html-converter';\n\n// internal\nimport {\n  sort_candidates_by_party,\n} 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\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\n    let candidates = partyBallot.candidacies;\n\n    if (partyBallot <= 0) {\n      candidates = sort_candidates_by_party(candidates);\n    }\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        <div class=\"race\">\n            <span>\n              <h4 class=\"race__title\">{partyName} </h4>\n            </span>\n          </div>\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;","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","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;","// 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;","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 () => {};","// 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 * 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","import { h } from 'preact';\nimport getJSON from '../utils/get-json';\nimport PureComponent from './PureComponent';\n\nimport { PreactHTMLConverter } from 'preact-html-converter';\n\nimport counties from '../../../data/counties.json';\n\nconst converter = PreactHTMLConverter();\n\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    let data = counties['counties'].filter((item) => item.county.toLowerCase().replace(/\\s+/g, '') == slug)[0];\n\n    this.setState({ data, isLoaded: true });\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       \n            {data.admin_title} {converter.convert(data.name)}\n          </span>\n          . To learn more about your local and county races and see a sample 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;","// 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';\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 { suggestions } =\n    await PlacesLib.AutocompleteSuggestion.fetchAutocompleteSuggestions(\n      request\n    );\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    };\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.sessionToken = null;\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\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:\n          typeof latLng.lat === 'function' ? latLng.lat() : latLng.lat,\n        longitude:\n          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  }\n\n  async componentDidMount() {\n\n    // New: load the modern Places library classes\n    // eslint-disable-next-line no-undef\n    PlacesLib = await google.maps.importLibrary('places');\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\n  render() {\n    const { contests, notes } = this.props;\n    const {\n      coordinates,\n      data,\n      lookupError,\n      lookupPending,\n      results,\n      value,\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\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 ===\n            '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-' +\n              data.sboe.district \n      );\n\n      noteMatches['tx-senate'] = notes.filter(\n        contest =>\n          contest.type ===\n            'texas-senate-district-' + data.tx_senate.district \n      );\n\n      noteMatches['tx-house'] = notes.filter(\n        contest =>\n          contest.type ===\n            'texas-house-district-' + data.tx_house.district\n      );\n\n\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={(\n                      candidate,\n                      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              {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={(\n                        candidate,\n                        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 class=\"seat\"><span><h3 class=\"seat__title\">Texas Senate {data['tx_senate']['district']} <a class=\"t-links-unset\"\n              href={`${directoryUrl}tx-senate/${data['tx_senate']['district']}/`}\n            >\n              <span class=\"icon-div\" title=\"Click to learn more about this district\">\n                <svg class=\"icon icon-info\">\n                  <use xlinkHref=\"#icon-info\"></use>\n                </svg>\n              </span>\n            </a></h3></span>\n              \n              <div class=\"no_primary\">Seat is not up for election this year.</div>\n              </div>}\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={(\n                      candidate,\n                      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              {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={(\n                        candidate,\n                        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 class=\"seat\"><span><h3 class=\"seat__title\">State Board of Education {data['sboe']['district']} <a class=\"t-links-unset\"\n              href={`${directoryUrl}sboe/${data['sboe']['district']}`}\n            >\n              <span class=\"icon-div\" title=\"Click to learn more about this district\">\n                <svg class=\"icon icon-info\">\n                  <use xlinkHref=\"#icon-info\"></use>\n                </svg>\n              </span>\n            </a></h3></span>\n              \n              <div class=\"no_primary\">Seat is not up for election this year.</div>\n              </div>\n              }\n            </div>\n          </Portal>\n        )}\n      </div>\n    );\n  }\n}\n\nexport default YourRaces;","/**\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}","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}","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;","// 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\">\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\">\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\">\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\">\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  \n  export default App;","// JSON updated by Republic\nconst FLAT_BALLOT_URL =\n  'https://s3.us-east-1.amazonaws.com/sos-test-2.texastribune.org/2026_primary/ballot_page/results_FLAT_for_ballot.json';\n\nexport {\n  FLAT_BALLOT_URL\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(\n  <App notes={notes} />,\n  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","\nlet 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'));"],"sourceRoot":""}