84 строки
		
	
	
		
			132 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			84 строки
		
	
	
		
			132 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| {
 | |
|   "version": 3,
 | |
|   "file": "bundle.css",
 | |
|   "sources": [
 | |
|     "../../Svg.svelte",
 | |
|     "../../App.svelte",
 | |
|     "../../Catch.svelte",
 | |
|     "../../CookieBanner.svelte",
 | |
|     "../../Balloon.svelte",
 | |
|     "../../Brush.svelte",
 | |
|     "../../Canvas.svelte",
 | |
|     "../../CaseDensity.svelte",
 | |
|     "../../Centroid.svelte",
 | |
|     "../../CentroidTooltip.svelte",
 | |
|     "../../Checkbox.svelte",
 | |
|     "../../Controls.svelte",
 | |
|     "../../CopyTooltip.svelte",
 | |
|     "../../CoronaChart.svelte",
 | |
|     "../../CreatedBy.svelte",
 | |
|     "../../Dropdown.svelte",
 | |
|     "../../EventTooltip.svelte",
 | |
|     "../../EventTooltipCross.svelte",
 | |
|     "../../Events.svelte",
 | |
|     "../../Info.svelte",
 | |
|     "../../Labels.svelte",
 | |
|     "../../Legend.svelte",
 | |
|     "../../LoadingInfo.svelte",
 | |
|     "../../ScoreBar.svelte",
 | |
|     "../../ScoreQuestions.svelte",
 | |
|     "../../SearchText.svelte",
 | |
|     "../../Share.svelte",
 | |
|     "../../ShinyCircle.svelte",
 | |
|     "../../Slider.svelte",
 | |
|     "../../SourceLink.svelte",
 | |
|     "../../SpotTooltip.svelte",
 | |
|     "../../Svg.svelte",
 | |
|     "../../Table.svelte",
 | |
|     "../../Timeline.svelte",
 | |
|     "../../TimelineSpot.svelte",
 | |
|     "../../ToTop.svelte",
 | |
|     "../../Visualization.svelte"
 | |
|   ],
 | |
|   "sourcesContent": [
 | |
|     "<svg version=\"1.1\" class=\"fa-icon {className}\"\n  class:fa-spin={spin} class:fa-pulse={pulse} class:fa-inverse={inverse}\n  class:fa-flip-horizontal=\"{flip === 'horizontal'}\" class:fa-flip-vertical=\"{flip === 'vertical'}\"\n  {x} {y} {width} {height}\n  aria-label={label}\n  role=\"{ label ? 'img' : 'presentation' }\"\n  viewBox={box} style={style}\n  >\n  <slot></slot>\n</svg>\n\n<style>\n.fa-icon {\n  display: inline-block;\n  fill: currentColor;\n}\n.fa-flip-horizontal {\n  transform: scale(-1, 1);\n}\n.fa-flip-vertical {\n  transform: scale(1, -1);\n}\n.fa-spin {\n  animation: fa-spin 1s 0s infinite linear;\n}\n.fa-inverse {\n  color: #fff;\n}\n.fa-pulse {\n  animation: fa-spin 1s infinite steps(8);\n}\n@keyframes fa-spin {\n  0% {\n    transform: rotate(0deg);\n  }\n  100% {\n    transform: rotate(360deg);\n  }\n}\n</style>\n\n<script>\n  let className;\n\n  export { className as class };\n\n  export let width;\n  export let height;\n  export let box;\n\n  export let spin = false;\n  export let inverse = false;\n  export let pulse = false;\n  export let flip = null;\n\n  // optionals\n  export let x = undefined;\n  export let y = undefined;\n  export let style = undefined;\n  export let label = undefined;\n</script>\n",
 | |
|     "<script>\n  // the root component\n  import Catch from './Catch.svelte';\n  import Visualization from './components/Visualization.svelte';\n  import CookieBanner from './CookieBanner.svelte';\n\n  let width;\n\n  console.log('🎉 Fantastic! You are interested in our source code! Check it out – uncompiled: https://github.com/DFRLab/interference2020');\n</script>\n\n<div class=\"app-wrapper\" bind:clientWidth={width}>\n  <CookieBanner />\n  {#if (width < 600)}\n    <Catch content={'Please visit us on a larger screen to explore the visualization or try turning your device.'} />\n  {:else if (/MSIE|Trident/.test(window.navigator.userAgent))}\n    <Catch content={'Please visit us with a modern browser.'} />\n  {:else}\n    <Visualization />\n  {/if}\n</div>\n\n<style>\n  .app-wrapper {\n    width: 100%;\n    margin: 0;\n    padding: 0.3rem 0;\n  }\n</style>\n",
 | |
|     "<script>\n  // shown when the viz cannot be displayed\n  export let content = '';\n\n  function sendMail() {\n    const subject = encodeURIComponent('Foreign Interference Attribution Tracker');\n    const body = encodeURIComponent('I have seen this project on the web:\\nhttps://interference2020.org');\n    window.location.href = `mailto:?subject=${subject}&body=${body}`;\n  }\n</script>\n\n<section class=\"content catch\">\n  <p>{content}</p>\n  <span class=\"pseudolink\" on:click={sendMail}>Send Email with Link</span>\n</section>\n<div class=\"placeholder-image\">\n  <img src=\"images/screenshots/fiat_placeholder.jpg\" alt=\"Screenshot of the visualization showing red balloons on a timeline.\" />\n</div>\n\n<style>\n  section.catch {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    max-width: none;\n    margin: 2rem 0;\n    width: 100%;\n    overflow: hidden;\n  }\n\n  p, span {\n    width: 100%;\n    margin: 1rem 0;\n    font-family: var(--font-02);\n    font-size: 1.1rem;\n    color: var(--text-black);\n    text-align: center;\n  }\n\n  .placeholder-image {\n    width: 100%;\n    max-width: 1100px;\n    margin: 0 auto;\n    overflow: hidden;\n  }\n\n  img {\n    width: 100%;\n  }\n</style>\n",
 | |
|     "<script>\n  // the cookie banner\n</script>\n\n<div id=\"cookies-eu-banner\">\n  <div class=\"content\">\n    <p>This page wants to use cookies.</p>\n    <button id=\"cookies-eu-accept\">Accept</button>\n    <button id=\"cookies-eu-reject\">Reject</button>\n    <a href=\"https://www.atlanticcouncil.org/privacy-policy/\" target=\"_blank\">Privacy</a>\n  </div>\n</div>\n\n<style>\n  #cookies-eu-banner {\n    display: none;\n    width: 100%;\n    min-height: 10%;\n    padding: 1rem;\n    color: var(--bg);\n    font-family: var(--font-02);\n    font-size: 1rem;\n    opacity: 0.95;\n    background-color: var(--usa-lightred);\n    position: fixed;\n    z-index: 1000000;\n    left: 0;\n    bottom: 0;\n  }\n\n  .content {\n    display: flex;\n    align-items: baseline;\n    justify-content: center;\n    width: 100%;\n    height: 100%;\n    position: relative;\n  }\n\n  .content > p, button {\n    margin-right: 1rem;\n  }\n\n  button {\n    cursor: pointer;\n  }\n\n  #cookies-eu-banner button {\n    padding: 0.1rem 0.3rem;\n    font-size: 1rem;\n    font-weight: normal;\n    text-decoration: none;\n    border: 1px solid var(--bg);\n    border-radius: 2px;\n    outline: none;\n    position: relative;\n  }\n\n  button#cookies-eu-reject {\n    color: var(--bg);\n    background-color: var(--usa-lightred);\n  }\n\n  button#cookies-eu-accept {\n    color: var(--usa-lightred);\n    background-color: var(--bg);\n  }\n\n  a {\n    display: block;\n    justify-self: flex-end;\n    font-size: 0.8rem;\n    color: var(--bg);\n  }\n</style>\n",
 | |
|     "<script>\n  // the single balloon implementation\n  import { onMount } from 'svelte';\n  import { fade } from 'svelte/transition';\n  import { width } from '../stores/dimensions';\n  import { bloomDuration, growDuration, jitterFactor } from '../transitions/constants';\n  import { createEventDispatcher } from 'svelte';\n\n  import EventTooltip from './EventTooltip.svelte';\n\n  export let timePoint;\n  export let tweenedPos;\n  export let selected = false;\n\n  const dispatch = createEventDispatcher();\n\n  function handleMouseOver(e) {\n    if (e.buttons === 1) return;\n    dispatch('mouseover', {id: timePoint.id, tp: timePoint, e})\n  }\n\n  function handleMouseClick(e) {\n    dispatch('click', {id: timePoint.id, tp: timePoint, e})\n  }\n</script>\n\n<g class=\"balloon\"\n   class:selected\n   transform=\"translate({tweenedPos.x} {tweenedPos.fy})\"\n   on:mouseover|stopPropagation={handleMouseOver}\n   on:click|stopPropagation={handleMouseClick}\n   in:fade|local={{duration: bloomDuration, delay: growDuration + timePoint.id * jitterFactor}}\n   out:fade|local={{duration: bloomDuration, delay: timePoint.id * jitterFactor}}>\n  {#if (timePoint.recentlyAdded)}\n    <circle class=\"glow\"\n            cx=\"0\"\n            cy=\"0\"\n            r={timePoint.rSmiTot * 0.95}></circle>\n  {/if}\n  <circle class=\"balloon-main\"\n          cx=\"0\"\n          cy=\"0\"\n          r={timePoint.rSmiTot}\n          fill={timePoint.color}></circle>\n  <circle class=\"balloon-effect\"\n          class:smi-pending={timePoint.smiPending}\n          cx=\"0\"\n          cy=\"0\"\n          r={timePoint.rSmiTot}></circle>\n</g>\n\n<style>\n  circle {\n    stroke: none;\n    opacity: 1;\n  }\n\n  .balloon {\n    cursor: pointer;\n  }\n\n  .glow {\n    stroke: var(--usa-lightred);\n    stroke-width: 0.05rem;\n    fill: none;\n    animation: pulse 3s infinite ease-in-out;\n    animation-iteration-count: 20;\n    opacity: 0;\n    pointer-events: none;\n  }\n\n  .balloon-effect {\n    fill: url('#radial-gradient');\n  }\n\n  .balloon-effect.smi-pending {\n    stroke: var(--usa-lightblue);\n    stroke-width: 0.18rem;\n    stroke-linecap: round;\n    stroke-dasharray: 3px 5px;\n  }\n\n  .selected .balloon-effect {\n    stroke: var(--usa-blue);\n    stroke-width: 0.18rem;\n  }\n\n  @keyframes pulse {\n    0% {\n      transform: scale(0.5);\n      opacity: 0.9;\n    }\n    50% {\n      opacity: 0.8;\n    }\n    70% {\n      opacity: 0.09;\n    }\n    100% {\n      transform: scale(3);\n      opacity: 0;\n    }\n  }\n</style>\n",
 | |
|     "<script>\n  // the time scale brush / zoom\n  import { onMount } from 'svelte';\n  import { timeScale } from '../stores/scales';\n  import { panelHeight, margin } from '../stores/dimensions';\n  import { brushable } from '../actions/brushable';\n  import { originalTimeDomain } from '../stores/filters';\n\n  let x = 0;\n  let fx = 0;\n  let fy = 0;\n  let width = 0;\n  let fWidth = 0;\n  let fHeight = 0;\n  let resetText;\n\n  let invisible = true;\n\n  function resetBrush() {\n    x = fx = $timeScale.range()[0];\n    fy = $margin.top;\n    width = fWidth = $timeScale.range()[1] - $timeScale.range()[0];\n    fHeight = ($panelHeight - $margin.top) * 1.05;\n  }\n\n  function resetTimeDomain() {\n    if ($originalTimeDomain) {\n      $timeScale.domain($originalTimeDomain);\n      $originalTimeDomain = null;\n      $timeScale = $timeScale;\n    }\n  }\n\n  function handleBrushStart(e) {\n    invisible = false;\n    width = 0;\n  }\n\n  function handleBrush(e) {\n    width = e.detail.width;\n    x = e.detail.x;\n  }\n\n  function handleBrushEnd(e) {\n    invisible = true;\n\n    const { x1, x2 } = e.detail;\n    if (!x1 || !x2 || isNaN(x1) || isNaN(x2) || Math.abs(x2 - x1) < 10) return;\n\n    if (!$originalTimeDomain) $originalTimeDomain = [...$timeScale.domain()];\n\n    $timeScale.domain([$timeScale.invert(x1), $timeScale.invert(x2)]);\n    $timeScale = $timeScale;\n    \n    resetBrush();\n  }\n\n  function handleKeyUp(e) {\n    if (e.keyCode === 27) {\n      resetTimeDomain();\n      return;\n    }\n\n    if ($originalTimeDomain !== null && (e.keyCode === 37 || e.keyCode == 39)) {\n      const prevDomain = [...$timeScale.domain()];\n      const diff = Math.floor(0.25 * (prevDomain[1] - prevDomain[0]));\n      if (e.keyCode === 37) {\n        $timeScale.domain([new Date(prevDomain[0] - diff), new Date(prevDomain[1] - diff)]);\n      } else if (e.keyCode === 39) {\n        $timeScale.domain([new Date(prevDomain[0] - - diff), new Date(prevDomain[1] - - diff)]);\n      }\n      $timeScale = $timeScale;\n    }\n  }\n\n  function handleResetButtonClick() {\n    resetTimeDomain();\n  }\n\n  onMount(() => {\n    resetBrush();\n  });\n</script>\n\n<svelte:window on:keyup={handleKeyUp}/>\n\n<g class=\"brush disable-select\">\n  <rect class=\"brush-area\"\n        class:invisible\n        x={x}\n        y={$panelHeight - 40}\n        width={width}\n        height={80}\n        rx=\"3\"\n        ry=\"3\"></rect>\n  <rect class=\"brush-catcher\"\n        x={fx}\n        y={fy}\n        width={fWidth}\n        height={fHeight}\n        use:brushable\n        on:brushstart={handleBrushStart}\n        on:brush={handleBrush}\n        on:brushend={handleBrushEnd}></rect>\n</g>\n{#if ($originalTimeDomain)}\n  <g class=\"reset-brush\"\n     transform=\"translate({$timeScale.range()[0] - $margin.left / 1.5} {$panelHeight + 50})\"\n     on:click={handleResetButtonClick}>\n    <rect x=\"-3\"\n          y=\"-15\"\n          width={resetText ? resetText.getComputedTextLength() + 6 : 0}\n          height=\"20\"\n          rx=\"3\"\n          ry=\"3\"></rect>\n    <text class=\"disable-select\" bind:this={resetText}>Reset time scale</text>\n  </g>\n{/if}\n\n<style>\n  .brush-area {\n    visibility: visible;\n    fill: var(--usa-red);\n    opacity: 0.3;\n    pointer-events: none;\n  }\n\n  .brush-catcher {\n    visibility: hidden;\n    fill: black;\n    pointer-events: all;\n    cursor: ew-resize;\n  }\n\n  .invisible {\n    visibility: hidden;\n  }\n\n  .reset-brush {\n    cursor: pointer;\n  }\n\n  .reset-brush rect {\n    fill: var(--usa-lightred);\n    stroke: var(--usa-lightred);\n    stroke-width: 0.15rem;\n    transition: fill 200ms ease;\n  }\n\n  .reset-brush:hover rect {\n    fill: var(--bg);\n  }\n\n  .reset-brush text {\n    font-family: var(--font-02);\n    font-size: 0.8rem;\n    fill: var(--bg);\n    transition: fill 200ms ease;\n  }\n\n  .reset-brush:hover text {\n    fill: var(--usa-lightred);\n  }\n</style>\n",
 | |
|     "<script>\n  // the canvas component holding the world map\n  import { width, height, panelHeight, mapHeight } from '../stores/dimensions';\n  import { bg, usaRed, usaLightRed, usaLightLightRed } from '../utils/colors';\n  import { countries, projection, geoPath } from '../stores/map';\n  import { scaleFactor } from '../stores/scales';\n\n  let canvas;\n\n  $: if (canvas && $countries.length > 0) {\n    canvas.width = $scaleFactor * $width;\n    canvas.height = $scaleFactor * $height;\n    canvas.style.width = `${$width}px`;\n    canvas.style.height = `${$height}px`;\n\n    const ctx = canvas.getContext('2d', { alpha: false });\n    ctx.scale($scaleFactor, $scaleFactor);\n    ctx.translate(0, $panelHeight);\n\n    ctx.strokeStyle = usaLightLightRed;\n    ctx.fillStyle = bg;\n    ctx.fillRect(0, -$panelHeight, $width, $height);\n    \n    $geoPath.context(ctx);\n\n    // highlight the US\n    ctx.save();\n    ctx.fillStyle = usaLightLightRed;\n    ctx.beginPath();\n    $geoPath($countries.find((c) => c.properties.name === 'United States of America'));\n    ctx.fill();\n    ctx.restore();\n\n    ctx.beginPath();\n    $countries.forEach($geoPath);\n    ctx.stroke();\n  }\n</script>\n\n<canvas bind:this={canvas}></canvas>\n\n<style>\n  canvas {\n    position: absolute;\n    z-index: 0;\n  }\n</style>\n",
 | |
|     "<script>\n  // the case density plot for the country tooltips\n  import {\n    scaleLinear,\n    extent,\n    line as d3line,\n    curveBasis } from 'd3';\n  import { kernelDensityEstimator, kernelEpanechnikov } from '../utils/misc';\n\n  export let width = 0;\n  export let height = 0;\n  export let dates = [];\n  export let minDate = new Date();\n  export let maxDate = new Date();\n\n  const margin = {\n    top: 10,\n    right: 6,\n    bottom: 10,\n    left: 6\n  };\n\n  const line = d3line().curve(curveBasis);\n\n  $: ms = dates.map((d) => d.getTime() - minDate.getTime());\n\n  $: xScale = scaleLinear()\n      .domain([0, maxDate.getTime() - minDate.getTime()])\n      .range([margin.left, width - margin.right]);\n\n  $: kde = kernelDensityEstimator(kernelEpanechnikov(Math.max(...ms) / ms.length), xScale.ticks(ms.length))\n  $: density = kde(ms);\n\n  $: yScale = scaleLinear()\n      .domain(extent(density.map((d) => d[1])))\n      .range([height - margin.bottom, margin.top]);\n\n  $: data = density.map((d) => [xScale(d[0]), yScale(d[1])]);\n</script>\n\n<svg viewBox=\"0 0 {width} {height}\"\n     width={width}\n     height={height}>\n  <defs>\n    <linearGradient id=\"density-gradient\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n      <stop offset=\"0\" style=\"stop-color: var(--usa-lightlightblue);\" />\n      <stop offset=\"0.8\" style=\"stop-color: var(--usa-lightblue);\" />\n      <stop offset=\"1\" style=\"stop-color: var(--usa-lightblue);\" />\n    </linearGradient>\n  </defs>\n  <g class=\"line\">\n    <path d={line(data)}></path>\n    <circle cx={data[data.length - 1][0]} cy={data[data.length - 1][1]} r=\"5\" />\n  </g>\n</svg>\n\n<style>\n  .line path {\n    stroke: url(#density-gradient);\n    stroke-opacity: 1;\n    stroke-width: 0.15rem;\n    stroke-linecap: round;\n    fill: none;\n  }\n\n  circle {\n    stroke: none;\n    fill: var(--usa-blue);\n  }\n</style>\n",
 | |
|     "<script>\n  // single implementation of a country centroid on the map\n  import { centroidScale } from '../stores/scales';\n  import { growDuration } from '../transitions/constants';\n  import { haveOverlap } from '../utils/misc';\n  import { createEventDispatcher } from 'svelte';\n  \n  export let centroid;\n  export let country;\n  export let selected = false;\n\n  const dispatch = createEventDispatcher();\n</script>\n\n<g class=\"centroid\"\n   class:selected\n   on:click|stopPropagation={(e) => dispatch('click', {id: country, c: centroid, e})}\n   on:mouseover|stopPropagation={(e) => dispatch('mouseover', {id: country, c: centroid, e})}>\n  <circle class=\"centroid-fg\"\n          style=\"transition: stroke-opacity {growDuration}ms ease;\"\n          cx={centroid[0].xCountry}\n          cy={centroid[0].yCountry}\n          r={$centroidScale(centroid.length)}></circle>\n  {#if (centroid.length > 5)}\n    <g class=\"centroid-label\" transform=\"translate({centroid[0].xCountry} {centroid[0].yCountry + 5})\">\n      <text style=\"transition: opacity {growDuration}ms ease;\">{centroid.filter((c) => c.show).length}</text>\n    </g>\n  {/if}\n</g>\n\n<style>\n  .centroid {\n    cursor: pointer;\n  }\n\n  .centroid-fg {\n    stroke: var(--usa-blue);\n    stroke-width: 0.18rem;\n    stroke-opacity: 0.2;\n    fill: var(--bg);\n  }\n\n  .selected .centroid-fg {\n    stroke-opacity: 1;\n  }\n\n  .centroid-label text {\n    font-family: var(--font-02);\n    font-size: 0.7rem;\n    font-weight: bold;\n    text-anchor: middle;\n    fill: var(--usa-blue);\n    opacity: 0.2;\n    pointer-events: none;\n  }\n\n  .selected .centroid-label text {\n    opacity: 1;\n  }\n</style>\n",
 | |
|     "<script>\n  // tooltip for the country centroids\n  import { fade } from 'svelte/transition';\n  import { width } from '../stores/dimensions';\n  import { tooltip } from '../stores/centroidSelections';\n  import { timeScale } from '../stores/scales';\n  import { sortConsistently } from '../utils/misc';\n  import { originalTimeDomain } from '../stores/filters';\n  import {\n    disinformantNationFilter,\n    platformFilter,\n    methodFilter,\n    sourceCategoryFilter,\n    selectAllFilters\n  } from '../stores/filters';\n  import { timeFormat, group } from 'd3';\n  import { uniq } from 'lodash';\n\n  import CaseDensity from './CaseDensity.svelte';\n\n  const offset = {\n    top: 10,\n    right: 10,\n    bottom: 10,\n    left: 10\n  };\n  const contentOffset = 100;\n\n  const tf = timeFormat('%B %d, %Y');\n\n  let tWidth = 0;\n  let tHeight = 0;\n  let side;\n  let left, top, contentTop;\n\n  let platforms, methods, sourceCategories;\n\n  $: if ($tooltip) {\n    side = $width - $tooltip.c[0].xCountry < $width / 2 ? 'left' : 'right';\n    \n    top = $tooltip.c[0].yCountry - offset.top;\n\n    contentTop = contentOffset - $tooltip.e.pageY + window.pageYOffset;\n    if (Math.abs(contentTop) > tHeight - offset.bottom) {\n      contentTop = -tHeight - offset.bottom;\n    }\n    \n    if (side === 'left') {\n      left = $tooltip.c[0].xCountry - tWidth - 2 * offset.left;\n    } else if (side === 'right') {   \n      left = $tooltip.c[0].xCountry - offset.left;\n    }\n  }\n\n  function handleLiClick(type, item) {\n    selectAllFilters();\n    disinformantNationFilter.selectOne($tooltip.c[0].disNation);\n    switch (type) {\n      case 'platform': platformFilter.selectOne(item); break;\n      case 'method': methodFilter.selectOne(item); break;\n      case 'source': sourceFilter.selectOne(item); break;\n      case 'sourceCategory': sourceCategoryFilter.selectOne(item); break;\n    }\n  }\n\n  function generateItemsArray(data, name) {\n    return [...group(data.map((d) => d[name]).flat(), (d) => d)]\n              .map((d, i) => ({id: i, name: d[0], count: d[1].length}))\n              .sort((a, b) => sortConsistently(a, b, 'count', 'id'));\n  }\n\n  $: if ($tooltip) {\n    platforms = generateItemsArray($tooltip.c, 'platforms');\n    methods = generateItemsArray($tooltip.c, 'methods');\n    sourceCategories = generateItemsArray($tooltip.c, 'sourceCategory');\n  }\n</script>\n\n{#if ($tooltip)}\n  <div class=\"tooltip\"\n       style=\"left: {left}px; top: {top}px;\"\n       bind:clientWidth={tWidth}\n       on:click|stopPropagation\n       on:mouseover|stopPropagation\n       transition:fade={{duration: 200}}>\n    <div class=\"content\"\n         bind:clientHeight={tHeight}\n         style=\"top: {contentTop}px;\">\n      <div class=\"scroll-wrapper\">\n        <div class=\"title\">\n          <h2>{uniq($tooltip.c.map((d) => d.disNation)).join(' | ')}</h2>\n          <p class=\"small no-break\">{$tooltip.c.length} case{$tooltip.c.length !== 1 ? 's': ''}</p>\n        </div>\n        {#if ($tooltip.c.length > 5 && !$originalTimeDomain)}\n          <div class=\"case-density-vs-time\">\n            <h3>Attributions over time</h3>\n            <CaseDensity width={Math.max(0, tWidth - offset.left - offset.right - 2 * 16)} \n                         height={50}\n                         dates={$tooltip.c.map((d) => d.attributionDate)}\n                         minDate={$timeScale.domain()[0]}\n                         maxDate={new Date()} />\n          </div>\n        {/if}\n        <div class=\"platforms-used\">\n          <h3>Platforms used</h3>\n          <ul>\n            {#each platforms as platform (platform.id)}\n              <li on:click|stopPropagation={() => handleLiClick('platform', platform.name)}>\n                {platform.name}\n                <span class=\"very-small\">({platform.count})</span>\n              </li>\n            {/each}\n          </ul>\n        </div>\n        <div class=\"methods-applied\">\n          <h3>Methods applied</h3>\n          <ul>\n            {#each methods as method (method.id)}\n              <li on:click|stopPropagation={() => handleLiClick('method', method.name)}>\n                {method.name}\n                <span class=\"very-small\">({method.count})</span>\n              </li>\n            {/each}\n          </ul>\n        </div>\n        <div class=\"source-categories\">\n          <h3>Source categor{sourceCategories.length !== 1 ? 'ies' : 'y'}</h3>\n          <ul>\n            {#each sourceCategories as sourceCategory (sourceCategory.id)}\n              <li on:click|stopPropagation={() => handleLiClick('sourceCategory', sourceCategory.name)}>\n                {sourceCategory.name}\n                <span class=\"very-small\">({sourceCategory.count})</span>\n              </li>\n            {/each}\n          </ul>\n        </div>\n      </div>\n    </div>\n  </div>\n{/if}\n\n<style>\n  .tooltip {\n    width: 21%;\n    min-width: 100px;\n    font-family: var(--font-02);\n    position: absolute;\n    z-index: 10000;\n  }\n\n  .content {\n    display: flex;\n    flex-direction: column;\n    width: 100%;\n    max-height: 60vh;\n    margin: 16px;\n    color: var(--text-black);\n    background-color: var(--bg);\n    box-shadow: 0 1px 2px rgba(0,0,0,0.07), \n                0 2px 4px rgba(0,0,0,0.07), \n                0 4px 8px rgba(0,0,0,0.07), \n                0 8px 16px rgba(0,0,0,0.07),\n                0 16px 32px rgba(0,0,0,0.07), \n                0 32px 64px rgba(0,0,0,0.07);\n    position: absolute;\n  }\n\n  .scroll-wrapper {\n    width: 100%;\n    height: 100%;\n    overflow-x: hidden;\n    overflow-y: scroll;\n  }\n\n  .scroll-wrapper .title {\n    display: flex;\n    flex-direction: column;\n    padding: 1rem;\n    background-image: linear-gradient(var(--usa-lightlightblue), var(--usa-lightblue));\n  }\n\n  .scroll-wrapper > div {\n    width: 100%;\n    padding: 0.5rem 1rem;\n  }\n\n  h2, h3 {\n    color: var(--text-black);\n  }\n\n  h2 {\n    font-family: var(--font-01);\n    font-size: 1.1rem;\n    font-weight: bold;\n  }\n\n  h3 {\n    margin: 0 0 0.1rem 0;\n    font-size: 0.9rem;\n    font-weight: normal;\n    clear: both;\n  }\n\n  p {\n    display: inline;\n    font-size: 0.8rem;\n    line-height: 1.5;\n  }\n\n  ul {\n    display: inline-block;\n    list-style-type: none;\n  }\n\n  li {\n    float: left;\n    margin: 0.1rem 0.2rem 0.1rem 0;\n    padding: 0.1rem 0.3rem;\n    font-size: 0.7rem;\n    color: var(--text-black);\n    border: none;\n    border-radius: 0.2rem;\n    background-color: var(--usa-lightlightblue);\n    cursor: pointer;\n    user-select: none;\n    transition: background-color 200ms ease;\n    box-shadow: 0 1px 2px rgba(0,0,0,0.07), \n                0 2px 4px rgba(0,0,0,0.07);\n  }\n\n  li:hover {\n    background-color: var(--usa-lightblue);\n  }\n\n  .small {\n    font-size: 0.7rem;\n    font-weight: normal;\n  }\n\n  .very-small {\n    font-size: 0.6rem;\n    font-weight: normal;\n  }\n\n  .no-break {\n    word-break: keep-all;\n    white-space: nowrap;\n  }\n</style>\n",
 | |
|     "<script>\n  // custom checkbox\n  export let id;\n  export let checked = false;\n</script>\n\n<input type=\"checkbox\"\n       id=\"checkbox-{id}\"\n       class:checked\n       on:click|stopPropagation />\n<label for=\"checkbox-{id}\" class=\"choice-entry-name\">\n  <slot></slot>\n</label>\n\n<style>\n  label {\n    display: inline-block;\n    width: 100%;\n    padding-left: 1.5rem;\n    cursor: pointer;\n    pointer-events: all;\n  } \n\n  input[type=\"checkbox\"] {\n    display:none;\n    pointer-events: all;\n  }\n\n  input[type=\"checkbox\"] + label::before {\n    display: block;\n    width: 15px;\n    height: 15px;\n    margin-right: 0.4rem;\n    border: 2px solid var(--usa-blue);\n    border-radius: 3px;\n    background-color: var(--bg);\n    content: \"\";\n    position: absolute;\n    left: 0.5rem;\n  }\n\n  input[type=\"checkbox\"].checked + label::before {\n    box-shadow: inset 0px 0px 0px 3px var(--bg);\n    background-color: var(--usa-blue);\n  }\n</style>\n",
 | |
|     "<script>\n  // controls pane holding filters and buttons\n  import {\n    disinformantNationFilter,\n    platformFilter,\n    methodFilter,\n    sourceFilter,\n    sourceCategoryFilter,\n    attributionScoreFilter,\n    attributionScoreDef,\n    textSearchFilter,\n    selectAllFilters,\n    contextData,\n    originalTimeDomain } from '../stores/filters';\n  import { timeScale, attributionScoreScale } from '../stores/scales';\n\n  import Dropdown from './Dropdown.svelte';\n  import Slider from './Slider.svelte';\n  import SearchText from './SearchText.svelte';\n  import Share from './Share.svelte';\n\n  export let timePoints;\n\n  function addCount(filter, property, timePoints) {\n    return filter.map((d) => ({\n      ...d,\n      count: timePoints.map((d) => d[property]).flat().filter((a) => a === d.id).length,\n      liveCount: timePoints.filter((d) => d.show).map((d) => d[property]).flat().filter((a) => a === d.id).length\n    }));\n  }\n\n  function handleButtonClick() {\n    selectAllFilters();\n    contextData.unselectAll();\n    if ($originalTimeDomain) {\n      $timeScale.domain($originalTimeDomain);\n      $timeScale = $timeScale;\n      $originalTimeDomain = null;\n    }\n  }\n</script>\n\n{#if (timePoints)}\n  <div class=\"controls-inner-wrapper\">\n    <div class=\"controls\">\n      <SearchText searchString={$textSearchFilter}\n                  label=\"Search\"\n                  on:change={(e) => $textSearchFilter = e.detail}\n                  on:reset={() => textSearchFilter.reset()} />\n      <Slider value={$attributionScoreFilter}\n              label=\"Attribution Score\"\n              min={attributionScoreDef[0]} \n              max={attributionScoreDef[1]}\n              showHandleLabels={false}\n              startColor={$attributionScoreScale(attributionScoreDef[0])}\n              stopColor={$attributionScoreScale(attributionScoreDef[1])}\n              on:changed={(e) => $attributionScoreFilter = e.detail} />\n      <Dropdown items={addCount($disinformantNationFilter, 'disinformantNation', timePoints)}\n                label=\"Disinformant Nation\"\n                superior\n                on:itemsAdded={(e) => disinformantNationFilter.select(e.detail)}\n                on:itemsRemoved={(e) => disinformantNationFilter.unselect(e.detail)} />\n      <Dropdown items={addCount($platformFilter, 'platforms', timePoints)}\n                label=\"Platform\"\n                on:itemsAdded={(e) => platformFilter.select(e.detail)}\n                on:itemsRemoved={(e) => platformFilter.unselect(e.detail)} />\n      <Dropdown items={addCount($sourceFilter, 'sourceFilter', timePoints)}\n                label=\"Source\"\n                hideOneHitWonders\n                superior\n                on:itemsAdded={(e) => sourceFilter.select(e.detail)}\n                on:itemsRemoved={(e) => sourceFilter.unselect(e.detail)} />\n      <Dropdown items={addCount($sourceCategoryFilter, 'sourceCategory', timePoints)}\n                label=\"Source Category\"\n                on:itemsAdded={(e) => sourceCategoryFilter.select(e.detail)}\n                on:itemsRemoved={(e) => sourceCategoryFilter.unselect(e.detail)} />\n      <Dropdown items={addCount($methodFilter, 'methods', timePoints)}\n                label=\"Method\"\n                superior\n                on:itemsAdded={(e) => methodFilter.select(e.detail)}\n                on:itemsRemoved={(e) => methodFilter.unselect(e.detail)} />\n      <Dropdown items={$contextData}\n                label=\"Context Dataset\"\n                nameField=\"name\"\n                on:itemsAdded={(e) => contextData.select(e.detail)}\n                on:itemsRemoved={(e) => contextData.unselect(e.detail)} />\n      <button class=\"reset-filters\"\n              on:click={() => handleButtonClick()}>\n        Reset\n      </button>\n    </div>\n    <Share />\n  </div>\n{/if}\n\n<style>\n  .controls-inner-wrapper {\n    padding: 0.2rem;\n    border: none;\n    border-radius: 3px;\n    background-color: var(--transparentbg);\n  }\n\n  .controls {\n    display: grid;\n    grid-auto-flow: column;\n    grid-template-rows: repeat(9, 1fr);\n    grid-gap: 0.3rem;\n    margin-bottom: 0.7rem;\n  }\n\n  @media (min-width: 460px) {\n    .controls {\n      grid-template-rows: repeat(4, 1fr);\n    }\n  }\n\n  @media (min-width: 1000px) {\n    .controls {\n      grid-template-rows: repeat(2, 1fr);\n    }\n  }\n\n  @media (min-width: 1850px) {\n    .controls {\n      grid-template-rows: repeat(1, 1fr);\n    }\n  }\n\n  button {\n    pointer-events: all;\n  }\n\n  button.reset-filters {\n    align-self: flex-end;\n    min-width: 100px;\n    height: 1.7rem;\n    max-height: 1.7rem;\n    margin: 0.3rem 0.3rem 0 0.3rem;\n    padding: 0.1rem 0.3rem;\n    font-family: var(--font-02);\n    font-size: 0.8rem;\n    font-weight: normal;\n    line-height: 1.3rem;\n    color: var(--usa-blue);\n    background-color: var(--bg);\n    border: 2px solid var(--usa-blue);\n    border-radius: 3px;\n    outline: none;\n    overflow: hidden;\n    transition: all 200ms ease;\n  }\n\n  button.reset-filters:hover {\n    color: var(--bg);\n    background-color: var(--usa-blue);\n    cursor: pointer;\n  }\n</style>\n",
 | |
|     "<script>\n  // tooltip on the copy\n  import { fade } from 'svelte/transition';\n\n  export let title = '';\n  export let content = '';\n  export let x = 0;\n  export let y = 0;\n\n  const maxWidth = 300;\n  const margin = 10;\n\n  let width = maxWidth;\n  let left = 0;\n\n  $: {\n    if (x - width / 2 < 0) {\n      left = margin;\n    } else {\n      left = x - width / 2;\n    }\n\n    if (x + width - document.body.offsetWidth > 0) {\n      left = document.body.offsetWidth - width - margin;\n    }\n  }\n</script>\n\n<div class=\"copy-tooltip\"\n     bind:clientWidth={width}\n     style=\"left: {left}px; top: {y}px; width: {maxWidth}px;\"\n     transition:fade={{duration: 200}}>\n  <div class=\"content\">\n    <h2>{title}</h2>\n    <p>{content}</p>\n    <p class=\"footer\">Click to read more.</p>\n  </div>\n</div>\n\n<style>\n  .copy-tooltip {\n    margin-right: 1rem;\n    position: absolute;\n    z-index: 10000;\n  }\n\n  .content {\n    width: 100%;\n    height: 100%;\n    padding: 1rem;\n    font-family: var(--font-02);\n    color: var(--text-black);\n    background-color: var(--bg);\n    box-shadow: 0 1px 2px rgba(0,0,0,0.07), \n                0 2px 4px rgba(0,0,0,0.07), \n                0 4px 8px rgba(0,0,0,0.07), \n                0 8px 16px rgba(0,0,0,0.07),\n                0 16px 32px rgba(0,0,0,0.07), \n                0 32px 64px rgba(0,0,0,0.07);\n  }\n\n  h2 {\n    margin: 0.2rem 0;\n    font-size: 0.9rem;\n  }\n\n  p {\n    font-size: 0.8rem;\n    line-height: 1.5;\n  }\n\n  p.footer {\n    margin: 0.2rem 0;\n    font-size: 0.7rem;\n  }\n</style>\n",
 | |
|     "<script>\n  // chart with COVID-19 cases in the U.S.\n  import { timeScale } from '../stores/scales';\n  import { panelHeight } from '../stores/dimensions';\n  import { fade } from 'svelte/transition';\n  import {\n    scaleLog,\n    max,\n    area as d3area,\n    format } from 'd3';\n\n  export let data;\n  export let margin = {\n    top: 100,\n    right: 20,\n    bottom: 0,\n    left: 20\n  };\n  export let showLegend = true;\n\n  const commaFormat = format(',');\n\n  let xScale, yScale, area, lastItem, ticks;\n  let casesPath, deathsPath;\n\n  $: if (data) {\n    yScale = scaleLog()\n      .domain([1, max(data.map((d) => d.cases))])\n      .range([$panelHeight - margin.bottom, margin.top * 0.7]);\n\n    area = (type, data) => d3area()\n              .x((d) => $timeScale(d.date))\n              .y0(yScale(1))\n              .y1((d) => yScale(d[type]))(data);\n    \n    casesPath = area('cases', data);\n    deathsPath = area('deaths', data.filter((d) => d.deaths > 0));\n\n    lastItem = data.slice(-1)[0];\n\n    ticks = yScale.ticks(5).slice(1);\n  }\n</script>\n\n{#if (data)}\n  <g class=\"corona-chart\"\n     transition:fade={{duration: 200}}>\n    <g class=\"areas\">\n      <path class=\"cases\"\n            d={casesPath}></path>\n      <path class=\"deaths\"\n            d={deathsPath}></path>\n    </g>\n    {#if (showLegend)}\n      <g class=\"legend legend-cases\"\n          transform=\"translate({$timeScale(lastItem.date)} {yScale(lastItem.cases) + 1})\">\n        <path d=\"M0 0L10 0L10 -50\"></path>\n        <text transform=\"translate(15 -40)\">\n          {commaFormat(lastItem.cases)} cases\n        </text>\n      </g>\n      <g class=\"legend legend-deaths\"\n          transform=\"translate({$timeScale(lastItem.date)} {yScale(lastItem.deaths) + 1})\">\n        <path d=\"M0 0L20 0L20 {yScale(lastItem.cases) - yScale(lastItem.deaths) - 20}\"></path>\n        <text transform=\"translate(25 {yScale(lastItem.cases) - yScale(lastItem.deaths) - 10})\">\n          {commaFormat(lastItem.deaths)} deaths\n        </text>\n      </g>\n      <g class=\"ticks\"\n        transform=\"translate({$timeScale(lastItem.date) + 5} 0)\">\n        {#each ticks as tick}\n          <g class=\"tick\"\n            transform=\"translate(0 {yScale(tick)})\">\n            <rect x=\"0\" y=\"-12\" width=\"25\" height=\"15\"></rect>\n            <text>{commaFormat(tick)}</text>\n          </g>\n        {/each}\n      </g>\n    {/if}\n  </g>\n{/if}\n\n<style>\n  path {\n    stroke: none;\n    opacity: 0.2;\n  }\n\n  path.cases {\n    fill: var(--usa-lightblue);\n  }\n\n  path.deaths {\n    fill: var(--usa-blue);\n  }\n\n  .legend path {\n    stroke-width: 1px;\n    opacity: 0.6;\n    stroke-linecap: round;\n    fill: none;\n  }\n\n  .legend-cases path {\n    stroke: var(--usa-lightblue);\n  }\n\n  .legend-deaths path {\n    stroke: var(--usa-blue);\n  }\n\n  .legend text {\n    font-family: var(--font-02);\n    font-size: 0.7rem;\n    fill: var(--dfrlab-gray);\n  }\n\n  .tick rect {\n    fill: var(--bg);\n    stroke: none;\n  }\n\n  .tick text {\n    font-family: var(--font-02);\n    font-size: 0.6rem;\n    fill: var(--dfrlab-silver);\n  }\n</style>\n",
 | |
|     "<script>\n</script>\n\n<div class=\"created-by\">\n  <p>Research team: <a href=\"https://twitter.com/etbrooking\" target=\"_blank\">Emerson T. Brooking</a> (lead), <a href=\"https://twitter.com/AlyssaKann\" target=\"_blank\">Alyssa Kann</a>, <a href=\"https://twitter.com/maxbrizzuto\" target=\"_blank\">Max Rizzuto</a>, <a href=\"https://twitter.com/jacqumalaret\" target=\"_blank\">Jacqueline Malaret</a>, and Helen Simpson (<a href=\"https://www.atlanticcouncil.org/programs/digital-forensic-research-lab/\" target=\"_blank\">DFRLab, Atlantic Council</a>)</p>\n  <p>Created by <a href=\"https://higsch.com\" target=\"_blank\">Matthias Stahl (higsch | data & design)</a></p>\n</div>\n\n<style>\n  .created-by {\n    font-family: var(--font-02);\n    font-size: 0.6rem;\n    color: var(--dfrlab-lightgray);\n    writing-mode: vertical-rl;\n    overflow: hidden;\n    position: absolute;\n    z-index: 1000000;\n    top: 51%;\n    right: 1rem;\n  }\n\n  a {\n    color: var(--dfrlab-lightgray);\n    text-decoration: none;\n    transition: all 200ms ease;\n  }\n\n  a:hover {\n    color: var(--dfrlab-gray);\n    text-decoration: underline;\n  }\n</style>\n",
 | |
|     "<script>\n  // a custom dropdown\n  import { createEventDispatcher } from 'svelte';\n  import { slide } from 'svelte/transition';\n  import { sortConsistently } from '../utils/misc';\n\n  import Checkbox from './Checkbox.svelte';\n\n  export let items = [];\n  export let label = '';\n  export let nameField = 'id';\n  export let hideOneHitWonders = false;\n  export let superior = false;\n\n  const dispatch = createEventDispatcher();\n\n  let elem;\n  let expanded = false;\n\n  function handleBodyClick() {\n    expanded = false\n  }\n\n  function toggleExpanded() {\n    expanded = !expanded;\n  }\n\n  function selectAll() {\n    dispatch('itemsAdded', items.map((d) => d.id));\n  }\n\n  function unselectAll() {\n    dispatch('itemsRemoved', items.map((d) => d.id));\n  }\n\n  function handleDropdownClick() {\n    toggleExpanded();\n  }\n\n  function handleChoiceClick(id) {\n    if (!items.filter((d) => d.selected).map((d) => d.id).includes(id)) {\n      dispatch('itemsAdded', id);\n    } else {\n      dispatch('itemsRemoved', id);\n    }\n  }\n</script>\n\n<svelte:body on:click={(e) => handleBodyClick(e)}></svelte:body>\n\n<div class=\"dropdown\" bind:this={elem}>\n  <div class=\"label\">\n    {label}\n  </div>\n  <div class=\"selected-items\" on:click|stopPropagation={handleDropdownClick}>\n    <span class=\"selected-items-icon\"></span>\n    <span class=\"selected-items-text\">\n      {items.filter((d) => d.selected).length === 0\n        ? 'none'\n        : (items.every((d) => d.selected && items.length > 1)\n          ? 'all'\n          : items.filter((d) => d.selected).map((d) => d[nameField]).join(', '))}\n    </span>\n    <button class=\"selected-items-arrow\">\n      <svg class:expanded width=\"15\" height=\"10\">\n        <path d=\"M0 0L15 0L7.5 10Z\"></path>\n      </svg>\n    </button>\n  </div>\n  <div class=\"choice-wrapper\">\n    {#if (expanded)}\n      <div class=\"choice\" transition:slide class:superior>\n        <div class=\"choice-controls\">\n          <button class=\"choice-controls-selectall\" on:click|stopPropagation={selectAll}>Select all</button>\n          <button class=\"choice-controls-unselectall\" on:click|stopPropagation={unselectAll}>Unselect all</button>\n        </div>\n        <ul class=\"choice-list\">\n          {#each items.sort((a, b) => -sortConsistently(a, b, 'id', 'id')) as item, i (item.id)}\n            {#if (!(hideOneHitWonders && item.count === 1))}\n              <li on:click|stopPropagation>\n                <Checkbox id=\"{label}-{i}\"\n                          checked={item.selected}\n                          on:click={() => handleChoiceClick(item.id)}>\n                  <span class=\"choice-entry-name\">{item[nameField]}</span>\n                  {#if (item.liveCount)}\n                    <span class=\"choice-entry-count\">({item.liveCount})</span>\n                  {:else if (item.source)}\n                    <span class=\"choice-entry-source\">({item.source})</span>\n                  {/if}\n                </Checkbox>\n              </li>\n            {/if}\n          {/each}\n        </ul>\n        {#if (hideOneHitWonders)}\n          <p class=\"info\">{label}s with only one result in the dataset are hidden.</p>\n        {/if}\n      </div>\n    {/if}\n  </div>\n</div>\n\n<style>\n  .dropdown {\n    align-self: flex-end;\n    display: flex;\n    flex-direction: column;\n    font-family: var(--font-02);\n    width: 200px;\n    max-width: 200px;\n    min-width: 200px;\n    margin: 0.3rem 0.3rem 0 0.3rem;\n    position: relative;\n    pointer-events: all;\n  }\n\n  .label {\n    margin: 0 0 0.1rem 0;\n    font-size: 0.7rem;\n    color: var(--usa-blue);\n  }\n\n  .selected-items {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    width: 100%;\n    height: 1.7rem;\n    padding: 0.1rem 0.3rem;\n    font-size: 0.8rem;\n    background-color: var(--bg);\n    border: 2px solid var(--usa-blue);\n    border-radius: 3px;\n    cursor: pointer;\n  }\n\n  .selected-items-text {\n    width: 100%;\n    color: var(--text-black);\n    overflow: hidden;\n    white-space: nowrap;\n  }\n\n  .selected-items-arrow {\n    background: none;\n    border: none;\n    outline: none;\n    cursor: pointer;\n  }\n\n  .selected-items-arrow svg {\n    margin-top: 0.2rem;\n    stroke: none;\n    fill: var(--usa-blue);\n    transition: transform 400ms ease;\n  }\n\n  .selected-items-arrow svg.expanded{\n    transform: rotate(-540deg);\n  }\n\n  .choice-wrapper {\n    width: 100%;\n    height: 0;\n    position: relative;\n  }\n\n  .choice {\n    width: 100%;\n    border: 2px solid var(--usa-lightblue);\n    border-radius: 3px;\n    background-color: var(--bg);\n    position: absolute;\n    z-index: 12000;\n    top: 0;\n  }\n\n  .superior {\n    z-index: 100000 !important;\n  }\n\n  .choice-controls {\n    display: flex;\n    align-items: center;\n    width: 100%;\n  }\n\n  .choice-controls button {\n    margin: 0.5rem;\n    padding: 0.2rem 0.5rem;\n    color: var(--bg);\n    border: none;\n    border-radius: 5px;\n    outline: none;\n    cursor: pointer;\n  }\n\n  button.choice-controls-selectall {\n    background-color: var(--usa-lightblue);\n  }\n\n  button.choice-controls-unselectall {\n    background-color: var(--usa-lightred);\n  }\n\n  ul.choice-list {\n    width: 100%;\n    max-height: 600px;\n    overflow-y: scroll;\n    list-style-type: none;\n    font-size: 0.8rem;\n    position: relative;\n  }\n\n  ul.choice-list li {\n    padding: 0.4rem 0.5rem;\n    cursor: pointer;\n    background-color: var(--bg);\n    transition: background-color 200ms ease;\n  }\n\n  ul.choice-list li:hover {\n    background-color: var(--usa-lightblue);\n  }\n\n  .choice-entry-count, .choice-entry-source {\n    font-size: 0.8em;\n  }\n\n  .choice-entry-source {\n    display: block;\n  }\n\n  p.info {\n    padding: 0.4rem 0.5rem;\n    font-size: 0.7rem;\n    color: var(--dfrlab-gray);\n  }\n</style>\n",
 | |
|     "<script>\n  // a case tooltip (event = case)\n  import { afterUpdate } from 'svelte';\n  import { width, panelHeight, controlsHeight } from '../stores/dimensions';\n  import { tooltip } from '../stores/eventSelections';\n  import { fade, slide } from 'svelte/transition';\n  import { timeFormat, format } from 'd3';\n  import { extractHostname } from '../utils/misc';\n  import {\n    platformFilter,\n    methodFilter,\n    sourceFilter,\n    sourceCategoryFilter,\n    textSearchFilter,\n    selectAllFilters} from '../stores/filters';\n  import { maxScores } from '../inputs/scores';\n  import { images } from '../inputs/dataPaths';\n\n  import EventTooltipCross from './EventTooltipCross.svelte';\n  import ScoreBar from './ScoreBar.svelte';\n  import ScoreQuestions from './ScoreQuestions.svelte';\n  import Share from './Share.svelte';\n\n  const offset = {\n    top: 10,\n    right: 10,\n    bottom: 10,\n    left: 10\n  };\n  const contentOffset = -20;\n\n  const attributionTf = timeFormat('%B %d, %Y');\n  const activityTf = timeFormat('%B %Y');\n  const commaFormat = format(',');\n\n  let elem;\n  let tWidth, tHeight;\n  let side;\n  let left, top, contentTop;\n  let scrollWrapper;\n\n  let scoreQuestionsExpanded = false;\n\n  function handleLiClick(type, item) {\n    selectAllFilters();\n    switch (type) {\n      case 'platform': platformFilter.selectOne(item); break;\n      case 'method': methodFilter.selectOne(item); break;\n      case 'source': sourceFilter.selectOne(item); break;\n      case 'sourceCategory': sourceCategoryFilter.selectOne(item); break;\n    }\n  }\n\n  function highlight(s) {\n    if (!$textSearchFilter || $textSearchFilter === '') return s;\n    return s.replace(new RegExp($textSearchFilter, 'gi'), (match) => `<span class=\"highlighted\">${match}</span>`);\n  }\n\n  $: if (showTooltip) {\n    scoreQuestionsExpanded = false;\n\n    side = $width - $tooltip.tp.x < $width / 2 ? 'left' : 'right';\n    \n    top = $tooltip.tp.fy - offset.top;\n\n    // adjust for the difference between mouse hover point and balloon center\n    const balloonPos = $tooltip.e.pageY;\n\n    // the regular tooltip offset to the balloon\n    contentTop = contentOffset;\n\n    // if the tooltip hits the lower page boundary\n    if (balloonPos + contentTop + tHeight - window.pageYOffset > window.innerHeight) {\n      // console.log('lower')\n      contentTop -= balloonPos + tHeight - window.pageYOffset - window.innerHeight;\n    }\n\n    // if the tooltip hits the upper page boundary\n    if (balloonPos + contentTop - window.pageYOffset < $controlsHeight) {\n      // console.log('upper')\n      contentTop -= balloonPos + contentTop - window.pageYOffset - $controlsHeight - 50;\n    }\n\n    // // if the tooltip hits the uper border of the SVG\n    if ($tooltip.tp.fy + contentTop < $controlsHeight) {\n      // console.log('border')\n      contentTop -= $tooltip.tp.fy + contentTop - $controlsHeight;\n    }\n    \n    if (side === 'left') {\n      left = $tooltip.tp.x - tWidth + offset.left;\n    } else if (side === 'right') {   \n      left = $tooltip.tp.x - offset.left;\n    }\n\n    if (scrollWrapper) scrollWrapper.scrollTo(0, 0);\n  }\n\n  $: showTooltip = ($tooltip && $tooltip.tp && $tooltip.tp.show);\n</script>\n\n{#if (showTooltip)}\n  <div class=\"tooltip\"\n       style=\"left: {left}px; top: {top}px;\"\n       bind:clientWidth={tWidth}\n       on:click|stopPropagation\n       on:mouseover|stopPropagation\n       transition:fade={{duration: 200}}>\n    <EventTooltipCross {tWidth} {offset} {side} />\n    <div class=\"mouse-catcher\"\n          style=\"width: {tWidth}px;\n                 height: {Math.max(10, Math.abs(contentTop) - $tooltip.tp.rSmiTot + 25)}px;\n                 position: absolute;\n                 top: {contentTop - 10}px;\"></div>\n    <div class=\"mouse-catcher\"\n          style=\"width: {tWidth}px;\n                 height: {Math.abs(tHeight - Math.abs(contentTop))}px;\n                 position: absolute;\n                 top: {$tooltip.tp.rSmiTot + 5}px;\"></div>\n    <div class=\"content\"\n         bind:this={elem}\n         bind:clientHeight={tHeight}\n         style=\"top: {contentTop}px; margin: 0px {$tooltip.tp.rSmiTot / 3 + offset.left}px;\">\n      <div class=\"scroll-wrapper\"\n           bind:this={scrollWrapper}>\n        <div class=\"title\">\n          <div class=\"title-top\">\n            <div class=\"title-dates\">\n              <p class=\"no-break\">{attributionTf($tooltip.tp.attributionDate)} | {@html highlight($tooltip.tp.disinformantAttribution)}</p>\n              <p>Active: \n                {#if ($tooltip.tp.startDate && !$tooltip.tp.endDate)}\n                  {activityTf($tooltip.tp.startDate)} <span class=\"small\">(approx.)</span>\n                {:else if (!$tooltip.tp.startDate && $tooltip.tp.endDate)}\n                  {activityTf($tooltip.tp.endDate)} <span class=\"small\">(approx.)</span>\n                {:else if ($tooltip.tp.startDate && $tooltip.tp.endDate)}\n                  {#if (activityTf($tooltip.tp.startDate) === activityTf($tooltip.tp.endDate))}\n                    {activityTf($tooltip.tp.startDate)}\n                  {:else}\n                    {activityTf($tooltip.tp.startDate)} to {activityTf($tooltip.tp.endDate)}\n                  {/if}\n                {:else}\n                  unspecified\n                {/if}\n              </p>\n            </div>\n            <Share text=\"\" caseId={$tooltip.tp.id} mode=\"tooltip\" />\n          </div>\n          <h2>{@html highlight($tooltip.tp.shortTitle)}</h2>\n          <div class=\"score-bars\">\n            <div class=\"score-bar-wrapper\">\n              <ScoreBar value={$tooltip.tp.attributionCredibilityScore} maxValue={maxScores.attributionCredibilityScore} />\n              <p>Credibility</p>\n            </div>\n            <div class=\"score-bar-wrapper\">\n              <ScoreBar value={$tooltip.tp.attributionObjectivityScore} maxValue={maxScores.attributionObjectivityScore} />\n              <p>Objectivity</p>\n            </div>\n            <div class=\"score-bar-wrapper\">\n              <ScoreBar value={$tooltip.tp.attributionEvidenceScore} maxValue={maxScores.attributionEvidenceScore} />\n              <p>Evidence</p>\n            </div>\n            <div class=\"score-bar-wrapper\">\n              <ScoreBar value={$tooltip.tp.attributionTransparencyScore} maxValue={maxScores.attributionTransparencyScore} />\n              <p>Transparency</p>\n            </div>\n            <span class=\"score-info-icon disable-select\" on:click|self={() => scoreQuestionsExpanded = !scoreQuestionsExpanded}>\n              {scoreQuestionsExpanded ? 'X' : '?'}\n            </span>\n          </div>\n          {#if (scoreQuestionsExpanded)}\n            <div class=\"store-questions-wrapper\" transition:slide|local>\n              <ScoreQuestions timePoint={$tooltip.tp} />\n            </div>\n          {/if}\n        </div>\n        <div class=\"smi\">\n          <h3>Attribution impact</h3>\n          {#if ($tooltip.tp.smiPending)}\n            <p>pending</p>\n          {:else}\n            <ul>\n              <li>\n                <span class=\"smi-score facebook\">{commaFormat($tooltip.tp.smiFacebook)}</span>\n                <span class=\"smi-label\">Facebook</span>\n              </li>\n              <li>\n                <span class=\"smi-score twitter\">{commaFormat($tooltip.tp.smiTwitter)}</span>\n                <span class=\"smi-label\">Twitter</span>\n              </li>\n              <li>\n                <span class=\"smi-score reddit\">{commaFormat($tooltip.tp.smiReddit)}</span>\n                <span class=\"smi-label\">Reddit</span>\n              </li>\n            </ul>\n          {/if}\n        </div>\n        {#if ($tooltip.tp.imageUrl)}\n          <div class=\"image\">\n            <img src=\"{images}{$tooltip.tp.caseHash}.jpg\" alt={$tooltip.tp.shortTitle} />\n            <p>{$tooltip.tp.imageCredit}</p>\n          </div>\n        {/if}\n        <div class=\"description\">\n          <h3>Description</h3>\n          <p>{@html highlight($tooltip.tp.shortDescription)}</p>\n        </div>\n        <div class=\"platforms\">\n          <h3>Platforms</h3>\n          <ul>\n            {#each $tooltip.tp.platforms as platform (platform)}\n              <li class=\"card\" on:click|self={() => handleLiClick('platform', platform)}>{@html highlight(platform)}</li>\n            {/each}\n          </ul>\n        </div>\n        <div class=\"methods\">\n          <h3>Methods</h3>\n          <ul>\n            {#each $tooltip.tp.methods as method (method)}\n              <li class=\"card\" on:click|self={() => handleLiClick('method', method)}>{@html highlight(method)}</li>\n            {/each}\n          </ul>\n        </div>\n        <div class=\"source\">\n          <h3>Source{$tooltip.tp.source.length !== 1 ? 's' : ''}</h3>\n          <ul>\n            {#each $tooltip.tp.source as source, i (source)}\n              <li class=\"card\" on:click|self={() => handleLiClick('source', $tooltip.tp.sourceFilter[i] ? $tooltip.tp.sourceFilter[i] : $tooltip.tp.sourceFilter.slice(-1)[0])}>\n                {#if ($tooltip.tp.sourceFilter[i] && $tooltip.tp.sourceFilter[i] !== source)}\n                  {@html highlight(source)} / {@html highlight($tooltip.tp.sourceFilter[i])}\n                {:else if (!$tooltip.tp.sourceFilter[i] && $tooltip.tp.sourceFilter.slice(-1)[0] !== source)}\n                  {@html highlight(source)} / {@html highlight($tooltip.tp.sourceFilter.slice(-1)[0])}\n                {:else if ($tooltip.tp.sourceFilter[i])}\n                  {@html highlight($tooltip.tp.sourceFilter[i])}\n                {:else}\n                  {@html highlight($tooltip.tp.sourceFilter.slice(-1)[0])}\n                {/if}\n              </li>\n            {/each}\n          </ul>\n        </div>\n        <div class=\"source-category\">\n          <h3>Source categor{$tooltip.tp.sourceCategory.length !== 1 ? 'ies' : 'y'}</h3>\n          <ul>\n            {#each $tooltip.tp.sourceCategory as cat (cat)}\n              <li class=\"card\" on:click|self={() => handleLiClick('sourceCategory', cat)}>{@html highlight(cat)}</li>\n            {/each}\n          </ul>\n        </div>\n        <div class=\"link\">\n          <h3>Link</h3>\n          <a href={$tooltip.tp.attributionUrl} target=\"_blank\" class=\"no-float\">{extractHostname($tooltip.tp.attributionUrl)}</a>\n        </div>\n      </div>\n    </div>\n  </div>\n{/if}\n\n<style>\n  .tooltip {\n    width: 70%;\n    /* min-width: 550px; */\n    font-family: var(--font-02);\n    position: absolute;\n    z-index: 10000;\n  }\n\n  @media (min-width: 800px) {\n    .tooltip {\n      width: 21%;\n      min-width: 550px;\n    }\n  }\n\n  .content {\n    display: flex;\n    flex-direction: column;\n    max-height: 60vh;\n    color: var(--text-black);\n    background-color: var(--bg);\n    pointer-events: all;\n    box-shadow: 0 1px 2px rgba(0,0,0,0.07), \n                0 2px 4px rgba(0,0,0,0.07), \n                0 4px 8px rgba(0,0,0,0.07), \n                0 8px 16px rgba(0,0,0,0.07),\n                0 16px 32px rgba(0,0,0,0.07), \n                0 32px 64px rgba(0,0,0,0.07);\n    position: absolute;\n  }\n\n  .scroll-wrapper {\n    height: 100%;\n    overflow-x: hidden;\n    overflow-y: scroll;\n  }\n\n  .scroll-wrapper .title {\n    padding: 1rem;\n    background-image: linear-gradient(var(--usa-lightlightred), var(--usa-lightred));\n    position: relative;\n  }\n\n  .title-top {\n    display: flex;\n    align-items: flex-start;\n    width: 100%;\n  }\n\n  .title-dates {\n    flex: 1;\n  }\n\n  .title-dates p {\n    color: var(--text-black);\n    font-size: 0.7rem;\n  }\n\n  .scroll-wrapper > div {\n    width: 100%;\n    padding: 0.5rem 1rem;\n  }\n\n  h2, h3 {\n    color: var(--text-black);\n  }\n\n  h2 {\n    margin: 1rem 0;\n    font-size: 1.1rem;\n    font-weight: bold;\n  }\n\n  h3 {\n    margin: 0 0 0.1rem 0;\n    font-size: 0.9rem;\n    font-weight: normal;\n    clear: both;\n  }\n\n  .score-bars {\n    display: flex;\n    align-items: flex-start;\n    justify-content: space-between;\n  }\n\n  .score-bar-wrapper {\n    flex: 1 1 0;\n    display: inline-block;\n  }\n\n  .score-bar-wrapper p {\n    font-size: 0.7rem;\n  }\n\n  .score-bars span.score-info-icon {\n    width: 1rem;\n    height: 1rem;\n    margin: 0;\n    padding: 0 auto 0.1rem auto;\n    font-size: 0.7rem;\n    font-weight: bold;\n    text-align: center;\n    color: var(--usa-lightred);\n    border: 2px solid var(--text-darkgray);\n    border-radius: 2px;\n    background-color: var(--text-darkgray);\n    transition: all 400ms ease;\n    cursor: pointer;\n  }\n\n  .score-bars span.score-info-icon:hover {\n    color: var(--text-darkgray);\n    background-color: var(--usa-lightred);\n  }\n\n  .store-questions-wrapper {\n    position: relative;\n  }\n\n  h3 {\n    margin: 0 0 0.1rem 0;\n    font-size: 0.9rem;\n    font-weight: normal;\n    color: var(--text-black);\n    clear: both;\n  }\n\n  p {\n    font-size: 0.8rem;\n    line-height: 1.5;\n  }\n\n  ul {\n    display: inline-block;\n    list-style-type: none;\n  }\n\n  li.card, a {\n    float: left;\n    margin: 0.1rem 0.2rem 0.1rem 0;\n    padding: 0.1rem 0.3rem;\n    font-size: 0.8rem;\n    color: var(--text-black);\n    border: none;\n    border-radius: 0.2rem;\n    background-color: var(--usa-lightlightred);\n    cursor: pointer;\n    user-select: none;\n    transition: background-color 200ms ease;\n    box-shadow: 0 1px 2px rgba(0,0,0,0.07), \n                0 2px 4px rgba(0,0,0,0.07);\n  }\n\n  .smi ul {\n    display: flex;\n  }\n\n  .smi li {\n    margin: 0.2rem 0.3rem 0.2rem 0;\n    font-size: 0.8rem;\n  }\n\n  .smi-score {\n    padding: 0 0.2rem;\n    border: none;\n    border-radius: 3px;\n    box-shadow: 0 1px 2px rgba(0,0,0,0.07), \n                0 2px 4px rgba(0,0,0,0.07);\n  }\n\n  .smi-label {\n    display: inline-block;\n    padding: 0 0.1rem;\n    border: none;\n    border-radius: 3px;\n  }\n\n  a {\n    text-decoration: none;\n  }\n\n  a:hover, li.card:hover {\n    background-color: var(--usa-lightred);\n  }\n\n  .small {\n    font-size: 0.6rem;\n  }\n\n  .no-break {\n    word-break: keep-all;\n    white-space: nowrap;\n  }\n\n  .scroll-wrapper .image {\n    min-height: 1%;\n    width: 100%;\n  }\n\n  .image img {\n    width: 100%;\n  }\n\n  .image p {\n    width: 100%;\n    font-size: 0.5rem;\n    text-align: right;\n  }\n\n  .no-float {\n    float: none;\n  }\n</style>\n",
 | |
|     "<script>\n  // the little cross showing up on hovered balloons\n  import { draw } from 'svelte/transition';\n  import { oneLineTrim } from 'common-tags';\n\n  export let tWidth = 0;\n  export let offset = {\n    top: 10,\n    right: 10,\n    bottom: 10,\n    left: 10\n  };\n  export let side = 'left';\n</script>\n\n<svg viewBox=\"0 0 {offset.left * 2} {offset.top * 2}\"\n     width={offset.left * 2}\n     height={offset.top * 2}\n     style=\"left: {side === 'right' ? 0 : tWidth - 2 * offset.left}px;\">\n  <path d=\"M{offset.left} 0L{offset.left} {offset.top * 2}\"></path>\n  <path d=\"M0 {offset.top}L{offset.left * 2} {offset.top}\"></path>\n</svg>\n\n<style>\n  svg {\n    pointer-events: none;\n    position: absolute;\n    z-index: 0;\n  }\n\n  path {\n    stroke: var(--usa-blue);\n    stroke-width: 2px;\n    stroke-linecap: round;\n    fill: none;\n  }\n</style>\n",
 | |
|     "<script>\n  // setting up all events\n  import Event from './Event.svelte';\n  import { hovered, selected } from '../stores/eventSelections';\n\n  export let timePoints = [];\n\n  function handleEventMouseover(event) {\n    $hovered = event.detail;\n  }\n\n  function handleEventClick(event) {\n    const obj = event.detail;\n    if ($selected.map((d) => d.id).includes(obj.id)) {\n      selected.remove(obj);\n    } else {\n      selected.add(obj);\n    }\n  }\n</script>\n\n<g class=\"events\">\n  {#each timePoints as timePoint (timePoint.id)}\n    <Event {timePoint}\n           selected={$selected && $selected.map((d) => d.id).includes(timePoint.id)}\n           hovered={$hovered && $hovered.id === timePoint.id}\n           on:click={handleEventClick}\n           on:mouseover={handleEventMouseover} />\n  {/each}\n</g>\n\n<style>\n  .events {\n    width: 100%;\n    height: 50%;\n    overflow: hidden;\n  }\n</style>\n",
 | |
|     "<script>\n  // info shown on the timeline, e.g. for jumps to table view\n  import { fade } from 'svelte/transition';\n\n  export let selectedItems = [];\n  export let x = 0;\n  export let y = 0;\n\n  let showCounter = 0;\n\n  $: show = selectedItems.length >= 2;\n  $: if (show) showCounter += 1;\n</script>\n\n{#if (show && showCounter <= 2)}\n  <div class=\"info\"\n       style=\"left: {x}px; top: {y}px;\"\n       transition:fade>\n    <div class=\"info-icon\">i</div>\n    <p>Compare your selection in the <span class=\"pseudolink\" on:click|self={() => document.querySelector('#table').scrollIntoView({behavior: 'smooth'})}>dataset view</span>.</p>  \n  </div>\n{/if}\n\n<style>\n  .info {\n    display: flex;\n    align-items: center;\n    position: absolute;\n    z-index: 20000;\n  }\n\n  .info-icon {\n    width: 1.2rem;\n    height: 1.2rem;\n    font-family: var(--font-02);\n    font-size: 0.8rem;\n    font-weight: bold;\n    color: var(--usa-blue);\n    text-align: center;\n    border: 2px solid var(--usa-blue);\n    border-radius: 50%;\n  }\n\n  p {\n    margin-left: 0.4rem;\n    font-family: var(--font-02);\n    font-size: 0.8rem;\n    color: var(--text-black);\n  }\n</style>\n",
 | |
|     "<script>\n  // collection of viz labels\n  import { timeScale, smiTotalYScale } from '../stores/scales';\n  import { margin } from '../stores/dimensions';\n  import { timeFormat, format } from 'd3';\n  import { panelHeight } from '../stores/dimensions';\n\n  const lineLength = 70;\n  const offset = 5;\n\n  const commaFormat = format(',');\n  const tf = timeFormat('%b %d, %Y');\n\n  let yScaleText, mapScaleText, timeScaleText;\n</script>\n\n<g class=\"labels disable-select\">\n  <g class=\"time-scale\"\n     transform=\"translate(0 {$smiTotalYScale.range()[0]})\">\n    {#each $timeScale.ticks(3) as tick}\n      <g class=\"tick\"\n         transform=\"translate({$timeScale(tick)} 20)\">\n        <circle cx=\"0\" cy=\"-20\" r=\"5\" />\n        <text class=\"bg\">{tf(tick).replace('Jan 01, ', '')}</text>\n        <text>{tf(tick).replace('Jan 01, ', '')}</text>\n      </g>\n    {/each}\n    <g class=\"today\" transform=\"translate({$timeScale(new Date())} 20)\">\n      <circle cx=\"0\"\n              cy=\"-20\"\n              r=\"5\"></circle>\n      <text class=\"bg\">Today</text>\n      <text>Today</text>\n    </g>\n    <g class=\"time-scale-label\" transform=\"translate({15 + $timeScale.range()[0] - $margin.left / 1.5} -15)\">\n      <path d=\"M0 0l{lineLength} 0\"></path>\n      <text class=\"bg\"\n            dx={lineLength + offset}\n            dy=\"4\">Attribution Date</text>\n      <text bind:this={timeScaleText}\n            dx={lineLength + offset}\n            dy=\"4\">Attribution Date</text>\n      <path d=\"M{timeScaleText ? timeScaleText.getComputedTextLength() + lineLength + 2 * offset: 0} 0l{lineLength} 0\"\n            marker-end=\"url(#arrow)\"></path>\n    </g>\n  </g>\n  <g class=\"y-scale-ticks\"\n     transform=\"translate({15 + $timeScale.range()[0] - $margin.left / 1.5} 0)\">\n    {#each $smiTotalYScale.ticks(5).slice(1) as tick}\n      <g class=\"tick\"\n          transform=\"translate(0 {$smiTotalYScale(tick)})\">\n        <text>{commaFormat(tick)}</text>\n      </g>\n    {/each}\n  </g>\n  <g class=\"y-scale\"\n     transform=\"translate({$timeScale.range()[0] - $margin.left / 1.5} {0.95 * $smiTotalYScale.range()[0]})\">\n    <path d=\"M0 0l0 {-lineLength}\"></path>\n    <text bind:this={yScaleText}\n          transform=\"rotate(270)\"\n          dx={lineLength + offset}\n          dy=\"4\">Attribution Impact</text>\n    <path d=\"M0 {yScaleText ? -yScaleText.getComputedTextLength() - lineLength - 2 * offset: 0}l0 {-lineLength}\"\n          marker-end=\"url(#arrow)\"></path>\n  </g>\n  <g class=\"map-scale\"\n     transform=\"translate({$timeScale.range()[0] - $margin.left / 1.5} {1.05 * $panelHeight})\">\n    <path d=\"M0 0l0 {lineLength}\"></path>\n    <text bind:this={mapScaleText}\n          transform=\"rotate(270)\"\n          dx={mapScaleText ? -mapScaleText.getComputedTextLength() - lineLength - offset: 0}\n          dy=\"4\">Disinformant Nations</text>\n    <path d=\"M0 {mapScaleText ? mapScaleText.getComputedTextLength() + lineLength + 2 * offset: 0}l0 {lineLength}\"></path>\n  </g>\n</g>\n\n<style>\n  .time-scale text {\n    fill: var(--text-darkgray);\n    font-family: var(--font-02);\n    font-size: 0.7rem;\n    text-anchor: middle;\n  }\n\n  .time-scale-label text {\n    text-anchor: start;\n  }\n\n  .time-scale text.bg {\n    stroke: var(--bg);\n    stroke-width: 0.25rem;\n    stroke-opacity: 0.8;\n    fill: var(--bg);\n  }\n\n  .time-scale circle {\n    stroke: none;\n    fill: var(--dfrlab-gray);\n  }\n\n  .y-scale-ticks text, .y-scale text, .map-scale text {\n    fill: var(--text-darkgray);\n    font-family: var(--font-02);\n    font-size: 0.7rem;\n  }\n\n  .y-scale-ticks text {\n    font-size: 0.6rem;\n  }\n\n  .time-scale path, .y-scale path, .map-scale path {\n    stroke: var(--text-darkgray);\n    stroke-width: 0.1rem;\n  }\n</style>\n",
 | |
|     "<script>\n  // additional legend on SVG, currently holding an extra attribution impact legend\n  import {\n    timeScale,\n    smiTotalYScale,\n    smiTotalRScale } from '../stores/scales';\n  import { margin } from '../stores/dimensions';\n  import { format } from 'd3';\n\n  const commaFormat = format(',');\n  const rTicks = [500000, 100000, 0];\n</script>\n\n<g class=\"legend\"\n   transform=\"translate({20 + $timeScale.range()[0] - $margin.left / 1.5 + $smiTotalRScale(rTicks[0])} {$smiTotalYScale.range()[1] - 20})\">\n  <text transform=\"translate({-$smiTotalRScale(rTicks[0]) - 20} {$smiTotalRScale(rTicks.slice(-1)[0])}) rotate(270)\"\n        dy=\"4\">\n    Attribution Impact\n  </text>\n  <g class=\"total-r-scale\" transform=\"translate(0 {-4.5 * $smiTotalRScale(rTicks.slice(-1)[0])})\">\n    {#each rTicks as tick, i}\n      <line x1=\"0\"\n            y1={$smiTotalRScale(rTicks[0]) - 2 * $smiTotalRScale(tick)}\n            x2={$smiTotalRScale(rTicks[0]) + 15}\n            y2={$smiTotalRScale(rTicks[0]) - 2 * $smiTotalRScale(tick)}></line>\n      <text class=\"tick\"\n            transform=\"translate({$smiTotalRScale(rTicks[0]) + 18} {$smiTotalRScale(rTicks[0]) - 2 * $smiTotalRScale(tick)})\">\n        {commaFormat(tick)}\n      </text>\n      <circle cx=\"0\"\n              cy={$smiTotalRScale(rTicks[0]) - $smiTotalRScale(tick)}\n              r={$smiTotalRScale(tick)}></circle>\n    {/each}\n  </g>\n  <g class=\"smi-pending\">\n    <line x1=\"0\"\n          y1={-$smiTotalRScale(rTicks.slice(-1)[0])}\n          x2={$smiTotalRScale(rTicks[0]) + 15}\n          y2={-$smiTotalRScale(rTicks.slice(-1)[0])}></line>\n    <text class=\"tick\"\n          transform=\"translate({$smiTotalRScale(rTicks[0]) + 18} {-$smiTotalRScale(rTicks.slice(-1)[0])})\">\n      pending\n    </text>\n    <circle cx=\"0\"\n            cy=\"0\"\n            r={$smiTotalRScale(rTicks.slice(-1)[0])}></circle>\n  </g>\n</g>\n\n<style>\n  line {\n    fill: none;\n    stroke: var(--text-darkgray);\n    stroke-width: 0.05rem;\n    stroke-dasharray: 4px 3px;\n  }\n\n  text {\n    fill: var(--text-darkgray);\n    font-family: var(--font-02);\n    font-size: 0.7rem;\n  }\n\n  text.tick {\n    font-size: 0.6rem;\n  }\n\n  .total-r-scale circle {\n    fill: none;\n    stroke: var(--usa-lightred);\n    stroke-width: 0.1rem;\n  }\n\n  .smi-pending circle {\n    fill: none;\n    stroke: var(--usa-lightblue);\n    stroke-width: 0.18rem;\n    stroke-linecap: round;\n    stroke-dasharray: 3px 5px;\n  }\n</style>\n",
 | |
|     "<script>\n  // loading banner\n</script>\n\n<div class=\"loading-info\">\n  <p>Loading and visualizing...</p>\n</div>\n\n<style>\n  .loading-info {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    width: 100%;\n    font-family: var(--font-02);\n  }\n\n  p {\n    color: var(--usa-blue);\n    font-size: 1rem;\n  }\n</style>\n",
 | |
|     "<script>\n  // a score bar used on case tooltips\n  export let value = 0;\n  export let minValue = 0;\n  export let maxValue = 1;\n\n  $: relState = (value - minValue) / (maxValue - minValue);\n</script>\n\n<div class=\"score-bar\">\n  <span class=\"inner-score-bar\"\n       style=\"width: {relState * 100}%;\"></span>\n</div>\n\n<style>\n  .score-bar {\n    width: 100%;\n    max-width: 70px;\n    min-height: 10px;\n    border: 1px solid var(--text-darkgray);\n    border-radius: 3px;\n    position: relative;\n  }\n\n  .inner-score-bar {\n    height: 100%;\n    background-color: var(--text-darkgray);\n    border: none;\n    position: absolute;\n  }\n</style>\n",
 | |
|     "<script>\n  // score questions and answers used on the case tooltips\n  import { uniqBy } from 'lodash';\n  import { questions, scores, maxScores } from '../inputs/scores';\n\n  export let timePoint;\n\n  const ans = (int) => int === 1 ? true : false;\n</script>\n\n<div class=\"score-questions\">\n  {#each scores as s}\n    <h4>{s.scoreName}: {timePoint[s.score]}/{maxScores[s.score]}</h4>\n    <ul>\n      {#each questions.filter((d) => d.score === s.score) as q (q.id)}\n        <li>\n          <input type=\"checkbox\" checked={ans(timePoint[q.column])} />\n          <span class=\"checkmark\"></span>\n          <p>{q.text}</p>\n        </li>\n      {/each}\n    </ul>\n  {/each}\n</div>\n\n<style>\n  ul {\n    margin: 0.3rem 0;\n    list-style-type: none;\n  }\n\n  h4 {\n    margin: 1rem 0 0 0;\n    font-size: 0.8rem;\n    font-weight: bold;\n    color: var(--text-black);\n  }\n\n  li {\n    display: block;\n    margin: 0.3rem 0;\n    padding-left: 20px;\n    position: relative;\n  }\n\n  li p {\n    font-family: var(--font-02);\n    font-size: 0.8rem;\n    line-height: 1.5;\n    color: var(--text-black);\n  }\n\n  li input {\n    position: absolute;\n    opacity: 0;\n    height: 0;\n    width: 0;\n  }\n\n  .checkmark {\n    position: absolute;\n    top: 5px;\n    left: 0;\n    height: 15px;\n    width: 15px;\n    border: none;\n    border-radius: 2px;\n    background-color: var(--bg);\n  }\n\n  .checkmark:after {\n    content: '';\n    display: none;\n    position: absolute;\n  }\n\n  li input:checked ~ .checkmark:after {\n    display: block;\n  }\n\n  li .checkmark:after {\n    left: 5px;\n    top: 2px;\n    width: 3px;\n    height: 7px;\n    border: solid var(--usa-blue);\n    border-width: 0 3px 3px 0;\n    transform: rotate(45deg);\n  }\n</style>\n",
 | |
|     "<script>\n  // free text search bar\n  import { createEventDispatcher } from 'svelte';\n\n  export let searchString = '';\n  export let label = '';\n\n  const dispatch = createEventDispatcher();\n\n  function reset() {\n    searchString = '';\n    search();\n  }\n\n  function handleKeyUp(e) {\n    if (e && e.keyCode === 13) search();\n  }\n\n  function handleGoClick() {\n    search();\n  }\n\n  function search() {\n    dispatch('change', searchString);\n  }\n</script>\n\n<div class=\"search-text\">\n  <div class=\"label\">\n    <p>{label}</p>\n    <p>|</p>\n    <span on:click={() => reset()}>Reset</span>\n  </div>\n  <div class=\"search\">\n    <input id=\"table-search-field\"\n            type=\"text\"\n            placeholder=\"Type and press enter\"\n            bind:value={searchString}\n            on:keyup={(e) => handleKeyUp(e)} />\n    {#if (searchString !== '')}\n      <span class=\"button-fields\">\n        <span class=\"reset\"\n                class:active={searchString}\n                on:click={() => searchString = ''}>\n          x\n        </span>\n        <span class=\"go\"\n              class:active={searchString}\n              on:click={() => handleGoClick()}>\n          Go\n        </span>\n      </span>\n    {/if}\n  </div>\n</div>\n\n<style>\n  .search-text {\n    align-self: flex-end;\n    display: flex;\n    flex-direction: column;\n    font-family: var(--font-02);\n    width: 200px;\n    max-width: 200px;\n    min-width: 200px;\n    margin: 0.3rem 0.3rem 0 0.3rem;\n    position: relative;\n    pointer-events: all;\n  }\n\n  .label {\n    display: flex;\n    margin: 0 0 0.1rem 0;\n    font-size: 0.7rem;\n    color: var(--usa-blue);\n  }\n\n  .label > * {\n    padding-right: 0.2rem;\n  }\n\n  .label span {\n    margin: 0 -0.1rem;\n    padding: 0 0.1rem;\n    color: var(--usa-blue);\n    border: none;\n    border-radius: 3px;\n    cursor: pointer;\n    transition: all 200ms ease;\n  }\n\n  .label span:hover {\n    color: var(--bg);\n    background-color: var(--usa-blue);\n  }\n\n  .search {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    width: 100%;\n    height: 1.7rem;\n    font-size: 0.8rem;\n    background-color: var(--bg);\n    border: 2px solid var(--usa-blue);\n    border-radius: 3px;\n    position: relative;\n  }\n\n  input {\n    width: 100%;\n    height: 100%;\n    padding: 0.1rem 2.3rem 0.1rem 0.3rem;\n    font-size: 0.8rem;\n    color: var(--text-black);\n    background-color: var(--bg);\n    border: none;\n  }\n\n  .button-fields {\n    display: block;\n    position: absolute;\n    bottom: 0.2rem;\n    right: 0.3rem;\n    z-index: 10001;\n  }\n\n  .reset {\n    display: none;\n    margin-right: 0.3rem;\n    cursor: pointer;\n  }\n\n  .go {\n    cursor: pointer;\n  }\n</style>\n",
 | |
|     "<script>\n  import {\n    disinformantNationFilter,\n    platformFilter,\n    methodFilter,\n    sourceFilter,\n    sourceCategoryFilter,\n    attributionScoreFilter,\n    attributionScoreDef,\n    textSearchFilter,\n    originalTimeDomain,\n    contextData } from '../stores/filters';\n  import { urlFromFilters } from '../utils/share';\n\n  import Icon from 'svelte-awesome';\n  import { twitter, clipboard } from 'svelte-awesome/icons';\n\n  export let text = 'Share this view.';\n  export let caseId = '';\n  export let mode = 'standard';\n\n  async function copyToClipBoard() {\n    await navigator.clipboard.writeText(url);\n    const previousText = text;\n    text = 'Copied!';\n    setTimeout(() => text = previousText, 3000);\n  }\n\n  $: url = urlFromFilters(\n            $disinformantNationFilter,\n            $platformFilter,\n            $methodFilter,\n            $sourceFilter,\n            $sourceCategoryFilter,\n            $attributionScoreFilter,\n            $textSearchFilter,\n            $contextData,\n            caseId);\n</script>\n\n<div class=\"share\">\n  <p class:gray={mode === 'tooltip'}>{text}</p>\n  <a class=\"twitter-share-button\"\n     class:gray={mode === 'tooltip'}\n     href=\"https://twitter.com/intent/tweet?url={url.replace('#', '%23')}\"\n     data-size=\"large\"\n     target=\"_blank\">\n    <Icon data={twitter} scale=\"1.2\" />\n  </a>\n  <span class=\"pseudolink\"\n        class:gray={mode === 'tooltip'}\n        on:click={copyToClipBoard}>\n    <Icon data={clipboard}/>\n  </span>\n</div>\n\n<style>\n  .share {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    font-family: var(--font-02);\n    font-size: 0.7rem;\n    pointer-events: all;\n  }\n\n  p {\n    color: var(--usa-blue);\n  }\n\n  a {\n    margin: 0 0.4rem;\n  }\n\n  .gray {\n    color: var(--text-darkgray);\n    transition: all 200ms ease;\n  }\n\n  .gray:hover {\n    color: var(--text-black);\n  }\n</style>\n",
 | |
|     "<script>\n  // shiny circle around balloons\n  import { fade } from 'svelte/transition';\n  import { bloomDuration, growDuration, jitterFactor } from '../transitions/constants';\n  import { sortConsistently } from '../utils/misc';\n\n  export let timePoint;\n  export let tweenedPos;\n  export let selected = false;\n  export let hovered = false;\n\n  let sortedRadii = [];\n\n  $: if (timePoint) sortedRadii = [\n    {\n      id: 2,\n      className: 'reddit',\n      r: timePoint.rSmiReShare + timePoint.rSmiTwShare + timePoint.rSmiFbShare,\n    },\n    {\n      id: 1,\n      className: 'twitter',\n      r: timePoint.rSmiTwShare + timePoint.rSmiFbShare,\n    },\n    {\n      id: 0,\n      className: 'facebook',\n      r: timePoint.rSmiFbShare,\n    }\n  ]\n  .map((d) => ({...d, r: d.r * sizeFactor}));\n\n  $: sizeFactor = timePoint.rSmiTot / 100;\n</script>\n\n<g class=\"shiny-circle\"\n   class:selected={selected || hovered}\n   transform=\"translate({tweenedPos.x} {tweenedPos.fy})\"\n   in:fade|local={{duration: bloomDuration, delay: growDuration + timePoint.id * jitterFactor}}\n   out:fade|local={{duration: bloomDuration, delay: timePoint.id * jitterFactor}}>\n  {#each sortedRadii as {id, className, r} (id)}\n    <circle class={className}\n            cx=\"0\"\n            cy=\"0\"\n            r={r + timePoint.rSmiTot} />\n  {/each}\n</g>\n\n<style>\n  g {\n    opacity: 0.04;\n    transition: opacity 400ms ease;\n    pointer-events: none;\n  }\n\n  g.selected {\n    opacity: 0.76;\n  }\n\n  circle {\n    stroke: none;\n    opacity: 1;\n  }\n</style>\n",
 | |
|     "<script>\n  // a custom slider for score selection\n  import { createEventDispatcher, onMount } from 'svelte';\n  import { scaleLinear } from 'd3';\n  import { slidable } from '../actions/slidable';\n\n  export let label = '';\n  export let min = 0;\n  export let max = 10;\n  export let value = [0, 10];\n  export let showHandleLabels = true;\n  export let startColor = 'white';\n  export let stopColor = 'red';\n\n  const dispatch = createEventDispatcher();\n  const handleWidth = 17;\n\n  const pos = {\n    left: 0,\n    right: 0\n  };\n\n  let sliderWidth = 0;\n\n  function handleSlide(e, side) {\n    const newPos = pos[side] + e.detail.dx;\n\n    if (newPos < 0 || newPos > sliderWidth) return;\n    if (side === 'left' && newPos > pos.right) return;\n    if (side === 'left' && newPos < scale.range()[0]) return;\n    if (side === 'right' && newPos < pos.left) return;\n    if (side === 'right' && newPos > scale.range()[1]) return;\n    \n    pos[side] = newPos;\n  }\n\n  function handleSlideEnd(e, side) {\n    dispatch('changed', [Math.round(scale.invert(pos.left), 0),\n                         Math.round(scale.invert(pos.right), 0)]);\n  }\n\n  $: scale = scaleLinear()\n      .domain([min, max])\n      .range([handleWidth / 2, sliderWidth - 1.7 * handleWidth]);\n\n  $: pos.left = scale(value[0]) || 0;\n  $: pos.right = scale(value[1]) || 0;\n</script>\n\n<div class=\"slider\"\n     bind:clientWidth={sliderWidth}\n     style=\"--handle-width: {handleWidth}px;\">\n  <div class=\"label\">\n    {label}\n  </div>\n  <div class=\"slider-body\">\n    <div class=\"slider-selected-range\"\n         style=\"width: {sliderWidth - 3 * handleWidth}px;\n                margin-left: {1.5 * handleWidth}px;\n                background: linear-gradient(90deg, {startColor}, {stopColor});\"></div>\n    <div class=\"slider-handle\"\n         class:no-label={!showHandleLabels}\n         style=\"left: {(value[0] === value[1]) ? pos.left - 5 : pos.left}px;\"\n         use:slidable\n         on:slide={(e) => handleSlide(e, 'left')}\n         on:slideend={(e) => handleSlideEnd(e, 'left')}>\n      <span class=\"disable-select\">{showHandleLabels ? Math.round(scale.invert(pos.left), 0) : ''}</span>\n    </div>\n    <div class=\"slider-handle\"\n         class:no-label={!showHandleLabels}\n         style=\"left: {(value[0] === value[1]) ? pos.right + 5 : pos.right}px;\"\n         use:slidable\n         on:slide={(e) => handleSlide(e, 'right')}\n         on:slideend={(e) => handleSlideEnd(e, 'right')}>\n      <span class=\"disable-select\">{showHandleLabels ? Math.round(scale.invert(pos.right), 0) : ''}</span>\n    </div>\n  </div>\n</div>\n\n<style>\n  .slider {\n    display: flex;\n    flex-direction: column;\n    font-family: var(--font-02);\n    width: 200px;\n    max-width: 200px;\n    margin: 0.3rem 0.3rem 0 0.3rem;\n    position: relative;\n    pointer-events: all;\n  }\n\n  .label {\n    margin: 0 0 0.1rem 0;\n    font-size: 0.7rem;\n    color: var(--usa-blue);\n  }\n\n  .slider-body {\n    display: flex;\n    align-items: center;\n    width: 100%;\n    height: 1.7rem;\n    padding: 0.1rem 0;\n    font-size: 0.7rem;\n    background-color: var(--bg);\n    border: 2px solid var(--usa-blue);\n    border-radius: 3px;\n    position: relative;\n  }\n\n  .slider-selected-range {\n    height: 8px;\n    border: none;\n    border-radius: 2px;\n    position: absolute;\n    z-index: 100;\n  }\n\n  .slider-handle {\n    width: var(--handle-width);\n    height: var(--handle-width);\n    border: 2px solid var(--usa-blue);\n    border-radius: 50%;\n    background-color: var(--bg);\n    cursor: pointer;\n    position: absolute;\n    z-index: 10000;\n  }\n\n  .slider-handle > span {\n    width: 100%;\n    height: 100%;\n    font-size: 0.7rem;\n    text-align: center;\n    color: var(--usa-blue);\n    position: absolute;\n  }\n</style>\n",
 | |
|     "<script>\n  // a source link\n  import { draw } from 'svelte/transition';\n  import { mapHeight, minDim } from '../stores/dimensions';\n  import { linear } from 'svelte/easing';\n  import { growDuration, bloomDuration, jitterFactor } from '../transitions/constants';\n  import { curvyDoubleLine } from '../utils/paths';\n  import { createTweenedPos } from '../transitions/tween';\n\n  export let source;\n  export let selected = 'unselected';\n  export let hovered = 'unselected';\n  export let extraFaint = false;\n\n  const tweenedPos = createTweenedPos();\n\n  function setOpacity(selected, hovered, extraFaint) {\n    if (extraFaint) return 0.2 / 3 / 2;\n\n    let opacity = 0.5 / source.disinformantNation.length;\n\n    if (selected === 'selected' || hovered === 'selected') {\n      opacity = 0.95;\n      return(opacity);\n    }\n    if (selected === 'background' || hovered === 'background') opacity = 0.2 / source.disinformantNation.length;\n\n    return(opacity);\n  }\n\n  $: $tweenedPos = {x: source.x, fy: source.fy, _x: source._x, _y: source._y};\n\n  $: opacity = setOpacity(selected, hovered, extraFaint);\n</script>\n\n{#if (source.show)}\n  <g class=\"source-link\"\n     style=\"opacity: {opacity}; transition: all 700ms ease;\"\n     class:selected={selected || hovered}>\n    <path d={curvyDoubleLine(source.xCountry,\n                             source.yCountry,\n                             $tweenedPos._x,\n                             $tweenedPos._y,\n                             $tweenedPos.x,\n                             $tweenedPos.fy + source.rSmiTot - 5,\n                             source.shift,\n                             $mapHeight / 15)}\n          stroke-width={$minDim / 200}\n          in:draw|local={{duration: growDuration, delay: source.id * jitterFactor, easing: linear}}\n          out:draw|local={{duration: growDuration, delay: bloomDuration + source.id * jitterFactor, easing: linear}}></path>\n  </g>\n{/if}\n\n<style>\n  path {\n    stroke: var(--usa-blue);\n    fill: none;\n  }\n\n  .selected path {\n    opacity: 1;\n  }\n</style>\n",
 | |
|     "<script>\n  // tooltip of the timeline spots\n  import { fade } from 'svelte/transition';\n  import { timeFormat } from 'd3';\n\n  export let data;\n  export let x = 0;\n  export let y = 0;\n\n  const tf = timeFormat('%B %d, %Y');\n\n  const maxWidth = 300;\n  const margin = 10;\n\n  let width = maxWidth;\n  let left = 0;\n\n  $: {\n    if (x - width / 2 < 0) {\n      left = margin;\n    } else {\n      left = x - width / 2;\n    }\n\n    if (x + width - document.body.offsetWidth > 0) {\n      left = document.body.offsetWidth - width - margin;\n    }\n  }\n</script>\n\n<div class=\"spot-tooltip\"\n     bind:clientWidth={width}\n     style=\"left: {left}px; top: {y}px; width: {maxWidth}px;\"\n     transition:fade={{duration: 200}}>\n  <div class=\"content\">\n    <p class=\"date\">\n      {tf(data.date)}\n    </p>\n    <h2 class=\"name\">\n      {data.name}\n    </h2>\n    <p class=\" description\">\n      {data.description}\n    </p>\n  </div>\n</div>\n\n<style>\n  .spot-tooltip {\n    margin-right: 1rem;\n    position: absolute;\n    z-index: 1000000000;\n  }\n\n  .content {\n    width: 100%;\n    height: 100%;\n    padding: 1rem;\n    font-family: var(--font-02);\n    color: var(--text-black);\n    background-color: var(--bg);\n    box-shadow: 0 1px 2px rgba(0,0,0,0.07), \n                0 2px 4px rgba(0,0,0,0.07), \n                0 4px 8px rgba(0,0,0,0.07), \n                0 8px 16px rgba(0,0,0,0.07),\n                0 16px 32px rgba(0,0,0,0.07), \n                0 32px 64px rgba(0,0,0,0.07);\n  }\n\n  .date {\n    font-size: 0.6rem;\n  }\n\n  h2 {\n    margin: 0.2rem 0;\n    font-size: 0.9rem;\n  }\n\n  .description {\n    font-size: 0.8rem;\n    line-height: 1.5;\n  }\n</style>\n",
 | |
|     "<script>\n  // the whole SVG wrapper\n  import { width, height, panelHeight } from '../stores/dimensions';\n  import { selected, hovered } from '../stores/eventSelections';\n  import Defs from './Defs.svelte';\n  import BackgroundChart from './BackgroundChart.svelte';\n  import Brush from './Brush.svelte';\n  import Events from './Events.svelte';\n  import Sources from './Sources.svelte';\n  import Timeline from './Timeline.svelte';\n  import Legend from './Legend.svelte';\n  import Labels from './Labels.svelte';\n\n  export let timePoints;\n\n  function handleMouseover() {\n    $hovered = null\n  }\n\n  function handleClick(event) {\n    selected.reset();\n  }\n\n</script>\n\n<svg viewBox=\"0 0 {$width} {$height}\"\n     width={$width}\n     height={$height}\n     on:mouseover={handleMouseover}\n     on:click={handleClick}>\n  <Defs />\n  <rect x=\"0\" y=\"0\" width={$width} height={$panelHeight * 1.1}></rect>\n  <BackgroundChart />\n  <Sources {timePoints} />\n  <Labels />\n  <Brush />\n  <Timeline />\n  <Legend />\n  <Events {timePoints} />\n</svg>\n\n<style>\n  svg {\n    position: absolute;\n    z-index: 1000;\n  }\n\n  rect {\n    fill: url(#bg-gradient);\n  }\n</style>\n",
 | |
|     "<script>\n  // the data table\n  import { sortConsistently } from '../utils/misc';\n  import { draggable } from '../actions/draggable';\n  import { selected } from '../stores/eventSelections';\n  import { columns as inputColumns} from '../inputs/table';\n\n  export let timePoints = [];\n\n  let columns = [...inputColumns];\n  let rows;\n\n  let searchString = '';\n\n  function getData(timePoints) {\n    resetSorters();\n    rows = [...timePoints].filter((d) => d.show);\n  }\n\n  function sortRows(property, direction) {\n    rows.sort((a, b) => direction * sortConsistently(a, b, property, 'id'));\n  }\n\n  function resetSorters() {\n    columns = columns.map((d) => ({...d, sorted: 'none'}));\n  }\n\n  function handleSorterClick(property) {\n    columns.forEach((d) => {\n      if (d.property !== property) d.sorted = 'none';\n    })\n    const column = columns.find((d) => d.property === property);\n    if (column.sorted === 'none') {\n      column.sorted = 'descending';\n      sortRows(property, -1);\n    } else if (column.sorted === 'descending') {\n      column.sorted = 'ascending';\n      sortRows(property, 1);\n    } else if (column.sorted === 'ascending') {\n      column.sorted = 'none';\n      getData(timePoints);\n    }\n    columns = columns;\n  }\n\n  function getSortedSelectedRows(ids) {\n    const arr = [];\n    ids.reverse().forEach((id) => {\n      arr.push(timePoints.find((d) => d.id === id));\n    });\n    return(arr);\n  }\n\n  function moveUp(ids) {\n    resetSorters();\n    if (ids.length > 0) {\n      rows = [...getSortedSelectedRows(ids), ...rows.filter((d) => !ids.includes(d.id))];\n    }\n  }\n\n  $: getData(timePoints);\n\n  $: if ($selected && timePoints) moveUp($selected.map((d) => d.id));\n</script>\n\n<div id=\"table\"\n     class=\"table-element\"\n     on:click|stopPropagation>\n  <div class=\"table-header\">\n    <a href=\"https://github.com/DFRLab/Interference2020-Data\" target=\"_blank\">Download full dataset</a>\n  </div>\n  <div class=\"inner-table-wrapper\" use:draggable>\n    <table cellspacing=\"0\" cellpadding=\"0\">\n      <thead class=\"disable-select\">\n        <tr>\n          {#each columns as column (column.property)}\n            <th>\n              {column.name}\n              {#if (column.sortable)}\n                <svg viewBox=\"0 0 15 10\"\n                     width=\"12\"\n                     height=\"8\"\n                     class={column.sorted}\n                     on:click|stopPropagation={() => handleSorterClick(column.property)}>\n                  <path d=\"M0 0L15 0L7.5 10Z\"></path>\n                </svg>\n              {/if}\n            </th>\n          {/each}\n        </tr>\n      </thead>\n      <tbody on:mousedown|stopPropagation>\n        {#each rows.filter((d) => d.search.indexOf(searchString.toUpperCase()) > -1) as row, i (row.id)}\n          <tr class:darker={1 - (i % 2) === 0}\n              class:selected={$selected.map((d) => d.id).includes(row.id)}>\n            {#each columns as column (column.property)}\n              <td class={column.classes} style={column.minWidth ? `min-width: ${column.minWidth};`: ''}>\n                {#if (row[column.property] === undefined || row[column.property] === null)}\n                  {''}\n                {:else if (column.format)}\n                  {column.format(row[column.property])}\n                {:else if (column.hyperlink)}\n                  <a href={row[column.property]} target=\"_blank\">Link</a>\n                {:else}\n                  {row[column.property]}\n                {/if}\n              </td>\n            {/each}\n          </tr>\n        {/each}\n      </tbody>\n    </table>\n  </div>\n</div>\n\n<style>\n  .table-element {\n    display: block;\n    width : 90%;\n    margin: 0 auto;\n    position: relative;\n  }\n  \n  .table-header {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    height: 1.7rem;\n    margin: 0.4rem 0;\n    padding: 0;\n    font-family: var(--font-02);\n    font-size: 0.8rem;\n  }\n\n  .inner-table-wrapper {\n    width: 100%;\n    height: 600px;\n    max-height: 70vh;\n    overflow-x: scroll;\n    border: 1px solid var(--usa-blue);\n  }\n\n  .inner-table-wrapper::-webkit-scrollbar {\n    -webkit-appearance: none;\n  }\n\n  .inner-table-wrapper::-webkit-scrollbar:horizontal {\n    height: 7px;\n  }\n\n  .inner-table-wrapper::-webkit-scrollbar:vertical {\n    width: 7px;\n  }\n\n  .inner-table-wrapper::-webkit-scrollbar-thumb {\n    background-color:var(--usa-lightblue);\n  }\n\n  table {\n    width: 100%;\n    min-width: 100%;\n    font-family: var(--font-02);\n    color: var(--text-black);\n    border: none;\n    position: relative;\n  }\n\n  th, td {\n    padding: 0.2rem 0.4rem;\n  }\n\n  th {\n    font-size: 0.9rem;\n    text-align: left;\n    vertical-align: top;\n    background-color: var(--usa-lightblue);\n    white-space: nowrap;\n    cursor: grab;\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 10000;\n  }\n\n  th svg {\n    margin-bottom: 0.05rem;\n    stroke: none;\n    fill: var(--text-black);\n    transition: transform 400ms ease;\n    cursor: pointer;\n  }\n\n  th svg.none {\n    transform: rotate(-90deg);\n  }\n\n  th svg.descending {\n    transform: rotate(360deg);\n  }\n\n  th svg.ascending {\n    transform: rotate(-540deg);\n  }\n\n  tbody {\n    width: 100%;\n  }\n\n  tr {\n    background-color: var(--bg);\n  }\n\n  tr.selected {\n    background-color: var(--usa-lightblue);\n  }\n\n  td {\n    font-size: 0.8rem;\n    line-height: 1.5;\n    vertical-align: top;\n    position: relative;\n  }\n\n  .score-bar {\n    height: 0.7rem;\n    margin: auto 0;\n    background-color: var(--usa-lightblue);\n    border: none;\n    border-radius: 3px;\n    position: absolute;\n    top: 0;\n    right: 0;\n    bottom: 0;\n    left: 0.4rem;\n  }\n\n  .left {\n    text-align: left;\n  }\n\n  .right {\n    text-align: right;\n  }\n\n  .darker {\n    background-color: var(--dfrlab-lightlightgray);\n  }\n</style>\n",
 | |
|     "<script>\n  // the timeline\n  import { oneLineTrim } from 'common-tags';\n  import { width, maxDim, panelHeight } from '../stores/dimensions';\n  import { gentleLine } from '../utils/paths';\n\n  import TimelineSpots from './TimelineSpots.svelte';\n\n  const xOffset = $width / 70;\n  const yOffset = $maxDim / 900;\n</script>\n\n<g class=\"timeline\" transform=\"translate(0 {$panelHeight})\">\n  <path d={gentleLine($width, xOffset, yOffset)}></path>\n</g>\n<TimelineSpots />\n\n<style>\n  path {\n    stroke: none;\n    fill: url(#timeline-gradient);\n    fill-opacity: 1;\n  }\n</style>\n",
 | |
|     "<script>\n  // selected dates on the timeline (= the spots)\n  import { panelHeight } from '../stores/dimensions';\n  import { timeScale } from '../stores/scales';\n  import { spottooltipable } from '../actions/spottooltipable';\n  import { drawWrapper } from '../stores/elements';\n  import { createTweenedPos } from '../transitions/tween';\n\n  export let spot;\n\n  const x = createTweenedPos();\n\n  $: $x = $timeScale(spot.date);\n</script>\n\n<g class=\"spot\"\n    transform=\"translate({$x} 0)\"\n    use:spottooltipable={{data: spot, target: $drawWrapper, top: $panelHeight + 20}}>\n  <circle cx=\"0\" cy=\"0\" r=\"5\"></circle>\n  <circle class=\"bait\" cx=\"0\" cy=\"0\" r=\"10\"></circle>\n</g>\n\n<style>\n  g.spot {\n    pointer-events: all;\n    cursor: pointer;\n  }\n\n  g.spot:hover circle:not(.bait) {\n    fill: var(--dfrlab-gray);\n  }\n\n  circle {\n    stroke: var(--dfrlab-gray);\n    stroke-width: 0.13rem;\n    stroke-opacity: 0.9;\n    fill: var(--bg);\n    transition: all 200ms ease;\n  }\n\n  circle.bait {\n    fill: none;\n    stroke: none;\n  }\n</style>\n",
 | |
|     "<script>\n  // back to top or to viz buttons\n  import { fly } from 'svelte/transition';\n  import { scrollTo } from '../utils/misc';\n\n  let show = false;\n\n  function handleScroll() {\n    if (window.pageYOffset > window.innerHeight) {\n      show = true;\n    } else {\n      show = false;\n    }\n  }\n\n  function handleSpanClick(id) {\n    scrollTo(id);\n  }\n</script>\n\n<svelte:window on:scroll={handleScroll}></svelte:window>\n\n{#if (show)}\n  <div class=\"to-top\" transition:fly={{duration: 400, y: 100}}>\n    <span class=\"pseudolink\" on:click={() => handleSpanClick('top')}>To Top</span>\n    <span class=\"pseudolink\" on:click={() => handleSpanClick('viz')}>To Visualization</span>\n  </div>\n{/if}\n\n<style>\n  .to-top {\n    padding: 0.7rem;\n    font-family: var(--font-02);\n    font-size: 0.9rem;\n    background-color: var(--transparentbg);\n    border-top: 2px solid var(--usa-lightblue);\n    border-left: 2px solid var(--usa-lightblue);\n    border-right: 2px solid var(--usa-lightblue);\n    border-top-left-radius: 3px;\n    border-top-right-radius: 3px;\n    position: fixed;\n    z-index: 1000001;\n    bottom: 0;\n    right: 1rem;\n  }\n\n  span {\n    display: block;\n    margin: 0.2rem auto;\n    text-align: center;\n  }\n</style>\n",
 | |
|     "<script>\n  // the visualization wrapper\n  // also holds the logic for the force-directed graph simulation\n  // also holds filter=>event logic\n  // also holds base data loading logic\n  import { onMount } from 'svelte';\n  import loadData from '../utils/loadData';\n  import loadMapData from '../utils/loadMapData';\n  import loadCoronaData from '../utils/loadCoronaData';\n  import { setScales } from '../utils/scales';\n  import {\n    width,\n    height,\n    panelHeight,\n    minDim,\n    maxDim,\n    margin,\n    controlsHeight } from '../stores/dimensions';\n  import {\n    timeScale,\n    smiTotalYScale,\n    smiTotalRScale,\n    smiShareRScale,\n    attributionScoreScale } from '../stores/scales';\n  import {\n    disinformantNationFilter,\n    platformFilter,\n    methodFilter,\n    sourceFilter,\n    sourceCategoryFilter,\n    attributionScoreFilter,\n    attributionScoreDef,\n    textSearchFilter,\n    originalTimeDomain,\n    contextData,\n    caseIdFilter } from '../stores/filters';\n  import { haveOverlap, withinRange, includesTextSearch, isCaseId, preloadImages } from '../utils/misc';\n  import { selected } from '../stores/eventSelections';\n  import { drawWrapper } from '../stores/elements';\n  \n  import { uniq } from 'lodash';\n  import {\n    extent,\n    forceSimulation,\n    forceX,\n    forceY,\n    forceManyBody,\n    forceCenter,\n    forceCollide,\n    timeFormat } from 'd3';\n  import { sortConsistently } from '../utils/misc';\n  import { parseUrl } from '../utils/share';\n\n  import ToTop from './ToTop.svelte';\n  import TopVisualContent from './TopVisualContent.svelte';\n  import LoadingInfo from './LoadingInfo.svelte';\n  import Controls from './Controls.svelte';\n  import Svg from './Svg.svelte';\n  import Canvas from './Canvas.svelte';\n  import Info from './Info.svelte';\n  import EventTooltip from './EventTooltip.svelte';\n  import CentroidTooltip from './CentroidTooltip.svelte';\n  import CreatedBy from './CreatedBy.svelte';\n  import Table from './Table.svelte';\n\n  const tf = timeFormat('%B %d, %Y');\n  const observeDays = 0;\n\n  let data, timePoints;\n\n  onMount(async () => {\n    // load the dataset and add runtime variables\n    data = (await loadData())\n            .map((d) => ({\n              ...d,\n              recentylAdded: Math.ceil(((new Date()) - d.timestamp) / (1000 * 60 * 60 * 24)) <= observeDays,\n              search: [d.shortTitle, d.shortDescription, d.platforms, d.methods, d.sourceNation, d.source, d.sourceCategory].flat().join('__').toUpperCase(),\n              show: false\n            }));\n\n    // load the map data\n    loadMapData();\n\n    // setup filters\n    disinformantNationFilter.init(data, 'disinformantNation');\n    platformFilter.init(data, 'platforms');\n    methodFilter.init(data, 'methods');\n    sourceFilter.init(data, 'sourceFilter');\n    sourceCategoryFilter.init(data, 'sourceCategory');\n    $attributionScoreFilter = attributionScoreDef;\n\n    // get context datasets\n    $contextData = [\n      {\n        id: 'corona',\n        name: 'COVID-19 in the US',\n        source: 'The New York Times',\n        data: await loadCoronaData(),\n        selected: false\n      }\n    ];\n\n    preloadImages(data);\n\n    // apply filters from URL\n    if (window.location.hash.length > 1) {\n      const urlFilters = parseUrl(window.location.hash);\n\n      disinformantNationFilter.applyBoolArray(urlFilters.disinformantNations);\n      platformFilter.applyBoolArray(urlFilters.platforms);\n      methodFilter.applyBoolArray(urlFilters.methods);\n      sourceFilter.applyBoolArray(urlFilters.sources);\n      sourceCategoryFilter.applyBoolArray(urlFilters.sourceCategories);\n      contextData.applyBoolArray(urlFilters.contextData);\n      $attributionScoreFilter = urlFilters.attributionScores;\n      $textSearchFilter = urlFilters.textSearch;\n      $caseIdFilter = urlFilters.caseId;\n    } \n  });\n\n  // set the scales\n  $: setScales(data, $width, $minDim, $maxDim, $panelHeight, $margin);\n\n  $: if (data) {\n    // calculate scaled data points\n    const scaledData = data.map((d) => ({\n      ...d,\n      _x: $timeScale(d.attributionDate),\n      _y: $smiTotalYScale.range()[0],\n      color: $attributionScoreScale(d.attributionScore),\n      rSmiTot: isNaN(d.smiTotal) || d.smiTotal === 0 ? $smiTotalRScale.range()[0] : $smiTotalRScale(d.smiTotal),\n      rSmiFb: isNaN(d.smiFacebook) || d.smiFacebook === 0 ? $smiTotalRScale.range()[0] : $smiTotalRScale(d.smiFacebook),\n      rSmiTw: isNaN(d.smiTwitter) || d.smiTwitter === 0 ? $smiTotalRScale.range()[0] : $smiTotalRScale(d.smiTwitter),\n      rSmiRe: isNaN(d.smiReddit) || d.smiReddit === 0 ? $smiTotalRScale.range()[0] : $smiTotalRScale(d.smiReddit),\n      rSmiFbShare: $smiShareRScale(d.smiFacebookShare),\n      rSmiTwShare: $smiShareRScale(d.smiTwitterShare),\n      rSmiReShare: $smiShareRScale(d.smiRedditShare),\n      fy: d.smiPending ? Math.min($smiTotalYScale.range()[0], $smiTotalYScale.range()[0] - 2 * $smiTotalRScale.range()[0] + (Math.random() - 0.5) * 20) : $smiTotalYScale(d.smiTotal),\n      outOfTimeRange: $timeScale(d.attributionDate) < $timeScale.range()[0] || $timeScale(d.attributionDate) > $timeScale.range()[1]\n    }))\n    .sort((a, b) => sortConsistently(a, b, 'rSmiTot', 'id'));\n\n    // for some rason these definitions need to be in here and not in a gobal scope or module\n    const simulation = forceSimulation()\n      .force('x', forceX().x(d => d._x));\n\n    const simulationCharge = forceSimulation()\n      .force('x', forceX().x(d => d._x))\n      .force('charge', forceManyBody().strength((d) => -(d.rSmiTot + 1) * 10).distanceMax(500).distanceMin(50));\n\n    simulation\n      .nodes(scaledData)\n      .alpha(0.8)\n      .tick(300);\n\n    // finally set the global timePoints variable\n    simulationCharge\n      .nodes(scaledData)\n      .alpha(0.8)\n      .tick(300)\n      .on('end', () => {\n        timePoints = scaledData.map((d) => ({\n          ...d,\n          x: $originalTimeDomain\n              ? d.x \n              : Math.max(\n                  $margin.left - Math.random() * $margin.left / 4, \n                  Math.min($width - $margin.right + (Math.random() + 2) * $margin.right / 4, d.x)\n                )\n        }));\n    });\n  }\n\n  // translate filter values into show property state\n  $: if (timePoints) {\n      timePoints = timePoints.map((d) => ({\n        ...d,\n        show: haveOverlap($disinformantNationFilter, d.disinformantNation)\n              && haveOverlap($platformFilter, d.platforms)\n              && haveOverlap($methodFilter, d.methods)\n              && haveOverlap($sourceFilter, d.sourceFilter)\n              && haveOverlap($sourceCategoryFilter, d.sourceCategory)\n              && includesTextSearch($textSearchFilter, d.search)\n              && withinRange($attributionScoreFilter, d.attributionScore)\n              && isCaseId($caseIdFilter, d.id)\n      }));\n    }\n</script>\n\n<ToTop />\n<TopVisualContent {data} />\n<div id=\"viz\" class=\"visualization-wrapper\" bind:clientWidth={$width}>\n  {#if (!timePoints)}\n    <LoadingInfo />\n  {/if}\n  <div class=\"sticky-wrapper\">\n    <div class=\"controls-wrapper\" bind:clientHeight={$controlsHeight}>\n      <Controls {timePoints} />\n    </div>\n    <div class=\"draw-wrapper\" bind:this={$drawWrapper} bind:clientHeight={$height}>\n      {#if (timePoints)}\n        <Svg {timePoints} />\n        <Canvas />\n        <Info selectedItems={$selected}\n              x={2 * $timeScale.range()[0]}\n              y={$smiTotalYScale.range()[1]} />\n        <EventTooltip />\n        <CentroidTooltip />\n        <CreatedBy />\n      {/if}\n    </div>\n  </div>\n  <div class=\"table-wrapper\">\n    <Table {timePoints} />\n  </div>\n</div>\n\n<style>\n  .visualization-wrapper {\n    width: 100%;\n    position: relative;\n  }\n\n  .controls-wrapper {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    padding: 0 0.5rem 0.5rem 0.5rem;\n    position: relative;\n    pointer-events: none;\n  }\n\n  .sticky-wrapper {\n    display: flex;\n    flex-direction: column;\n    width: 100%;\n    height: 180vmin;\n    min-height: 1200px;\n    max-height: 80vmax;\n    margin: 2rem 0 0 0;\n    position: relative;\n  }\n\n  .draw-wrapper {\n    flex: 1;\n    width: 100%;\n    height: 100%;\n    overflow: hidden;\n    position: relative;\n  }\n\n  @media (min-width: 1350px) {\n    .controls-wrapper {\n      position: sticky;\n      top: 0px;\n      z-index: 2000;\n    }\n\n    .draw-wrapper {\n      position: absolute;\n      top: 0;\n      z-index: 0;\n    } \n  }\n\n  .table-wrapper {\n    width: 100%;\n    margin: 2rem 0;\n    padding: 0.2rem 1rem;\n  }\n</style>\n"
 | |
|   ],
 | |
|   "names": [],
 | |
|   "mappings": "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"
 | |
| } | 
