interference2020/public/build/bundle.css.map
2020-12-19 00:01:56 +01:00

96 строки
150 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",
"../../CheckboxPanel.svelte",
"../../CibTable.svelte",
"../../Controls.svelte",
"../../CopyTooltip.svelte",
"../../CoronaChart.svelte",
"../../CreatedBy.svelte",
"../../Dropdown.svelte",
"../../EventTooltip.svelte",
"../../EventTooltipCross.svelte",
"../../Events.svelte",
"../../GoogleTrendsChart.svelte",
"../../ImpactStrip.svelte",
"../../Info.svelte",
"../../Labels.svelte",
"../../Legend.svelte",
"../../LoadingInfo.svelte",
"../../PolarizationLegend.svelte",
"../../PolarizationStrip.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-top: 3px;\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 import {\n highlightPolarization,\n highlightCib,\n polarizationFilter,\n polarizationDef } from '../stores/filters';\n import { polarizationScale } from '../stores/scales';\n import { copytooltipable } from '../actions/copytooltipable';\n\n import Checkbox from './Checkbox.svelte';\n import Slider from './Slider.svelte';\n\n function handleClick(type) {\n switch (type) {\n case 'polarization':\n $highlightPolarization = !$highlightPolarization;\n break;\n case 'cib':\n $highlightCib = !$highlightCib;\n break;\n }\n }\n</script>\n\n<ul class=\"checkboxpanel-wrapper\">\n <li>\n <Checkbox id=\"checkboxpanel-checkbox-polarization\"\n checked={$highlightPolarization}\n on:click={() => handleClick('polarization')}>\n <span use:copytooltipable={{content: 'The political leanings of 600+ media entities – using political data from the AllSides Media Bias Ratings – was applied to the web links found in Attribution Impact. Since not all web links had matching AllSides data, the polarization data filter shows only cases where there were ten or more AllSides-matching articles and/or cases where 25 percent or more of articles matched with AllSides data. The stem lines on the polarization data filter are colored based on the mean political polarization of that case.', showClickMessage: false}}>\n Partisan Leaning Data Filter\n </span>\n </Checkbox>\n </li>\n <li class=\"polarization-slider\" class:hide={!$highlightPolarization}>\n <Slider value={$polarizationFilter}\n lockInMode={false}\n showLabel={false}\n min={polarizationDef[0]} \n max={polarizationDef[1]}\n showHandleLabels={false}\n barOpacity={0.7}\n startColor={$polarizationScale(polarizationDef[0])}\n middleColor={$polarizationScale(0)}\n stopColor={$polarizationScale(polarizationDef[1])}\n showBorder={false}\n on:changed={(e) => $polarizationFilter = e.detail} />\n </li>\n <!-- <li>\n <Checkbox id=\"checkboxpanel-checkbox-cib\"\n checked={$highlightCib}\n on:click={() => handleClick('cib')}>\n <span use:copytooltipable={{content: 'Some content', showClickMessage: false}}>CIB data filter</span>\n </Checkbox>\n </li> -->\n</ul>\n\n<style>\n ul {\n display: flex;\n align-items: center;\n width: 100%;\n margin: 0.1rem 0 0.1rem -0.2rem;\n list-style-type: none;\n }\n\n li {\n position: relative;\n }\n\n li.polarization-slider {\n margin-bottom: 0.05rem;\n }\n\n span {\n display: inline-block;\n margin: 2% 0 0 0.5rem;\n font-family: var(--font-02);\n font-size: 0.8rem;\n color: var(--usa-blue);\n }\n\n .hide {\n visibility: hidden;\n }\n</style>\n",
"<script>\n import {\n cibTableFields,\n cibColumnHeaders } from '../inputs/cib';\n\n import { format } from 'd3';\n\n import Icon from 'svelte-awesome';\n import { facebook, instagram } from 'svelte-awesome/icons';\n \n export let data;\n\n const commaFormat = format(',');\n const iconData = {\n facebook,\n instagram\n };\n</script>\n\n<div class=\"cib-table-wrapper\">\n <table>\n <thead>\n <tr>\n {#each cibColumnHeaders as { id, name } (id)}\n <td>{name}</td>\n {/each}\n </tr>\n </thead>\n <tbody>\n {#each cibTableFields as field (field.id)}\n <tr>\n {#each cibColumnHeaders as { id, type } (id)}\n <td>\n {#if (type === 'platformName')}\n <Icon data={iconData[field[type].toLowerCase()]}\n scale=\"0.9\"\n label={field[type]} />\n {:else if (type === 'fieldName')}\n <span>{field[type]}</span>\n {:else if (data[field[type]] !== undefined)}\n <span class=\"right-align\">{commaFormat(data[field[type]])}</span>\n {/if}\n </td>\n {/each}\n </tr>\n {/each}\n </tbody>\n </table>\n <div class=\"budget-and-events\">\n {#if (data.budgetTotalUsd && data.budgetTotalUsd > 0)}\n <p>Facebook advertising expenditures: $ {commaFormat(data.budgetTotalUsd)}.</p>\n {/if}\n </div>\n</div>\n\n<style>\n .cib-table-wrapper {\n display: flex;\n width: 100%;\n margin-top: 0.3rem;\n }\n\n table {\n flex: 1;\n max-width: 60%;\n font-size: 0.8rem;\n color: var(--text-black);\n border-collapse: collapse;\n }\n\n thead {\n font-size: 0.7rem;\n }\n\n thead td {\n border-bottom: 1px solid gray;\n }\n\n td {\n min-width: 30px;\n padding: 0.1rem 0.2rem;\n vertical-align: middle;\n }\n\n td span {\n display: inline-block;\n width: 100%;\n margin-bottom: 0.2rem;\n }\n\n td span.right-align {\n text-align: right;\n }\n\n .budget-and-events {\n padding: 1.1rem 0 0 1rem;\n }\n\n .budget-and-events p {\n font-size: 0.7rem;\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,\n highlightPolarization,\n highlightCib } 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 CheckboxPanel from './CheckboxPanel.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 $highlightPolarization = false;\n $highlightCib = false;\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 <div class=\"checkbox-panel\">\n <CheckboxPanel />\n <Share />\n </div>\n <!-- <Share /> -->\n </div>\n{/if}\n\n<style>\n .controls-inner-wrapper {\n padding: 0 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\n .checkbox-panel {\n display: flex;\n align-items: center;\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 export let showClickMessage = true;\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 {#if (showClickMessage)}\n <p class=\"footer\">Click to read more.</p>\n {/if}\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, (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 } from 'd3';\n import { extractHostname } from '../utils/misc';\n import {\n platformFilter,\n methodFilter,\n sourceFilter,\n sourceCategoryFilter,\n tagFilter,\n textSearchFilter,\n highlightPolarization,\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 ImpactStrip from './ImpactStrip.svelte';\n import PolarizationLegend from './PolarizationLegend.svelte';\n import CibTable from './CibTable.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\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 case 'tag': tagFilter.selectOne(item); break;\n }\n }\n\n function highlight(s) {\n if (!$textSearchFilter || $textSearchFilter === '') return s;\n return s.replace(new RegExp($textSearchFilter.toLowerCase().split(' or ').join('|'), '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>{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 <ImpactStrip value={$tooltip.tp.smiFacebook}\n polarization={$highlightPolarization ? $tooltip.tp.polarization : null}\n label=\"Facebook\" />\n <ImpactStrip value={$tooltip.tp.smiTwitter}\n polarization={$highlightPolarization ? $tooltip.tp.polarization : null}\n label=\"Twitter\" />\n <ImpactStrip value={$tooltip.tp.smiReddit}\n polarization={$highlightPolarization ? $tooltip.tp.polarization : null}\n label=\"Reddit\" />\n </ul>\n {#if ($highlightPolarization && ($tooltip.tp.polarization.fulfills10Articles || $tooltip.tp.polarization.fulfills25Percent))}\n <PolarizationLegend />\n {/if}\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 {#if ($tooltip.tp.cib.hasCib)}\n <div class=\"cib\">\n <h3>Removed Content</h3>\n <CibTable data={$tooltip.tp.cib} />\n </div>\n {/if}\n {#if (!($tooltip.tp.tags.length === 1 && $tooltip.tp.tags[0] === 'unspecified'))}\n <div class=\"tags\">\n <h3>Tags</h3>\n <ul>\n {#each $tooltip.tp.tags as tag (tag)}\n <li class=\"card\" on:click|self={() => handleLiClick('tag', tag)}>{@html highlight(tag)}</li>\n {/each}\n </ul>\n </div>\n {/if}\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-width: 550px;\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 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 .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 // chart with GoogleTrends data\n import { timeScale } from '../stores/scales';\n import { panelHeight } from '../stores/dimensions';\n import { fade } from 'svelte/transition';\n import {\n scaleLinear,\n max,\n area as d3area,\n format,\n curveBasis } 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, ticks;\n let casesPath, deathsPath;\n\n $: if (data) {\n yScale = scaleLinear()\n .domain([0, max(data, (d) => d.value)])\n .range([$panelHeight - margin.bottom, margin.top * 0.7]);\n\n area = d3area()\n .x((d) => $timeScale(d.date))\n .y0(yScale(0))\n .y1((d) => yScale(d.value))\n .curve(curveBasis);\n\n ticks = yScale.ticks(5).slice(1);\n }\n</script>\n\n{#if (data)}\n <g class=\"google-trends-chart\"\n transition:fade={{duration: 200}}>\n <g class=\"area\">\n <path d={area(data)}></path>\n </g>\n <!-- {#if (showLegend)}\n <g class=\"ticks\"\n transform=\"translate({$timeScale(data.slice(-1)[0].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.3;\n fill: var(--usa-blue);\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 import { format } from 'd3';\n\n import PolarizationStrip from './PolarizationStrip.svelte';\n\n export let value = 0;\n export let polarization;\n export let label = '';\n\n const commaFormat = format(',');\n\n let valueWidth = 0;\n</script>\n\n<li>\n <div class=\"smi-score {label.toLowerCase()}\"\n bind:clientWidth={valueWidth}>\n {commaFormat(value)}\n </div>\n <span class=\"smi-label\">\n {label}\n </span>\n {#if (polarization && (polarization.fulfills10Articles || polarization.fulfills25Percent) && value > 0)}\n <PolarizationStrip polarization={polarization[label.toLowerCase()]}\n smi={value}\n valueWidth={valueWidth} />\n {/if}\n</li>\n\n<style>\n li {\n margin: 0.2rem 0.3rem 0.2rem 0;\n font-size: 0.8rem;\n min-width: 30%;\n }\n\n .smi-score {\n display: inline-block;\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</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.1rem;\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 {-2 * $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 import { categories } from '../inputs/polarization';\n</script>\n\n<div class=\"pol-legend\">\n <p>Polarization:</p>\n <ul>\n {#each categories as category (category)}\n <li>\n <div class=\"pol-legend-field pol-{category.id}\"></div>\n <p>{category.name}</p>\n </li>\n {/each}\n </ul>\n</div>\n\n<style>\n .pol-legend {\n display: flex;\n align-items: center;\n font-family: var(--font-02);\n color: var(--dfrlab-gray);\n }\n\n .pol-legend p {\n margin-right: 0.7rem;\n font-size: 0.7rem;\n }\n\n .pol-legend ul {\n display: flex;\n align-items: center;\n height: 100%;\n list-style-type: none;\n }\n\n .pol-legend ul li {\n display: flex;\n align-items: center;\n height: 100%;\n }\n\n .pol-legend ul li p {\n font-size: 0.6rem;\n }\n\n .pol-legend-field {\n width: 0.5rem;\n height: 0.5rem;\n margin-right: 0.2rem;\n }\n</style>\n",
"<script>\n import { categories } from '../inputs/polarization';\n\n import { scaleLinear, line as d3line, curveBasis } from 'd3';\n\n export let polarization;\n export let smi = 0;\n export let valueWidth = 0;\n\n const magnifierHeight = 20;\n\n const margin = {\n top: 4,\n right: 2,\n bottom: 0,\n left: 2\n };\n\n const yScale = scaleLinear()\n .domain([0, 1])\n .range([margin.top, magnifierHeight - margin.bottom]);\n\n const line = d3line()\n .x((d) => d[0])\n .y((d) => yScale(d[1]))\n .curve(curveBasis);\n\n let width;\n let stack = {};\n\n $: totalEngagement = Object.keys(polarization).map((k) => polarization[k]).reduce((acc, cur) => acc + cur);\n $: engagementExplained = totalEngagement / smi;\n\n $: Object.keys(polarization).forEach((k) => {\n const value = polarization[k];\n stack[k] = {\n value,\n width: Math.floor(100 * value / totalEngagement, 2)\n };\n });\n\n $: leftPathData = [\n [margin.left + valueWidth / 2 - engagementExplained * valueWidth / 2, 0],\n [margin.left + valueWidth / 2 - engagementExplained * valueWidth / 2, 0.3],\n [margin.left, 0.7],\n [margin.left, 1]\n ];\n\n $: rightPathData = [\n [valueWidth / 2 + engagementExplained * valueWidth / 2 - margin.right, 0],\n [valueWidth / 2 + engagementExplained * valueWidth / 2 - margin.right, 0.3],\n [width * 0.98 - margin.right, 0.7],\n [width * 0.98 - margin.right, 1]\n ];\n</script>\n\n<div class=\"polarization-strip\"\n bind:clientWidth={width}>\n {#if (width > 0)}\n <svg class=\"pol-magnifier\"\n width={width}\n height={magnifierHeight}>\n <path d={line(leftPathData)} />\n <path d={line(rightPathData)} />\n <text x={Math.max(15, valueWidth / 2)}\n y={yScale(1)}>\n {Math.round(engagementExplained * 100)}%\n </text>\n </svg>\n {/if}\n <div class=\"pol-layer-wrapper\">\n {#each categories as category (category.id)}\n <div class=\"pol-layer pol-{category.id}\"\n style=\"width: {stack[category.id].width}%;\">\n </div>\n {/each}\n </div>\n</div>\n\n<style>\n .polarization-strip {\n width: 100%;\n }\n\n path {\n stroke: var(--dfrlab-gray);\n stroke-width: 1.5;\n stroke-dasharray: 2 3;\n stroke-linecap: round;\n fill: none;\n }\n\n text {\n font-family: var(--font-02);\n font-size: 0.6rem;\n text-anchor: middle;\n fill: var(--dfrlab-gray);\n }\n\n .pol-layer-wrapper {\n width: 100%;\n height: 1rem;\n border: none;\n }\n\n .pol-layer {\n display: inline-block;\n height: 100%;\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 tagFilter,\n attributionScoreFilter,\n polarizationFilter,\n textSearchFilter,\n originalTimeDomain,\n contextData,\n highlightPolarization,\n highlightCib } 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 $tagFilter,\n $attributionScoreFilter,\n $polarizationFilter,\n $textSearchFilter,\n $contextData,\n caseId,\n $highlightPolarization,\n $highlightCib);\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 margin: 0 0.5rem 0 0;\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 white-space: nowrap;\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 lockInMode = true;\n export let label = '';\n export let showLabel = true;\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 middleColor = null;\n export let stopColor = 'red';\n export let barOpacity = 1;\n export let showBorder = true;\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 if (lockInMode) {\n dispatch('changed', [Math.round(scale.invert(pos.left), 0),\n Math.round(scale.invert(pos.right), 0)]);\n } else {\n dispatch('changed', [scale.invert(pos.left), scale.invert(pos.right)]);\n }\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\n $: background = `linear-gradient(90deg, ${startColor}, ${middleColor ? middleColor + ', ' : ''}${stopColor})`;\n</script>\n\n<div class=\"slider\"\n bind:clientWidth={sliderWidth}\n style=\"--handle-width: {handleWidth}px;\">\n {#if (showLabel)}\n <div class=\"label\">\n {label}\n </div>\n {/if}\n <div class=\"slider-body\" class:border={showBorder}>\n <div class=\"slider-selected-range\"\n style=\"width: {sliderWidth - 2 * handleWidth}px;\n margin-left: {1 * handleWidth}px;\n opacity: {barOpacity};\n background: {background};\"></div>\n <div class=\"slider-handle\"\n class:no-label={!showHandleLabels}\n style=\"left: {(Math.abs(value[0] - value[1]) < 0.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: {(Math.abs(value[0] - value[1]) < 0.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: none;\n position: relative;\n }\n\n .border {\n border: 2px solid var(--usa-blue);\n border-radius: 3px;\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 import { usaBlue } from '../utils/colors';\n\n export let source;\n export let selected = 'unselected';\n export let hovered = 'unselected';\n export let extraFaint = false;\n export let showPolarizationColor = 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.35 / 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={showPolarizationColor ? source.polarizationColor : usaBlue}\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 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 loadGoogleTrendsData from '../utils/loadGoogleTrendsData';\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,\n polarizationScale } 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,\n tagFilter,\n polarizationFilter,\n polarizationDef,\n highlightPolarization,\n highlightCib } from '../stores/filters';\n import {\n haveOverlap,\n withinRange,\n includesTextSearch,\n isCaseId,\n showPolarization,\n showCib,\n 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, calculateAveragePolarization } 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 = 3;\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 recentlyAdded: 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('__').toLowerCase(),\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 tagFilter.init(data, 'tags');\n $attributionScoreFilter = attributionScoreDef;\n $polarizationFilter = polarizationDef;\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 id: 'gt_voter_fraud',\n name: '\"Voter Fraud\" search',\n source: 'Google Trends',\n data: await loadGoogleTrendsData('voter fraud'),\n selected: false\n },\n {\n id: 'gt_disinformation',\n name: '\"Disinformation\" search',\n source: 'Google Trends',\n data: await loadGoogleTrendsData('disinformation'),\n selected: false\n }\n ]\n .filter((d) => d.data.length > 0);\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 tagFilter.applyBoolArray(urlFilters.tags);\n contextData.applyBoolArray(urlFilters.contextData);\n $attributionScoreFilter = urlFilters.attributionScores;\n $polarizationFilter = urlFilters.polarization;\n $textSearchFilter = urlFilters.textSearch;\n $caseIdFilter = urlFilters.caseId;\n $highlightPolarization = urlFilters.highlightPolarization;\n $highlightCib = urlFilters.highlightCib;\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 const averagePolarization = calculateAveragePolarization(d.polarization.general);\n return {\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 averagePolarization,\n polarizationColor: $polarizationScale(averagePolarization)\n };\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 && haveOverlap($tagFilter, d.tags)\n && includesTextSearch($textSearchFilter, d.search)\n && withinRange($attributionScoreFilter, d.attributionScore)\n && withinRange($polarizationFilter, d.averagePolarization, !$highlightPolarization)\n && isCaseId($caseIdFilter, d.id)\n && showPolarization($highlightPolarization, d.polarization)\n && showCib($highlightCib, d.cib)\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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"
}