{"version":3,"sources":["webpack:///./app/scripts/components/BarChart.js","webpack:///./config/modern-polyfills.js","webpack:///./node_modules/moment/locale sync ^\\.\\/.*$","webpack:///./app/scripts/embeds/frames.js","webpack:///./app/scripts/packs/main-statewide.js","webpack:///./app/scripts/utils/debounce.js","webpack:///./app/scripts/components/PureComponent.js","webpack:///../src/utils.mjs","webpack:///../src/constants.mjs","webpack:///../src/framer.mjs","webpack:///../src/frames.mjs"],"names":["BarChart","PureComponent","constructor","super","this","getContainerWidth","bind","createChart","clearContainers","state","breakPoint","base","d3","node","offsetWidth","year","each","d","html","componentDidMount","window","addEventListener","componentDidUpdate","prevProps","props","county","yearData","statewideMax","toggle","frameWidth","bodyWidth","keys","groupedData","category","value","republican","democratic","didnotvote","margin","top","left","right","bottom","height","g","append","attr","chartWidth","labels_g","xAxis","yAxis","chartHeight","x","domain","padding","y","nice","range","call","tickSize","tickFormat","ticks","intcomma","intword","replace","selectAll","data","enter","bandwidth","is_there_sos_data","noData","noDataWidth","noDataHeight","text","tspans","wordwrap","partyLabels","is_election_over","decimalPlaces","percentTurnout","registered_voters","parseFloat","toFixed","getBoundingClientRect","width","render","class","label","require","map","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","e","Error","code","Object","resolve","module","exports","frameLoader","fn","initFrame","repTurnout2022","demTurnout2022","statewideData","statewide","max","toggles","dateObjRep","turnout_rep_by_day","results","forEach","r","push","date","formatted_date","moment","latestDateRep","find","parseInt","county_results","cumulative_votes_in_person_and_mail","replaceAll","dateObjDem","turnout_dem_by_day","latestDateDem","turnout_rep_final","reduce","a","b","total_votes","turnout_dem_final","statewideCharts","sort","document","getElementById","debounce","func","wait","immediate","timeout","args","context","timestamp","result","later","last","Date","now","setTimeout","apply","arguments","callNow","shallowEqual","key","Component","shouldComponentUpdate","const","extend","obj","let","i","EMBED_SIZE","Framer","ref","container","src","allowfullscreen","name","referrerpolicy","sandbox","title","processMessage_","createIframe_","sendFrameHeight","documentElement","offsetHeight","parent","postMessage","sentinel","AMP_SENTINEL","cb","removeEventListener","initFrameAndPoll","delay","setInterval","sendHeightOnPoll","remove","removeChild","iframe","createElement","setAttribute","appendChild","event","source","contentWindow","type","setIframeHeight_"],"mappings":"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","file":"main-statewide.fb9252802b.mjs","sourcesContent":["// packages\nimport { h } from 'preact';\nimport { widont, intcomma, intword } from 'journalize';\nimport debounce from '../utils/debounce';\nimport PureComponent from './PureComponent';\nimport * as d3 from 'd3';\nimport { wordwrap } from 'd3-jetpack';\n\nclass BarChart extends PureComponent {\n  constructor() {\n    super();\n\n    this.getContainerWidth = this.getContainerWidth.bind(this);\n    this.createChart = this.createChart.bind(this);\n    this.clearContainers = this.clearContainers.bind(this);\n\n    this.state = {\n      breakPoint: 664,\n    };\n  }\n\n  getContainerWidth(base) {\n    const body = d3.select(base);\n    const width = body.node().offsetWidth;\n\n    return width;\n    // this.setState({\n    //   width,\n    // });\n  }\n\n  clearContainers(year) {\n    const body = d3.select(`.bar-chart-container-${year}`);\n    body.each(function(d) {\n      d3.select(this).html('');\n    });\n    // base.html('');\n  }\n\n  componentDidMount() {\n    // set up listeners\n    window.addEventListener('resize', this.createChart);\n\n    // initial run\n    this.createChart();\n  }\n\n  componentDidUpdate(prevProps) {\n    if (this.props.county != prevProps.county) {\n      this.createChart();\n    }\n  }\n\n  createChart() {\n    const { yearData, statewideMax, toggle, base } = this.props;\n    const { breakPoint } = this.state;\n\n    let frameWidth = this.getContainerWidth(base),\n      bodyWidth = this.getContainerWidth('body');\n    this.clearContainers(yearData.year);\n\n    // for stacked bars\n    let stackedData = d3\n      .stack()\n      .keys(['republican', 'democratic', 'didnotvote'])([yearData]);\n\n    let groupedData = [\n      {\n        category: 'republican',\n        value: yearData.republican,\n      },\n      {\n        category: 'democratic',\n        value: yearData.democratic,\n      },\n      {\n        category: 'didnotvote',\n        value: yearData.didnotvote,\n      },\n    ];\n\n    let margin = {\n      top: 25,\n      left: 50,\n      right: 10,\n      bottom: 50,\n    };\n\n    let height = 400;\n    if (bodyWidth < breakPoint) height = 300;\n    if (bodyWidth > breakPoint && yearData.year != '2018') margin.left = 10;\n\n    // append svg\n    let svg = d3\n        .select(`.bar-chart-container-${yearData.year}`)\n        .append('svg')\n        .attr('width', frameWidth)\n        .attr('height', height),\n      g = svg\n        .append('g')\n        .attr('class', 'stacked-bar-chart')\n        .attr('width', chartWidth)\n        .attr('transform', `translate(${margin.left},${margin.top})`),\n      labels_g = g.append('g').attr('class', 'labels-container');\n\n    let xAxis = g.append('g').attr('class', 'axis axis--x'),\n      yAxis = g.append('g').attr('class', 'axis axis--y');\n\n    let chartWidth = frameWidth - margin.left - margin.right,\n      chartHeight = height - margin.top - margin.bottom;\n\n    // set ranges\n    let x = d3\n      .scaleBand()\n      .domain(['republican', 'democratic', 'didnotvote']) // [yearData.year] for stacked bar\n      .padding(0.25);\n    let y = d3\n      .scaleLinear()\n      .domain([0, statewideMax])\n      .nice();\n\n    x.range([0, chartWidth]);\n    y.range([chartHeight, 0]);\n\n    xAxis\n      .call(\n        d3\n          .axisBottom(x)\n          .tickSize(0)\n          .tickFormat('')\n      )\n      .attr('transform', `translate(0,${chartHeight})`);\n\n    yAxis.call(\n      d3\n        .axisLeft(y)\n        .ticks(5)\n        .tickSize(-chartWidth)\n        .tickFormat(d => {\n          if (bodyWidth > breakPoint) {\n            if (yearData.year != '2018') return '';\n            else return intcomma(intword(d)).replace(' million', 'M');\n          } else {\n            return intcomma(intword(d)).replace(' million', 'M');\n          }\n        })\n      // .tickSize(0)\n      // .tickFormat('')\n      // .ticks(3)\n      // .tickSize(-chartWidth)\n      // .tickFormat(d => `${d * 100}%`)\n    );\n\n    // grouped bars\n    let barGroups = g\n      .selectAll('rect')\n      .data(groupedData)\n      .enter()\n      .append('rect')\n      .attr('x', function(d) {\n        return x(d.category);\n      })\n      .attr('y', function(d) {\n        return y(d.value);\n      })\n      .attr('width', x.bandwidth())\n      .attr('height', function(d) {\n        return chartHeight - y(d.value);\n      })\n      .attr('fill', d => {\n        if (d.category == 'republican') return '#f2593b';\n        if (d.category == 'democratic') return '#1755c5';\n        if (d.category == 'didnotvote') return '#99a0af';\n      })\n      .attr('display', () => {\n        if (toggle.is_there_sos_data == 'NO' && yearData.year == '2022')\n          return 'none';\n        else return 'initial';\n      });\n\n    if (toggle.is_there_sos_data == 'NO' && yearData.year == '2022') {\n      let noData = g.append('g');\n\n      let noDataHeight = 50,\n        noDataWidth = chartWidth - 20;\n      noData\n        .append('rect')\n        .attr('height', noDataHeight)\n        .attr('width', noDataWidth)\n        .attr('x', chartWidth / 2 - noDataWidth / 2)\n        .attr('y', chartHeight / 2 - noDataHeight / 2)\n        .attr('fill', '#f7f7f7')\n        .attr('opacity', 0.8);\n\n      noData\n        .append('text')\n        .attr('y', chartHeight / 2 - 3)\n        .text('')\n        .tspans(wordwrap('No turnout data is available yet', 20))\n        .attr('x', chartWidth / 2)\n        .attr('text-anchor', 'middle')\n        .attr('class', 'no-data-text');\n    }\n\n    let partyLabels = labels_g\n      .selectAll('g')\n      .data(['republican', 'democratic'])\n      .enter()\n      .append('g')\n      .attr(\n        'transform',\n        d => `translate(${x(d) + x.bandwidth()},${y(0) + 20})`\n      );\n\n    partyLabels\n      .append('circle')\n      .attr('r', 10)\n      .attr('cy', -4.5)\n      .attr('cx', -x.bandwidth() / 2)\n      .attr('class', d => {\n        if (toggle.is_there_sos_data == 'NO' && yearData.year == '2022')\n          return 'gray-circle';\n        else return `${d}-circle`;\n      });\n\n    partyLabels\n      .append('text')\n      .text(d => d[0])\n      .attr('dy', 0)\n      .attr('dx', -x.bandwidth() / 2 - 4)\n      .attr('class', 'circle-text');\n\n    labels_g\n      .append('text')\n      .attr('y', y(0) + 20)\n      .text('')\n      .tspans(\n        wordwrap(\n          yearData.year == '2022' && toggle.is_election_over == 'NO'\n            ? 'Did not vote yet'\n            : 'Did not vote',\n          10\n        )\n      )\n      .attr('x', x('didnotvote') + x.bandwidth() / 2)\n      .attr('text-anchor', 'middle')\n      .attr('class', 'didnotvote-text');\n\n    if (toggle.is_there_sos_data != 'NO' || yearData.year != '2022') {\n      labels_g\n        .selectAll('.percent-text')\n        .data(groupedData)\n        .enter()\n        .append('g')\n        .attr('class', 'percent-text')\n        .attr('transform', d => `translate(0,${y(d.value) - 10})`)\n        .append('text')\n        .text(d => {\n          let percentTurnout = (d.value / yearData.registered_voters) * 100,\n            decimalPlaces;\n          if (percentTurnout < 1) decimalPlaces = 1;\n          else decimalPlaces = 1;\n\n          return `${parseFloat(percentTurnout.toFixed(decimalPlaces))}%`;\n        })\n        .attr('x', function(d) {\n          return (\n            x(d.category) +\n            x.bandwidth() / 2 -\n            d3\n              .select(this)\n              .node()\n              .getBoundingClientRect().width /\n              2\n          );\n        });\n    }\n\n    // stacked bars\n    // let barGroups = g\n    //   .append('g')\n    //   .attr('class', 'bar-groups-container')\n    //   .selectAll('g')\n    //   .data(groupedData) // stackedData for stacked bars\n    //   .enter()\n    //   .append('g')\n    //   .attr('fill', d => {\n    //     if (d.key == 'republican') return '#f2593b';\n    //     if (d.key == 'democratic') return '#1755c5';\n    //     if (d.key == 'didnotvote') return '#99a0af';\n    //   })\n    //   .attr('class', 'bar-groups');\n\n    // let barRects = barGroups\n    //   .selectAll('rect')\n    //   .data(function(d) {\n    //     return d;\n    //   })\n    //   .enter()\n    //   .append('rect');\n\n    // let barWidth = 25;\n    // barRects\n    //   .attr('x', function(d) {\n    //     return x(d.data.year) - (barWidth - x.bandwidth()) / 2;\n    //   })\n    //   .attr('y', function(d) {\n    //     return y(d[1]);\n    //   })\n    //   .attr('height', function(d) {\n    //     let diff = y(d[0]) - y(d[1]);\n    //     if (diff < 0) return 0;\n    //     else return diff;\n    //   })\n    //   .attr('width', barWidth);\n\n    // registered voters label for stacked bars\n    // let registeredVotersLabel = labels_g\n    //   .append('g')\n    //   .datum(yearData)\n    //   .attr('text-anchor', 'end')\n    //   .attr('transform', d => {\n    //     return `translate(${x(d.year) -\n    //       (barWidth - x.bandwidth()) / 2 -\n    //       85}, ${y(d['registered_voters']) + 5})`;\n    //   })\n    //   .attr('class', 'registered-voter-text label');\n\n    // registeredVotersLabel\n    //   .append('text')\n    //   .text(d => intcomma(intword(d['registered_voters'])))\n    //   .style('font-weight', 'bold');\n\n    // registeredVotersLabel\n    //   .append('text')\n    //   .text('registered')\n    //   .attr('dy', 15);\n\n    // registeredVotersLabel\n    //   .append('text')\n    //   .text('voters')\n    //   .attr('dy', 30);\n\n    // party labels for stacked bars\n    // if (yearData.year == 2022) {\n    // let text = 'Data is delayed';\n    // let noDataGroup = labels_g\n    //   .append('g')\n    //   .datum(yearData)\n    //   .attr(\n    //     'transform',\n    //     d =>\n    //       `translate(${x(d.year) - (barWidth - x.bandwidth()) / 2 - 40}, ${y(\n    //         0\n    //       ) - 20})`\n    //   );\n    // noDataGroup\n    //   .append('text')\n    //   .text('')\n    //   .tspans(wordwrap(text, 12))\n    //   .attr('class', 'label');\n    // } else {\n    //   let partyLabels = labels_g\n    //     .append('g')\n    //     .selectAll('g')\n    //     .data(stackedData)\n    //     .enter()\n    //     .append('g')\n    //     .attr('text-anchor', 'start')\n    //     .style('display', d => (d.key == 'didnotvote' ? 'none' : 'initial'));\n\n    //   let partyLabelsGroups = partyLabels\n    //     .selectAll('g')\n    //     .data(function(d) {\n    //       d[0].key = d.key;\n    //       return d;\n    //     })\n    //     .enter()\n    //     .append('g')\n    //     .attr(\n    //       'transform',\n    //       d =>\n    //         `translate(${x(d.data.year) -\n    //           (barWidth - x.bandwidth()) / 2 -\n    //           15}, ${y(d[1]) + 10})`\n    //     );\n\n    //   partyLabelsGroups\n    //     .append('text')\n    //     .text(d => {\n    //       if (d.key != 'didnotvote') {\n    //         return `${parseFloat(\n    //           ((d.data[d.key] / d.data['registered_voters']) * 100).toFixed(1)\n    //         )}%`;\n    //       }\n    //     })\n    //     .style('font-weight', 'bold')\n    //     .attr('class', d => `${d.key}-text label`);\n\n    //   partyLabelsGroups\n    //     .append('circle')\n    //     .attr('r', 10)\n    //     .attr('cy', -4.5)\n    //     .attr('cx', -15)\n    //     .attr('class', d => `${d.key}-circle`);\n\n    //   partyLabelsGroups\n    //     .append('text')\n    //     .text(d => d.key[0])\n    //     .attr('dy', 0)\n    //     .attr('dx', -19)\n    //     .attr('class', 'circle-text');\n    // }\n  }\n\n  render() {\n    const { yearData, toggle } = this.props;\n    return (\n      <div>\n        <div class=\"bar-chart-header\">\n          <p class=\"election-type\">{yearData.label} primary</p>\n          <h1>\n            {yearData.year} turnout{' '}\n            {toggle.is_there_sos_data == 'YES' &&\n            yearData.year == '2022' &&\n            toggle.is_election_over == 'NO' ? (\n              <span class=\"as-of\">after early voting</span> // as of {toggle.day}\n            ) : (\n              <span></span>\n            )}\n          </h1>\n          <p>\n            {yearData.year != '2022' || toggle.is_there_sos_data == 'YES'\n              ? `${parseFloat(\n                  (\n                    parseFloat(\n                      (\n                        (yearData.republican / yearData.registered_voters) *\n                        100\n                      ).toFixed(1)\n                    ) +\n                    parseFloat(\n                      (\n                        (yearData.democratic / yearData.registered_voters) *\n                        100\n                      ).toFixed(1)\n                    )\n                  ).toFixed(1)\n                )}% of `\n              : ''}\n            {intcomma(intword(yearData.registered_voters))}\n          </p>\n          <p>registered voters</p>\n        </div>\n        <div class={`bar-chart-container-${yearData.year} bar-chart`}></div>\n      </div>\n    );\n  }\n}\n\nexport default BarChart;\n","'use strict';\n\n// We depend on intersection-observer enough that it should just be assumed as necessary\nrequire('intersection-observer');\n","var map = {\n\t\"./af\": \"K/tc\",\n\t\"./af.js\": \"K/tc\",\n\t\"./ar\": \"jnO4\",\n\t\"./ar-dz\": \"o1bE\",\n\t\"./ar-dz.js\": \"o1bE\",\n\t\"./ar-kw\": \"Qj4J\",\n\t\"./ar-kw.js\": \"Qj4J\",\n\t\"./ar-ly\": \"HP3h\",\n\t\"./ar-ly.js\": \"HP3h\",\n\t\"./ar-ma\": \"CoRJ\",\n\t\"./ar-ma.js\": \"CoRJ\",\n\t\"./ar-sa\": \"gjCT\",\n\t\"./ar-sa.js\": \"gjCT\",\n\t\"./ar-tn\": \"bYM6\",\n\t\"./ar-tn.js\": \"bYM6\",\n\t\"./ar.js\": \"jnO4\",\n\t\"./az\": \"SFxW\",\n\t\"./az.js\": \"SFxW\",\n\t\"./be\": \"H8ED\",\n\t\"./be.js\": \"H8ED\",\n\t\"./bg\": \"hKrs\",\n\t\"./bg.js\": \"hKrs\",\n\t\"./bm\": \"p/rL\",\n\t\"./bm.js\": \"p/rL\",\n\t\"./bn\": \"kEOa\",\n\t\"./bn-bd\": \"loYQ\",\n\t\"./bn-bd.js\": \"loYQ\",\n\t\"./bn.js\": \"kEOa\",\n\t\"./bo\": \"0mo+\",\n\t\"./bo.js\": \"0mo+\",\n\t\"./br\": \"aIdf\",\n\t\"./br.js\": \"aIdf\",\n\t\"./bs\": \"JVSJ\",\n\t\"./bs.js\": \"JVSJ\",\n\t\"./ca\": \"1xZ4\",\n\t\"./ca.js\": \"1xZ4\",\n\t\"./cs\": \"PA2r\",\n\t\"./cs.js\": \"PA2r\",\n\t\"./cv\": \"A+xa\",\n\t\"./cv.js\": \"A+xa\",\n\t\"./cy\": \"l5ep\",\n\t\"./cy.js\": \"l5ep\",\n\t\"./da\": \"DxQv\",\n\t\"./da.js\": \"DxQv\",\n\t\"./de\": \"tGlX\",\n\t\"./de-at\": \"s+uk\",\n\t\"./de-at.js\": \"s+uk\",\n\t\"./de-ch\": \"u3GI\",\n\t\"./de-ch.js\": \"u3GI\",\n\t\"./de.js\": \"tGlX\",\n\t\"./dv\": \"WYrj\",\n\t\"./dv.js\": \"WYrj\",\n\t\"./el\": \"jUeY\",\n\t\"./el.js\": \"jUeY\",\n\t\"./en-au\": \"Dmvi\",\n\t\"./en-au.js\": \"Dmvi\",\n\t\"./en-ca\": \"OIYi\",\n\t\"./en-ca.js\": \"OIYi\",\n\t\"./en-gb\": \"Oaa7\",\n\t\"./en-gb.js\": \"Oaa7\",\n\t\"./en-ie\": \"4dOw\",\n\t\"./en-ie.js\": \"4dOw\",\n\t\"./en-il\": \"czMo\",\n\t\"./en-il.js\": \"czMo\",\n\t\"./en-in\": \"7C5Q\",\n\t\"./en-in.js\": \"7C5Q\",\n\t\"./en-nz\": \"b1Dy\",\n\t\"./en-nz.js\": \"b1Dy\",\n\t\"./en-sg\": \"t+mt\",\n\t\"./en-sg.js\": \"t+mt\",\n\t\"./eo\": \"Zduo\",\n\t\"./eo.js\": \"Zduo\",\n\t\"./es\": \"iYuL\",\n\t\"./es-do\": \"CjzT\",\n\t\"./es-do.js\": \"CjzT\",\n\t\"./es-mx\": \"tbfe\",\n\t\"./es-mx.js\": \"tbfe\",\n\t\"./es-us\": \"Vclq\",\n\t\"./es-us.js\": \"Vclq\",\n\t\"./es.js\": \"iYuL\",\n\t\"./et\": \"7BjC\",\n\t\"./et.js\": \"7BjC\",\n\t\"./eu\": \"D/JM\",\n\t\"./eu.js\": \"D/JM\",\n\t\"./fa\": \"jfSC\",\n\t\"./fa.js\": \"jfSC\",\n\t\"./fi\": \"gekB\",\n\t\"./fi.js\": \"gekB\",\n\t\"./fil\": \"1ppg\",\n\t\"./fil.js\": \"1ppg\",\n\t\"./fo\": \"ByF4\",\n\t\"./fo.js\": \"ByF4\",\n\t\"./fr\": \"nyYc\",\n\t\"./fr-ca\": \"2fjn\",\n\t\"./fr-ca.js\": \"2fjn\",\n\t\"./fr-ch\": \"Dkky\",\n\t\"./fr-ch.js\": \"Dkky\",\n\t\"./fr.js\": \"nyYc\",\n\t\"./fy\": \"cRix\",\n\t\"./fy.js\": \"cRix\",\n\t\"./ga\": \"USCx\",\n\t\"./ga.js\": \"USCx\",\n\t\"./gd\": \"9rRi\",\n\t\"./gd.js\": \"9rRi\",\n\t\"./gl\": \"iEDd\",\n\t\"./gl.js\": \"iEDd\",\n\t\"./gom-deva\": \"qvJo\",\n\t\"./gom-deva.js\": \"qvJo\",\n\t\"./gom-latn\": \"DKr+\",\n\t\"./gom-latn.js\": \"DKr+\",\n\t\"./gu\": \"4MV3\",\n\t\"./gu.js\": \"4MV3\",\n\t\"./he\": \"x6pH\",\n\t\"./he.js\": \"x6pH\",\n\t\"./hi\": \"3E1r\",\n\t\"./hi.js\": \"3E1r\",\n\t\"./hr\": \"S6ln\",\n\t\"./hr.js\": \"S6ln\",\n\t\"./hu\": \"WxRl\",\n\t\"./hu.js\": \"WxRl\",\n\t\"./hy-am\": \"1rYy\",\n\t\"./hy-am.js\": \"1rYy\",\n\t\"./id\": \"UDhR\",\n\t\"./id.js\": \"UDhR\",\n\t\"./is\": \"BVg3\",\n\t\"./is.js\": \"BVg3\",\n\t\"./it\": \"bpih\",\n\t\"./it-ch\": \"bxKX\",\n\t\"./it-ch.js\": \"bxKX\",\n\t\"./it.js\": \"bpih\",\n\t\"./ja\": \"B55N\",\n\t\"./ja.js\": \"B55N\",\n\t\"./jv\": \"tUCv\",\n\t\"./jv.js\": \"tUCv\",\n\t\"./ka\": \"IBtZ\",\n\t\"./ka.js\": \"IBtZ\",\n\t\"./kk\": \"bXm7\",\n\t\"./kk.js\": \"bXm7\",\n\t\"./km\": \"6B0Y\",\n\t\"./km.js\": \"6B0Y\",\n\t\"./kn\": \"PpIw\",\n\t\"./kn.js\": \"PpIw\",\n\t\"./ko\": \"Ivi+\",\n\t\"./ko.js\": \"Ivi+\",\n\t\"./ku\": \"JCF/\",\n\t\"./ku.js\": \"JCF/\",\n\t\"./ky\": \"lgnt\",\n\t\"./ky.js\": \"lgnt\",\n\t\"./lb\": \"RAwQ\",\n\t\"./lb.js\": \"RAwQ\",\n\t\"./lo\": \"sp3z\",\n\t\"./lo.js\": \"sp3z\",\n\t\"./lt\": \"JvlW\",\n\t\"./lt.js\": \"JvlW\",\n\t\"./lv\": \"uXwI\",\n\t\"./lv.js\": \"uXwI\",\n\t\"./me\": \"KTz0\",\n\t\"./me.js\": \"KTz0\",\n\t\"./mi\": \"aIsn\",\n\t\"./mi.js\": \"aIsn\",\n\t\"./mk\": \"aQkU\",\n\t\"./mk.js\": \"aQkU\",\n\t\"./ml\": \"AvvY\",\n\t\"./ml.js\": \"AvvY\",\n\t\"./mn\": \"lYtQ\",\n\t\"./mn.js\": \"lYtQ\",\n\t\"./mr\": \"Ob0Z\",\n\t\"./mr.js\": \"Ob0Z\",\n\t\"./ms\": \"6+QB\",\n\t\"./ms-my\": \"ZAMP\",\n\t\"./ms-my.js\": \"ZAMP\",\n\t\"./ms.js\": \"6+QB\",\n\t\"./mt\": \"G0Uy\",\n\t\"./mt.js\": \"G0Uy\",\n\t\"./my\": \"honF\",\n\t\"./my.js\": \"honF\",\n\t\"./nb\": \"bOMt\",\n\t\"./nb.js\": \"bOMt\",\n\t\"./ne\": \"OjkT\",\n\t\"./ne.js\": \"OjkT\",\n\t\"./nl\": \"+s0g\",\n\t\"./nl-be\": \"2ykv\",\n\t\"./nl-be.js\": \"2ykv\",\n\t\"./nl.js\": \"+s0g\",\n\t\"./nn\": \"uEye\",\n\t\"./nn.js\": \"uEye\",\n\t\"./oc-lnc\": \"Fnuy\",\n\t\"./oc-lnc.js\": \"Fnuy\",\n\t\"./pa-in\": \"8/+R\",\n\t\"./pa-in.js\": \"8/+R\",\n\t\"./pl\": \"jVdC\",\n\t\"./pl.js\": \"jVdC\",\n\t\"./pt\": \"8mBD\",\n\t\"./pt-br\": \"0tRk\",\n\t\"./pt-br.js\": \"0tRk\",\n\t\"./pt.js\": \"8mBD\",\n\t\"./ro\": \"lyxo\",\n\t\"./ro.js\": \"lyxo\",\n\t\"./ru\": \"lXzo\",\n\t\"./ru.js\": \"lXzo\",\n\t\"./sd\": \"Z4QM\",\n\t\"./sd.js\": \"Z4QM\",\n\t\"./se\": \"//9w\",\n\t\"./se.js\": \"//9w\",\n\t\"./si\": \"7aV9\",\n\t\"./si.js\": \"7aV9\",\n\t\"./sk\": \"e+ae\",\n\t\"./sk.js\": \"e+ae\",\n\t\"./sl\": \"gVVK\",\n\t\"./sl.js\": \"gVVK\",\n\t\"./sq\": \"yPMs\",\n\t\"./sq.js\": \"yPMs\",\n\t\"./sr\": \"zx6S\",\n\t\"./sr-cyrl\": \"E+lV\",\n\t\"./sr-cyrl.js\": \"E+lV\",\n\t\"./sr.js\": \"zx6S\",\n\t\"./ss\": \"Ur1D\",\n\t\"./ss.js\": \"Ur1D\",\n\t\"./sv\": \"X709\",\n\t\"./sv.js\": \"X709\",\n\t\"./sw\": \"dNwA\",\n\t\"./sw.js\": \"dNwA\",\n\t\"./ta\": \"PeUW\",\n\t\"./ta.js\": \"PeUW\",\n\t\"./te\": \"XLvN\",\n\t\"./te.js\": \"XLvN\",\n\t\"./tet\": \"V2x9\",\n\t\"./tet.js\": \"V2x9\",\n\t\"./tg\": \"Oxv6\",\n\t\"./tg.js\": \"Oxv6\",\n\t\"./th\": \"EOgW\",\n\t\"./th.js\": \"EOgW\",\n\t\"./tk\": \"Wv91\",\n\t\"./tk.js\": \"Wv91\",\n\t\"./tl-ph\": \"Dzi0\",\n\t\"./tl-ph.js\": \"Dzi0\",\n\t\"./tlh\": \"z3Vd\",\n\t\"./tlh.js\": \"z3Vd\",\n\t\"./tr\": \"DoHr\",\n\t\"./tr.js\": \"DoHr\",\n\t\"./tzl\": \"z1FC\",\n\t\"./tzl.js\": \"z1FC\",\n\t\"./tzm\": \"wQk9\",\n\t\"./tzm-latn\": \"tT3J\",\n\t\"./tzm-latn.js\": \"tT3J\",\n\t\"./tzm.js\": \"wQk9\",\n\t\"./ug-cn\": \"YRex\",\n\t\"./ug-cn.js\": \"YRex\",\n\t\"./uk\": \"raLr\",\n\t\"./uk.js\": \"raLr\",\n\t\"./ur\": \"UpQW\",\n\t\"./ur.js\": \"UpQW\",\n\t\"./uz\": \"Loxo\",\n\t\"./uz-latn\": \"AQ68\",\n\t\"./uz-latn.js\": \"AQ68\",\n\t\"./uz.js\": \"Loxo\",\n\t\"./vi\": \"KSF8\",\n\t\"./vi.js\": \"KSF8\",\n\t\"./x-pseudo\": \"/X5v\",\n\t\"./x-pseudo.js\": \"/X5v\",\n\t\"./yo\": \"fzPg\",\n\t\"./yo.js\": \"fzPg\",\n\t\"./zh-cn\": \"XDpg\",\n\t\"./zh-cn.js\": \"XDpg\",\n\t\"./zh-hk\": \"SatO\",\n\t\"./zh-hk.js\": \"SatO\",\n\t\"./zh-mo\": \"OmwH\",\n\t\"./zh-mo.js\": \"OmwH\",\n\t\"./zh-tw\": \"kOpN\",\n\t\"./zh-tw.js\": \"kOpN\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"RnhZ\";","// packages\nimport { initFrame } from '@newswire/frames';\n\n/**\n * Sets up an instance of a frame and executes a function, i.e. a function to render the graphic.\n *\n * @param {Function} [fn] An optional function to be called on load and resize\n */\nexport function frameLoader(fn) {\n  // initialize frame no matter what\n  // sends height to parent container\n  initFrame();\n\n  if (fn) {\n    // resize listener\n    window.addEventListener('resize', fn);\n    fn();\n  }\n}\n","import { frameLoader } from '../embeds/frames';\nimport { h, render } from 'preact';\nimport { max } from 'd3';\nimport * as moment from 'moment';\n\n// data\nimport data from '../../../data/data.json';\nimport turnout_dem_by_day from '../../../data/turnout_data/turnout_dem_by_day.json';\nimport turnout_rep_by_day from '../../../data/turnout_data/turnout_rep_by_day.json';\nimport turnout_dem_final from '../../../data/turnout_data/turnout_dem_final.json';\nimport turnout_rep_final from '../../../data/turnout_data/turnout_rep_final.json';\n\n// components\nimport BarChart from '../components/BarChart';\n\nlet statewideData = data.statewide,\n  statewideMax = max(data.statewide, d => d['registered_voters']);\n\nlet gridClass = 'three-column',\n  toggle = data.toggles,\n  repTurnout2022,\n  demTurnout2022;\n\nif (toggle.is_election_over == 'NO') {\n  ////////////// GET LATEST REP DATA\n  let dateObjRep = [];\n  Object.keys(turnout_rep_by_day[0].results).forEach(r => {\n    dateObjRep.push({\n      date: r,\n      formatted_date: moment(r),\n    });\n  });\n  let latestDateRep = dateObjRep.find(\n    d => d.formatted_date == max(dateObjRep, d => d.formatted_date)\n  ).date;\n\n  repTurnout2022 = parseInt(\n    turnout_rep_by_day[0].results[latestDateRep].county_results[\n      'TOTAL'\n    ].cumulative_votes_in_person_and_mail.replaceAll(',', '')\n  );\n\n  ////////////// GET LATEST DEM DATA\n  let dateObjDem = [];\n  Object.keys(turnout_dem_by_day[0].results).forEach(r => {\n    dateObjDem.push({\n      date: r,\n      formatted_date: moment(r),\n    });\n  });\n  let latestDateDem = dateObjDem.find(\n    d => d.formatted_date == max(dateObjDem, d => d.formatted_date)\n  ).date;\n\n  demTurnout2022 = parseInt(\n    turnout_dem_by_day[0].results[latestDateDem].county_results[\n      'TOTAL'\n    ].cumulative_votes_in_person_and_mail.replaceAll(',', '')\n  );\n} else if (toggle.is_election_over == 'YES') {\n  repTurnout2022 = turnout_rep_final.reduce(function(a, b) {\n    return a + b.total_votes;\n  }, 0);\n  demTurnout2022 = turnout_dem_final.reduce(function(a, b) {\n    return a + b.total_votes;\n  }, 0);\n}\n\n////////////// SUB IN 2022 DATA\nstatewideData.forEach(d => {\n  if (d.year == 2022) {\n    d.republican = repTurnout2022;\n    d.democratic = demTurnout2022;\n    d.didnotvote = d.didnotvote - (d.republican + d.democratic);\n  }\n});\n\n////////////// SORT DATA\nstatewideData = statewideData.sort(function(a, b) {\n  return a.year - b.year;\n});\n\n////////////// CHECK TOGGLE IF WE SHOULD DISPLAY 2022 DATA\n// if (toggle.is_there_sos_data == 'NO') {\n//   statewideData = statewideData.filter(yearData => yearData.year != 2022);\n//   gridClass = 'two-column';\n// }\n// if (toggle.is_there_sos_data == 'YES') {\n//   gridClass = 'three-column';\n// }\n\n////////////// GENERATE CHARTS\nconst statewideCharts = statewideData.map(yearData => {\n  return (\n    <div id={`statewide-${yearData.year}`} class=\"graphic\">\n      <BarChart\n        yearData={yearData}\n        statewideMax={statewideMax}\n        base={'.graphic'}\n        toggle={toggle}\n      />\n    </div>\n  );\n});\n\nrender(\n  <div id=\"statewide-charts-container\" class={gridClass}>\n    {statewideCharts}\n  </div>,\n  document.getElementById('statewide-charts')\n);\n\n// included in index.html by default\n// initiates frame so your graphic is wrapped in an AMP-compatible iframe\n// renderGraphic() renders a coded graphic on load and on resize\nframeLoader();\n","export default function debounce(func, wait, immediate) {\n  var timeout, args, context, timestamp, result;\n\n  var later = function() {\n    var last = Date.now() - timestamp;\n\n    if (last < wait && last >= 0) {\n      timeout = setTimeout(later, wait - last);\n    } else {\n      timeout = null;\n      if (!immediate) {\n        result = func.apply(context, args);\n        if (!timeout) context = args = null;\n      }\n    }\n  };\n\n  return function() {\n    context = this;\n    args = arguments;\n    timestamp = Date.now();\n    var callNow = immediate && !timeout;\n    if (!timeout) timeout = setTimeout(later, wait);\n    if (callNow) {\n      result = func.apply(context, args);\n      context = args = null;\n    }\n\n    return result;\n  };\n}\n","import { Component } from 'preact';\n\nfunction shallowEqual(a, b) {\n  for (let key in a) {\n    if (a[key] !== b[key]) {\n      return false;\n    }\n  }\n\n  for (let key in b) {\n    if (!(key in a)) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nclass PureComponent extends Component {\n  shouldComponentUpdate(props, state) {\n    return !(\n      shallowEqual(props, this.props) && shallowEqual(state, this.state)\n    );\n  }\n}\n\nexport default PureComponent;\n","/**\n * A white-list of attributes to consider booleans for our purposes. Because\n * iframe attributes like \"sandbox\" actually mean something when they're an\n * empty string, we can't assume that means \"true\" across the board.\n *\n * @private\n * @type {Array}\n */\nconst booleans = ['allowfullscreen'];\n\n/**\n * Searches an element's attributes and returns an Object of all the ones that\n * begin with a specified prefix. Each matching attribute name is returned\n * without the prefix.\n *\n * @private\n * @param  {Element} element\n * @param  {string} prefix\n * @return {object}\n */\nfunction getMatchingAttributes(element, prefix) {\n  // prepare the object to return\n  const attrs = {};\n\n  // grab all the attributes off the element\n  const map = element.attributes;\n\n  // get a count of the number of attributes\n  const length = map.length;\n\n  // get the prefix's length\n  const prefixLength = prefix.length;\n\n  // loop through the attributes\n  for (let i = 0; i < length; i++) {\n    // get each attribute key\n    const key = map[i].name;\n\n    // continue if the key begins with supplied prefix\n    if (key.substr(0, prefixLength) === prefix) {\n      // slice off the prefix to get the bare field key\n      const field = key.slice(prefixLength);\n\n      // grab the value associated with the key\n      let value = map[i].value;\n\n      if (booleans.indexOf(field) > -1) {\n        value = true;\n      }\n\n      // add matching key to object\n      attrs[field] = value;\n    }\n  }\n\n  return attrs;\n}\n\nfunction extend(obj, props) {\n  for (let i in props) obj[i] = props[i];\n  return obj;\n}\n\nexport { extend, getMatchingAttributes };\n","const EMBED_SIZE = 'embed-size';\nconst AMP_SENTINEL = 'amp';\nconst FRAME_PREFIX = 'data-frame-';\nconst FRAME_AUTO_INITIALIZED_ATTRIBUTE = `${FRAME_PREFIX}auto-initialized`;\nconst FRAME_SRC_ATTRIBUTE = `${FRAME_PREFIX}src`;\n\nexport {\n  AMP_SENTINEL,\n  EMBED_SIZE,\n  FRAME_PREFIX,\n  FRAME_AUTO_INITIALIZED_ATTRIBUTE,\n  FRAME_SRC_ATTRIBUTE,\n};\n","import { extend, getMatchingAttributes } from './utils.mjs';\nimport {\n  AMP_SENTINEL,\n  EMBED_SIZE,\n  FRAME_PREFIX,\n  FRAME_AUTO_INITIALIZED_ATTRIBUTE,\n  FRAME_SRC_ATTRIBUTE,\n} from './constants.mjs';\n\n/**\n * The Framer object to be called in the host page. Effectively a wrapper around\n * interactions with an embedded iframe.\n *\n * @param {object} options options used to prepare the iframe\n * @param {Element} options.container the containing DOM element for the iframe\n * @param {string} options.src the URL to set as the `src` of the iframe\n * @param {boolean} [options.allowfullscreen] toggles the `allowfullscreen` attribute\n * @param {string} [options.name] sets the `name` attribute\n * @param {string} [options.referrerpolicy] sets the `referrerpolicy` attribute\n * @param {string} [options.sandbox] sets the `sandbox` attribute\n * @param {string} [options.title] sets the `title` attribute\n */\nclass Framer {\n  constructor({\n    allowfullscreen = false,\n    container,\n    name,\n    referrerpolicy,\n    sandbox = 'allow-scripts',\n    src,\n    title,\n  }) {\n    this.container = container;\n    this.src = src;\n    this.allowfullscreen = allowfullscreen;\n    this.name = name;\n    this.referrerpolicy = referrerpolicy;\n    this.sandbox = sandbox;\n    this.title = title;\n\n    this.processMessage_ = this.processMessage_.bind(this);\n    window.addEventListener('message', this.processMessage_, false);\n\n    this.createIframe_();\n  }\n\n  /**\n   * Removes event listeners and removes the iframe from the container.\n   *\n   * @returns {void}\n   * @example\n   *\n   * const framer = new Framer(...);\n   * // tears down the Framer\n   * framer.remove();\n   */\n  remove() {\n    window.removeEventListener('message', this.processMessage_, false);\n    this.container.removeChild(this.iframe);\n    // important to de-reference the iframe so it can be GC'ed\n    this.iframe = null;\n  }\n\n  /**\n   * Creates the iframe element and sets the source of the iframe.\n   *\n   * @private\n   * @returns {void}\n   */\n  createIframe_() {\n    const iframe = (this.iframe = document.createElement('iframe'));\n\n    iframe.setAttribute('src', this.src);\n    iframe.setAttribute('width', '100%');\n    iframe.setAttribute('scrolling', 'no');\n    iframe.setAttribute('marginheight', '0');\n    iframe.setAttribute('frameborder', '0');\n\n    if (this.allowfullscreen) {\n      iframe.setAttribute('allowfullscreen', '');\n    }\n\n    if (this.name) {\n      iframe.setAttribute('name', name);\n    }\n\n    if (this.referrerpolicy) {\n      iframe.setAttribute('referrerpolicy', this.referrerpolicy);\n    }\n\n    iframe.setAttribute('sandbox', this.sandbox);\n\n    if (this.title) {\n      iframe.setAttribute('title', this.title);\n    }\n\n    this.container.appendChild(iframe);\n  }\n\n  /**\n   * Receives a message from the frame. Checks to make sure it is only listening\n   * to the iframe it created, and that the sentinel value and type matches.\n   *\n   * @private\n   * @param {Event} event\n   * @returns {void}\n   */\n  processMessage_(event) {\n    // this message isn't from our created frame, stop here\n    if (event.source !== this.iframe.contentWindow) return;\n\n    const { data } = event;\n\n    // if the sentinel and type matches, update our height\n    if (data.sentinel === AMP_SENTINEL && data.type === EMBED_SIZE) {\n      this.setIframeHeight_(data.height);\n    }\n  }\n\n  /**\n   * Sets the iframe's height.\n   *\n   * @private\n   * @param {number} height\n   * @returns {void}\n   */\n  setIframeHeight_(height) {\n    this.iframe.setAttribute('height', height);\n  }\n}\n\n/**\n * Automatically initializes any frames that have not already been\n * auto-activated.\n *\n * @returns {Array} An array of all the created Framers\n * @example\n *\n * // sets up all frames that have not been initialized yet\n * autoInitFrames();\n */\nfunction autoInitFrames() {\n  const elements = document.querySelectorAll(\n    `[${FRAME_SRC_ATTRIBUTE}]:not([${FRAME_AUTO_INITIALIZED_ATTRIBUTE}])`\n  );\n\n  const activated = [];\n\n  for (let i = 0; i < elements.length; i++) {\n    const container = elements[i];\n\n    const attributes = getMatchingAttributes(container, FRAME_PREFIX);\n    container.setAttribute(FRAME_AUTO_INITIALIZED_ATTRIBUTE, '');\n\n    activated.push(\n      new Framer(\n        extend(\n          {\n            container,\n          },\n          attributes\n        )\n      )\n    );\n  }\n\n  return activated;\n}\n\nexport { autoInitFrames, Framer };\n","// internal\nimport { AMP_SENTINEL, EMBED_SIZE } from './constants.mjs';\nimport { extend } from './utils.mjs';\n\n/**\n * A wrapper around postMessage to normalize the message body. Automatically\n * includes the AMP sentinel value.\n *\n * @private\n * @param {string} type Type of message being sent\n * @param {Object} [data] Any additional data to send\n * @returns {void}\n */\nfunction sendMessage(type, data = {}) {\n  window.parent.postMessage(\n    extend({ sentinel: AMP_SENTINEL, type }, data),\n    '*'\n  );\n}\n\n/**\n * Gets the height of the current document's body. Uses offsetHeight to ensure\n * that margins are accounted for.\n *\n * @private\n * @returns {number}\n */\nfunction getDocumentHeight() {\n  return document.documentElement.offsetHeight;\n}\n\n/**\n * Sends the current document's height or provided value to the host window\n * using postMessage.\n *\n * @param {number} [height] The height to pass to the host page, is determined automatically if not passed\n * @returns {void}\n * @example\n *\n * // Uses the document's height to tell the host page\n * sendFrameHeight();\n *\n * // Pass a height you've determined in another way\n * sendFrameHeight(500);\n *\n */\nfunction sendFrameHeight(height = getDocumentHeight()) {\n  sendMessage(EMBED_SIZE, { height });\n}\n\n/**\n * Sets up an event listener for the load event that sends the new frame\n * height to the host. Automatically removes itself once fired.\n *\n * @returns {void}\n * @example\n *\n * // once the frame's load event is fired, tell the host page its new height\n * sendHeightOnLoad();\n */\nfunction sendHeightOnLoad() {\n  window.addEventListener('load', function cb() {\n    sendFrameHeight();\n\n    window.removeEventListener('load', cb);\n  });\n}\n\n/**\n * Sets up an event listener for the resize event that sends the new frame\n * height to the host.\n *\n * @returns {void}\n * @example\n *\n * // every time the frame is resized, tell the host page what its new height is\n * sendHeightOnResize();\n */\nfunction sendHeightOnResize() {\n  window.addEventListener('resize', () => sendFrameHeight());\n}\n\n/**\n * Sends height updates to the host page on an interval.\n *\n * @param {number} [delay] How long to set the interval\n * @returns {void}\n * @example\n *\n * // will call sendFrameHeight every 300ms\n * sendHeightOnPoll();\n *\n * // will call sendFrameHeight every 150ms\n * sendHeightOnPoll(150);\n */\nfunction sendHeightOnPoll(delay = 300) {\n  setInterval(sendFrameHeight, delay);\n}\n\n/**\n * A helper for running the standard functions for setting up a frame.\n *\n * Automatically calls an sendFrameHeight, sendHeightOnLoad and sendHeightOnResize.\n *\n * @returns {void}\n * @example\n *\n * initFrame();\n */\nfunction initFrame() {\n  sendFrameHeight();\n  sendHeightOnLoad();\n  sendHeightOnResize();\n}\n\n/**\n * Initializes a frame, then sets up a poll to continue to update on an interval.\n *\n * @param {number} [delay] An optional custom delay to pass to sendHeightOnPoll\n * @returns {void}\n * @example\n *\n * // calls initFrame, then calls sendHeightOnPoll\n * initFrameAndPoll();\n */\nfunction initFrameAndPoll(delay) {\n  initFrame();\n  sendHeightOnPoll(delay);\n}\n\nexport {\n  initFrame,\n  initFrameAndPoll,\n  sendFrameHeight,\n  sendHeightOnLoad,\n  sendHeightOnPoll,\n  sendHeightOnResize,\n};\n"],"sourceRoot":""}