├── .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 |
64 |
67 |
70 |
73 |
76 |
79 |
82 |
85 |
88 |
91 |
94 |
97 |
100 |
103 |
106 |
109 |
112 |
115 |
118 |
121 |
124 |
127 |
130 |
133 |
136 |
139 |
142 |
145 |
148 |
151 |
154 |
157 |
160 |
163 |
166 |
169 |
172 |
175 |
178 |
181 |
184 |
187 |
190 |
193 |
196 |
199 |
202 |
205 |
208 |
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 |
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 |
95 | {/if}
96 |
97 |
98 |
--------------------------------------------------------------------------------
/src/components/layercake/SharedTooltip.svelte:
--------------------------------------------------------------------------------
1 |
37 |
38 |
69 |
70 |
79 | {#if visible === true}
80 |
83 |
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 |
28 | {:else}
29 |
32 | {/if}
33 |
34 |
35 | {/each}
36 |
37 | {#if has_missing_data}
38 |
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 |
--------------------------------------------------------------------------------