├── .github └── workflows │ ├── update_map.yml │ └── workflow.yml ├── .gitignore ├── LICENSE ├── README.md ├── ai ├── ai2html-config.json ├── hello-ai-project.ai └── vaccination_map.ai ├── config.json ├── copy-template.js ├── data-old ├── vaccinations.csv └── vaccinations.json ├── package-lock.json ├── package.json ├── pre-render.js ├── process-data ├── make_as-of_file.sh └── make_vax_map.sh ├── public ├── build │ ├── bundle.css │ ├── bundle.js │ └── bundle.js.map ├── favicon.png ├── global.css ├── index.html ├── pym.v1.min.js ├── pymtest.html ├── pymtest2.html ├── states.png ├── styles.css ├── styles.css.map ├── vaccination_map-Artboard_1.png ├── vaccination_map.html ├── vaccinations_county_map.svg ├── vaccinations_county_map_test.svg ├── vaccinations_map.json └── vaccinations_map.svg ├── rollup.config-ssr.js ├── rollup.config.js ├── scripts ├── pym.v1.min.js └── setupTypeScript.js └── src ├── App.svelte ├── components ├── layercake │ ├── Annotations.svelte │ ├── Area.svelte │ ├── AreaStacked.svelte │ ├── ArrowheadDef.svelte │ ├── Arrows.svelte │ ├── AxisRadial.svelte │ ├── AxisX.html.svelte │ ├── AxisX.svelte │ ├── AxisY.html.svelte │ ├── AxisY.svelte │ ├── Bar.svelte │ ├── BarStacked.svelte │ ├── Beeswarm.html.svelte │ ├── Beeswarm.svelte │ ├── BeeswarmForce.html.svelte │ ├── BeeswarmForce.svelte │ ├── Brush.svelte │ ├── CalendarMonth.svelte │ ├── CirclePack.html.svelte │ ├── CirclePackForce.svelte │ ├── ClevelandDotPlot.html.svelte │ ├── ClevelandDotPlot.svelte │ ├── Column.svelte │ ├── ColumnLinear.svelte │ ├── ColumnStacked.svelte │ ├── ForceDirectedGraph.svelte │ ├── Key.svelte │ ├── Labels.svelte │ ├── Line.svelte │ ├── Map.canvas.svelte │ ├── Map.svg.svelte │ ├── MultiLine.svelte │ ├── QuadTree.percent-range.svelte │ ├── QuadTree.svelte │ ├── Radar.svelte │ ├── Sankey.svelte │ ├── Scatter.canvas.svelte │ ├── Scatter.html.svelte │ ├── Scatter.svg.svelte │ ├── Scatter.webgl.svelte │ ├── SharedTooltip.percent-range.svelte │ ├── SharedTooltip.svelte │ ├── SmallMultipleWrapper.percent-range.svelte │ ├── SmallMultipleWrapper.svelte │ ├── SyncedBrushWrapper.percent-range.svelte │ ├── SyncedBrushWrapper.svelte │ ├── Tooltip.svelte │ └── Voronoi.svelte └── smarts │ ├── HtmlRender.svelte │ ├── Map.albers.svelte │ ├── MapKey.svelte │ ├── MapLabels.albers.svelte │ └── SvgImage.svelte ├── data ├── as-of.json ├── counties.json ├── innerlines.json ├── names.json ├── points.csv ├── states.json ├── us_counties_albers.json ├── us_states_albers.json ├── us_states_albers_innerlines.json ├── us_states_albers_labels_nyt.json ├── vaccinations.csv ├── vaccinations.json ├── vaccinations_county.csv ├── vaccinations_county.json ├── vaccinations_county_map.topojson.json ├── vaccinations_map.topojson.json └── vaccinations_states_subset.topojson.json ├── main.js └── template.svelte /.github/workflows/update_map.yml: -------------------------------------------------------------------------------- 1 | name: Make fresh maps 2 | 3 | on: 4 | workflow_dispatch: 5 | schedule: 6 | - cron: '19 03 * * *' 7 | 8 | jobs: 9 | scheduled: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Check out this repo 13 | uses: actions/checkout@v2 14 | - name: Download data and make the maps 15 | run: |- 16 | bash process-data/make_vax_map.sh 17 | bash process-data/make_as-of_file.sh 18 | - name: Build the Svelte app 19 | run: |- 20 | npm install 21 | npm run build 22 | - name: Commit and push to main branch 23 | run: |- 24 | git config user.name "Automated" 25 | git config user.email "actions@users.noreply.github.com" 26 | git add -A 27 | timestamp=$(date -u) 28 | git commit -m "Updated at: ${timestamp}" || exit 0 29 | git push origin main 30 | 31 | -------------------------------------------------------------------------------- /.github/workflows/workflow.yml: -------------------------------------------------------------------------------- 1 | name: Deploy Project 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | workflow_dispatch: 8 | workflow_run: 9 | workflows: ["Make fresh maps"] 10 | types: 11 | - completed 12 | 13 | jobs: 14 | deploy: 15 | runs-on: ubuntu-latest 16 | steps: 17 | - uses: actions/checkout@master 18 | - uses: jakejarvis/s3-sync-action@master 19 | with: 20 | args: --acl public-read --follow-symlinks --delete 21 | env: 22 | AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} 23 | AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} 24 | AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} 25 | AWS_REGION: 'us-east-1' # optional: defaults to us-east-1 26 | SOURCE_DIR: 'public' # optional: defaults to entire repository 27 | DEST_DIR: ${{ github.event.repository.name }} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # John Keefe’s global git ignore 2 | 3 | .DS_Store 4 | .AppleDouble 5 | .LSOverride 6 | .env 7 | 8 | *.log 9 | scratch.* 10 | 11 | # Icon must end with two \r 12 | Icon 13 | 14 | 15 | # Thumbnails 16 | ._* 17 | 18 | # Files that might appear on external disk 19 | .Spotlight-V100 20 | .Trashes 21 | 22 | # Directories potentially created on remote AFP share 23 | .AppleDB 24 | .AppleDesktop 25 | Network Trash Folder 26 | Temporary Items 27 | .apdisk 28 | 29 | # Node Dependencies 30 | # (use npm install to load them instead, or see readme) 31 | node_modules 32 | 33 | # Jupyter notebook checkpoint folders 34 | .ipynb_checkpoints 35 | 36 | # Python environments 37 | venv 38 | .venv 39 | 40 | # Terraform 41 | .terraform 42 | *.tfvars 43 | 44 | # From Svelte 45 | /node_modules/ 46 | 47 | 48 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Creative Commons Legal Code 2 | 3 | CC0 1.0 Universal 4 | 5 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE 6 | LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN 7 | ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS 8 | INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES 9 | REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS 10 | PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM 11 | THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED 12 | HEREUNDER. 13 | 14 | Statement of Purpose 15 | 16 | The laws of most jurisdictions throughout the world automatically confer 17 | exclusive Copyright and Related Rights (defined below) upon the creator 18 | and subsequent owner(s) (each and all, an "owner") of an original work of 19 | authorship and/or a database (each, a "Work"). 20 | 21 | Certain owners wish to permanently relinquish those rights to a Work for 22 | the purpose of contributing to a commons of creative, cultural and 23 | scientific works ("Commons") that the public can reliably and without fear 24 | of later claims of infringement build upon, modify, incorporate in other 25 | works, reuse and redistribute as freely as possible in any form whatsoever 26 | and for any purposes, including without limitation commercial purposes. 27 | These owners may contribute to the Commons to promote the ideal of a free 28 | culture and the further production of creative, cultural and scientific 29 | works, or to gain reputation or greater distribution for their Work in 30 | part through the use and efforts of others. 31 | 32 | For these and/or other purposes and motivations, and without any 33 | expectation of additional consideration or compensation, the person 34 | associating CC0 with a Work (the "Affirmer"), to the extent that he or she 35 | is an owner of Copyright and Related Rights in the Work, voluntarily 36 | elects to apply CC0 to the Work and publicly distribute the Work under its 37 | terms, with knowledge of his or her Copyright and Related Rights in the 38 | Work and the meaning and intended legal effect of CC0 on those rights. 39 | 40 | 1. Copyright and Related Rights. A Work made available under CC0 may be 41 | protected by copyright and related or neighboring rights ("Copyright and 42 | Related Rights"). Copyright and Related Rights include, but are not 43 | limited to, the following: 44 | 45 | i. the right to reproduce, adapt, distribute, perform, display, 46 | communicate, and translate a Work; 47 | ii. moral rights retained by the original author(s) and/or performer(s); 48 | iii. publicity and privacy rights pertaining to a person's image or 49 | likeness depicted in a Work; 50 | iv. rights protecting against unfair competition in regards to a Work, 51 | subject to the limitations in paragraph 4(a), below; 52 | v. rights protecting the extraction, dissemination, use and reuse of data 53 | in a Work; 54 | vi. database rights (such as those arising under Directive 96/9/EC of the 55 | European Parliament and of the Council of 11 March 1996 on the legal 56 | protection of databases, and under any national implementation 57 | thereof, including any amended or successor version of such 58 | directive); and 59 | vii. other similar, equivalent or corresponding rights throughout the 60 | world based on applicable law or treaty, and any national 61 | implementations thereof. 62 | 63 | 2. Waiver. To the greatest extent permitted by, but not in contravention 64 | of, applicable law, Affirmer hereby overtly, fully, permanently, 65 | irrevocably and unconditionally waives, abandons, and surrenders all of 66 | Affirmer's Copyright and Related Rights and associated claims and causes 67 | of action, whether now known or unknown (including existing as well as 68 | future claims and causes of action), in the Work (i) in all territories 69 | worldwide, (ii) for the maximum duration provided by applicable law or 70 | treaty (including future time extensions), (iii) in any current or future 71 | medium and for any number of copies, and (iv) for any purpose whatsoever, 72 | including without limitation commercial, advertising or promotional 73 | purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each 74 | member of the public at large and to the detriment of Affirmer's heirs and 75 | successors, fully intending that such Waiver shall not be subject to 76 | revocation, rescission, cancellation, termination, or any other legal or 77 | equitable action to disrupt the quiet enjoyment of the Work by the public 78 | as contemplated by Affirmer's express Statement of Purpose. 79 | 80 | 3. Public License Fallback. Should any part of the Waiver for any reason 81 | be judged legally invalid or ineffective under applicable law, then the 82 | Waiver shall be preserved to the maximum extent permitted taking into 83 | account Affirmer's express Statement of Purpose. In addition, to the 84 | extent the Waiver is so judged Affirmer hereby grants to each affected 85 | person a royalty-free, non transferable, non sublicensable, non exclusive, 86 | irrevocable and unconditional license to exercise Affirmer's Copyright and 87 | Related Rights in the Work (i) in all territories worldwide, (ii) for the 88 | maximum duration provided by applicable law or treaty (including future 89 | time extensions), (iii) in any current or future medium and for any number 90 | of copies, and (iv) for any purpose whatsoever, including without 91 | limitation commercial, advertising or promotional purposes (the 92 | "License"). The License shall be deemed effective as of the date CC0 was 93 | applied by Affirmer to the Work. Should any part of the License for any 94 | reason be judged legally invalid or ineffective under applicable law, such 95 | partial invalidity or ineffectiveness shall not invalidate the remainder 96 | of the License, and in such case Affirmer hereby affirms that he or she 97 | will not (i) exercise any of his or her remaining Copyright and Related 98 | Rights in the Work or (ii) assert any associated claims and causes of 99 | action with respect to the Work, in either case contrary to Affirmer's 100 | express Statement of Purpose. 101 | 102 | 4. Limitations and Disclaimers. 103 | 104 | a. No trademark or patent rights held by Affirmer are waived, abandoned, 105 | surrendered, licensed or otherwise affected by this document. 106 | b. Affirmer offers the Work as-is and makes no representations or 107 | warranties of any kind concerning the Work, express, implied, 108 | statutory or otherwise, including without limitation warranties of 109 | title, merchantability, fitness for a particular purpose, non 110 | infringement, or the absence of latent or other defects, accuracy, or 111 | the present or absence of errors, whether or not discoverable, all to 112 | the greatest extent permissible under applicable law. 113 | c. Affirmer disclaims responsibility for clearing rights of other persons 114 | that may apply to the Work or any use thereof, including without 115 | limitation any person's Copyright and Related Rights in the Work. 116 | Further, Affirmer disclaims responsibility for obtaining any necessary 117 | consents, permissions or other rights required for any use of the 118 | Work. 119 | d. Affirmer understands and acknowledges that Creative Commons is not a 120 | party to this document and has no duty or obligation with respect to 121 | this CC0 or use of the Work. 122 | -------------------------------------------------------------------------------- /ai/ai2html-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "settings_version": "0.101.0", 3 | "create_promo_image": false, 4 | "promo_image_width": 1024, 5 | "image_format": [ 6 | "auto" 7 | ], 8 | "write_image_files": true, 9 | "responsiveness": "dynamic", 10 | "max_width": "", 11 | "output": "one-file", 12 | "project_name": "", 13 | "project_type": "", 14 | "html_output_path": "../public/", 15 | "html_output_extension": ".html", 16 | "image_output_path": "", 17 | "image_source_path": null, 18 | "image_alt_text": "", 19 | "cache_bust_token": null, 20 | "create_config_file": false, 21 | "config_file_path": "", 22 | "local_preview_template": "", 23 | "png_transparent": false, 24 | "png_number_of_colors": 128, 25 | "jpg_quality": 60, 26 | "center_html_output": true, 27 | "use_2x_images_if_possible": true, 28 | "use_lazy_loader": false, 29 | "include_resizer_classes": false, 30 | "include_resizer_widths": true, 31 | "include_resizer_script": false, 32 | "inline_svg": false, 33 | "svg_id_prefix": "", 34 | "svg_embed_images": false, 35 | "render_text_as": "html", 36 | "render_rotated_skewed_text_as": "html", 37 | "testing_mode": false, 38 | "show_completion_dialog_box": true, 39 | "clickable_link": "", 40 | "last_updated_text": "", 41 | "headline": "", 42 | "leadin": "", 43 | "summary": "", 44 | "notes": "", 45 | "sources": "", 46 | "credit": "", 47 | "settings_block": [ 48 | "settings_version", 49 | "image_format", 50 | "responsiveness", 51 | "output", 52 | "html_output_path", 53 | "html_output_extension", 54 | "image_output_path", 55 | "local_preview_template", 56 | "png_number_of_colors", 57 | "jpg_quality", 58 | "clickable_link", 59 | "image_alt_text" 60 | 61 | ], 62 | "config_file": [ 63 | "headline", 64 | "leadin", 65 | "summary", 66 | "notes", 67 | "sources", 68 | "credit" 69 | ], 70 | "fonts": [ 71 | { 72 | "aifont": "ArialMT", 73 | "family": "arial,helvetica,sans-serif", 74 | "weight": "", 75 | "style": "" 76 | }, 77 | { 78 | "aifont": "Arial-BoldMT", 79 | "family": "arial,helvetica,sans-serif", 80 | "weight": "bold", 81 | "style": "" 82 | }, 83 | { 84 | "aifont": "Arial-ItalicMT", 85 | "family": "arial,helvetica,sans-serif", 86 | "weight": "", 87 | "style": "italic" 88 | }, 89 | { 90 | "aifont": "Arial-BoldItalicMT", 91 | "family": "arial,helvetica,sans-serif", 92 | "weight": "bold", 93 | "style": "italic" 94 | }, 95 | { 96 | "aifont": "Georgia", 97 | "family": "georgia,'times new roman',times,serif", 98 | "weight": "", 99 | "style": "" 100 | }, 101 | { 102 | "aifont": "Georgia-Bold", 103 | "family": "georgia,'times new roman',times,serif", 104 | "weight": "bold", 105 | "style": "" 106 | }, 107 | { 108 | "aifont": "Georgia-Italic", 109 | "family": "georgia,'times new roman',times,serif", 110 | "weight": "", 111 | "style": "italic" 112 | }, 113 | { 114 | "aifont": "Georgia-BoldItalic", 115 | "family": "georgia,'times new roman',times,serif", 116 | "weight": "bold", 117 | "style": "italic" 118 | } 119 | ] 120 | } -------------------------------------------------------------------------------- /ai/hello-ai-project.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReallyGoodSmarts/datanews-rig-demo/dd497d3bcaf22eef31c5db1ce3bbb718fdb5fbfd/ai/hello-ai-project.ai -------------------------------------------------------------------------------- /ai/vaccination_map.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReallyGoodSmarts/datanews-rig-demo/dd497d3bcaf22eef31c5db1ce3bbb718fdb5fbfd/ai/vaccination_map.ai -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- 1 | { 2 | "hydrate": false 3 | } 4 | -------------------------------------------------------------------------------- /copy-template.js: -------------------------------------------------------------------------------- 1 | require('svelte/register'); 2 | const fs = require('fs'); 3 | const { minify } = require("html-minifier"); 4 | 5 | const production = process.argv[2] === 'true'; 6 | 7 | const templatePath = './src/template.svelte'; 8 | const outPath = 'public/index.html'; 9 | 10 | const Template = require(templatePath).default; 11 | 12 | const { html } = Template.render({ includeJS: true }); 13 | 14 | const output = production ? minify(html, { collapseWhitespace: true }) : html; 15 | 16 | fs.writeFileSync(outPath, output, 'utf-8'); 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "datanews-rig-demo", 3 | "version": "1.0.0", 4 | "description": "This is me building and documenting a data news rig to help community newsrooms make and publish data projects.", 5 | "main": "index.js", 6 | "scripts": { 7 | "build": "rollup -c", 8 | "build:ssr": "rollup -c rollup.config-ssr.js", 9 | "prebuild:ssr": "npm run build", 10 | "dev": "rollup -c -w", 11 | "start": "sirv public" 12 | }, 13 | "repository": { 14 | "type": "git", 15 | "url": "git+https://github.com/ReallyGoodSmarts/datanews-rig-demo.git" 16 | }, 17 | "keywords": [], 18 | "author": "", 19 | "license": "ISC", 20 | "bugs": { 21 | "url": "https://github.com/ReallyGoodSmarts/datanews-rig-demo/issues" 22 | }, 23 | "homepage": "https://github.com/ReallyGoodSmarts/datanews-rig-demo#readme", 24 | "devDependencies": { 25 | "@rollup/plugin-commonjs": "^11.0.0", 26 | "@rollup/plugin-dsv": "^2.0.0", 27 | "@rollup/plugin-json": "^4.1.0", 28 | "@rollup/plugin-node-resolve": "^6.0.0", 29 | "d3-format": "^2.0.0", 30 | "d3-geo": "^2.0.1", 31 | "dayjs": "^1.10.4", 32 | "html-minifier": "^4.0.0", 33 | "layercake": "^4.1.0", 34 | "pym": "^0.1.1", 35 | "rollup": "^2.38.5", 36 | "rollup-plugin-css-only": "^3.1.0", 37 | "rollup-plugin-execute": "^1.1.1", 38 | "rollup-plugin-livereload": "^2.0.0", 39 | "rollup-plugin-svelte": "^7.1.0", 40 | "rollup-plugin-terser": "^7.0.2", 41 | "svelte": "^3.32.2", 42 | "topojson-client": "^3.1.0" 43 | }, 44 | "dependencies": { 45 | "clean-css": "^4.2.3", 46 | "mapshaper": "^0.5.39", 47 | "sirv-cli": "^1.0.0" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /pre-render.js: -------------------------------------------------------------------------------- 1 | require('svelte/register'); 2 | const fs = require('fs'); 3 | const path = require('path'); 4 | const CleanCSS = require('clean-css'); 5 | const { minify } = require("html-minifier"); 6 | const config = require('./config.json'); 7 | 8 | const includeJS = config.hydrate; 9 | 10 | const App = require('./build/App.js'); 11 | 12 | const templatePath = './src/template.svelte'; 13 | const outDir = 'public'; 14 | 15 | const Template = require(templatePath).default; 16 | 17 | const { head, html, css } = App.render({}); 18 | const data = Template.render({ includeJS, head, html }); 19 | 20 | const cssOptions = {}; 21 | const minifiedCss = new CleanCSS(cssOptions).minify(css.code).styles; 22 | 23 | const htmlOptions = { collapseWhitespace: true }; 24 | const minifiedHtml = minify(data.html, htmlOptions); 25 | 26 | fs.writeFileSync(path.join(outDir, 'index.html'), minifiedHtml, 'utf-8'); 27 | fs.writeFileSync(path.join(outDir, 'styles.css'), minifiedCss, 'utf-8'); 28 | fs.writeFileSync(path.join(outDir, 'styles.css.map'), css.map, 'utf-8'); 29 | -------------------------------------------------------------------------------- /process-data/make_as-of_file.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # usage from project root: 4 | # bash process-data/make_as-of_file.sh 5 | 6 | # this funky line reads in the vaccinations.json and pulls the 7 | # report date from the first object ... and then stores it as a 8 | # json file in the format: 9 | # { "Date": "2021-03-26" } 10 | echo "{ \"as_of\": $(cat ./src/data/vaccinations.json | jq .[0].Date) }" > ./src/data/as-of.json -------------------------------------------------------------------------------- /process-data/make_vax_map.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # usage from project root: 4 | # bash process-data/make_vax_map.sh 5 | 6 | #download the data using jq to just get the 'vaccination_data' key 7 | curl https://covid.cdc.gov/covid-data-tracker/COVIDData/getAjaxData?id=vaccination_data | jq .vaccination_data > ./src/data/vaccinations.json 8 | 9 | # use jq to turn that file into a csv(!) 10 | cat ./src/data/vaccinations.json | jq -r '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv' > ./src/data/vaccinations.csv 11 | 12 | #download the county data using jq to just get the 'vaccination_data' key 13 | curl https://covid.cdc.gov/covid-data-tracker/COVIDData/getAjaxData?id=vaccination_county_condensed_data | jq .vaccination_county_condensed_data > ./src/data/vaccinations_county.json 14 | 15 | # use jq to turn that file into a csv(!) 16 | cat ./src/data/vaccinations_county.json | jq -r '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv' > ./src/data/vaccinations_county.csv 17 | 18 | # use mapshaper to load in 3 maps, 19 | # join the data to the states map, 20 | # classify that data 21 | # style the state names and innerlines 22 | npx mapshaper -i ./src/data/us_states_albers.json ./src/data/us_states_albers_labels_nyt.json ./src/data/us_states_albers_innerlines.json combine-files \ 23 | -rename-layers states,names,innerlines \ 24 | -join ./src/data/vaccinations.csv keys=STUSPS,Location target=states\ 25 | -classify field=Series_Complete_Pop_Pct color-scheme=PuBuGn breaks=10,20,30,40,50,60,70,80,90 target=states \ 26 | -style stroke=#c2c2c2 stroke-width=1 target=names \ 27 | -style stroke=#F8F8F8 stroke-width=1 target=innerlines \ 28 | -o public/vaccinations_map.svg target=* 29 | 30 | # use mapshaper to load in 3 maps, 31 | # join the data to the states map, 32 | # classify that data 33 | # style the state names and innerlines 34 | # ... but this time output as topojson 35 | npx mapshaper -i ./src/data/us_states_albers.json ./src/data/us_states_albers_labels_nyt.json ./src/data/us_states_albers_innerlines.json combine-files \ 36 | -rename-layers states,names,innerlines \ 37 | -join ./src/data/vaccinations.csv keys=STUSPS,Location target=states\ 38 | -classify field=Series_Complete_Pop_Pct color-scheme=PuBuGn breaks=10,20,30,40,50,60,70,80,90 target=states \ 39 | -style stroke=#282828 stroke-width=1 target=names \ 40 | -style stroke=#F8F8F8 stroke-width=1 target=innerlines \ 41 | -o format=topojson src/data/vaccinations_map.topojson.json target=* 42 | 43 | 44 | 45 | ## Do the counties! SVG ... 46 | npx mapshaper -i ./src/data/us_counties_albers.json ./src/data/us_states_albers_labels_nyt.json ./src/data/us_states_albers_innerlines.json combine-files \ 47 | -rename-layers counties,names,innerlines \ 48 | -join ./src/data/vaccinations_county.csv keys=GEOID,FIPS field-types=GEOID,FIPS:str target=counties\ 49 | -classify field=Series_Complete_Pop_Pct color-scheme=PuBuGn breaks=10,20,30,40,50,60,70,80,90 target=counties \ 50 | -style stroke=#282828 stroke-width=1 target=names \ 51 | -style stroke=#F8F8F8 stroke-width=1 target=innerlines \ 52 | -o public/vaccinations_county_map.svg target=* 53 | 54 | # make a state map of just a few states (because we have incomplete county data for them) 55 | npx mapshaper -i ./src/data/us_states_albers.json -filter '"TX,HI,VA,GA,WV".indexOf(STUSPS) > -1' \ 56 | -rename-layers states_subset \ 57 | -join ./src/data/vaccinations.csv keys=STUSPS,Location fields=Series_Complete_Pop_Pct target=states_subset\ 58 | -classify field=Series_Complete_Pop_Pct color-scheme=PuBuGn breaks=10,20,30,40,50,60,70,80,90 target=states_subset \ 59 | -o format=topojson src/data/vaccinations_states_subset.topojson.json target=* 60 | 61 | # ## Do the counties! TOPOJSON ... 62 | # npx mapshaper -i ./src/data/us_counties_albers.json ./src/data/us_states_albers_labels_nyt.json ./src/data/us_states_albers_innerlines.json combine-files \ 63 | # -rename-layers counties,names,innerlines \ 64 | # -join ./src/data/vaccinations_county.csv keys=GEOID,FIPS field-types=GEOID,FIPS:str target=counties\ 65 | # -classify field=Series_Complete_Pop_Pct color-scheme=PuBuGn breaks=10,20,30,40,50,60,70,80,90 target=counties \ 66 | # -style stroke=#c2c2c2 stroke-width=1 target=names \ 67 | # -style stroke=#c2c2c2 stroke-width=1 target=innerlines \ 68 | # -o format=topojson ./src/data/vaccinations_county_map.topojson.json target=* 69 | 70 | 71 | ## Do the counties, but replace some states' counties with state shapes ... TOPOJSON ... 72 | npx mapshaper -i ./src/data/us_counties_albers.json ./src/data/us_states_albers_labels_nyt.json ./src/data/us_states_albers_innerlines.json ./src/data/vaccinations_states_subset.topojson.json combine-files \ 73 | -rename-layers counties,names,innerlines,states_subset \ 74 | -join ./src/data/vaccinations_county.csv keys=GEOID,FIPS field-types=GEOID,FIPS:str target=counties\ 75 | -classify field=Series_Complete_Pop_Pct color-scheme=PuBuGn breaks=10,20,30,40,50,60,70,80,90 target=counties \ 76 | -style stroke=#282828 stroke-width=1 target=names \ 77 | -style stroke=#F8F8F8 stroke-width=1 target=innerlines \ 78 | -filter invert '"TX,HI,VA,GA,WV".indexOf(StateAbbr) > -1' target=counties \ 79 | -merge-layers name=counties force target=counties,states_subset \ 80 | -o format=topojson ./src/data/vaccinations_county_map.topojson.json target=* 81 | -------------------------------------------------------------------------------- /public/build/bundle.css: -------------------------------------------------------------------------------- 1 | main.svelte-1omwt0s{text-align:left;font-size:1em;font-family:sans-serif}h1.svelte-1omwt0s{color:#121212;margin-top:0px;font-size:1.5em;font-weight:700}.g-leadin.svelte-1omwt0s{color:#808080;font-weight:300;width:100%;font-family:sans-serif}.g-notes.svelte-1omwt0s{color:#808080;font-weight:300;font-size:0.7em;width:100%;font-family:sans-serif}.chart-container.svelte-1omwt0s{width:100%;height:400px}.tooltip-county.svelte-1omwt0s{font-weight:700}#embed-popup.svelte-1omwt0s{position:fixed;top:50%;left:50%;transform:translate(-50%, -50%);background-color:hsla(360, 100%, 100%, 0.75);padding:10px 10px 10px 10px;border-color:#121212;border-style:solid;border-width:0.5px}.embed-code.svelte-1omwt0s{z-index:999;font-family:"Fira Mono", "DejaVu Sans Mono", Menlo, Consolas, "Liberation Mono", Monaco, "Lucida Console", monospace;font-size:0.8em;padding:10px 10px 10px 10px}.map-key.svelte-1azrjgf.svelte-1azrjgf{max-width:400px;margin:auto;font-family:arial, helvetica, sans-serif;margin-bottom:5px}.map-key.svelte-1azrjgf .map-interaction-tip.svelte-1azrjgf{font-size:14px;font-weight:300;margin-bottom:5px;opacity:0.6;display:none;text-align:center;margin-top:15px}.map-key-hed.svelte-1azrjgf.svelte-1azrjgf{color:#121212;font-size:1.2em;font-weight:bold;margin:auto;margin-bottom:5px;text-align:center}.map-key-subhed.svelte-1azrjgf.svelte-1azrjgf{color:#121212;font-size:1em;font-weight:300;margin:auto;margin-bottom:5px;text-align:center}@media(max-width: 765px){.map-key.svelte-1azrjgf .map-interaction-tip.svelte-1azrjgf{display:block}}.level-labels.svelte-1azrjgf.svelte-1azrjgf{display:-ms-flexbox;display:flex}.level-labels.svelte-1azrjgf span.svelte-1azrjgf{transform:translate(-50%, 0);display:inline-block}.level-labels.svelte-1azrjgf .level-label.svelte-1azrjgf{paddintop:3px;-ms-flex:1;flex:1;text-align:left;font-weight:300;font-size:14px;position:relative}.bars.svelte-1azrjgf.svelte-1azrjgf{display:-ms-flexbox;display:flex}.bars.svelte-1azrjgf .bar.svelte-1azrjgf{-ms-flex:1;flex:1;height:15px}@media(max-width: 765px){.bars.svelte-1azrjgf .bar.svelte-1azrjgf{height:14px}}.bars.svelte-1azrjgf .bar.bar-tick.svelte-1azrjgf{border-right:1px solid #666}.bars.svelte-1azrjgf .bar.bar-last.svelte-1azrjgf{margin-left:10px}@media(max-width: 600px){}.bars.svelte-1azrjgf .bar .level.svelte-1azrjgf{width:100%;height:60%}.feature-path.svelte-1nx3pk3:hover{stroke:#121212;stroke-width:1px}#g-state-DC.svelte-rpe5rz{transform:translate(-1%,1%) 2 | }#g-state-CT.svelte-rpe5rz,#g-state-RI.svelte-rpe5rz,#g-state-MA.svelte-rpe5rz,#g-state-NH.svelte-rpe5rz,#g-state-MD.svelte-rpe5rz{transform:translate(0.2%,0.5%)}#g-state-RI.svelte-rpe5rz{transform:translate(0.4%,1%)}@media(max-width: 1500px){#g-state-DC.svelte-rpe5rz{display:none}#g-state-CT.svelte-rpe5rz,#g-state-RI.svelte-rpe5rz,#g-state-MA.svelte-rpe5rz,#g-state-NH.svelte-rpe5rz,#g-state-MD.svelte-rpe5rz{transform:translate(0.2%,1%)}#g-state-RI.svelte-rpe5rz{transform:translate(0.9%,1.2%)}}@media(max-width: 900px){#g-state-RI.svelte-rpe5rz{display:none}}@media(max-width:500px){.label-text.svelte-rpe5rz{transform:translate(0%,2%)}#g-state-DE.svelte-rpe5rz,#g-state-MD.svelte-rpe5rz,#g-state-CT.svelte-rpe5rz,#g-state-VT.svelte-rpe5rz,#g-state-MA.svelte-rpe5rz,#g-state-NH.svelte-rpe5rz{display:none}}.label-text.svelte-rpe5rz{text-anchor:middle;font-size:0.8em;fill:#282828;text-shadow:0px 0px 2px #fff}@media(max-width: 700px){.label-text.svelte-rpe5rz{font-size:0.6em}#g-state-NH.svelte-rpe5rz{transform:translate(0.2%,1.5%)}}.tooltip.svelte-tbh15h{position:absolute;width:150px;border:1px solid #ccc;font-size:13px;background:rgba(255, 255, 255, 0.85);transform:translate(-50%, -100%);padding:5px;z-index:15}.layercake-container.svelte-vhzpsp,.layercake-container.svelte-vhzpsp *{box-sizing:border-box}.layercake-container.svelte-vhzpsp{width:100%;height:100%}div.svelte-1bu60uu,slot.svelte-1bu60uu{position:absolute;top:0;left:0}svg.svelte-u84d8d{position:absolute;top:0;left:0;overflow:visible}svg.svelte-6sm8ei{position:absolute;width:100%;height:100%;overflow:visible}svg.svelte-6sm8ei *{vector-effect:non-scaling-stroke} -------------------------------------------------------------------------------- /public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReallyGoodSmarts/datanews-rig-demo/dd497d3bcaf22eef31c5db1ce3bbb718fdb5fbfd/public/favicon.png -------------------------------------------------------------------------------- /public/global.css: -------------------------------------------------------------------------------- 1 | html, body { 2 | position: relative; 3 | width: 100%; 4 | height: 100%; 5 | } 6 | 7 | body { 8 | color: #333; 9 | margin: 0; 10 | /* padding: 8px; */ 11 | box-sizing: border-box; 12 | font-family: Verdana, Arial, Helvetica, sans-serif; 13 | } 14 | 15 | a { 16 | color: rgb(0,100,200); 17 | text-decoration: none; 18 | } 19 | 20 | a:hover { 21 | text-decoration: underline; 22 | } 23 | 24 | a:visited { 25 | color: rgb(0,80,160); 26 | } 27 | 28 | label { 29 | display: block; 30 | } 31 | 32 | input, button, select, textarea { 33 | font-family: inherit; 34 | font-size: inherit; 35 | -webkit-padding: 0.4em 0; 36 | padding: 0.4em; 37 | margin: 0 0 0.5em 0; 38 | box-sizing: border-box; 39 | border: 1px solid #ccc; 40 | border-radius: 2px; 41 | } 42 | 43 | input:disabled { 44 | color: #ccc; 45 | } 46 | 47 | button { 48 | color: #333; 49 | background-color: #f4f4f4; 50 | outline: none; 51 | } 52 | 53 | button:disabled { 54 | color: #999; 55 | } 56 | 57 | button:not(:disabled):active { 58 | background-color: #ddd; 59 | } 60 | 61 | button:focus { 62 | border-color: #666; 63 | } 64 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | Data News Studio -------------------------------------------------------------------------------- /public/pym.v1.min.js: -------------------------------------------------------------------------------- 1 | /*! pym.js - v1.3.2 - 2018-02-13 */ 2 | 3 | !function(a){"function"==typeof define&&define.amd?define(a):"undefined"!=typeof module&&module.exports?module.exports=a():window.pym=a.call(this)}(function(){var a={},b=function(a){var b=document.createEvent("Event");b.initEvent("pym:"+a,!0,!0),document.dispatchEvent(b)},c=function(a){var b=new RegExp("[\\?&]"+a.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]")+"=([^&#]*)"),c=b.exec(location.search);return null===c?"":decodeURIComponent(c[1].replace(/\+/g," "))},d=function(a,b){if(("*"===b.xdomain||a.origin.match(new RegExp(b.xdomain+"$")))&&"string"==typeof a.data)return!0},e=function(a){var b=/^(?:(?:https?|mailto|ftp):|[^&:\/?#]*(?:[\/?#]|$))/gi;if(a.match(b))return!0},f=function(a,b,c){return["pym",a,b,c].join("xPYMx")},g=function(a){var b=["pym",a,"(\\S+)","(.*)"];return new RegExp("^"+b.join("xPYMx")+"$")},h=Date.now||function(){return(new Date).getTime()},i=function(a,b,c){var d,e,f,g=null,i=0;c||(c={});var j=function(){i=!1===c.leading?0:h(),g=null,f=a.apply(d,e),g||(d=e=null)};return function(){var k=h();i||!1!==c.leading||(i=k);var l=b-(k-i);return d=this,e=arguments,l<=0||l>b?(g&&(clearTimeout(g),g=null),i=k,f=a.apply(d,e),g||(d=e=null)):g||!1===c.trailing||(g=setTimeout(j,l)),f}},j=function(){for(var b=a.autoInitInstances.length,c=b-1;c>=0;c--){var d=a.autoInitInstances[c];d.el.getElementsByTagName("iframe").length&&d.el.getElementsByTagName("iframe")[0].contentWindow||a.autoInitInstances.splice(c,1)}};return a.autoInitInstances=[],a.autoInit=function(c){var d=document.querySelectorAll("[data-pym-src]:not([data-pym-auto-initialized])"),e=d.length;j();for(var f=0;f-1&&(b=this.url.substring(c,this.url.length),this.url=this.url.substring(0,c)),this.url.indexOf("?")<0?this.url+="?":this.url+="&",this.iframe.src=this.url+"initialWidth="+a+"&childId="+this.id,this.settings.optionalparams&&(this.iframe.src+="&parentTitle="+encodeURIComponent(document.title),this.iframe.src+="&"+this.settings.parenturlparam+"="+encodeURIComponent(this.settings.parenturlvalue)),this.iframe.src+=b,this.iframe.setAttribute("width","100%"),this.iframe.setAttribute("scrolling","no"),this.iframe.setAttribute("marginheight","0"),this.iframe.setAttribute("frameborder","0"),this.settings.title&&this.iframe.setAttribute("title",this.settings.title),void 0!==this.settings.allowfullscreen&&!1!==this.settings.allowfullscreen&&this.iframe.setAttribute("allowfullscreen",""),void 0!==this.settings.sandbox&&"string"==typeof this.settings.sandbox&&this.iframe.setAttribute("sandbox",this.settings.sandbox),this.settings.id&&(document.getElementById(this.settings.id)||this.iframe.setAttribute("id",this.settings.id)),this.settings.name&&this.iframe.setAttribute("name",this.settings.name);this.el.firstChild;)this.el.removeChild(this.el.firstChild);this.el.appendChild(this.iframe),window.addEventListener("resize",this._onResize),this.settings.trackscroll&&window.addEventListener("scroll",this._throttleOnScroll)},this._onResize=function(){this.sendWidth(),this.settings.trackscroll&&this.sendViewportAndIFramePosition()}.bind(this),this._onScroll=function(){this.sendViewportAndIFramePosition()}.bind(this),this._fire=function(a,b){if(a in this.messageHandlers)for(var c=0;c 2 | 3 | 4 | 5 | 6 | 7 | 10 | 11 | 12 | This is a test 13 | 14 |
15 | 16 | 19 | 20 | End of test 21 | 22 | -------------------------------------------------------------------------------- /public/pymtest2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 10 | 11 | 12 | This is a test 13 | 14 |
15 | 16 | End of test 17 | 18 | -------------------------------------------------------------------------------- /public/states.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReallyGoodSmarts/datanews-rig-demo/dd497d3bcaf22eef31c5db1ce3bbb718fdb5fbfd/public/states.png -------------------------------------------------------------------------------- /public/styles.css: -------------------------------------------------------------------------------- 1 | .chart-container.svelte-ivcd9i{width:100%;height:100%}.layercake-container.svelte-vhzpsp,.layercake-container.svelte-vhzpsp *{box-sizing:border-box}.layercake-container.svelte-vhzpsp{width:100%;height:100%} 2 | 3 | /*//// ADD ADDTIONAL STYLE HERE ////*/ 4 | 5 | /* adding map font resizing and state name vanishing */ 6 | 7 | .g-state-labels .g-pstyle0 { 8 | color: #a3a3a3 !important; 9 | } 10 | 11 | @media (max-width: 650px) { 12 | 13 | .g-state-labels .g-pstyle0 { 14 | font-size: 10px !important; 15 | } 16 | 17 | } 18 | 19 | @media (min-width: 650px) { 20 | 21 | .g-state-labels .g-pstyle0 { 22 | font-size: 12px !important; 23 | } 24 | 25 | } 26 | 27 | @media (max-width: 550px) { 28 | #g-state-RI { 29 | display:none; 30 | } 31 | } 32 | 33 | @media (max-width: 450px) { 34 | #g-state-MA, #g-state-CT, #g-state-DE, #g-state-MD, #g-state-VT, #g-state-NH { 35 | display:none; 36 | } 37 | } 38 | 39 | 40 | -------------------------------------------------------------------------------- /public/styles.css.map: -------------------------------------------------------------------------------- 1 | null -------------------------------------------------------------------------------- /public/vaccination_map-Artboard_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReallyGoodSmarts/datanews-rig-demo/dd497d3bcaf22eef31c5db1ce3bbb718fdb5fbfd/public/vaccination_map-Artboard_1.png -------------------------------------------------------------------------------- /public/vaccination_map.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 54 | 55 |
56 | 57 | 58 |
59 |
60 | 61 |
62 |

Wash.

63 |
64 |
65 |

Maine

66 |
67 |
68 |

Mont.

69 |
70 |
71 |

N.D.

72 |
73 |
74 |

Minn.

75 |
76 |
77 |

Vt.

78 |
79 |
80 |

Ore.

81 |
82 |
83 |

N.H.

84 |
85 |
86 |

Wis.

87 |
88 |
89 |

Idaho

90 |
91 |
92 |

N.Y.

93 |
94 |
95 |

S.D.

96 |
97 |
98 |

Mass.

99 |
100 |
101 |

R.I.

102 |
103 |
104 |

Wy.

105 |
106 |
107 |

Conn.

108 |
109 |
110 |

Mich.

111 |
112 |
113 |

Pa.

114 |
115 |
116 |

Iowa

117 |
118 |
119 |

Neb.

120 |
121 |
122 |

N.J.

123 |
124 |
125 |

Nev.

126 |
127 |
128 |

Ohio

129 |
130 |
131 |

Md.

132 |
133 |
134 |

Del.

135 |
136 |
137 |

Ill.

138 |
139 |
140 |

Ind.

141 |
142 |
143 |

Utah

144 |
145 |
146 |

W.V.

147 |
148 |
149 |

Colo.

150 |
151 |
152 |

Calif.

153 |
154 |
155 |

Va.

156 |
157 |
158 |

Kan.

159 |
160 |
161 |

Mo.

162 |
163 |
164 |

Ky.

165 |
166 |
167 |

N.C.

168 |
169 |
170 |

Tenn.

171 |
172 |
173 |

Okla.

174 |
175 |
176 |

Ariz.

177 |
178 |
179 |

Ark.

180 |
181 |
182 |

N.M.

183 |
184 |
185 |

S.C.

186 |
187 |
188 |

Ala.

189 |
190 |
191 |

Ga.

192 |
193 |
194 |

Miss.

195 |
196 |
197 |

La.

198 |
199 |
200 |

Tex.

201 |
202 |
203 |

Alaska

204 |
205 |
206 |

Fla.

207 |
208 |
209 |

Hawaii

210 |
211 |
212 | 213 |
214 | 215 | 216 | -------------------------------------------------------------------------------- /rollup.config-ssr.js: -------------------------------------------------------------------------------- 1 | import svelte from 'rollup-plugin-svelte'; 2 | import resolve from '@rollup/plugin-node-resolve'; 3 | import commonjs from '@rollup/plugin-commonjs'; 4 | import dsv from '@rollup/plugin-dsv'; 5 | import execute from "rollup-plugin-execute"; 6 | import json from "@rollup/plugin-json"; 7 | import css from 'rollup-plugin-css-only'; 8 | 9 | import config from './config.json'; 10 | 11 | export default { 12 | input: 'src/App.svelte', 13 | output: { 14 | file: 'build/App.js', 15 | format: 'cjs', 16 | sourcemap: true, 17 | exports: 'default' 18 | }, 19 | plugins: [ 20 | svelte({ 21 | compilerOptions: { 22 | generate: 'ssr', 23 | hydratable: config.hydrate 24 | } 25 | }), 26 | // we'll extract any component CSS out into 27 | // a separate file - better for performance 28 | css({ output: 'bundle.css' }), 29 | dsv(), 30 | json(), 31 | resolve({ 32 | browser: true, 33 | dedupe: ['svelte'] 34 | }), 35 | commonjs(), 36 | execute(`node pre-render.js`) 37 | ] 38 | }; 39 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import svelte from 'rollup-plugin-svelte'; 2 | import resolve from '@rollup/plugin-node-resolve'; 3 | import commonjs from '@rollup/plugin-commonjs'; 4 | import dsv from '@rollup/plugin-dsv'; 5 | import livereload from 'rollup-plugin-livereload'; 6 | import { terser } from 'rollup-plugin-terser'; 7 | import execute from "rollup-plugin-execute"; 8 | import json from "@rollup/plugin-json"; 9 | import css from 'rollup-plugin-css-only'; 10 | 11 | import config from './config.json'; 12 | 13 | const production = !process.env.ROLLUP_WATCH; 14 | 15 | function serve() { 16 | let server; 17 | 18 | function toExit() { 19 | if (server) server.kill(0); 20 | } 21 | 22 | return { 23 | writeBundle() { 24 | if (server) return; 25 | server = require('child_process').spawn('npm', ['run', 'start', '--', '--dev'], { 26 | stdio: ['ignore', 'inherit', 'inherit'], 27 | shell: true 28 | }); 29 | 30 | process.on('SIGTERM', toExit); 31 | process.on('exit', toExit); 32 | } 33 | }; 34 | } 35 | 36 | 37 | 38 | export default { 39 | input: 'src/main.js', 40 | output: { 41 | sourcemap: true, 42 | format: 'iife', 43 | name: 'app', 44 | file: 'public/build/bundle.js' 45 | }, 46 | plugins: [ 47 | // Allow for importing csv files as modules 48 | dsv(), 49 | // And importing json files 50 | json(), 51 | 52 | svelte({ 53 | // enable run-time checks when not in production 54 | compilerOptions: { 55 | dev: !production, 56 | hydratable: config.hydrate 57 | } 58 | }), 59 | // we'll extract any component CSS out into 60 | // a separate file - better for performance 61 | css({ output: 'bundle.css' }), 62 | 63 | // If you have external dependencies installed from 64 | // npm, you'll most likely need these plugins. In 65 | // some cases you'll need additional configuration - 66 | // consult the documentation for details: 67 | // https://github.com/rollup/plugins/tree/master/packages/commonjs 68 | resolve({ 69 | browser: true, 70 | dedupe: ['svelte'] 71 | }), 72 | commonjs(), 73 | 74 | // Copy the template over 75 | execute(`node copy-template.js ${production}`), 76 | 77 | // In dev mode, call `npm run start` once 78 | // the bundle has been generated 79 | !production && serve(), 80 | 81 | // Watch the `public` directory and refresh the 82 | // browser on changes when not in production 83 | !production && livereload('public'), 84 | 85 | // If we're building for production (npm run build 86 | // instead of npm run dev), minify 87 | production && terser() 88 | 89 | ], 90 | watch: { 91 | clearScreen: false 92 | } 93 | }; 94 | -------------------------------------------------------------------------------- /scripts/pym.v1.min.js: -------------------------------------------------------------------------------- 1 | /*! pym.js - v1.3.2 - 2018-02-13 */ 2 | 3 | !function(a){"function"==typeof define&&define.amd?define(a):"undefined"!=typeof module&&module.exports?module.exports=a():window.pym=a.call(this)}(function(){var a={},b=function(a){var b=document.createEvent("Event");b.initEvent("pym:"+a,!0,!0),document.dispatchEvent(b)},c=function(a){var b=new RegExp("[\\?&]"+a.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]")+"=([^&#]*)"),c=b.exec(location.search);return null===c?"":decodeURIComponent(c[1].replace(/\+/g," "))},d=function(a,b){if(("*"===b.xdomain||a.origin.match(new RegExp(b.xdomain+"$")))&&"string"==typeof a.data)return!0},e=function(a){var b=/^(?:(?:https?|mailto|ftp):|[^&:\/?#]*(?:[\/?#]|$))/gi;if(a.match(b))return!0},f=function(a,b,c){return["pym",a,b,c].join("xPYMx")},g=function(a){var b=["pym",a,"(\\S+)","(.*)"];return new RegExp("^"+b.join("xPYMx")+"$")},h=Date.now||function(){return(new Date).getTime()},i=function(a,b,c){var d,e,f,g=null,i=0;c||(c={});var j=function(){i=!1===c.leading?0:h(),g=null,f=a.apply(d,e),g||(d=e=null)};return function(){var k=h();i||!1!==c.leading||(i=k);var l=b-(k-i);return d=this,e=arguments,l<=0||l>b?(g&&(clearTimeout(g),g=null),i=k,f=a.apply(d,e),g||(d=e=null)):g||!1===c.trailing||(g=setTimeout(j,l)),f}},j=function(){for(var b=a.autoInitInstances.length,c=b-1;c>=0;c--){var d=a.autoInitInstances[c];d.el.getElementsByTagName("iframe").length&&d.el.getElementsByTagName("iframe")[0].contentWindow||a.autoInitInstances.splice(c,1)}};return a.autoInitInstances=[],a.autoInit=function(c){var d=document.querySelectorAll("[data-pym-src]:not([data-pym-auto-initialized])"),e=d.length;j();for(var f=0;f-1&&(b=this.url.substring(c,this.url.length),this.url=this.url.substring(0,c)),this.url.indexOf("?")<0?this.url+="?":this.url+="&",this.iframe.src=this.url+"initialWidth="+a+"&childId="+this.id,this.settings.optionalparams&&(this.iframe.src+="&parentTitle="+encodeURIComponent(document.title),this.iframe.src+="&"+this.settings.parenturlparam+"="+encodeURIComponent(this.settings.parenturlvalue)),this.iframe.src+=b,this.iframe.setAttribute("width","100%"),this.iframe.setAttribute("scrolling","no"),this.iframe.setAttribute("marginheight","0"),this.iframe.setAttribute("frameborder","0"),this.settings.title&&this.iframe.setAttribute("title",this.settings.title),void 0!==this.settings.allowfullscreen&&!1!==this.settings.allowfullscreen&&this.iframe.setAttribute("allowfullscreen",""),void 0!==this.settings.sandbox&&"string"==typeof this.settings.sandbox&&this.iframe.setAttribute("sandbox",this.settings.sandbox),this.settings.id&&(document.getElementById(this.settings.id)||this.iframe.setAttribute("id",this.settings.id)),this.settings.name&&this.iframe.setAttribute("name",this.settings.name);this.el.firstChild;)this.el.removeChild(this.el.firstChild);this.el.appendChild(this.iframe),window.addEventListener("resize",this._onResize),this.settings.trackscroll&&window.addEventListener("scroll",this._throttleOnScroll)},this._onResize=function(){this.sendWidth(),this.settings.trackscroll&&this.sendViewportAndIFramePosition()}.bind(this),this._onScroll=function(){this.sendViewportAndIFramePosition()}.bind(this),this._fire=function(a,b){if(a in this.messageHandlers)for(var c=0;c 6 | export let name: string; 7 | 8 | 9 | As well as validating the code for CI. 10 | */ 11 | 12 | /** To work on this script: 13 | rm -rf test-template template && git clone sveltejs/template test-template && node scripts/setupTypeScript.js test-template 14 | */ 15 | 16 | const fs = require("fs") 17 | const path = require("path") 18 | const { argv } = require("process") 19 | 20 | const projectRoot = argv[2] || path.join(__dirname, "..") 21 | 22 | // Add deps to pkg.json 23 | const packageJSON = JSON.parse(fs.readFileSync(path.join(projectRoot, "package.json"), "utf8")) 24 | packageJSON.devDependencies = Object.assign(packageJSON.devDependencies, { 25 | "svelte-check": "^1.0.0", 26 | "svelte-preprocess": "^4.0.0", 27 | "@rollup/plugin-typescript": "^8.0.0", 28 | "typescript": "^4.0.0", 29 | "tslib": "^2.0.0", 30 | "@tsconfig/svelte": "^1.0.0" 31 | }) 32 | 33 | // Add script for checking 34 | packageJSON.scripts = Object.assign(packageJSON.scripts, { 35 | "validate": "svelte-check" 36 | }) 37 | 38 | // Write the package JSON 39 | fs.writeFileSync(path.join(projectRoot, "package.json"), JSON.stringify(packageJSON, null, " ")) 40 | 41 | // mv src/main.js to main.ts - note, we need to edit rollup.config.js for this too 42 | const beforeMainJSPath = path.join(projectRoot, "src", "main.js") 43 | const afterMainTSPath = path.join(projectRoot, "src", "main.ts") 44 | fs.renameSync(beforeMainJSPath, afterMainTSPath) 45 | 46 | // Switch the app.svelte file to use TS 47 | const appSveltePath = path.join(projectRoot, "src", "App.svelte") 48 | let appFile = fs.readFileSync(appSveltePath, "utf8") 49 | appFile = appFile.replace(" 68 | 69 |
70 | 71 |

Fully vaccinated across the U.S.

72 | 73 |

Percentage of county's total population that has received both doses of Pfizer or Moderna shots, or the single-dose Johnson & Johnson shot.

74 | 75 | 76 | 82 | 83 |
84 | 85 | 90 | 91 | 95 | 96 | 97 | 98 | 102 | 103 | 104 | 105 | 110 | 111 | 112 | {#if !popupVisible} 113 | 114 | 115 | evt = hideTooltip= event} 121 | on:mouseout={() => hideTooltip = true} 122 | 123 | /> 124 | 125 | 126 | 129 | {#if hideTooltip !== true} 130 | 134 |
135 | {detail.props.NAME}
136 | {detail.props.StateName ? detail.props.StateName : "statewide"}
137 | {detail.props.Series_Complete_Pop_Pct ? detail.props.Series_Complete_Pop_Pct : "Unknown "}% vaccinated 138 |
139 |
140 | {/if} 141 | 142 | {/if} 143 |
144 |
145 | 146 |

Data as of {as_of}. Statewide totals shown for Hawaii and Texas, where county-level data is not available, and for Georgia, Virginia, and West Virginia, where the county of residence wasn't available for about half of those vaccinated. | Source: Centers for Disease Control and Prevention | Get the data | Embed this | By John Keefe

147 | 148 | {#if popupVisible} 149 |
150 | 151 |

This visualization is free to use under Creative Commons license CC BY 4.0. Embed it on your site as an iframe or with this code:

152 | 153 |

<div id="datanews-embed-{vizName}"></div><script type="text/javascript" src="https://pym.nprapps.org/pym.v1.min.js"></script><script>var pymParent = new pym.Parent('datanews-embed-{vizName}', 'https://projects.datanews.studio/datanews-rig-demo/index.html', {});</script>

154 | 155 | 156 | 157 |
158 | {/if} 159 | 160 |
161 | 162 | 163 | 223 | -------------------------------------------------------------------------------- /src/components/layercake/Annotations.svelte: -------------------------------------------------------------------------------- 1 | 23 | 24 |
25 | {#each annotations as d, i} 26 |
{d.text}
31 | {/each} 32 |
33 | 34 | 39 | 40 | -------------------------------------------------------------------------------- /src/components/layercake/Area.svelte: -------------------------------------------------------------------------------- 1 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/components/layercake/AreaStacked.svelte: -------------------------------------------------------------------------------- 1 | 14 | 15 | 16 | {#each $data as d} 17 | 22 | {/each} 23 | 24 | -------------------------------------------------------------------------------- /src/components/layercake/ArrowheadDef.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/components/layercake/Arrows.svelte: -------------------------------------------------------------------------------- 1 | 70 | 71 | 72 | {#if annotations.length} 73 | 74 | {#each annotations as anno, i} 75 | {#if anno.arrows} 76 | {#each anno.arrows as arrow} 77 | 80 | {/each} 81 | {/if} 82 | {/each} 83 | 84 | {/if} 85 | 86 | 98 | -------------------------------------------------------------------------------- /src/components/layercake/AxisRadial.svelte: -------------------------------------------------------------------------------- 1 | 22 | 23 | 26 | 35 | 43 | 44 | {#each $config.x as label, i} 45 | 54 | 55 | {label} 61 | {/each} 62 | 63 | -------------------------------------------------------------------------------- /src/components/layercake/AxisX.html.svelte: -------------------------------------------------------------------------------- 1 | 24 | 25 |
26 | {#each tickVals as tick, i} 27 | {#if gridlines !== false} 28 |
29 | {/if} 30 | {#if tickMarks === true} 31 |
32 | {/if} 33 |
36 |
{formatTick(tick)}
39 |
40 | {/each} 41 | {#if baseline === true} 42 |
43 | {/if} 44 |
45 | 46 | 88 | -------------------------------------------------------------------------------- /src/components/layercake/AxisX.svelte: -------------------------------------------------------------------------------- 1 | 38 | 39 | 40 | {#each tickVals as tick, i} 41 | 42 | {#if gridlines !== false} 43 | 44 | {/if} 45 | {#if tickMarks === true} 46 | 47 | {/if} 48 | {formatTick(tick)} 54 | 55 | {/each} 56 | {#if baseline === true} 57 | 58 | {/if} 59 | 60 | 61 | 89 | -------------------------------------------------------------------------------- /src/components/layercake/AxisY.html.svelte: -------------------------------------------------------------------------------- 1 | 26 | 27 |
28 | {#each tickVals as tick, i} 29 |
30 | {#if gridlines !== false} 31 |
32 | {/if} 33 | {#if baseline !== false && i === 0} 34 |
35 | {/if} 36 | {#if tickMarks === true} 37 |
38 | {/if} 39 |
{formatTick(tick)}
47 |
48 | {/each} 49 |
50 | 51 | 85 | -------------------------------------------------------------------------------- /src/components/layercake/AxisY.svelte: -------------------------------------------------------------------------------- 1 | 25 | 26 | 27 | {#each tickVals as tick, i} 28 | 29 | {#if gridlines !== false} 30 | 36 | {/if} 37 | {#if tickMarks === true} 38 | 45 | {/if} 46 | {formatTick(tick)} 53 | 54 | {/each} 55 | 56 | 57 | 78 | -------------------------------------------------------------------------------- /src/components/layercake/Bar.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | {#each $data as d, i} 10 | 19 | {/each} 20 | 21 | -------------------------------------------------------------------------------- /src/components/layercake/BarStacked.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | {#each $data as series} 15 | {#each series as d, i} 16 | 25 | {/each} 26 | {/each} 27 | 28 | -------------------------------------------------------------------------------- /src/components/layercake/Beeswarm.html.svelte: -------------------------------------------------------------------------------- 1 | 57 | 58 |
59 | {#each circles as d} 60 |
72 | {$custom.getTitle(d)} 73 |
74 | {/each} 75 |
76 | 77 | 85 | -------------------------------------------------------------------------------- /src/components/layercake/Beeswarm.svelte: -------------------------------------------------------------------------------- 1 | 57 | 58 | 59 | {#each circles as d} 60 | 68 | {$custom.getTitle(d)} 69 | 70 | {/each} 71 | 72 | -------------------------------------------------------------------------------- /src/components/layercake/BeeswarmForce.html.svelte: -------------------------------------------------------------------------------- 1 | 30 | 31 |
32 | {#each simulation.nodes() as node} 33 |
45 | {$custom.getTitle(node)} 46 |
47 | {/each} 48 |
49 | 50 | 58 | -------------------------------------------------------------------------------- /src/components/layercake/BeeswarmForce.svelte: -------------------------------------------------------------------------------- 1 | 30 | 31 | 32 | {#each simulation.nodes() as node} 33 | 41 | {$custom.getTitle(node)} 42 | 43 | {/each} 44 | 45 | -------------------------------------------------------------------------------- /src/components/layercake/Brush.svelte: -------------------------------------------------------------------------------- 1 | 86 | 87 |
88 | {#if min !== null} 89 |
90 |
91 |
92 | {/if} 93 |
94 | 95 | 128 | -------------------------------------------------------------------------------- /src/components/layercake/CalendarMonth.svelte: -------------------------------------------------------------------------------- 1 | 59 | 60 | {#each days as day} 61 | 70 | {/each} 71 | 72 | 79 | -------------------------------------------------------------------------------- /src/components/layercake/CirclePack.html.svelte: -------------------------------------------------------------------------------- 1 | 62 | 63 |
64 | {#each descendants as d} 65 |
70 |
74 |
87 |
{titleCase(d.data.id)}
88 | {#if d.data.data[valueKey]} 89 |
{commas(d.data.data[valueKey])}
90 | {/if} 91 |
92 |
93 | {/each} 94 |
95 | 96 | 156 | -------------------------------------------------------------------------------- /src/components/layercake/CirclePackForce.svelte: -------------------------------------------------------------------------------- 1 | 60 | {#each nodes as point} 61 | 70 | 71 | 72 | {/each} 73 | -------------------------------------------------------------------------------- /src/components/layercake/ClevelandDotPlot.html.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 |
13 | {#each $data as row} 14 |
15 |
23 | 24 | {#each $xGet(row) as circleX, i} 25 |
35 | {/each} 36 |
37 | {/each} 38 |
39 | 40 | 53 | -------------------------------------------------------------------------------- /src/components/layercake/ClevelandDotPlot.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | {#each $data as row} 14 | 15 | 21 | 22 | {#each $xGet(row) as circleX, i} 23 | 29 | {/each} 30 | 31 | {/each} 32 | 33 | 34 | 44 | -------------------------------------------------------------------------------- /src/components/layercake/Column.svelte: -------------------------------------------------------------------------------- 1 | 23 | 24 | 25 | {#each $data as d, i} 26 | 37 | {/each} 38 | 39 | -------------------------------------------------------------------------------- /src/components/layercake/ColumnLinear.svelte: -------------------------------------------------------------------------------- 1 | 22 | 23 | {#each $data as d, i} 24 | 35 | {/each} 36 | -------------------------------------------------------------------------------- /src/components/layercake/ColumnStacked.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | {#each $data as series, i} 15 | {#each series as d} 16 | 25 | {/each} 26 | {/each} 27 | 28 | -------------------------------------------------------------------------------- /src/components/layercake/ForceDirectedGraph.svelte: -------------------------------------------------------------------------------- 1 | 68 | {#each links as link} 69 | 70 | 76 | {$x(link.source)} 77 | 78 | 79 | {/each} 80 | 81 | {#each nodes as point} 82 | 91 | {$x(point)} 92 | 93 | {/each} 94 | -------------------------------------------------------------------------------- /src/components/layercake/Key.svelte: -------------------------------------------------------------------------------- 1 | 37 | 38 | 68 | 69 |
70 | {#each $zDomain as item} 71 |
72 |
79 |
{displayName(item)}
80 |
81 | {/each} 82 |
83 | -------------------------------------------------------------------------------- /src/components/layercake/Labels.svelte: -------------------------------------------------------------------------------- 1 | 18 | 19 | {#each $data as group} 20 |
{cap(group.key)}
27 | {/each} 28 | 29 | 36 | -------------------------------------------------------------------------------- /src/components/layercake/Line.svelte: -------------------------------------------------------------------------------- 1 | 14 | 15 | 16 | 17 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/components/layercake/Map.canvas.svelte: -------------------------------------------------------------------------------- 1 | 55 | -------------------------------------------------------------------------------- /src/components/layercake/Map.svg.svelte: -------------------------------------------------------------------------------- 1 | 53 | 54 | dispatch('mouseout')} 57 | > 58 | {#each features as feature} 59 | dispatch('mousemove', { e, props: feature.properties })} 66 | on:mousemove={handleMousemove(feature)} 67 | > 68 | {/each} 69 | 70 | 71 | 81 | -------------------------------------------------------------------------------- /src/components/layercake/MultiLine.svelte: -------------------------------------------------------------------------------- 1 | 14 | 15 | 16 | {#each $data as group} 17 | 22 | {/each} 23 | 24 | 25 | 33 | -------------------------------------------------------------------------------- /src/components/layercake/QuadTree.percent-range.svelte: -------------------------------------------------------------------------------- 1 | 40 | 41 | 50 | 51 |
56 | 63 | -------------------------------------------------------------------------------- /src/components/layercake/QuadTree.svelte: -------------------------------------------------------------------------------- 1 | 36 | 37 | 46 | 47 |
52 | 59 | -------------------------------------------------------------------------------- /src/components/layercake/Radar.svelte: -------------------------------------------------------------------------------- 1 | 29 | 30 | 33 | {#each $data as row} 34 | 35 | 42 | 43 | 44 | {#each $xGet(row) as circleR, i} 45 | 53 | {/each} 54 | {/each} 55 | 56 | 57 | 64 | -------------------------------------------------------------------------------- /src/components/layercake/Sankey.svelte: -------------------------------------------------------------------------------- 1 | 34 | 35 | 40 | 41 | 42 | 43 | {#each sankeyData.links as d} 44 | 50 | {/each} 51 | 52 | 53 | {#each sankeyData.nodes as d, i} 54 | 60 | 67 | {d.id} 68 | 69 | {/each} 70 | 71 | 72 | -------------------------------------------------------------------------------- /src/components/layercake/Scatter.canvas.svelte: -------------------------------------------------------------------------------- 1 | 35 | -------------------------------------------------------------------------------- /src/components/layercake/Scatter.html.svelte: -------------------------------------------------------------------------------- 1 | 13 | 14 |
15 | {#each $data as d} 16 |
27 | {/each} 28 |
29 | 30 | 37 | -------------------------------------------------------------------------------- /src/components/layercake/Scatter.svg.svelte: -------------------------------------------------------------------------------- 1 | 13 | 14 | 15 | {#each $data as d} 16 | 24 | {/each} 25 | 26 | -------------------------------------------------------------------------------- /src/components/layercake/Scatter.webgl.svelte: -------------------------------------------------------------------------------- 1 | 154 | -------------------------------------------------------------------------------- /src/components/layercake/SharedTooltip.percent-range.svelte: -------------------------------------------------------------------------------- 1 | 37 | 38 | 68 | 69 | 78 | {#if visible === true} 79 |
82 |
90 |
{formatTitle(found[$config.x])}
91 | {#each sortResult(found) as row} 92 |
{formatKey(row.key)}: {formatValue(row.value)}
93 | {/each} 94 |
95 | {/if} 96 |
97 | 98 | -------------------------------------------------------------------------------- /src/components/layercake/SharedTooltip.svelte: -------------------------------------------------------------------------------- 1 | 37 | 38 | 69 | 70 | 79 | {#if visible === true} 80 |
83 |
91 |
{formatTitle(found[$config.x])}
92 | {#each sortResult(found) as row} 93 |
{formatKey(row.key)}: {formatValue(row.value)}
94 | {/each} 95 |
96 | {/if} 97 |
98 | 99 | -------------------------------------------------------------------------------- /src/components/layercake/SmallMultipleWrapper.percent-range.svelte: -------------------------------------------------------------------------------- 1 | 27 | 28 | d.field === 'x').accessor} 33 | y={extentGetters.find(d => d.field === 'y').accessor} 34 | {data} 35 | xDomain={$xDomain} 36 | yDomain={$yDomain} 37 | > 38 | 39 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/components/layercake/SmallMultipleWrapper.svelte: -------------------------------------------------------------------------------- 1 | 27 | 28 | d.field === 'x').accessor} 31 | y={extentGetters.find(d => d.field === 'y').accessor} 32 | {data} 33 | xDomain={$xDomain} 34 | yDomain={$yDomain} 35 | > 36 | 37 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /src/components/layercake/SyncedBrushWrapper.percent-range.svelte: -------------------------------------------------------------------------------- 1 | 24 | 25 | 45 | 46 |
47 |
48 | 57 | 58 | { 60 | const filtered = ticks.filter(t => t % 1 === 0); 61 | if (filtered.length > 7) { 62 | return filtered.filter((t, i) => i % 2 === 0); 63 | } 64 | return filtered; 65 | }} 66 | /> 67 | 70 | 71 | 72 | 75 | 78 | 79 | 80 |
81 | 82 |
83 | 92 | 93 | 96 | 99 | 100 | 101 | 105 | 106 | 107 |
108 |
109 | -------------------------------------------------------------------------------- /src/components/layercake/SyncedBrushWrapper.svelte: -------------------------------------------------------------------------------- 1 | 24 | 25 | 45 | 46 |
47 |
48 | 55 | 56 | { 58 | const filtered = ticks.filter(t => t % 1 === 0); 59 | if (filtered.length > 7) { 60 | return filtered.filter((t, i) => i % 2 === 0); 61 | } 62 | return filtered; 63 | }} 64 | /> 65 | 68 | 71 | 74 | 75 | 76 |
77 | 78 |
79 | 86 | 87 | 90 | 93 | 94 | 95 | 99 | 100 | 101 |
102 |
103 | -------------------------------------------------------------------------------- /src/components/layercake/Tooltip.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 18 | 19 | {#if evt.detail} 20 |
27 | 28 |
29 | {/if} 30 | -------------------------------------------------------------------------------- /src/components/layercake/Voronoi.svelte: -------------------------------------------------------------------------------- 1 | 23 | 24 | 35 | 36 | {#each uniquePoints as point, i} 37 | 38 | {/each} 39 | -------------------------------------------------------------------------------- /src/components/smarts/HtmlRender.svelte: -------------------------------------------------------------------------------- 1 | 13 | 14 |

15 | {@html htmlContent} 16 |

17 | -------------------------------------------------------------------------------- /src/components/smarts/Map.albers.svelte: -------------------------------------------------------------------------------- 1 | 85 | 86 | dispatch('mouseout')} 89 | > 90 | {#each features as feature, i } 91 | dispatch('mousemove', { e, props: feature.properties })} 98 | on:mousemove={handleMousemove(feature)} 99 | > 100 | {/each} 101 | 102 | 103 | 109 | -------------------------------------------------------------------------------- /src/components/smarts/MapKey.svelte: -------------------------------------------------------------------------------- 1 | 14 | 15 |
16 |
17 |
{hed}
18 |
{subhed}
19 | 20 |
21 | 22 | {#each colors as color, i} 23 | 24 | {#if (i < colors.length - 1)} 25 |
26 |
27 |
28 | {:else} 29 |
30 |
31 |
32 | {/if} 33 | 34 | 35 | {/each} 36 | 37 | {#if has_missing_data} 38 |
39 |
40 |
41 | {/if} 42 | 43 |
44 | 45 |
46 | 47 | {#each level_breaks as level_break} 48 |
49 | {level_break} 50 |
51 | {/each} 52 | 53 | {#if has_missing_data} 54 |
55 | No data 56 |
57 | {/if} 58 | 59 |
60 | 61 |

{interaction_tip}

62 | 63 |
64 |
65 | 66 | 174 | 175 | 176 | 177 | 178 | -------------------------------------------------------------------------------- /src/components/smarts/MapLabels.albers.svelte: -------------------------------------------------------------------------------- 1 | 61 | 62 | 65 | 66 | {#each features as feature} 67 | 68 | 75 | 76 | {#if (feature.geometry)} 77 | 78 | {feature.properties[label_property]} 83 | {/if} 84 | 85 | {/each} 86 | 87 | 88 | 161 | -------------------------------------------------------------------------------- /src/components/smarts/SvgImage.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 |
7 |
8 | 9 |
10 |
-------------------------------------------------------------------------------- /src/data/as-of.json: -------------------------------------------------------------------------------- 1 | { "as_of": "2022-03-14" } 2 | -------------------------------------------------------------------------------- /src/data/points.csv: -------------------------------------------------------------------------------- 1 | myX,myY 2 | 1979,7.19 3 | 1980,7.83 4 | 1981,7.24 5 | 1982,7.44 6 | 1983,7.51 7 | 1984,7.1 8 | 1985,6.91 9 | 1986,7.53 10 | 1987,7.47 11 | 1988,7.48 12 | 1989,7.03 13 | 1990,6.23 14 | 1991,6.54 15 | 1992,7.54 16 | 1993,6.5 17 | 1994,7.18 18 | 1995,6.12 19 | 1996,7.87 20 | 1997,6.73 21 | 1998,6.55 22 | 1999,6.23 23 | 2000,6.31 24 | 2001,6.74 25 | 2002,5.95 26 | 2003,6.13 27 | 2004,6.04 28 | 2005,5.56 29 | 2006,5.91 30 | 2007,4.29 31 | 2008,4.72 32 | 2009,5.38 33 | 2010,4.92 34 | 2011,4.61 35 | 2012,3.62 36 | 2013,5.35 37 | 2014,5.28 38 | 2015,4.63 39 | 2016,4.72 40 | -------------------------------------------------------------------------------- /src/data/us_states_albers_labels_nyt.json: -------------------------------------------------------------------------------- 1 | {"type":"FeatureCollection", "features": [ 2 | {"type":"Feature","geometry":{"type":"Point","coordinates":[586435.4555369178,-511276.5660448533]},"properties":{"STATEFP":"28","STATENS":"01779790","AFFGEOID":"0400000US28","GEOID":"28","STUSPS":"MS","NAME":"Mississippi","LSAD":"00","ALAND":121533519481,"AWATER":3926919758,"full_name":"Mississippi","nyt_name":"Miss.","label-text":"Miss.","class":"g-state-name","ID_BUILDER":"g-state-MS"},"id":"g-state-MS"}, 3 | {"type":"Feature","geometry":{"type":"Point","coordinates":[1575483.1382414857,-85838.7878943652]},"properties":{"STATEFP":"37","STATENS":"01027616","AFFGEOID":"0400000US37","GEOID":"37","STUSPS":"NC","NAME":"North Carolina","LSAD":"00","ALAND":125923656064,"AWATER":13466071395,"full_name":"North Carolina","nyt_name":"N.C.","label-text":"N.C.","class":"g-state-name","ID_BUILDER":"g-state-NC"},"id":"g-state-NC"}, 4 | {"type":"Feature","geometry":{"type":"Point","coordinates":[-88020.94275117367,-226530.75602486014]},"properties":{"STATEFP":"40","STATENS":"01102857","AFFGEOID":"0400000US40","GEOID":"40","STUSPS":"OK","NAME":"Oklahoma","LSAD":"00","ALAND":177662925723,"AWATER":3374587997,"full_name":"Oklahoma","nyt_name":"Okla.","label-text":"Okla.","class":"g-state-name","ID_BUILDER":"g-state-OK"},"id":"g-state-OK"}, 5 | {"type":"Feature","geometry":{"type":"Point","coordinates":[1490448.1414427052,137307.38976054595]},"properties":{"STATEFP":"51","STATENS":"01779803","AFFGEOID":"0400000US51","GEOID":"51","STUSPS":"VA","NAME":"Virginia","LSAD":"00","ALAND":102257717110,"AWATER":8528531774,"full_name":"Virginia","nyt_name":"Va.","label-text":"Va.","class":"g-state-name","ID_BUILDER":"g-state-VA"},"id":"g-state-VA"}, 6 | {"type":"Feature","geometry":{"type":"Point","coordinates":[1306434.6655593645,234918.9497169824]},"properties":{"STATEFP":"54","STATENS":"01779805","AFFGEOID":"0400000US54","GEOID":"54","STUSPS":"WV","NAME":"West Virginia","LSAD":"00","ALAND":62266474513,"AWATER":489028543,"full_name":"West Virginia","nyt_name":"W.V.","label-text":"W.V.","class":"g-state-name","ID_BUILDER":"g-state-WV"},"id":"g-state-WV"}, 7 | {"type":"Feature","geometry":{"type":"Point","coordinates":[316557.8809428793,-617475.1197179385]},"properties":{"STATEFP":"22","STATENS":"01629543","AFFGEOID":"0400000US22","GEOID":"22","STUSPS":"LA","NAME":"Louisiana","LSAD":"00","ALAND":111897594374,"AWATER":23753621895,"full_name":"Louisiana","nyt_name":"La.","label-text":"La.","class":"g-state-name","ID_BUILDER":"g-state-LA"},"id":"g-state-LA"}, 8 | {"type":"Feature","geometry":{"type":"Point","coordinates":[902379.3726029437,662320.4685954732]},"properties":{"STATEFP":"26","STATENS":"01779789","AFFGEOID":"0400000US26","GEOID":"26","STUSPS":"MI","NAME":"Michigan","LSAD":"00","ALAND":146600952990,"AWATER":103885855702,"full_name":"Michigan","nyt_name":"Mich.","label-text":"Mich.","class":"g-state-name","ID_BUILDER":"g-state-MI"},"id":"g-state-MI"}, 9 | {"type":"Feature","geometry":{"type":"Point","coordinates":[1957317.3714768677,794670.7851715363]},"properties":{"STATEFP":"25","STATENS":"00606926","AFFGEOID":"0400000US25","GEOID":"25","STUSPS":"MA","NAME":"Massachusetts","LSAD":"00","ALAND":20205125364,"AWATER":7129925486,"full_name":"Massachusetts","nyt_name":"Mass.","label-text":"Mass.","class":"g-state-name","ID_BUILDER":"g-state-MA"},"id":"g-state-MA"}, 10 | {"type":"Feature","geometry":{"type":"Point","coordinates":[-1496695.5686895803,830850.3105246795]},"properties":{"STATEFP":"16","STATENS":"01779783","AFFGEOID":"0400000US16","GEOID":"16","STUSPS":"ID","NAME":"Idaho","LSAD":"00","ALAND":214049787659,"AWATER":2391722557,"full_name":"Idaho","nyt_name":"Idaho","label-text":"Idaho","class":"g-state-name","ID_BUILDER":"g-state-ID"},"id":"g-state-ID"}, 11 | {"type":"Feature","geometry":{"type":"Point","coordinates":[1394717.8778701609,-885415.7932623739]},"properties":{"STATEFP":"12","STATENS":"00294478","AFFGEOID":"0400000US12","GEOID":"12","STUSPS":"FL","NAME":"Florida","LSAD":"00","ALAND":138949136250,"AWATER":31361101223,"full_name":"Florida","nyt_name":"Fla.","label-text":"Fla.","class":"g-state-name","ID_BUILDER":"g-state-FL"},"id":"g-state-FL"}, 12 | {"type":"Feature","geometry":{"type":"Point","coordinates":[-314346.8945482229,454341.00879828073]},"properties":{"STATEFP":"31","STATENS":"01779792","AFFGEOID":"0400000US31","GEOID":"31","STUSPS":"NE","NAME":"Nebraska","LSAD":"00","ALAND":198956658395,"AWATER":1371829134,"full_name":"Nebraska","nyt_name":"Neb.","label-text":"Neb.","class":"g-state-name","ID_BUILDER":"g-state-NE"},"id":"g-state-NE"}, 13 | {"type":"Feature","geometry":{"type":"Point","coordinates":[-1807185.5125266681,1341044.191818914]},"properties":{"STATEFP":"53","STATENS":"01779804","AFFGEOID":"0400000US53","GEOID":"53","STUSPS":"WA","NAME":"Washington","LSAD":"00","ALAND":172112588220,"AWATER":12559278850,"full_name":"Washington","nyt_name":"Wash.","label-text":"Wash.","class":"g-state-name","ID_BUILDER":"g-state-WA"},"id":"g-state-WA"}, 14 | {"type":"Feature","geometry":{"type":"Point","coordinates":[-914669.5770682874,-287129.90358306246]},"properties":{"STATEFP":"35","STATENS":"00897535","AFFGEOID":"0400000US35","GEOID":"35","STUSPS":"NM","NAME":"New Mexico","LSAD":"00","ALAND":314196306401,"AWATER":728776523,"full_name":"New Mexico","nyt_name":"N.M.","label-text":"N.M.","class":"g-state-name","ID_BUILDER":"g-state-NM"},"id":"g-state-NM"}, 15 | {"type":"Feature","geometry":null,"properties":{"STATEFP":"72","STATENS":"01779808","AFFGEOID":"0400000US72","GEOID":"72","STUSPS":"PR","NAME":"Puerto Rico","LSAD":"00","ALAND":8868896030,"AWATER":4922382562,"full_name":"Puerto Rico","nyt_name":"P.R.","label-text":"P.R.","class":"g-state-name","ID_BUILDER":"g-state-PR"},"id":"g-state-PR"}, 16 | {"type":"Feature","geometry":{"type":"Point","coordinates":[-335585.6084621199,787253.6110598906]},"properties":{"STATEFP":"46","STATENS":"01785534","AFFGEOID":"0400000US46","GEOID":"46","STUSPS":"SD","NAME":"South Dakota","LSAD":"00","ALAND":196346981786,"AWATER":3382720225,"full_name":"South Dakota","nyt_name":"S.D.","label-text":"S.D.","class":"g-state-name","ID_BUILDER":"g-state-SD"},"id":"g-state-SD"}, 17 | {"type":"Feature","geometry":{"type":"Point","coordinates":[-253922.78182456183,-698595.9477435737]},"properties":{"STATEFP":"48","STATENS":"01779801","AFFGEOID":"0400000US48","GEOID":"48","STUSPS":"TX","NAME":"Texas","LSAD":"00","ALAND":676653171537,"AWATER":19006305260,"full_name":"Texas","nyt_name":"Tex.","label-text":"Tex.","class":"g-state-name","ID_BUILDER":"g-state-TX"},"id":"g-state-TX"}, 18 | {"type":"Feature","geometry":{"type":"Point","coordinates":[-2072621.5267861504,161560.7513011885]},"properties":{"STATEFP":"06","STATENS":"01779778","AFFGEOID":"0400000US06","GEOID":"06","STUSPS":"CA","NAME":"California","LSAD":"00","ALAND":403503931312,"AWATER":20463871877,"full_name":"California","nyt_name":"Calif.","label-text":"Calif.","class":"g-state-name","ID_BUILDER":"g-state-CA"},"id":"g-state-CA"}, 19 | {"type":"Feature","geometry":{"type":"Point","coordinates":[855251.5864704623,-485285.15809705114]},"properties":{"STATEFP":"01","STATENS":"01779775","AFFGEOID":"0400000US01","GEOID":"01","STUSPS":"AL","NAME":"Alabama","LSAD":"00","ALAND":131174048583,"AWATER":4593327154,"full_name":"Alabama","nyt_name":"Ala.","label-text":"Ala.","class":"g-state-name","ID_BUILDER":"g-state-AL"},"id":"g-state-AL"}, 20 | {"type":"Feature","geometry":{"type":"Point","coordinates":[1188133.5583313352,-485354.2848740801]},"properties":{"STATEFP":"13","STATENS":"01705317","AFFGEOID":"0400000US13","GEOID":"13","STUSPS":"GA","NAME":"Georgia","LSAD":"00","ALAND":149482048342,"AWATER":4422936154,"full_name":"Georgia","nyt_name":"Ga.","label-text":"Ga.","class":"g-state-name","ID_BUILDER":"g-state-GA"},"id":"g-state-GA"}, 21 | {"type":"Feature","geometry":{"type":"Point","coordinates":[1512099.1975911246,521829.97669260186]},"properties":{"STATEFP":"42","STATENS":"01779798","AFFGEOID":"0400000US42","GEOID":"42","STUSPS":"PA","NAME":"Pennsylvania","LSAD":"00","ALAND":115884442321,"AWATER":3394589990,"full_name":"Pennsylvania","nyt_name":"Pa.","label-text":"Pa.","class":"g-state-name","ID_BUILDER":"g-state-PA"},"id":"g-state-PA"}, 22 | {"type":"Feature","geometry":{"type":"Point","coordinates":[300869.8563948078,89320.49345133238]},"properties":{"STATEFP":"29","STATENS":"01779791","AFFGEOID":"0400000US29","GEOID":"29","STUSPS":"MO","NAME":"Missouri","LSAD":"00","ALAND":178050802184,"AWATER":2489425460,"full_name":"Missouri","nyt_name":"Mo.","label-text":"Mo.","class":"g-state-name","ID_BUILDER":"g-state-MO"},"id":"g-state-MO"}, 23 | {"type":"Feature","geometry":{"type":"Point","coordinates":[-817891.4458824636,208850.0485386087]},"properties":{"STATEFP":"08","STATENS":"01779779","AFFGEOID":"0400000US08","GEOID":"08","STUSPS":"CO","NAME":"Colorado","LSAD":"00","ALAND":268422891711,"AWATER":1181621593,"full_name":"Colorado","nyt_name":"Colo.","label-text":"Colo.","class":"g-state-name","ID_BUILDER":"g-state-CO"},"id":"g-state-CO"}, 24 | {"type":"Feature","geometry":{"type":"Point","coordinates":[-1328125.9032967908,291407.50168264494]},"properties":{"STATEFP":"49","STATENS":"01455989","AFFGEOID":"0400000US49","GEOID":"49","STUSPS":"UT","NAME":"Utah","LSAD":"00","ALAND":212886221680,"AWATER":6998824394,"full_name":"Utah","nyt_name":"Utah","label-text":"Utah","class":"g-state-name","ID_BUILDER":"g-state-UT"},"id":"g-state-UT"}, 25 | {"type":"Feature","geometry":{"type":"Point","coordinates":[862058.4411735358,-144654.54355613916]},"properties":{"STATEFP":"47","STATENS":"01325873","AFFGEOID":"0400000US47","GEOID":"47","STUSPS":"TN","NAME":"Tennessee","LSAD":"00","ALAND":106802728188,"AWATER":2350123465,"full_name":"Tennessee","nyt_name":"Tenn.","label-text":"Tenn.","class":"g-state-name","ID_BUILDER":"g-state-TN"},"id":"g-state-TN"}, 26 | {"type":"Feature","geometry":{"type":"Point","coordinates":[-934481.9263715255,672756.5772233144]},"properties":{"STATEFP":"56","STATENS":"01779807","AFFGEOID":"0400000US56","GEOID":"56","STUSPS":"WY","NAME":"Wyoming","LSAD":"00","ALAND":251458544898,"AWATER":1867670745,"full_name":"Wyoming","nyt_name":"Wy.","label-text":"Wy.","class":"g-state-name","ID_BUILDER":"g-state-WY"},"id":"g-state-WY"}, 27 | {"type":"Feature","geometry":{"type":"Point","coordinates":[1700613.1084800677,809789.0272944493]},"properties":{"STATEFP":"36","STATENS":"01779796","AFFGEOID":"0400000US36","GEOID":"36","STUSPS":"NY","NAME":"New York","LSAD":"00","ALAND":122049149763,"AWATER":19246994695,"full_name":"New York","nyt_name":"N.Y.","label-text":"N.Y.","class":"g-state-name","ID_BUILDER":"g-state-NY"},"id":"g-state-NY"}, 28 | {"type":"Feature","geometry":{"type":"Point","coordinates":[-205594.0033080648,114701.69000111253]},"properties":{"STATEFP":"20","STATENS":"00481813","AFFGEOID":"0400000US20","GEOID":"20","STUSPS":"KS","NAME":"Kansas","LSAD":"00","ALAND":211755344060,"AWATER":1344141205,"full_name":"Kansas","nyt_name":"Kan.","label-text":"Kan.","class":"g-state-name","ID_BUILDER":"g-state-KS"},"id":"g-state-KS"}, 29 | {"type":"Feature","geometry":{"type":"Point","coordinates":[-1862268.6869497679,-867855.2354886925]},"properties":{"STATEFP":"02","STATENS":"01785533","AFFGEOID":"0400000US02","GEOID":"02","STUSPS":"AK","NAME":"Alaska","LSAD":"00","ALAND":1478839695958,"AWATER":245481577452,"full_name":"Alaska","nyt_name":"Alaska","label-text":"Alaska","class":"g-state-name","ID_BUILDER":"g-state-AK"},"id":"g-state-AK"}, 30 | {"type":"Feature","geometry":{"type":"Point","coordinates":[-1752697.3444125568,415346.7464527608]},"properties":{"STATEFP":"32","STATENS":"01779793","AFFGEOID":"0400000US32","GEOID":"32","STUSPS":"NV","NAME":"Nevada","LSAD":"00","ALAND":284329506470,"AWATER":2047206072,"full_name":"Nevada","nyt_name":"Nev.","label-text":"Nev.","class":"g-state-name","ID_BUILDER":"g-state-NV"},"id":"g-state-NV"}, 31 | {"type":"Feature","geometry":{"type":"Point","coordinates":[560811.9763363445,321179.3140807806]},"properties":{"STATEFP":"17","STATENS":"01779784","AFFGEOID":"0400000US17","GEOID":"17","STUSPS":"IL","NAME":"Illinois","LSAD":"00","ALAND":143780567633,"AWATER":6214824948,"full_name":"Illinois","nyt_name":"Ill.","label-text":"Ill.","class":"g-state-name","ID_BUILDER":"g-state-IL"},"id":"g-state-IL"}, 32 | {"type":"Feature","geometry":{"type":"Point","coordinates":[1838141.5387251833,960435.5253449648]},"properties":{"STATEFP":"50","STATENS":"01779802","AFFGEOID":"0400000US50","GEOID":"50","STUSPS":"VT","NAME":"Vermont","LSAD":"00","ALAND":23874175944,"AWATER":1030416650,"full_name":"Vermont","nyt_name":"Vt.","label-text":"Vt.","class":"g-state-name","ID_BUILDER":"g-state-VT"},"id":"g-state-VT"}, 33 | {"type":"Feature","geometry":{"type":"Point","coordinates":[-1037614.186169347,1134765.993792567]},"properties":{"STATEFP":"30","STATENS":"00767982","AFFGEOID":"0400000US30","GEOID":"30","STUSPS":"MT","NAME":"Montana","LSAD":"00","ALAND":376962738765,"AWATER":3869208832,"full_name":"Montana","nyt_name":"Mont.","label-text":"Mont.","class":"g-state-name","ID_BUILDER":"g-state-MT"},"id":"g-state-MT"}, 34 | {"type":"Feature","geometry":{"type":"Point","coordinates":[205793.39517559833,511180.2450853417]},"properties":{"STATEFP":"19","STATENS":"01779785","AFFGEOID":"0400000US19","GEOID":"19","STUSPS":"IA","NAME":"Iowa","LSAD":"00","ALAND":144661267977,"AWATER":1084180812,"full_name":"Iowa","nyt_name":"Iowa","label-text":"Iowa","class":"g-state-name","ID_BUILDER":"g-state-IA"},"id":"g-state-IA"}, 35 | {"type":"Feature","geometry":{"type":"Point","coordinates":[1396709.4161173413,-299774.56812552107]},"properties":{"STATEFP":"45","STATENS":"01779799","AFFGEOID":"0400000US45","GEOID":"45","STUSPS":"SC","NAME":"South Carolina","LSAD":"00","ALAND":77864918488,"AWATER":5075218778,"full_name":"South Carolina","nyt_name":"S.C.","label-text":"S.C.","class":"g-state-name","ID_BUILDER":"g-state-SC"},"id":"g-state-SC"}, 36 | {"type":"Feature","geometry":{"type":"Point","coordinates":[1939239.963850858,926871.5505785907]},"properties":{"STATEFP":"33","STATENS":"01779794","AFFGEOID":"0400000US33","GEOID":"33","STUSPS":"NH","NAME":"New Hampshire","LSAD":"00","ALAND":23189413166,"AWATER":1026675248,"full_name":"New Hampshire","nyt_name":"N.H.","label-text":"N.H.","class":"g-state-name","ID_BUILDER":"g-state-NH"},"id":"g-state-NH"}, 37 | {"type":"Feature","geometry":{"type":"Point","coordinates":[-1418632.1595129103,-238775.64779785086]},"properties":{"STATEFP":"04","STATENS":"01779777","AFFGEOID":"0400000US04","GEOID":"04","STUSPS":"AZ","NAME":"Arizona","LSAD":"00","ALAND":294198551143,"AWATER":1027337603,"full_name":"Arizona","nyt_name":"Ariz.","label-text":"Ariz.","class":"g-state-name","ID_BUILDER":"g-state-AZ"},"id":"g-state-AZ"}, 38 | {"type":"Feature","geometry":{"type":"Point","coordinates":[1620922.6974977145,320041.2081808604]},"properties":{"STATEFP":"11","STATENS":"01702382","AFFGEOID":"0400000US11","GEOID":"11","STUSPS":"DC","NAME":"District of Columbia","LSAD":"00","ALAND":158340391,"AWATER":18687198,"full_name":"District of Columbia","nyt_name":"D.C.","label-text":"D.C.","class":"g-state-name","ID_BUILDER":"g-state-DC"},"id":"g-state-DC"}, 39 | {"type":"Feature","geometry":null,"properties":{"STATEFP":"60","STATENS":"01802701","AFFGEOID":"0400000US60","GEOID":"60","STUSPS":"AS","NAME":"American Samoa","LSAD":"00","ALAND":197759063,"AWATER":1307243754,"full_name":null,"nyt_name":null,"label-text":null,"class":"g-state-name","ID_BUILDER":"g-state-AS"},"id":"g-state-AS"}, 40 | {"type":"Feature","geometry":null,"properties":{"STATEFP":"78","STATENS":"01802710","AFFGEOID":"0400000US78","GEOID":"78","STUSPS":"VI","NAME":"United States Virgin Islands","LSAD":"00","ALAND":348021896,"AWATER":1550236201,"full_name":null,"nyt_name":null,"label-text":null,"class":"g-state-name","ID_BUILDER":"g-state-VI"},"id":"g-state-VI"}, 41 | {"type":"Feature","geometry":{"type":"Point","coordinates":[1781172.2554909652,432494.3504814032]},"properties":{"STATEFP":"34","STATENS":"01779795","AFFGEOID":"0400000US34","GEOID":"34","STUSPS":"NJ","NAME":"New Jersey","LSAD":"00","ALAND":19047825980,"AWATER":3544860246,"full_name":"New Jersey","nyt_name":"N.J.","label-text":"N.J.","class":"g-state-name","ID_BUILDER":"g-state-NJ"},"id":"g-state-NJ"}, 42 | {"type":"Feature","geometry":{"type":"Point","coordinates":[1618432.5690755264,370235.8041935435]},"properties":{"STATEFP":"24","STATENS":"01714934","AFFGEOID":"0400000US24","GEOID":"24","STUSPS":"MD","NAME":"Maryland","LSAD":"00","ALAND":25151100280,"AWATER":6979966958,"full_name":"Maryland","nyt_name":"Md.","label-text":"Md.","class":"g-state-name","ID_BUILDER":"g-state-MD"},"id":"g-state-MD"}, 43 | {"type":"Feature","geometry":{"type":"Point","coordinates":[2070369.9343487443,1168928.2839700785]},"properties":{"STATEFP":"23","STATENS":"01779787","AFFGEOID":"0400000US23","GEOID":"23","STUSPS":"ME","NAME":"Maine","LSAD":"00","ALAND":79887426037,"AWATER":11746549764,"full_name":"Maine","nyt_name":"Maine","label-text":"Maine","class":"g-state-name","ID_BUILDER":"g-state-ME"},"id":"g-state-ME"}, 44 | {"type":"Feature","geometry":{"type":"Point","coordinates":[-896519.7996955932,-1206019.1323442347]},"properties":{"STATEFP":"15","STATENS":"01779782","AFFGEOID":"0400000US15","GEOID":"15","STUSPS":"HI","NAME":"Hawaii","LSAD":"00","ALAND":16633990195,"AWATER":11777809026,"full_name":"Hawaii","nyt_name":"Hawaii","label-text":"Hawaii","class":"g-state-name","ID_BUILDER":"g-state-HI"},"id":"g-state-HI"}, 45 | {"type":"Feature","geometry":{"type":"Point","coordinates":[1758038.3265659355,325612.23538520595]},"properties":{"STATEFP":"10","STATENS":"01779781","AFFGEOID":"0400000US10","GEOID":"10","STUSPS":"DE","NAME":"Delaware","LSAD":"00","ALAND":5045925646,"AWATER":1399985648,"full_name":"Delaware","nyt_name":"Del.","label-text":"Del.","class":"g-state-name","ID_BUILDER":"g-state-DE"},"id":"g-state-DE"}, 46 | {"type":"Feature","geometry":null,"properties":{"STATEFP":"66","STATENS":"01802705","AFFGEOID":"0400000US66","GEOID":"66","STUSPS":"GU","NAME":"Guam","LSAD":"00","ALAND":543555840,"AWATER":934337453,"full_name":null,"nyt_name":null,"label-text":null,"class":"g-state-name","ID_BUILDER":"g-state-GU"},"id":"g-state-GU"}, 47 | {"type":"Feature","geometry":null,"properties":{"STATEFP":"69","STATENS":"01779809","AFFGEOID":"0400000US69","GEOID":"69","STUSPS":"MP","NAME":"Commonwealth of the Northern Mariana Islands","LSAD":"00","ALAND":472292529,"AWATER":4644252461,"full_name":null,"nyt_name":null,"label-text":null,"class":"g-state-name","ID_BUILDER":"g-state-MP"},"id":"g-state-MP"}, 48 | {"type":"Feature","geometry":{"type":"Point","coordinates":[1994719.4481921175,737440.0606554627]},"properties":{"STATEFP":"44","STATENS":"01219835","AFFGEOID":"0400000US44","GEOID":"44","STUSPS":"RI","NAME":"Rhode Island","LSAD":"00","ALAND":2677779902,"AWATER":1323670487,"full_name":"Rhode Island","nyt_name":"R.I.","label-text":"R.I.","class":"g-state-name","ID_BUILDER":"g-state-RI"},"id":"g-state-RI"}, 49 | {"type":"Feature","geometry":{"type":"Point","coordinates":[1009615.1404092099,87245.1546652873]},"properties":{"STATEFP":"21","STATENS":"01779786","AFFGEOID":"0400000US21","GEOID":"21","STUSPS":"KY","NAME":"Kentucky","LSAD":"00","ALAND":102279490672,"AWATER":2375337755,"full_name":"Kentucky","nyt_name":"Ky.","label-text":"Ky.","class":"g-state-name","ID_BUILDER":"g-state-KY"},"id":"g-state-KY"}, 50 | {"type":"Feature","geometry":{"type":"Point","coordinates":[1105993.9218392633,370427.7956652547]},"properties":{"STATEFP":"39","STATENS":"01085497","AFFGEOID":"0400000US39","GEOID":"39","STUSPS":"OH","NAME":"Ohio","LSAD":"00","ALAND":105828882568,"AWATER":10268850702,"full_name":"Ohio","nyt_name":"Ohio","label-text":"Ohio","class":"g-state-name","ID_BUILDER":"g-state-OH"},"id":"g-state-OH"}, 51 | {"type":"Feature","geometry":{"type":"Point","coordinates":[478683.8433974353,839622.9764668013]},"properties":{"STATEFP":"55","STATENS":"01779806","AFFGEOID":"0400000US55","GEOID":"55","STUSPS":"WI","NAME":"Wisconsin","LSAD":"00","ALAND":140290039723,"AWATER":29344951758,"full_name":"Wisconsin","nyt_name":"Wis.","label-text":"Wis.","class":"g-state-name","ID_BUILDER":"g-state-WI"},"id":"g-state-WI"}, 52 | {"type":"Feature","geometry":{"type":"Point","coordinates":[-1942975.8907073103,961005.3938583808]},"properties":{"STATEFP":"41","STATENS":"01155107","AFFGEOID":"0400000US41","GEOID":"41","STUSPS":"OR","NAME":"Oregon","LSAD":"00","ALAND":248606993270,"AWATER":6192386935,"full_name":"Oregon","nyt_name":"Ore.","label-text":"Ore.","class":"g-state-name","ID_BUILDER":"g-state-OR"},"id":"g-state-OR"}, 53 | {"type":"Feature","geometry":{"type":"Point","coordinates":[-338866.5963172441,1120576.1569139343]},"properties":{"STATEFP":"38","STATENS":"01779797","AFFGEOID":"0400000US38","GEOID":"38","STUSPS":"ND","NAME":"North Dakota","LSAD":"00","ALAND":178707534813,"AWATER":4403267548,"full_name":"North Dakota","nyt_name":"N.D.","label-text":"N.D.","class":"g-state-name","ID_BUILDER":"g-state-ND"},"id":"g-state-ND"}, 54 | {"type":"Feature","geometry":{"type":"Point","coordinates":[318296.94055389834,-275882.93398066825]},"properties":{"STATEFP":"05","STATENS":"00068085","AFFGEOID":"0400000US05","GEOID":"05","STUSPS":"AR","NAME":"Arkansas","LSAD":"00","ALAND":134768872727,"AWATER":2962859592,"full_name":"Arkansas","nyt_name":"Ark.","label-text":"Ark.","class":"g-state-name","ID_BUILDER":"g-state-AR"},"id":"g-state-AR"}, 55 | {"type":"Feature","geometry":{"type":"Point","coordinates":[833251.9205380392,308885.7044390527]},"properties":{"STATEFP":"18","STATENS":"00448508","AFFGEOID":"0400000US18","GEOID":"18","STUSPS":"IN","NAME":"Indiana","LSAD":"00","ALAND":92789302676,"AWATER":1538002829,"full_name":"Indiana","nyt_name":"Ind.","label-text":"Ind.","class":"g-state-name","ID_BUILDER":"g-state-IN"},"id":"g-state-IN"}, 56 | {"type":"Feature","geometry":{"type":"Point","coordinates":[111314.25519087719,1013213.7397467592]},"properties":{"STATEFP":"27","STATENS":"00662849","AFFGEOID":"0400000US27","GEOID":"27","STUSPS":"MN","NAME":"Minnesota","LSAD":"00","ALAND":206228939448,"AWATER":18945217189,"full_name":"Minnesota","nyt_name":"Minn.","label-text":"Minn.","class":"g-state-name","ID_BUILDER":"g-state-MN"},"id":"g-state-MN"}, 57 | {"type":"Feature","geometry":{"type":"Point","coordinates":[1904807.3250971045,698463.5437232149]},"properties":{"STATEFP":"09","STATENS":"01779780","AFFGEOID":"0400000US09","GEOID":"09","STUSPS":"CT","NAME":"Connecticut","LSAD":"00","ALAND":12542497068,"AWATER":1815617571,"full_name":"Connecticut","nyt_name":"Conn.","label-text":"Conn.","class":"g-state-name","ID_BUILDER":"g-state-CT"},"id":"g-state-CT"} 58 | ]} -------------------------------------------------------------------------------- /src/data/vaccinations_states_subset.topojson.json: -------------------------------------------------------------------------------- 1 | {"type":"Topology","arcs":[[[20815,10859],[9,24],[210,76],[-40,-121],[-34,-3],[-34,-60],[-26,-84],[-9,-105],[14,-27],[-26,-77],[12,-27],[-44,-132],[-6,-85],[-34,-69],[-39,-9],[-40,62],[-16,38],[-4,61],[15,57],[-11,10],[1,120],[36,147],[41,51],[20,88],[-40,10],[45,55]],[[17280,9824],[17,-21],[-27,-30],[31,-20],[29,-72],[43,-43],[54,-1],[18,-27],[39,-23],[67,15],[63,64],[36,57],[90,-67],[60,45],[74,31],[19,-1],[50,49],[-24,26],[10,36],[46,-18],[11,-16],[34,24],[79,77],[22,10],[27,-42],[91,84],[-24,41],[54,61],[-29,9],[-22,33],[54,157],[76,108],[29,97],[-13,17],[42,95],[29,32],[-17,23],[32,45],[20,66],[-10,33],[13,96],[68,-20],[46,-67],[99,-18],[17,13],[30,61],[23,134],[21,9],[0,71],[19,39],[11,49],[82,-54],[29,104],[22,38],[33,5],[13,37],[26,2],[21,48],[-14,8],[76,124],[-24,20],[3,48],[30,84],[-19,87],[335,-201],[22,136],[12,23]],[[19454,11654],[60,-2],[27,8],[19,-27],[53,-23],[-27,-69],[46,-47],[70,4],[59,-22],[6,-29],[57,-3],[19,-20],[35,-21],[27,-33],[4,-47],[9,-51],[-44,-52],[7,-29],[-37,-22],[-30,-37],[7,-14],[-19,-56],[-3,-44],[42,-75],[23,-2],[117,67],[4,-56],[46,-35],[7,-33],[77,-24],[43,12],[23,-23],[18,27],[46,0],[12,-28],[42,-20],[55,-58],[72,-16],[69,-30],[-5,-61],[-24,-1],[23,-101],[-19,-62],[-60,10],[-48,-1],[-12,36],[-34,43],[-28,18],[-45,8],[24,-49],[34,-2],[29,-57],[43,-35],[55,12],[5,-17],[57,-2],[-7,-47],[68,-34],[16,-56],[-27,-46],[-29,27],[-44,21],[-9,-37],[61,-65],[-31,-10],[-48,-31],[25,-14],[41,2],[93,-76],[-6,-71],[-23,6],[-32,-49],[-41,43],[-101,52],[1,31],[-35,43],[-25,-3],[-32,-33],[-44,32],[-69,-27],[29,-16],[48,14],[67,-31],[26,26],[12,-47],[1,-42],[17,-15],[35,1],[69,-43],[10,-32],[77,2],[19,64],[48,-13],[79,-8],[25,24],[27,-1],[52,-118],[54,-93],[26,-59],[-540,-121],[-62,-19],[-919,-193],[-578,-112],[-455,-80],[-240,-28],[-76,-16],[-491,-58],[15,21],[-160,-22],[-4,-18],[-434,-68],[-338,-49],[-9,2],[-232,-31],[77,62],[63,11],[20,18],[106,57],[33,8],[-2,32],[28,61],[59,11],[49,33],[7,51],[-10,16],[47,34],[30,44],[-7,49],[118,104],[81,44],[17,25],[174,222]],[[16829,10461],[38,-8],[67,38],[45,15],[4,104],[57,22],[6,26],[-15,64],[-29,65],[36,41],[-5,45],[22,66],[24,44],[37,-21],[25,0],[24,-36],[-11,-31],[24,-18],[19,47],[32,34],[4,41],[-31,31],[29,29],[-11,68],[30,45],[3,37],[61,5],[-1,57],[49,65],[30,-12],[9,-25],[28,-3],[39,39],[26,4],[16,39],[27,16],[49,94],[43,57],[29,10],[2,59],[14,23],[-23,23],[16,39],[-5,34],[16,20],[-12,42],[28,47],[-2,147],[15,63],[18,29],[6,45],[-21,93],[1,36],[-48,65],[16,40],[29,0],[28,25],[111,-717],[370,66],[208,39],[61,-403],[31,24],[20,39],[80,89],[59,98],[74,-11],[7,38],[28,35],[18,57],[33,5],[49,-24],[72,-7],[54,9],[24,31],[-24,15],[12,43],[36,20],[50,-7],[42,70],[56,-10],[45,-43],[43,-5],[25,28],[12,-40],[27,-46],[29,-2],[33,-46],[11,-70],[22,-6]],[[17280,9824],[-55,-10],[-59,36],[-18,24],[-56,21],[-44,57],[-8,33],[-37,22],[-21,49],[-50,30],[16,42],[-30,8],[-28,53],[-57,46],[12,28],[11,76],[-8,50],[-14,11],[-5,61]],[[9742,2526],[16,24],[97,82],[45,54],[49,15],[2,-19],[-209,-156]],[[8249,798],[11,169],[-6,30],[10,95],[14,88],[18,34],[22,81],[43,98],[29,17],[47,134],[47,-3],[-35,-48],[-61,-109],[-51,-114],[-30,-82],[-27,-100],[-14,-107],[-1,-111],[7,-74],[16,-87],[5,-83],[-39,132],[-5,40]],[[5063,8524],[253,-19],[512,-36],[383,-23],[307,-17],[307,-14],[-61,-1532],[34,13],[34,-25],[77,-105],[34,-35],[57,-5],[14,32],[48,-7],[61,-26],[12,60],[51,-34],[49,-64],[9,-97],[88,-16],[27,14],[30,-5],[17,-23],[93,-41],[46,-4],[26,24],[29,-3],[67,-80],[54,32],[22,41],[38,-19],[42,-1],[37,-17],[37,31],[11,-26],[-18,-29],[21,-35],[0,-31],[83,-12],[-15,-84],[61,-27],[83,67],[37,42],[50,-32],[-5,-25],[27,-18],[31,17],[25,-13],[-3,-49],[22,-18],[33,0],[41,52],[37,10],[40,-7],[8,-35],[-25,-35],[20,-52],[46,-8],[2,56],[28,14],[39,54],[-5,36],[44,22],[33,-85],[44,12],[20,-35],[43,20],[11,49],[53,-19],[-26,-28],[34,-27],[28,1],[16,-38],[47,3],[51,-70],[18,18],[8,43],[41,-14],[31,10],[18,61],[61,-1],[65,20],[10,18],[49,-36],[27,17],[30,0],[94,65],[25,-11],[13,-37],[57,-12],[98,10],[17,48],[22,19],[94,-47],[8,-31],[33,-7],[72,-79],[107,-37],[22,-32],[75,-3],[35,-14],[23,-3],[37,-68],[55,24],[83,12],[9,-18],[40,8],[24,-18],[9,-420],[15,-803],[16,-8],[28,-53],[49,-20],[15,-57],[33,-36],[-8,-21],[27,-36],[-19,-28],[7,-27],[-14,-26],[38,-57],[23,1],[33,-67],[18,-58],[-10,-37],[43,-67],[20,-52],[33,-5],[-9,-63],[22,-12],[-12,-43],[7,-65],[-27,-33],[14,-40],[-33,-68],[-7,-42],[-38,-43],[3,-36],[-22,-6],[-11,-44],[23,-74],[-29,-33],[-10,-41],[13,-31],[25,-10],[-7,-64],[15,-45],[-11,-65],[-14,-36],[-30,-27],[-18,-55],[-23,-45],[-43,-36],[57,-99],[0,-9],[-105,-1],[-60,-18],[-251,-121],[-90,-48],[2,19],[42,43],[10,32],[-139,-39],[38,91],[7,42],[-9,48],[-34,20],[-38,-18],[-23,-29],[-13,-40],[-32,-11],[-13,31],[-25,-16],[-21,-35],[21,-24],[-20,-49],[41,-56],[39,-26],[-3,-101],[-15,-18],[-33,-2],[-38,-53],[-44,-31],[-32,4],[-10,-46],[28,-39],[-82,-72],[-85,-86],[-53,-19],[-198,-126],[-76,-43],[-126,-60],[-121,-72],[-79,-62],[-34,-50],[-77,-42],[-125,-95],[-66,-61],[-73,-82],[-3,48],[28,55],[34,35],[20,-20],[22,14],[-7,31],[22,18],[58,10],[76,77],[93,31],[-8,60],[-86,-53],[-27,-27],[-38,-1],[-14,27],[0,44],[-52,-2],[-34,24],[-13,-18],[38,-35],[6,-33],[-13,-25],[16,-37],[-40,-49],[-57,-43],[-33,1],[-27,19],[-4,31],[-75,-36],[-51,-49],[54,-40],[26,39],[41,-2],[-5,-37],[-97,-158],[-21,0],[-18,41],[-134,-1],[-27,8],[-13,-24],[34,-22],[51,12],[-6,-44],[32,-47],[57,-26],[-44,-95],[-31,-97],[-2,-26],[-31,-69],[-45,-17],[-9,58],[-73,-65],[-55,37],[39,-72],[66,-11],[61,26],[11,-5],[-14,-73],[4,-15],[-8,-122],[-12,-109],[-13,-31],[8,-88],[28,-124],[26,-43],[54,-144],[10,-12],[-24,-44],[30,-107],[41,-6],[8,-26],[28,-6],[3,-66],[-52,5],[-95,-43],[-5,-48],[-47,7],[-9,28],[-42,2],[-6,24],[-35,17],[-41,54],[-38,20],[-51,0],[-14,23],[-58,7],[-54,-10],[-23,10],[-25,-17],[-44,21],[-27,-13],[-20,20],[-49,-1],[-14,33],[-33,4],[-11,26],[-31,5],[-51,55],[-25,-12],[-58,39],[-55,-15],[-56,75],[-33,31],[-23,-7],[-112,29],[-17,18],[-30,-13],[-19,24],[14,39],[-22,38],[-26,10],[-6,65],[-14,29],[-3,53],[-21,17],[0,33],[-16,44],[-39,29],[-5,34],[-33,18],[8,23],[-24,34],[-20,6],[17,118],[-8,58],[-36,19],[-3,53],[20,107],[-31,17],[13,51],[-19,33],[-40,30],[-23,-11],[-19,26],[-34,7],[-31,52],[-41,26],[-27,31],[-8,72],[-27,49],[5,21],[-37,11],[-17,57],[-22,16],[-18,47],[-82,45],[-51,71],[5,26],[-37,68],[10,21],[-45,98],[9,27],[-30,19],[2,24],[-33,17],[-4,63],[-22,68],[-63,94],[5,35],[-15,89],[-39,33],[-35,87],[-50,29],[-5,21],[-38,33],[-35,16],[-32,75],[-58,18],[-13,30],[-55,21],[14,22],[-44,18],[9,43],[-45,33],[-19,73],[-27,-12],[-33,11],[-40,29],[-52,-32],[-42,10],[-57,35],[-51,-4],[-62,21],[-60,-18],[-53,25],[-88,56],[-26,-5],[-49,-79],[-48,21],[-41,-30],[-15,11],[-78,-22],[-10,-39],[-27,-28],[0,-26],[-48,-57],[-19,-60],[-9,-66],[-25,-2],[-24,-70],[23,-33],[-86,-30],[-29,-58],[-29,-7],[-14,-46],[-40,-40],[-71,24],[-93,41],[-80,100],[-107,29],[-37,69],[-85,23],[-63,26],[-54,54],[-36,21],[-21,68],[-32,29],[-48,10],[-36,44],[-70,60],[-12,32],[-3,49],[-34,86],[-34,54],[-11,111],[15,24],[6,75],[-39,100],[-27,52],[-29,24],[0,95],[-13,48],[-43,36],[-17,62],[-26,-2],[-40,59],[-26,5],[-32,45],[-26,-6],[-19,27],[-63,24],[-8,41],[-83,80],[-24,78],[-25,27],[-74,49],[-51,101],[-37,24],[-10,42],[-29,25],[-44,9],[-83,76],[-12,47],[-20,21],[-12,54],[-37,86],[-41,30],[-25,-10],[-21,30],[-28,25],[-32,48],[22,104],[709,-80],[388,-40],[321,-32],[377,-34],[409,-33],[54,785],[68,789],[17,243],[97,1374],[24,351],[23,-2]],[[15396,7527],[131,14],[265,37],[368,47],[417,55],[0,5],[303,50],[-13,-63],[-94,-121],[-12,-50],[13,-32],[71,-50],[32,2],[71,-68],[48,-23],[59,20],[32,-29],[20,-59],[27,-17],[36,-53],[30,-88],[26,-11],[29,-47],[30,-25],[33,-63],[89,-51],[49,-16],[63,-50],[49,-95],[42,-26],[56,-12],[45,-55],[38,-13],[7,-65],[21,-41],[34,-6],[7,-45],[42,-28],[22,-36],[40,-27],[55,-8],[39,-33],[47,-24],[1,-54],[39,-65],[22,-7],[11,-44],[1,-61],[26,-37],[-7,-26],[40,-31],[37,-7],[70,-58],[1,-35],[36,-52],[21,-8],[11,-37],[-17,-36],[25,-32],[10,-52],[38,-28],[35,15],[62,-40],[21,1],[30,-13],[-19,-48],[-32,-1],[-28,-29],[36,-12],[-33,-46],[-32,9],[-16,-40],[27,-10],[-48,-78],[11,-71],[-18,-61],[-51,-11],[1,-21],[52,-2],[-56,-127],[26,-77],[-7,-39],[-23,-21],[-16,-41],[-24,-26],[11,-36],[-6,-46],[-40,-32],[57,-12],[6,-42],[-16,-77],[0,-54],[13,-24],[-30,8],[-43,-18],[-61,14],[-42,-5],[-31,20],[-49,1],[-73,21],[-13,-43],[-35,-28],[4,-73],[30,-44],[9,-93],[-7,-90],[-76,-15],[-32,47],[-1,48],[-45,62],[-553,-42],[-234,-16],[-863,-63],[-35,28],[-19,51],[-6,50],[-34,37],[-17,48],[-30,82],[-45,40],[-3,47],[-14,29],[12,25],[-7,55],[4,82],[13,59],[-17,60],[-49,54],[1,30],[-24,97],[40,125],[0,61],[-14,34],[29,43],[45,35],[14,32],[-23,30],[-44,13],[8,97],[-14,4],[-11,50],[-46,46],[-28,48],[-33,88],[-34,75],[-179,684],[-116,446],[-89,325],[-45,181]],[[2868,704],[10,41],[46,47],[30,5],[32,62],[40,36],[6,42],[-42,61],[-15,71],[11,43],[35,13],[56,-23],[22,-29],[51,-28],[44,-36],[22,8],[83,-28],[96,-53],[66,-42],[42,-38],[43,-66],[-4,-79],[60,2],[18,-37],[-1,-40],[54,-54],[64,-32],[-6,-37],[-105,-102],[-68,-31],[-41,-30],[-43,-14],[-49,11],[-22,-6],[-36,-38],[-48,-24],[-24,-28],[-36,-12],[-37,-44],[2,-21],[-32,-65],[-39,-36],[-102,68],[-55,18],[-27,63],[21,181],[-13,50],[-30,67],[-21,88],[-38,37],[-20,59]],[[2427,1631],[24,69],[15,15],[56,-7],[55,-91],[66,14],[43,24],[56,-8],[51,-55],[25,-5],[15,-27],[69,-22],[16,-18],[1,-40],[-43,-55],[-44,-10],[-20,-17],[-36,8],[-74,-36],[-52,-6],[-46,23],[-5,92],[-9,44],[-31,13],[-22,-16],[-55,26],[-38,42],[-17,43]],[[2425,1327],[16,21],[75,38],[20,-21],[-19,-47],[-78,-10],[-14,19]],[[2178,1621],[50,21],[72,-20],[53,-65],[-17,-42],[-42,-25],[-50,-3],[-20,44],[-9,49],[-30,16],[-7,25]],[[2009,1783],[38,54],[9,32],[35,-12],[221,-34],[42,11],[45,-1],[18,-23],[-62,-60],[-49,-17],[-152,46],[-37,-10],[-71,-2],[-37,16]],[[1345,2156],[106,4],[79,91],[29,7],[34,-50],[-2,-16],[30,-52],[25,-81],[51,-16],[39,-45],[8,-37],[29,-27],[-100,-32],[-62,39],[-63,8],[-49,-11],[-43,1],[-19,59],[-61,84],[0,42],[-31,32]],[[317,2529],[4,27],[27,25],[10,33],[50,25],[53,38],[43,-11],[21,14],[55,-4],[46,-14],[31,-51],[-3,-31],[-25,-42],[0,-71],[-12,-18],[-68,-52],[-111,27],[-40,43],[-62,22],[-19,40]],[[0,2380],[16,46],[27,27],[43,21],[10,31],[40,-2],[-22,-50],[5,-26],[-58,-21],[-32,-67],[-29,41]]],"transform":{"scale":[150.9924335466285,141.53190491502676],"translate":[-1385423.586559189,-1295597.92957183]},"objects":{"states_subset":{"type":"GeometryCollection","geometries":[{"arcs":[[[0]],[[1,2]]],"type":"MultiPolygon","properties":{"STATEFP":"51","STATENS":"01779803","AFFGEOID":"0400000US51","GEOID":"51","STUSPS":"VA","NAME":"Virginia","LSAD":"00","ALAND":102257717110,"AWATER":8528531774,"Series_Complete_Pop_Pct":72.3,"fill":"rgb(6, 124, 128)"}},{"arcs":[[3,-2,4]],"type":"Polygon","properties":{"STATEFP":"54","STATENS":"01779805","AFFGEOID":"0400000US54","GEOID":"54","STUSPS":"WV","NAME":"West Virginia","LSAD":"00","ALAND":62266474513,"AWATER":489028543,"Series_Complete_Pop_Pct":57,"fill":"rgb(82, 158, 200)"}},{"arcs":[[[5]],[[6]],[[7]]],"type":"MultiPolygon","properties":{"STATEFP":"48","STATENS":"01779801","AFFGEOID":"0400000US48","GEOID":"48","STUSPS":"TX","NAME":"Texas","LSAD":"00","ALAND":676653171537,"AWATER":19006305260,"Series_Complete_Pop_Pct":60.4,"fill":"rgb(37, 139, 172)"}},{"arcs":[[8]],"type":"Polygon","properties":{"STATEFP":"13","STATENS":"01705317","AFFGEOID":"0400000US13","GEOID":"13","STUSPS":"GA","NAME":"Georgia","LSAD":"00","ALAND":149482048342,"AWATER":4422936154,"Series_Complete_Pop_Pct":53.9,"fill":"rgb(82, 158, 200)"}},{"arcs":[[[9]],[[10]],[[11]],[[12]],[[13]],[[14]],[[15]],[[16]]],"type":"MultiPolygon","properties":{"STATEFP":"15","STATENS":"01779782","AFFGEOID":"0400000US15","GEOID":"15","STUSPS":"HI","NAME":"Hawaii","LSAD":"00","ALAND":16633990195,"AWATER":11777809026,"Series_Complete_Pop_Pct":77.6,"fill":"rgb(6, 124, 128)"}}]}}} -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import App from './App.svelte'; 2 | import config from '../config.json'; 3 | 4 | const app = new App({ 5 | target: document.body, 6 | hydrate: config.hydrate 7 | }); 8 | 9 | export default app; 10 | -------------------------------------------------------------------------------- /src/template.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | Data News Studio 16 | 17 | 18 | 19 | 20 | 21 | {#if includeJS === true} 22 | 23 | {/if} 24 | {@html head} 25 | 26 | 27 | 28 | {@html html} 29 | 30 | 31 | --------------------------------------------------------------------------------