{"version":3,"sources":["webpack:///./app/scripts/utils/debounce.js","webpack:///./app/scripts/utils/noop.js","webpack:///./app/scripts/components/Typeahead.js","webpack:///./app/scripts/utils/shallow-equal.ts","webpack:///./app/scripts/components/PureComponent.tsx","webpack:///./app/scripts/components/Portal.js","webpack:///./app/scripts/components/Ballots.tsx","webpack:///./app/scripts/components/PartyPill.tsx","webpack:///./app/scripts/components/CandidateRow.tsx","webpack:///./app/scripts/election-utils.ts","webpack:///./app/scripts/components/EachPartyColumn.tsx","webpack:///./app/scripts/utils/get-json.js","webpack:///./app/scripts/utils/legislative-districts.js","webpack:///./app/scripts/utils/find.ts","webpack:///./app/scripts/components/FindYourDistricts.js","webpack:///./app/scripts/packs/graphic.js","webpack:///./config/modern-polyfills.js"],"names":["debounce","func","wait","immediate","timeout","args","context","timestamp","result","later","last","Date","now","setTimeout","apply","this","arguments","callNow","Typeahead","Component","constructor","props","super","state","highlightedIndex","isOpen","handleOnBlur","bind","handleOnClear","handleOnFocus","handleOnInput","debouncedHandleOnInput","debounceDuration","handleKeyDown","setInputRef","setMenuRef","setItemRef","listRefs","_","prevState","componentDidUpdate","count","getFilteredItems","length","Boolean","setState","maybeScrollItemIntoView","element","inputRef","menuRef","idx","itemNode","menuNode","scrollIntoView","onlyScrollIfNeeded","items","shouldItemRender","sortItems","filter","item","value","sort","a","b","highlightItemOnMouseEnter","selectItemOnClick","getItemValue","onSelect","blur","renderList","class","ref","onMouseDown","event","preventDefault","map","cloneElement","renderItem","onClick","onMouseEnter","el","renderAttribution","onClear","onBlur","inputProps","onFocus","target","onChange","keyEvents","key","call","render","renderInput","role","String","autocomplete","onInput","onKeyDown","type","aria-label","aria-hidden","defaultProps","noop","ArrowDown","itemsCount","newIndex","ArrowUp","Enter","keyCode","select","setSelectionRange","Escape","hOP","Object","prototype","hasOwnProperty","is","x","y","shallowEqual","objA","objB","keysA","keys","keysB","i","PureComponent","shouldComponentUpdate","Portal","componentDidMount","renderPortal","componentWillUnmount","defaultNode","document","body","removeChild","node","portal","createElement","appendChild","children","converter","PreactHTMLConverter","Ballots","contest","columnCount","contestTitle","matchingFlag","matchingNote","renderParty","get_races","values","each_party","candidate","IsFlagged","IsNoted","rowClass","cx","href","directory_slug","district","title","xlinkHref","convert","party","visibleCandidatesCount","PartyPill","excludeInitial","style","partyPrefix","slice","toLowerCase","partyInitial","toUpperCase","classes","capfirst","memoize","CandidateRow","ballotName","isIncumbent","scope","contestIsCalled","determineBallotTitle","office","label","trim","EachPartyColumn","partyName","partyBallot","renderCandidate","candidates","colspan","jsonResponse","res","ok","Error","status","statusText","json","LOOKUP_URL","latitude","longitude","lookup","input","init","fetch","then","getJSON","find","arr","predicate","TypeError","sessionToken","google","maps","places","AutocompleteSessionToken","autocompleteService","AutocompleteService","bounds","east","west","south","north","componentRestrictions","country","types","getPredictions","Promise","resolve","reject","getPlacePredictions","predict","id","placeholder","FindYourDistricts","coordinates","data","lookupError","lookupPending","lookedFoundStored","results","handleGeocode","debouncedHandleGeocode","catch","name","placeId","placesService","getDetails","fields","lat","lng","geometry","location","toJSON","PlacesService","contests","flags","notes","addressFeedback","matches","sboe","matchFlag","matchNotes","runMatch","races","chamber","first_level","findByKey","o","toString","getFlag","flagData","NUMERIC_REGEXP","CHAMBER_REGEXP","flagRace","match","word","flagText","us_house","tx_senate","tx_house","for","description","place_id","isHighlighted","src","alt","getElementById","_resultsPortal","candidate_name","incumbent","Ballotdata","Contextdata","flag","querySelector","isMobile","getElementsByClassName","offsetWidth","selectedItem","sessionStorage","getItem","resize","filterSelection","c","querySelectorAll","w3RemoveClass","w3AddClass","arr1","arr2","className","split","indexOf","splice","join","addEventListener","elem","setItem","getBoundingClientRect","top","window","pageYOffset","scrollTo","behavior","left","btnContainer","btns","t","path","composedPath","current","replace","IntersectionObserver","e","toggleAttribute","intersectionRatio","threshold","observe","require"],"mappings":"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","file":"2.815da314a0.mjs","sourcesContent":["export default function debounce(func, wait, immediate) {\n  var timeout, args, context, timestamp, result;\n\n  var later = function() {\n    var last = Date.now() - timestamp;\n\n    if (last < wait && last >= 0) {\n      timeout = setTimeout(later, wait - last);\n    } else {\n      timeout = null;\n      if (!immediate) {\n        result = func.apply(context, args);\n        if (!timeout) context = args = null;\n      }\n    }\n  };\n\n  return function() {\n    context = this;\n    args = arguments;\n    timestamp = Date.now();\n    var callNow = immediate && !timeout;\n    if (!timeout) timeout = setTimeout(later, wait);\n    if (callNow) {\n      result = func.apply(context, args);\n      context = args = null;\n    }\n\n    return result;\n  };\n}\n","export default () => {};\n","// packages\nimport { cloneElement, Component, h } from 'preact';\nimport scrollIntoView from 'dom-scroll-into-view';\n\n// internal\nimport debounce from '../utils/debounce';\nimport noop from '../utils/noop';\n\nclass Typeahead extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      highlightedIndex: null,\n      isOpen: false,\n    };\n\n    this.handleOnBlur = this.handleOnBlur.bind(this);\n    this.handleOnClear = this.handleOnClear.bind(this);\n    this.handleOnFocus = this.handleOnFocus.bind(this);\n    this.handleOnInput = this.handleOnInput.bind(this);\n    this.debouncedHandleOnInput = debounce(\n      this.handleOnInput,\n      this.props.debounceDuration\n    );\n    this.handleKeyDown = this.handleKeyDown.bind(this);\n    this.setInputRef = this.setInputRef.bind(this);\n    this.setMenuRef = this.setMenuRef.bind(this);\n    this.setItemRef = this.setItemRef.bind(this);\n\n    this.listRefs = {};\n  }\n\n  static getDerivedStateFromProps(_, prevState) {\n    if (prevState.highlightedIndex == null) {\n      return { highlightedIndex: 0 };\n    }\n  }\n\n  componentDidUpdate() {\n    const { highlightedIndex } = this.state;\n    const count = this.getFilteredItems(this.props).length;\n\n    if (Boolean(highlightedIndex) && highlightedIndex >= count) {\n      this.setState({ highlightedIndex: 0 });\n    }\n\n    this.maybeScrollItemIntoView();\n  }\n\n  setInputRef(element) {\n    this.inputRef = element;\n  }\n\n  setMenuRef(element) {\n    this.menuRef = element;\n  }\n\n  setItemRef(element, idx) {\n    this.listRefs[`item-${idx}`] = element;\n  }\n\n  maybeScrollItemIntoView() {\n    const { highlightedIndex, isOpen } = this.state;\n\n    if (isOpen && highlightedIndex != null) {\n      const itemNode = this.listRefs[`item-${this.state.highlightedIndex}`];\n      const menuNode = this.menuRef;\n\n      if (itemNode && menuNode) {\n        scrollIntoView(itemNode, menuNode, {\n          onlyScrollIfNeeded: true,\n        });\n      }\n    }\n  }\n\n  getFilteredItems(props) {\n    let { items } = props;\n\n    const { shouldItemRender, sortItems } = props;\n\n    if (shouldItemRender) {\n      items = items.filter(item => shouldItemRender(item, props.value));\n    }\n\n    if (sortItems) {\n      items = items.sort((a, b) => sortItems(a, b, props.value));\n    }\n\n    return items;\n  }\n\n  highlightItemOnMouseEnter(highlightedIndex) {\n    this.setState({ highlightedIndex });\n  }\n\n  selectItemOnClick(item) {\n    const { getItemValue, onSelect } = this.props;\n\n    const value = getItemValue(item);\n\n    this.setState(\n      {\n        highlightedIndex: null,\n        isOpen: false,\n      },\n      () => {\n        this.inputRef.blur();\n        onSelect(value, item);\n      }\n    );\n  }\n\n  renderList() {\n    const { highlightedIndex } = this.state;\n    const props = this.props;\n\n    if (!props.value) return null;\n\n    const items = this.getFilteredItems(props);\n\n    return (\n      <ul\n        class=\"listbox\"\n        ref={this.setMenuRef}\n        onMouseDown={event => event.preventDefault()}\n      >\n        {items.map((item, idx) => {\n          return cloneElement(\n            props.renderItem(item, idx === highlightedIndex),\n            {\n              onClick: () => this.selectItemOnClick(item),\n              onMouseEnter: () => this.highlightItemOnMouseEnter(idx),\n              ref: el => this.setItemRef(el, idx),\n            }\n          );\n        })}\n        {items.length > 0 && props.renderAttribution()}\n      </ul>\n    );\n  }\n\n  handleOnClear(event) {\n    this.setState({ isOpen: false });\n\n    this.props.onClear(event);\n  }\n\n  handleOnBlur() {\n    this.setState({ isOpen: false });\n\n    const { onBlur } = this.props.inputProps;\n    if (onBlur) onBlur(event);\n  }\n\n  handleOnFocus(event) {\n    const { value } = this.props;\n\n    if (value.length > 0) this.setState({ isOpen: true });\n\n    const { onFocus } = this.props.inputProps;\n    if (onFocus) onFocus(event);\n  }\n\n  handleOnInput(event) {\n    const { value } = event.target;\n\n    this.props.onChange(value, event);\n\n    if (value.length <= 0) {\n      this.setState({ highlightedIndex: null });\n    }\n  }\n\n  handleKeyDown(event) {\n    const { isOpen } = this.state;\n\n    if (isOpen && Typeahead.keyEvents[event.key]) {\n      Typeahead.keyEvents[event.key].call(this, event);\n    } else if (!isOpen) {\n      this.setState({ isOpen: true });\n    }\n  }\n\n  render() {\n    const { inputProps, onClear, renderInput, value } = this.props;\n    const { isOpen } = this.state;\n\n    return (\n      <div class=\"typeahead\">\n        <div class=\"typeahead__input-wrapper\">\n          {renderInput({\n            ...inputProps,\n            role: 'combobox',\n            'aria-autocomplete': 'list',\n            'aria-expanded': String(isOpen),\n            autocomplete: 'off',\n            onBlur: this.handleOnBlur,\n            onFocus: this.handleOnFocus,\n            onInput: this.handleOnInput,\n            onKeyDown: this.handleKeyDown,\n            value,\n            ref: this.setInputRef,\n          })}\n          {onClear && value && (\n            <button\n              onClick={this.handleOnClear}\n              type=\"button\"\n              class=\"close\"\n              aria-label=\"Clear\"\n            >\n              <span aria-hidden=\"true\">&times;</span>\n            </button>\n          )}\n        </div>\n        {isOpen && this.renderList()}\n      </div>\n    );\n  }\n}\n\nTypeahead.defaultProps = {\n  debounceDuration: 150,\n  inputProps: {},\n  onChange: noop,\n  onClear: noop,\n  onSelect: noop,\n  renderInput: props => <input {...props} />,\n  value: '',\n};\n\nTypeahead.keyEvents = {\n  ArrowDown(event) {\n    event.preventDefault();\n\n    const items = this.getFilteredItems(this.props);\n    const itemsCount = items.length;\n    if (itemsCount < 1) return;\n\n    const { highlightedIndex } = this.state;\n\n    const newIndex =\n      highlightedIndex < itemsCount - 1\n        ? highlightedIndex + 1\n        : highlightedIndex;\n\n    this.setState({ highlightedIndex: newIndex });\n  },\n\n  ArrowUp(event) {\n    event.preventDefault();\n\n    const items = this.getFilteredItems(this.props);\n    const itemsCount = items.length;\n    if (itemsCount < 1) return;\n\n    const { highlightedIndex } = this.state;\n\n    const newIndex =\n      highlightedIndex > 0 ? highlightedIndex - 1 : highlightedIndex;\n\n    this.setState({ highlightedIndex: newIndex });\n  },\n\n  Enter(event) {\n    // not the right kind of Enter, abort\n    if (event.keyCode !== 13) return;\n\n    const { highlightedIndex, isOpen } = this.state;\n\n    if (!isOpen) {\n      // the menu is not open\n      return;\n    } else if (highlightedIndex == null) {\n      // input has control, but there's nothing selected\n      this.setState({ isOpen: false }, () => this.inputRef.select());\n    } else {\n      // the input has control and we have an item\n      event.preventDefault();\n\n      const item = this.getFilteredItems(this.props)[highlightedIndex];\n      const value = this.props.getItemValue(item);\n\n      this.setState(\n        {\n          highlightedIndex: null,\n          isOpen: false,\n        },\n        () => {\n          this.inputRef.setSelectionRange(value.length, value.length);\n          this.props.onSelect(value, item);\n        }\n      );\n    }\n  },\n\n  Escape() {\n    this.setState({\n      highlightedIndex: null,\n      isOpen: false,\n    });\n  },\n};\n\nexport default Typeahead;\n","const hOP = Object.prototype.hasOwnProperty;\n\n/**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\nfunction is(x: any, y: any): boolean {\n  // SameValue algorithm\n  if (x === y) {\n    // Steps 1-5, 7-10\n    // Steps 6.b-6.e: +0 != -0\n    // Added the nonzero y check to make Flow happy, but it is redundant\n    return x !== 0 || y !== 0 || 1 / x === 1 / y;\n  }\n  // Step 6.a: NaN == NaN\n  return x !== x && y !== y;\n}\n\n/**\n * Performs equality by iterating through keys on an object and returning false\n * when any key has values which are not strictly equal between the arguments.\n * Returns true when the values of all keys are strictly equal.\n */\nfunction shallowEqual(objA: object, objB: object): boolean {\n  if (is(objA, objB)) {\n    return true;\n  }\n\n  if (\n    typeof objA !== 'object' ||\n    objA === null ||\n    typeof objB !== 'object' ||\n    objB === null\n  ) {\n    return false;\n  }\n\n  const keysA = Object.keys(objA);\n  const keysB = Object.keys(objB);\n\n  if (keysA.length !== keysB.length) {\n    return false;\n  }\n\n  // Test for A's keys different from B.\n  for (let i = 0; i < keysA.length; i++) {\n    if (!hOP.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nexport default shallowEqual;\n","// packages\nimport { Component } from 'preact';\n\n// internal\nimport shallowEqual from '../utils/shallow-equal';\n\nabstract class PureComponent<P = {}, S = {}> extends Component<P, S> {\n  shouldComponentUpdate(props, state) {\n    const check =\n      shallowEqual(props, this.props) && shallowEqual(state, this.state);\n    // if (props.projection)\n    //   console.log(\n    //     'projection check:',\n    //     props.projection === this.props.projection,\n    //     !check\n    //   );\n    return !check;\n  }\n}\n\nexport default PureComponent;\n","import { Component, 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","// packages\nimport cx from 'classnames';\nimport { capfirst, intcomma } from 'journalize';\nimport { Component, h } from 'preact';\nimport { PreactHTMLConverter } from 'preact-html-converter';\n\n\n\n// internal\nimport { sort_candidates_by_party, changePartyName } from '../election-utils';\n\ntype Props = {\n  contest: { [key: string]: any };\n  columnCount: number;\n  contestTitle: string;\n  renderParty: any;\n  matchingFlag: { [key: string]: any };\n  matchingNote: { [key: string]: any };\n  visibleCandidatesCount?: number;\n};\n\nconst converter = PreactHTMLConverter();\n\nclass Ballots extends Component<Props> {\n  render() {\n    const {\n      contest,\n      columnCount,\n      contestTitle,\n      matchingFlag,\n      matchingNote,\n      renderParty,\n    } = this.props;\n\n\n    let get_races = contest.values;\n\n    let each_party = get_races.map((candidate: any) => candidate);\n\n\n    const IsFlagged = (matchingFlag[0]) ? true : false;\n\n    const IsNoted= (matchingNote[0]) ? true : false;\n\n\n    const rowClass = cx('seat__title', {\n        'flagged': IsFlagged == true,\n      });\n   \n\n    return (\n      <div class=\"seat\">\n        {IsFlagged == true && (\n          <div class=\"seat__flag\">\n            <span class=\"office__flag\">\n              <span class=\"gold-star\">★</span>Race to watch\n            </span>\n            <h3 class={rowClass}>\n              {contestTitle}\n              <a\n                href={`https://www.texastribune.org/directory/districts/${get_races[0].values[0].directory_slug}/${get_races[0].values[0].district}`}\n          title=\"Click to learn more about this district\"\n                    >\n                <span class=\"icon-div\">\n                  <svg class=\"icon icon-info\">\n                                <use xlinkHref=\"#icon-info\"></use>\n                  </svg>\n                   </span>\n                       </a>\n            </h3>\n            <p class=\"seat__flag__text\">\n              {converter.convert(matchingFlag[1].value)}\n            </p>\n          </div>\n        )}\n        {IsFlagged == false && (\n          <h3 class={rowClass}>\n            {contestTitle}\n            <a\n              href={`https://www.texastribune.org/directory/districts/${get_races[0].values[0].directory_slug}/${get_races[0].values[0].district}`}\n              title=\"Click to learn more about this district\"\n            >\n              <span class=\"icon-div\">\n                <svg class=\"icon icon-info\">\n                                    <use xlinkHref=\"#icon-info\"></use>\n                </svg>\n              </span>\n            </a>\n          </h3>\n        )}\n\n        <div class=\"seat__races\">\n          {each_party.map((party: any) => renderParty(party))}\n        </div>\n\n        {IsNoted == true && (\n          <p class=\"note__text\">{converter.convert(matchingNote[1].value)}</p>\n        )}\n      </div>\n    );\n  }\n}\n\nBallots.defaultProps = {\n  visibleCandidatesCount: 3,\n  columnCount: 2,\n};\n\nexport default Ballots;\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 }) => party);\n","import cx from 'classnames';\nimport { capfirst, intcomma } from 'journalize';\nimport { Component, h, VNode } from 'preact';\n\nimport PartyPill from './PartyPill';\nimport PureComponent from './PureComponent';\n\ninterface Props {\n  ballotName: string;\n  candidateId: string;\n  contestIsCalled: boolean;\n  isIncumbent: boolean;\n  isWinner: boolean;\n  party: string;\n  totalVotesInContest: number;\n  votes: number;\n}\n\nclass CandidateRow extends Component<Props> {\n  render() {\n    const { ballotName, party, isIncumbent } = this.props;\n\n    return (\n      <tr class=\"candidate race__candidate-row\">\n        <td class=\"candidate__cell candidate__party\">\n          <PartyPill party={party} />\n        </td>\n\n        <th scope=\"row\" class=\"candidate__cell candidate__name\">\n          {ballotName}{' '}\n          {isIncumbent == 'Yes' && (\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};\n\nexport default CandidateRow;\n","import { capfirst } from 'journalize';\n\nconst PARTY_SORT_ORDER = [\n  'democrat',\n  'republican',\n  'libertarian',\n  'independent',\n  'write-in',\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} - ${capfirst(contest.division_type)} ${\n    contest.division_type === 'statewide' ? '' : contest.district\n  }`.trim();\n}\n\nexport function determineContestTitle(contest) {\n  if (contest.division_type === 'statewide') return 'Statewide';\n\n  return determineDistrictTitle(contest);\n}\n\nexport function determineBallotTitle(contest) {\n  var office = contest.values[0].values[0].office;\n  var label = contest.values[0].values[0].label;\n  var district = contest.values[0].values[0].district;\n\n  return `${office} ${capfirst(label)} ${\n    label === 'statewide' ? '' : district\n  }`.trim();\n}\n\nexport function changePartyName(contest) {\n  var name = contest == 'Democratic' ? 'Democrat' : 'Republican';\n  return name;\n}\n  ","import cx from 'classnames';\nimport { capfirst, intcomma } from 'journalize';\nimport { Component, h } from 'preact';\n\nimport PartyPill from './PartyPill';\nimport PureComponent from './PureComponent';\n\n// internal\nimport { sort_candidates_by_party, changePartyName } from '../election-utils';\n\ninterface Props {\n  partyName: string;\n  partyBallot: { [key: string]: any };\n  renderCandidate: any;\n}\n\nclass EachPartyColumn extends Component<Props> {\n  render() {\n    const { partyName, partyBallot, renderCandidate } = this.props;\n\n    let get_candidates = partyBallot.values\n\n    let candidates =  get_candidates.map((candidate: any) => candidate);\n\n    const rowClass = cx('seat__race', {\n      'seat__race--Democrat': partyName == \"Democratic\",\n      'seat__race--Republican': partyName == \"Republican\",\n    });\n\n    return (\n      <div class={rowClass}>\n        <div class=\"race\">\n          <h4 class=\"race__title\">{changePartyName(partyName)}</h4>\n          <table class=\"race__candidates\">\n   <thead>\n     <tr>\n       <th scope=\"col\" class=\"race__candidate-header\" colspan=\"2\">\n               Candidates\n       </th>\n         </tr>\n     </thead>\n   <tbody>\n   {candidates.map((candidate: any) =>\n                   renderCandidate(candidate)\n                 )}\n\n   </tbody>\n   </table>\n        </div>\n      </div>\n    );\n  }\n}\n\nEachPartyColumn.defaultProps = {};\n\nexport default EachPartyColumn;\n","/**\n * A wrapper for the initial response from a fetch call that funnels to\n * res.json().\n *\n * @private\n * @param {Response} res\n * @returns {Promise}\n */\nfunction jsonResponse(res) {\n  if (!res.ok) throw new Error(`${res.status}: ${res.statusText}`);\n\n  return res.json();\n}\n\n/**\n * A light wrapper around fetch that assumes you're seeking a JSON response.\n *\n * @param {String|Request} input\n * @param {Object} init\n * @returns {Promise}\n */\nexport default function getJSON(input, init) {\n  return fetch(input, init).then(jsonResponse);\n}\n","import getJSON from './get-json';\n\nconst LOOKUP_URL = ({ latitude, longitude }) =>\n  `https://dv-dev.texastribune.org/legislative-lookup/?latitude=${latitude}&longitude=${longitude}`;\n\nexport function lookup({ latitude, longitude }) {\n  return getJSON(LOOKUP_URL({ latitude, longitude }));\n}\n","/**\n * A for-loop version of Array.prototype.find so IE and friends can play.\n *\n * @private\n * @param  {Array} arr\n * @param  {Function} predicate\n * @return {*|undefined}\n * @throws {TypeError} Argument predicate must be a function\n */\nexport default function find(\n  arr: Array<any>,\n  predicate: Function\n): any | undefined {\n  if (typeof predicate !== 'function') {\n    throw new TypeError('predicate must be a function');\n  }\n\n  for (let i = 0; i < arr.length; i++) {\n    if (predicate(arr[i], i, arr)) {\n      return arr[i];\n    }\n  }\n\n  return undefined;\n}\n","import cx from 'classnames';\nimport { get, set } from '../vendor/idb-keyval';\nimport { h } from 'preact';\n\n// components\nimport Typeahead from './Typeahead';\nimport PureComponent from './PureComponent';\nimport Portal from './Portal';\nimport Ballots from './Ballots';\nimport CandidateRow from './CandidateRow';\nimport EachPartyColumn from './EachPartyColumn';\n\n// local\nimport debounce from '../utils/debounce';\nimport { lookup } from '../utils/legislative-districts';\nimport find from '../utils/find';\nimport { determineBallotTitle } from '../election-utils';\n\nconst sessionToken = new google.maps.places.AutocompleteSessionToken();\nconst autocompleteService = new google.maps.places.AutocompleteService();\n\nconst bounds = {\n  east: -93.514764,\n  west: -106.662177,\n  south: 25.843902,\n  north: 36.500199,\n};\n\nconst componentRestrictions = { country: 'us' };\nconst types = ['geocode'];\n\nconst getPredictions = input => {\n  return new Promise((resolve, reject) => {\n    autocompleteService.getPlacePredictions(\n      { bounds, componentRestrictions, input, sessionToken, types },\n      (predict, status) => {\n        if (status === 'OK') resolve(predict);\n\n        reject(new Error('No results found.'));\n      }\n    );\n  });\n};\n\nconst inputProps = {\n  id: 'address-input',\n  class: 'address-input__input',\n  placeholder: '1010 Colorado St, Austin, TX, 78701',\n};\n\n// always render what's provided, the geocoder decides\nconst shouldItemRender = () => true;\n\nclass FindYourDistricts extends PureComponent {\n  constructor() {\n    super();\n\n    this.state = {\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  }\n\n  onClear(value) {\n    this.setState({ value: '' });\n  }\n\n  onChange(value) {\n    this.setState({ value }, this.debouncedHandleGeocode);\n  }\n\n  handleGeocode() {\n    const { value: input } = this.state;\n\n    getPredictions(input)\n      .then(results => this.setState({ results }))\n      .catch(() => this.setState({ results: [] }));\n  }\n\n  onSelect({ name, placeId }) {\n    const { onSelect } = this.props;\n    this.setState({ lookupError: false, lookupPending: true, value: name });\n\n    this.placesService.getDetails(\n      {\n        fields: ['geometry.location'],\n        placeId,\n        sessionToken,\n      },\n      result => {\n        const {\n          lat: latitude,\n          lng: longitude,\n        } = result.geometry.location.toJSON();\n\n        const coordinates = { latitude, longitude };\n\n        lookup(coordinates)\n          .then(({ data }) =>\n            this.setState(\n              {\n                coordinates,\n                data,\n                lookupPending: false,\n                lookedFoundStored: false,\n              },\n              // () => set('your-races-lookup', data)\n            )\n          )\n          .catch(() =>\n            this.setState({\n              data: null,\n              lookupError: true,\n              lookupPending: false,\n            })\n          );\n      }\n    );\n  }\n\n  componentDidMount() {\n    this.placesService = new google.maps.places.PlacesService(this.inputRef);\n\n    // get('your-races-lookup').then(data => {\n    //   if (data != null) {\n    //     this.setState({ data, lookedFoundStored: true });\n    //   }\n    // });\n  }\n\n  render() {\n    const { contests, flags, notes } = this.props;\n\n    const {\n      coordinates,\n      data,\n      lookupError,\n      lookupPending,\n      lookedFoundStored,\n      results,\n      value,\n    } = this.state;\n\n    let addressFeedback = null;\n\n    const matches = {\n      'us-house': null,\n      sboe: null,\n      'tx-senate': null,\n      'tx-house': null,\n    };\n\n    const matchFlag = {\n      'us-house': null,\n      sboe: null,\n      'tx-senate': null,\n      'tx-house': null,\n    };\n\n    const matchNotes = {\n      'us-house': null,\n      sboe: null,\n      'tx-senate': null,\n      'tx-house': null,\n    };\n\n    if (data) {\n      matches['us-house'] = runMatch(\n        contests,\n        'U.S. House',\n        data.us_house.district\n      );\n      matches['sboe'] = runMatch(\n        contests,\n        'State Board Of Education',\n        data.sboe.district\n      );\n      matches['tx-senate'] = runMatch(\n        contests,\n        'Texas Senate',\n        data.tx_senate.district\n      );\n      matches['tx-house'] = runMatch(\n        contests,\n        'Texas House',\n        data.tx_house.district\n      );\n\n      matchFlag['us-house'] = getFlag(\n        data.us_house.district,\n        'u-s-house',\n        flags\n      );\n\n      matchFlag['sboe'] = getFlag(\n        data.sboe.district,\n        'state-board-of-education',\n        flags\n      );\n\n      matchFlag['tx-senate'] = getFlag(\n        data.tx_senate.district,\n        'texas-senate',\n        flags\n      );\n\n      matchFlag['tx-house'] = getFlag(\n        data.tx_house.district,\n        'texas-house',\n        flags\n      );\n\n      matchNotes['us-house'] = getFlag(\n        data.us_house.district,\n        'u-s-house',\n        notes\n      );\n\n      matchNotes['sboe'] = getFlag(\n        data.sboe.district,\n        'state-board-of-education',\n        notes\n      );\n\n      matchNotes['tx-senate'] = getFlag(\n        data.tx_senate.district,\n        'texas-senate',\n        notes\n      );\n\n      matchNotes['tx-house'] = getFlag(\n        data.tx_house.district,\n        'texas-house',\n        notes\n      );\n\n      // Also add notes\n    }\n\n    function runMatch(races, chamber, district) {\n      var first_level;\n      first_level = findByKey(races, chamber);\n      return findByKey(first_level.values, district);\n    }\n\n    function findByKey(o, id) {\n      var o2 = find(o, contest => contest.key === id.toString());\n      return o2;\n    }\n\n    function getFlag(data, chamber, flagData) {\n      const NUMERIC_REGEXP = /\\d+$/; // Get the numberic district numbers\n      const CHAMBER_REGEXP = /^.*(?=(\\D))/; // Get the slugs for the chambers, should match the variable chamber\n\n      // Get the regexed versions of the chambers\n      const regexChamber = flagData.map(x => x.type.match(CHAMBER_REGEXP));\n\n      // filter out the chamber in question\n      const filtered = regexChamber.filter(word => word[0] === chamber);\n\n      //Only look for district numbers in the filtered out chamber array\n      const regexNum = filtered.map(x => x.input.match(NUMERIC_REGEXP));\n\n      // Find the matching distric numbers for each district in the array, there should only be one!!!\n      const flagRace = find(regexNum, contest => contest[0] === String(data));\n\n      //Find the flag text that matches that one;\n      const flagText = find(\n        flagData,\n        contest => flagRace && contest.type === flagRace.input\n      );\n\n      return [flagRace, flagText];\n    }\n\n    if (lookupPending) {\n      addressFeedback = (\n        <p class=\"copy copy--sans text-center font-italic\">\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=\"copy copy--sans text-center font-italic\">\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=\"copy copy--sans text-center font-italic\">\n          We found your information! The ballot information has been\n          personalized for you.\n        </p>\n      );\n    }\n\n    if (lookedFoundStored && !lookupPending && !lookupError) {\n      addressFeedback = (\n        <p class=\"copy copy--sans text-center font-italic\">\n          Welcome back! Your browser cached the address you looked up on your\n          last visit. Here are the districts we told you about last time.\n        </p>\n      );\n    }\n\n    return (\n      <div class=\"address-input\">\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          })}\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\n                src=\"https://apps.texastribune.org/features/2019/2020-primary-election-ballot/assets/images/powered-by-google-60e8a8323a.png\"\n                alt=\"Powered by Google\"\n              />\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        {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              <Ballots\n                key={matches['us-house'].key}\n                contest={matches['us-house']}\n                contestTitle={determineBallotTitle(matches['us-house'])}\n                matchingFlag={matchFlag['us-house']}\n                matchingNote={matchNotes['us-house']}\n                renderParty={party => (\n                  <EachPartyColumn\n                    partyName={party.key}\n                    partyBallot={party}\n                    renderCandidate={candidate => (\n                      <CandidateRow\n                        ballotName={candidate.candidate_name}\n                        party={candidate.party}\n                        isIncumbent={candidate.incumbent}\n                      />\n                    )}\n                  />\n                )}\n              />\n              {matches['sboe'] && (\n                <Ballots\n                  key={matches['sboe'].key}\n                  contest={matches['sboe']}\n                  contestTitle={determineBallotTitle(matches['sboe'])}\n                  matchingFlag={matchFlag['sboe']}\n                  matchingNote={matchNotes['sboe']}\n                  renderParty={party => (\n                    <EachPartyColumn\n                      partyName={party.key}\n                      partyBallot={party}\n                      renderCandidate={candidate => (\n                        <CandidateRow\n                          ballotName={candidate.candidate_name}\n                          party={candidate.party}\n                          isIncumbent={candidate.incumbent}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              )}\n              {matches['tx-senate'] && (\n                <Ballots\n                  key={matches['tx-senate'].key}\n                  contest={matches['tx-senate']}\n                  contestTitle={determineBallotTitle(matches['tx-senate'])}\n                  matchingFlag={matchFlag['tx-senate']}\n                  matchingNote={matchNotes['tx-senate']}\n                  renderParty={party => (\n                    <EachPartyColumn\n                      partyName={party.key}\n                      partyBallot={party}\n                      renderCandidate={candidate => (\n                        <CandidateRow\n                          ballotName={candidate.candidate_name}\n                          party={candidate.party}\n                          isIncumbent={candidate.incumbent}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              )}\n              <Ballots\n                key={matches['tx-house'].key}\n                contest={matches['tx-house']}\n                contestTitle={determineBallotTitle(matches['tx-house'])}\n                matchingFlag={matchFlag['tx-house']}\n                matchingNote={matchNotes['tx-house']}\n                renderParty={party => (\n                  <EachPartyColumn\n                    partyName={party.key}\n                    partyBallot={party}\n                    renderCandidate={candidate => (\n                      <CandidateRow\n                        ballotName={candidate.candidate_name}\n                        party={candidate.party}\n                        isIncumbent={candidate.incumbent}\n                      />\n                    )}\n                  />\n                )}\n              />\n            </div>\n          </Portal>\n        )}\n      </div>\n    );\n  }\n}\n\nFindYourDistricts.defaultProps = {\n  onSelect: () => {},\n};\n\nexport default FindYourDistricts;\n","import _ from 'lodash';\n\nimport { h, render } from 'preact';\nimport FindYourDistricts from '../components/FindYourDistricts';\nimport Ballotdata from '../../../data/data.json';\nimport Contextdata from '../../../data/text.json';\n\n// main code for feature graphics\n\nfunction onSelect(data) {}\n\nrender(\n  <FindYourDistricts\n    onSelect={onSelect}\n    contests={Ballotdata}\n    flags={Contextdata.flag}\n    notes={Contextdata.notes}\n  />,\n  document.getElementById('lookup-select')\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\nfunction resize() {\n  // code executed on window resize\n}\n\n// call resize on load\nresize();\nwindow.addEventListener('resize', _.debounce(resize, 200));\n\nfilterSelection('all');\nfunction filterSelection(c, id) {\n  var x, i;\n  x = document.querySelectorAll('#' + String(id) + ' > .seat');\n\n  // Add the \"show\" class (display:block) to the filtered elements, and remove the \"show\" class from the elements that are not selected\n  for (i = 0; i < x.length; i++) {\n    if (c == 'all') {\n      w3RemoveClass(x[i], 'remove');\n    } else {\n      w3RemoveClass(x[i], 'remove');\n      if (x[i].getElementsByClassName('office__flag').length == 0)\n        w3AddClass(x[i], 'remove');\n    }\n  }\n}\n\n// Show filtered elements\nfunction w3AddClass(element, name) {\n  var i, arr1, arr2;\n  arr1 = element.className.split(' ');\n  arr2 = name.split(' ');\n  for (i = 0; i < arr2.length; i++) {\n    if (arr1.indexOf(arr2[i]) == -1) {\n      element.className += ' ' + arr2[i];\n    }\n  }\n}\n\n// Hide elements that are not selected\nfunction w3RemoveClass(element, name) {\n  var i, arr1, arr2;\n  arr1 = element.className.split(' ');\n  arr2 = name.split(' ');\n  for (i = 0; i < arr2.length; i++) {\n    while (arr1.indexOf(arr2[i]) > -1) {\n      arr1.splice(arr1.indexOf(arr2[i]), 1);\n    }\n  }\n  element.className = arr1.join(' ');\n}\n\n// Add active class to the current control button (highlight it)\nvar btnContainer = document.querySelectorAll('#btnGroup');\n\nfor (var i = 0; i < btnContainer.length; i++) {\n  var btns = btnContainer[i].getElementsByClassName('button');\n\n  for (var t = 0; t < btns.length; t++) {\n    btns[t].addEventListener('click', function(event) {\n      var path =\n        event.path ||\n        (event.composedPath && event.composedPath()) ||\n        composedPath(event.target);\n      var currentParent = document.querySelector(\n        '#btnGroup.' + path[1].className\n      );\n      var current = currentParent.getElementsByClassName('active');\n      current[0].className = current[0].className.replace(' active', '');\n      this.className += ' active';\n      filterSelection(this.value, path[2].id);\n    });\n  }\n}\n\n// Added a function to tell when the sticky bar is stuck so that we can hide the \"See who's running for:\" for mobile.\n\nconst observer = new IntersectionObserver(\n  ([e]) => e.target.toggleAttribute('stuck', e.intersectionRatio < 1),\n  { threshold: [1] }\n);\n\nobserver.observe(document.querySelector('#sticky-bar'));\n","'use strict';\n\n// We depend on intersection-observer enough that it should just be assumed as necessary\nrequire('intersection-observer');\n"],"sourceRoot":""}