96 строки
150 KiB
Plaintext
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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"
|
|
} |