{"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/election-utils.ts","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","window","ttData","relatedContentContainer","document","getElementById","related_category","then","_ref","default","RelatedContent","render","h","title","_ref2","AdLoader","init","PartyPill","excludeInitial","party","style","partyPrefix","slice","toLowerCase","partyInitial","toUpperCase","classes","cx","concat","class","capfirst","defaultProps","memoize","CandidateRow","Component","ballotName","isIncumbent","this","props","rowClass","IsAsterisk","_defineProperty","contestIsCalled","isViewable","Header","colSpan","columnCount","timer","EmptyTable","chunk","arr","size","reduce","acc","_","i","push","PARTY_SORT_ORDER","TT_directory_slugs","office","determineDistrictTitle","contest","division_type","office_division","trim","determineContestTitle","determineContestTitleYourRaces","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","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","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.a69a46ded5.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';\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\n// ads\nimport(/* webpackChunkName: \"ads\" */ './utils/ad-loader').then(\n  ({ default: AdLoader }) => {\n    const ads = new AdLoader();\n    ads.init();\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;","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 } 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":""}