├── site ├── service-worker.js ├── server │ ├── news_content │ │ ├── .placeholder_file │ │ ├── ae.json │ │ ├── bg.json │ │ ├── br.json │ │ ├── cn.json │ │ ├── cz.json │ │ ├── de.json │ │ ├── eg.json │ │ ├── gr.json │ │ ├── hk.json │ │ ├── hu.json │ │ ├── id.json │ │ ├── il.json │ │ ├── jp.json │ │ ├── kr.json │ │ ├── lt.json │ │ ├── lv.json │ │ ├── no.json │ │ ├── pl.json │ │ ├── pt.json │ │ ├── ro.json │ │ ├── rs.json │ │ ├── ru.json │ │ ├── si.json │ │ ├── sk.json │ │ ├── th.json │ │ ├── tr.json │ │ ├── tw.json │ │ ├── ua.json │ │ ├── cu.json │ │ ├── at.json │ │ ├── mx.json │ │ ├── ch.json │ │ ├── se.json │ │ ├── ve.json │ │ ├── gb.json │ │ ├── ng.json │ │ ├── co.json │ │ ├── ca.json │ │ ├── nl.json │ │ ├── za.json │ │ ├── ie.json │ │ ├── it.json │ │ ├── nz.json │ │ ├── my.json │ │ ├── sa.json │ │ ├── sg.json │ │ ├── us.json │ │ ├── ma.json │ │ ├── in.json │ │ ├── ph.json │ │ ├── ar.json │ │ ├── be.json │ │ ├── fr.json │ │ └── au.json │ ├── live_updates_data.js │ ├── current_cases_data.js │ ├── get_total_cases.php │ ├── news.php │ └── get_live_updates.php ├── favicon.ico ├── full_logo.png ├── assets │ ├── img │ │ ├── creator.png │ │ └── icon_sourcefile.pxd │ │ │ ├── metadata.info │ │ │ ├── QuickLook │ │ │ ├── Icon.tiff │ │ │ └── Thumbnail.tiff │ │ │ └── data │ │ │ └── F8BE6F09-16C0-4AC1-8331-A280B9FC876A │ ├── css │ │ ├── components │ │ │ ├── row.css │ │ │ ├── container.css │ │ │ ├── panel.css │ │ │ ├── reload-btn.css │ │ │ ├── col.css │ │ │ ├── loader.css │ │ │ └── masthead.css │ │ ├── parts │ │ │ ├── about.css │ │ │ ├── current-cases.css │ │ │ ├── links.css │ │ │ ├── latest-news.css │ │ │ └── main-app.css │ │ ├── main.css │ │ └── abstracts │ │ │ ├── variables.css │ │ │ └── global.css │ ├── favicon │ │ ├── apple-icon.png │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── favicon-96x96.png │ │ ├── ms-icon-70x70.png │ │ ├── apple-icon-57x57.png │ │ ├── apple-icon-60x60.png │ │ ├── apple-icon-72x72.png │ │ ├── apple-icon-76x76.png │ │ ├── ms-icon-144x144.png │ │ ├── ms-icon-150x150.png │ │ ├── ms-icon-310x310.png │ │ ├── android-icon-36x36.png │ │ ├── android-icon-48x48.png │ │ ├── android-icon-72x72.png │ │ ├── android-icon-96x96.png │ │ ├── apple-icon-114x114.png │ │ ├── apple-icon-120x120.png │ │ ├── apple-icon-144x144.png │ │ ├── apple-icon-152x152.png │ │ ├── apple-icon-180x180.png │ │ ├── android-icon-144x144.png │ │ ├── android-icon-192x192.png │ │ └── apple-icon-precomposed.png │ └── js │ │ ├── masthead.js │ │ ├── app.js │ │ ├── current_cases.js │ │ ├── main.js │ │ ├── news.js │ │ └── fitty.js ├── browserconfig.xml ├── manifest.json └── index.php ├── site_demo.png ├── .gitignore ├── cronjobs ├── current_cases.py ├── live_updates.py └── news.py ├── LICENSE.txt └── README.md /site/service-worker.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /site/server/news_content/.placeholder_file: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /site/server/news_content/ae.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/bg.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/br.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/cn.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/cz.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/de.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/eg.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/gr.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/hk.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/hu.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/id.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/il.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/jp.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/kr.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/lt.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/lv.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/no.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/pl.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/pt.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/ro.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/rs.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/ru.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/si.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/sk.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/th.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/tr.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/tw.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site/server/news_content/ua.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":0,"articles":[]} -------------------------------------------------------------------------------- /site_demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site_demo.png -------------------------------------------------------------------------------- /site/server/live_updates_data.js: -------------------------------------------------------------------------------- 1 | const liveVideoURL = 'https://www.youtube.com/embed/8qW4j_zy1D8'; -------------------------------------------------------------------------------- /site/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/favicon.ico -------------------------------------------------------------------------------- /site/full_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/full_logo.png -------------------------------------------------------------------------------- /site/assets/img/creator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/img/creator.png -------------------------------------------------------------------------------- /site/assets/css/components/row.css: -------------------------------------------------------------------------------- 1 | .container > .row { 2 | display: block; 3 | width: 100%; 4 | height: auto; 5 | } 6 | -------------------------------------------------------------------------------- /site/assets/favicon/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/favicon/apple-icon.png -------------------------------------------------------------------------------- /site/assets/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /site/assets/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /site/assets/favicon/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/favicon/favicon-96x96.png -------------------------------------------------------------------------------- /site/assets/favicon/ms-icon-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/favicon/ms-icon-70x70.png -------------------------------------------------------------------------------- /site/assets/favicon/apple-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/favicon/apple-icon-57x57.png -------------------------------------------------------------------------------- /site/assets/favicon/apple-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/favicon/apple-icon-60x60.png -------------------------------------------------------------------------------- /site/assets/favicon/apple-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/favicon/apple-icon-72x72.png -------------------------------------------------------------------------------- /site/assets/favicon/apple-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/favicon/apple-icon-76x76.png -------------------------------------------------------------------------------- /site/assets/favicon/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/favicon/ms-icon-144x144.png -------------------------------------------------------------------------------- /site/assets/favicon/ms-icon-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/favicon/ms-icon-150x150.png -------------------------------------------------------------------------------- /site/assets/favicon/ms-icon-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/favicon/ms-icon-310x310.png -------------------------------------------------------------------------------- /site/assets/favicon/android-icon-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/favicon/android-icon-36x36.png -------------------------------------------------------------------------------- /site/assets/favicon/android-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/favicon/android-icon-48x48.png -------------------------------------------------------------------------------- /site/assets/favicon/android-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/favicon/android-icon-72x72.png -------------------------------------------------------------------------------- /site/assets/favicon/android-icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/favicon/android-icon-96x96.png -------------------------------------------------------------------------------- /site/assets/favicon/apple-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/favicon/apple-icon-114x114.png -------------------------------------------------------------------------------- /site/assets/favicon/apple-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/favicon/apple-icon-120x120.png -------------------------------------------------------------------------------- /site/assets/favicon/apple-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/favicon/apple-icon-144x144.png -------------------------------------------------------------------------------- /site/assets/favicon/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/favicon/apple-icon-152x152.png -------------------------------------------------------------------------------- /site/assets/favicon/apple-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/favicon/apple-icon-180x180.png -------------------------------------------------------------------------------- /site/assets/favicon/android-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/favicon/android-icon-144x144.png -------------------------------------------------------------------------------- /site/assets/favicon/android-icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/favicon/android-icon-192x192.png -------------------------------------------------------------------------------- /site/assets/favicon/apple-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/favicon/apple-icon-precomposed.png -------------------------------------------------------------------------------- /site/assets/img/icon_sourcefile.pxd/metadata.info: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/img/icon_sourcefile.pxd/metadata.info -------------------------------------------------------------------------------- /site/assets/img/icon_sourcefile.pxd/QuickLook/Icon.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/img/icon_sourcefile.pxd/QuickLook/Icon.tiff -------------------------------------------------------------------------------- /site/assets/img/icon_sourcefile.pxd/QuickLook/Thumbnail.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/img/icon_sourcefile.pxd/QuickLook/Thumbnail.tiff -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | scrapers/who_live/node_modules 3 | .DS_Store 4 | */.DS_Store 5 | */*/.DS_Store 6 | */*/*/.DS_Store 7 | */*/*/*/.DS_Store 8 | */*/*/*/*/.DS_Store 9 | site/server/api_keys.php -------------------------------------------------------------------------------- /site/server/current_cases_data.js: -------------------------------------------------------------------------------- 1 | const totalCurrentCases = '218175'; 2 | const totalDeaths = '8937'; 3 | const totalRecoveries = '84383'; 4 | const totalCurrentCasesLastUpdated = '2020-03-18T22:22:25+00:00'; 5 | -------------------------------------------------------------------------------- /site/assets/img/icon_sourcefile.pxd/data/F8BE6F09-16C0-4AC1-8331-A280B9FC876A: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaberomualdo/covid-live-monitor/HEAD/site/assets/img/icon_sourcefile.pxd/data/F8BE6F09-16C0-4AC1-8331-A280B9FC876A -------------------------------------------------------------------------------- /site/assets/js/masthead.js: -------------------------------------------------------------------------------- 1 | const mastheadMobileTitleTextElm = document.querySelector('.masthead .mobile-title .text'); 2 | 3 | window.addEventListener('load', () => { 4 | fitty(mastheadMobileTitleTextElm); 5 | }); 6 | -------------------------------------------------------------------------------- /site/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | #ffffff -------------------------------------------------------------------------------- /site/assets/css/components/container.css: -------------------------------------------------------------------------------- 1 | body > .container { 2 | width: 100%; 3 | min-height: 100vh; 4 | background-color: var(--darker-color); 5 | box-sizing: border-box; 6 | padding: 1.25rem; 7 | display: block; 8 | } 9 | 10 | @media only screen and (max-width: 600px) { 11 | body > .container { 12 | padding: 0.5rem; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /site/assets/css/parts/about.css: -------------------------------------------------------------------------------- 1 | .panel.about .panel-title { 2 | margin-bottom: 0.75rem; 3 | } 4 | 5 | .panel.about p { 6 | font-size: 0.8rem; 7 | line-height: 1.75; 8 | opacity: 0.95; 9 | } 10 | .panel.about p:not(:last-child) { 11 | margin-bottom: 1rem; 12 | } 13 | 14 | .panel.about a { 15 | font-weight: 600; 16 | text-decoration: none; 17 | display: inline; 18 | transition: transform 0.2s; 19 | } 20 | .panel.about a:hover { 21 | text-decoration: underline; 22 | } 23 | -------------------------------------------------------------------------------- /site/assets/css/components/panel.css: -------------------------------------------------------------------------------- 1 | .panel { 2 | display: block; 3 | overflow: hidden; 4 | width: 100%; 5 | height: auto; 6 | background-color: var(--dark-color); 7 | border-radius: 4px; 8 | box-shadow: 0 0.15rem 1rem var(--shadow-color); 9 | box-sizing: border-box; 10 | padding: 1rem; 11 | } 12 | 13 | .panel:not(:last-child) { 14 | margin-bottom: 1.25rem; 15 | } 16 | 17 | .panel .panel-title { 18 | text-transform: uppercase; 19 | font-weight: 600; 20 | line-height: 1.15; 21 | font-size: 1.3rem; 22 | } 23 | -------------------------------------------------------------------------------- /site/assets/css/components/reload-btn.css: -------------------------------------------------------------------------------- 1 | .container > .reload-btn { 2 | border: none; 3 | position: fixed; 4 | z-index: 99999; 5 | bottom: 1rem; 6 | right: 1rem; 7 | height: 3.5rem; 8 | width: 3.5rem; 9 | border-radius: 50%; 10 | background-color: var(--dark-color); 11 | box-shadow: 0 0.15rem 1rem var(--shadow-color); 12 | box-sizing: border-box; 13 | padding: calc(0.75rem - 1px); 14 | border: 1px solid var(--white-color); 15 | display: none; 16 | } 17 | .container > .reload-btn svg { 18 | fill: var(--white-color); 19 | width: 2rem; 20 | height: 2rem; 21 | } 22 | 23 | @media only screen and (max-width: 600px) { 24 | .container.cases-about-active > .reload-btn { 25 | display: block; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /site/assets/css/main.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600;700&display=swap'); 2 | @import url('https://fonts.googleapis.com/css2?family=Inconsolata:wght@700&display=swap'); 3 | 4 | @import 'abstracts/variables.css?v=2'; 5 | @import 'abstracts/global.css?v=2'; 6 | 7 | @import 'components/loader.css?v=2'; 8 | @import 'components/container.css?v=2'; 9 | 10 | @import 'components/row.css?v=2'; 11 | @import 'components/col.css?v=2'; 12 | @import 'components/panel.css?v=2'; 13 | 14 | @import 'components/masthead.css?v=2'; 15 | 16 | @import 'components/reload-btn.css?v=2'; 17 | 18 | @import 'parts/latest-news.css?v=2'; 19 | @import 'parts/current-cases.css?v=2'; 20 | @import 'parts/links.css?v=2'; 21 | @import 'parts/about.css?v=2'; 22 | @import 'parts/main-app.css?v=2'; 23 | -------------------------------------------------------------------------------- /site/assets/css/components/col.css: -------------------------------------------------------------------------------- 1 | .col { 2 | width: var(--col-width); 3 | display: block; 4 | float: left; 5 | } 6 | .col:not(:last-child) { 7 | margin-right: 1rem; 8 | } 9 | 10 | /* width of each column */ 11 | .col.left { 12 | width: var(--col-left-width); 13 | } 14 | .col.right { 15 | width: var(--col-right-width); 16 | } 17 | .col.center { 18 | width: calc(100% - (var(--col-left-width) + var(--col-right-width)) - (1rem * 2)); 19 | } 20 | 21 | /* mobile */ 22 | @media only screen and (max-width: 1050px) { 23 | .col { 24 | width: 100% !important; 25 | margin-right: 0 !important; 26 | display: none; 27 | } 28 | 29 | /* nav functionality */ 30 | .container.calculator-active .col.center, 31 | .container.news-active .col.right, 32 | .container.cases-about-active .col.left { 33 | display: block; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /cronjobs/current_cases.py: -------------------------------------------------------------------------------- 1 | """ 2 | This file runs a basic cronjob every minute to send a request to a PHP server 3 | that gets and updates the current total case count. 4 | """ 5 | 6 | import schedule 7 | import requests 8 | from datetime import date, datetime 9 | from time import gmtime, strftime, sleep 10 | 11 | # function to be run every minute 12 | def update_current_cases(): 13 | try: 14 | request = requests.get("https://covid19.xtrp.io/server/get_total_cases.php") 15 | if(request.status_code == 200): 16 | print(request.text) 17 | else: 18 | print("ERROR: " + str(request.status_code)) 19 | except: 20 | print("ERROR") 21 | 22 | # run function initially 23 | update_current_cases() 24 | 25 | # start and run cronjob 26 | schedule.every(5).minutes.do(update_current_cases) 27 | 28 | while True: 29 | schedule.run_pending() 30 | sleep(20) 31 | -------------------------------------------------------------------------------- /site/assets/css/abstracts/variables.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --theme-color: #da1333; 3 | 4 | --regular-color: #78909c; 5 | --white-color: #ffffff; 6 | 7 | --dark-color: #37474f; 8 | --darker-color: #263238; 9 | --subdark-color: #546e7a; 10 | --somewhat-subdark-color: #455a64; 11 | 12 | --light-color: #eceff1; 13 | 14 | --medium-color: #b0bec5; 15 | --somewhat-submedium-color: #d5dbde; 16 | --submedium-color: #dde3e6; 17 | --supermedium-color: #90a4ae; 18 | 19 | --green-color: #27ae60; 20 | --dark-green-color: #1e8449; 21 | 22 | --shadow-color: rgba(38, 50, 56, 0.625); 23 | --light-shadow-color: rgba(55, 71, 79, 0.2); 24 | 25 | /* NOTE: when replacing container width, replace media queries in components/container.css to match */ 26 | --container-width: 1200px; 27 | 28 | --col-left-width: 16rem; 29 | --col-right-width: 20rem; 30 | } 31 | -------------------------------------------------------------------------------- /site/server/news_content/cu.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":1,"articles":[{"source":{"id":"cnn","name":"CNN"},"author":null,"title":"La importancia del triunfo de Egan Bernal en la Ruta de Occitania - CNN","description":"Egan Bernal regresó con una victoria después del parón causado por el coronavirus. Fue en la Ruta de Occitania, donde el colombiano campeón del Tour de Francia 2019 se quedó con el título por encim…","url":"https://cnnespanol.cnn.com/video/egan-bernal-colombia-gana-ruta-de-occitania-tour-de-francia-deportes-cnne-pkg/","urlToImage":"https://cnnespanol.cnn.com/wp-content/uploads/2020/08/200804165346-egan-bernal-pic-depo-full-169.jpg?quality=100&strip=info","publishedAt":"2020-08-04T20:57:00Z","content":"Egan Bernal regresó con una victoria después del parón causado por el coronavirus. Fue en la Ruta de Occitania, donde el colombiano campeón del Tour de Francia 2019 se quedó con el título por encima … [+108 chars]"}]} -------------------------------------------------------------------------------- /site/assets/css/abstracts/global.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0; 3 | padding: 0; 4 | font-family: inherit; 5 | outline: none; 6 | color: inherit; 7 | fill: inherit; 8 | -webkit-font-smoothing: antialiased; 9 | -moz-osx-font-smoothing: grayscale; 10 | } 11 | 12 | body { 13 | color: var(--white-color); 14 | fill: var(--white-color); 15 | font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; 16 | } 17 | 18 | ::selection { 19 | background-color: var(--medium-color); 20 | } 21 | 22 | .built-by { 23 | font-size: 0.9rem; 24 | text-align: right; 25 | margin-bottom: 0.75rem; 26 | display: none; 27 | } 28 | .built-by a { 29 | font-weight: 600; 30 | text-decoration: none; 31 | } 32 | .built-by a:hover { 33 | text-decoration: underline; 34 | } 35 | @media only screen and (max-width: 1050px) { 36 | .built-by { 37 | display: block; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /site/assets/css/parts/current-cases.css: -------------------------------------------------------------------------------- 1 | .panel.current-cases .case-count-container { 2 | width: 100%; 3 | } 4 | 5 | .panel.current-cases .case-count-container .case-count { 6 | text-align: center; 7 | line-height: 1.15; 8 | color: var(--theme-color); 9 | text-shadow: 0 0 3px var(--theme-color); 10 | } 11 | .panel.current-cases .case-count-container .case-count span { 12 | font-family: 'Inconsolata', 'Andale Mono', 'Courier New', Courier, monospace; 13 | } 14 | 15 | .panel.current-cases .last-updated { 16 | float: right; 17 | font-size: 0.85rem; 18 | line-height: 1.35; 19 | opacity: 0.6; 20 | margin-top: 0.5rem; 21 | } 22 | 23 | .panel.stats p { 24 | line-height: 1.25; 25 | font-size: 0.9rem; 26 | } 27 | .panel.stats p:not(:last-child) { 28 | margin-bottom: 0.625rem; 29 | } 30 | .panel.stats p > * { 31 | display: inline-block; 32 | } 33 | .panel.stats p > strong { 34 | opacity: 0.7; 35 | font-weight: 500; 36 | } 37 | .panel.stats p > span { 38 | margin-left: 0.5rem; 39 | } 40 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright 2020 xtrp.io 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /cronjobs/live_updates.py: -------------------------------------------------------------------------------- 1 | """ 2 | This file runs a basic cronjob every day to send a request to a PHP server 3 | that gets and updates the current live WHO video. 4 | """ 5 | 6 | import schedule 7 | import requests 8 | from datetime import date, datetime 9 | from time import gmtime, strftime, sleep 10 | 11 | countries = ["ae","ar","at","au","be","bg","br","ca","ch","cn","co","cu","cz","de","eg","fr","gb","gr","hk","hu","id","ie","il","in","it","jp","kr","lt","lv","ma","mx","my","ng","nl","no","nz","ph","pl","pt","ro","rs","ru","sa","se","sg","si","sk","th","tr","tw","ua","us","ve","za"]; 12 | 13 | # function to be run every minute 14 | def live_updates(): 15 | request = requests.get("https://covid19.xtrp.io/server/get_live_updates.php") 16 | if(request.status_code == 200): 17 | print('Successful request with message: ' + request.text) 18 | else: 19 | print("ERROR: " + str(request.status_code)) 20 | 21 | # run function initially 22 | live_updates() 23 | 24 | # start and run cronjob 25 | schedule.every().day.at("12:00").do(live_updates) 26 | 27 | while True: 28 | schedule.run_pending() 29 | sleep(20) -------------------------------------------------------------------------------- /cronjobs/news.py: -------------------------------------------------------------------------------- 1 | """ 2 | This file runs a basic cronjob every day to send a request to a PHP server 3 | that gets and updates the current total case count. 4 | """ 5 | 6 | import schedule 7 | import requests 8 | from datetime import date, datetime 9 | from time import gmtime, strftime, sleep 10 | 11 | countries = ["ae","ar","at","au","be","bg","br","ca","ch","cn","co","cu","cz","de","eg","fr","gb","gr","hk","hu","id","ie","il","in","it","jp","kr","lt","lv","ma","mx","my","ng","nl","no","nz","ph","pl","pt","ro","rs","ru","sa","se","sg","si","sk","th","tr","tw","ua","us","ve","za"]; 12 | 13 | # function to be run every minute 14 | def update_news(): 15 | for country in countries: 16 | try: 17 | request = requests.get("https://covid19.xtrp.io/server/news.php?country=" + country + "&fromcache=false") 18 | if(request.status_code == 200): 19 | print('Finished country code ' + country) 20 | else: 21 | print("ERROR: " + str(request.status_code)) 22 | except: 23 | print("ERROR") 24 | 25 | # run function initially 26 | update_news() 27 | 28 | # start and run cronjob 29 | schedule.every().day.at("12:00").do(update_news) 30 | 31 | while True: 32 | schedule.run_pending() 33 | sleep(20) -------------------------------------------------------------------------------- /site/assets/css/parts/links.css: -------------------------------------------------------------------------------- 1 | .panel.links { 2 | padding: 0.2rem 0; 3 | text-align: center; 4 | font-size: 0; 5 | } 6 | .panel.links a { 7 | text-align: left; 8 | display: block; 9 | float: left; 10 | width: 100%; 11 | min-height: 2.5rem; 12 | box-sizing: border-box; 13 | padding: 0.8rem 1rem; 14 | font-size: 0.95rem; 15 | line-height: 1.5rem; 16 | text-decoration: none; 17 | opacity: 0.6; 18 | transition: opacity 0.2s; 19 | cursor: pointer; 20 | } 21 | .panel.links a:hover { 22 | opacity: 1; 23 | } 24 | 25 | .panel.links a > * { 26 | display: inline-block; 27 | vertical-align: top; 28 | } 29 | 30 | .panel.links a svg, 31 | .panel.links a img { 32 | height: 1.5rem; 33 | width: auto; 34 | margin-left: 0.5rem; 35 | } 36 | 37 | .panel.links a.creator img { 38 | width: 1.5rem; 39 | height: 1.5rem; 40 | border-radius: 50%; 41 | background-color: var(--subdark-color); 42 | transform: scale(1.1); 43 | } 44 | 45 | .panel.links hr { 46 | border: none; 47 | width: calc(100% - 2rem); 48 | display: inline-block; 49 | border-bottom: 1px solid var(--supermedium-color); 50 | } 51 | 52 | @media only screen and (max-width: 1050px) { 53 | .panel.links { 54 | display: none; 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /site/assets/css/components/loader.css: -------------------------------------------------------------------------------- 1 | body > .loader { 2 | background-color: var(--darker-color); 3 | width: 100%; 4 | height: 100vh; 5 | position: fixed; 6 | z-index: 9999; 7 | box-sizing: border-box; 8 | overflow: hidden; 9 | } 10 | body > .loader .loader-inner { 11 | width: 5rem; 12 | height: 5rem; 13 | border-radius: 50%; 14 | border: 0.5rem solid var(--dark-color); 15 | border-left-color: var(--theme-color); 16 | position: absolute; 17 | top: 50%; 18 | left: 50%; 19 | transform: translate(-50%, -50%); 20 | animation: spin 1s linear 0s infinite; 21 | } 22 | 23 | @-moz-keyframes spin { 24 | from { 25 | -moz-transform: translate(-50%, -50%) rotate(0deg); 26 | } 27 | to { 28 | -moz-transform: translate(-50%, -50%) rotate(360deg); 29 | } 30 | } 31 | @-webkit-keyframes spin { 32 | from { 33 | -webkit-transform: translate(-50%, -50%) rotate(0deg); 34 | } 35 | to { 36 | -webkit-transform: translate(-50%, -50%) rotate(360deg); 37 | } 38 | } 39 | @keyframes spin { 40 | from { 41 | transform: translate(-50%, -50%) rotate(0deg); 42 | } 43 | to { 44 | transform: translate(-50%, -50%) rotate(360deg); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /site/assets/js/app.js: -------------------------------------------------------------------------------- 1 | // app nav functionality 2 | (() => { 3 | const overviewBtn = document.querySelector('.panel.main-app .tab-select li.overview'); 4 | const healthBtn = document.querySelector('.panel.main-app .tab-select li.health'); 5 | 6 | const mainAppContainer = document.querySelector('.panel.main-app'); 7 | 8 | const clearCurrentTab = () => { 9 | mainAppContainer.classList.remove('overview-active'); 10 | mainAppContainer.classList.remove('health-active'); 11 | }; 12 | 13 | overviewBtn.addEventListener('click', () => { 14 | clearCurrentTab(); 15 | mainAppContainer.classList.add('overview-active'); 16 | removeHashFromURL(); 17 | }); 18 | 19 | healthBtn.addEventListener('click', () => { 20 | clearCurrentTab(); 21 | mainAppContainer.classList.add('health-active'); 22 | }); 23 | })(); 24 | 25 | // live video updates from the WHO 26 | (() => { 27 | const overviewPanelVideoContainerElm = document.querySelector('.panel.main-app .tabs > section.overview > .video-container'); 28 | overviewPanelVideoContainerElm.innerHTML += ` 29 | 30 | `; 31 | })(); 32 | -------------------------------------------------------------------------------- /site/server/get_total_cases.php: -------------------------------------------------------------------------------- 1 | find('.maincounter-number > span')); 8 | 9 | if(array_key_exists(0, $spans)) { 10 | $number = $spans[0]->innertext; 11 | $number = str_replace(',', '', $number); 12 | $number = str_replace(' ', '', $number); 13 | 14 | $deathsnumber = $spans[1]->innertext; 15 | $deathsnumber = str_replace(',', '', $deathsnumber); 16 | $deathsnumber = str_replace(' ', '', $deathsnumber); 17 | 18 | $recoveriesnumber = $spans[2]->innertext; 19 | $recoveriesnumber = str_replace(',', '', $recoveriesnumber); 20 | $recoveriesnumber = str_replace(' ', '', $recoveriesnumber); 21 | 22 | if(is_numeric($number) && is_numeric($deathsnumber) && is_numeric($recoveriesnumber)) { 23 | file_put_contents("current_cases_data.js", "const totalCurrentCases = '" . $number . "';\nconst totalDeaths = '" . $deathsnumber . "';\nconst totalRecoveries = '" . $recoveriesnumber . "';\nconst totalCurrentCasesLastUpdated = '" . (date("c")) . "';\n"); 24 | echo "Success (" . $number . " total cases)."; 25 | }else { 26 | echo "Failure."; 27 | } 28 | }else { 29 | var_dump($spans); 30 | echo "Failure: [0] index does not exist"; 31 | } 32 | ?> 33 | -------------------------------------------------------------------------------- /site/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Coronavirus Monitor", 3 | "name": "Coronavirus Live Monitor", 4 | "theme_color": "#DA1333", 5 | "background_color": "#263238", 6 | "display": "standalone", 7 | "icons": [ 8 | { 9 | "src": "assets/favicon/android-icon-36x36.png", 10 | "sizes": "36x36", 11 | "type": "image/png", 12 | "density": "0.75" 13 | }, 14 | { 15 | "src": "assets/favicon/android-icon-48x48.png", 16 | "sizes": "48x48", 17 | "type": "image/png", 18 | "density": "1.0" 19 | }, 20 | { 21 | "src": "assets/favicon/android-icon-72x72.png", 22 | "sizes": "72x72", 23 | "type": "image/png", 24 | "density": "1.5" 25 | }, 26 | { 27 | "src": "assets/favicon/android-icon-96x96.png", 28 | "sizes": "96x96", 29 | "type": "image/png", 30 | "density": "2.0" 31 | }, 32 | { 33 | "src": "assets/favicon/android-icon-144x144.png", 34 | "sizes": "144x144", 35 | "type": "image/png", 36 | "density": "3.0" 37 | }, 38 | { 39 | "src": "assets/favicon/android-icon-192x192.png", 40 | "sizes": "192x192", 41 | "type": "image/png", 42 | "density": "4.0" 43 | } 44 | ] 45 | } 46 | -------------------------------------------------------------------------------- /site/server/news_content/at.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":2,"articles":[{"source":{"id":null,"name":"Science.orf.at"},"author":"ORF.at","title":"Studie: Risiko in Schulen gut zu managen - ORF.at","description":"Das Risiko für Coronavirus-Ausbrüche in Schulen und Kindergärten lässt sich einer Studie aus Australien zufolge mit Maßnahmen wie Kontaktverfolgung gering halten.","url":"https://science.orf.at/stories/3201308/","urlToImage":"https://ibs.orf.at/science?image=https%3A%2F%2Ftubestatic.orf.at%2Fmims%2F2020%2F32%2F84%2Fcrops%2Fw%3D1200%2Ch%3D627%2Cq%3D75%2F641998_master_220784_themenbild_schulbeginn_fuer_volksschulen_ahs-unterstufen_neue_mittelschulen_nms_und_sonderschulen_nach_corona-sperre_.jpg%3Fs%3Da547bd3b47d10fad212d645dfdc4fccab66adda5","publishedAt":"2020-08-04T08:26:25Z","content":"Obwohl mit dem Virus infizierte Lehrerinnen, Betreuer und Kinder ihre jeweilige Einrichtung aufgesucht hätten, als sie bereits infektiös waren, seien dort nur wenige weitere Menschen infiziert worden… [+2105 chars]"},{"source":{"id":null,"name":"K.at"},"author":"Agenturen","title":"Coronavirus: ForscherInnen identifizierten Ziel für Arzneimittel - k.at","description":"WissenschafterInnen der Goethe-Universität Frankfurt haben ein mögliches Ziel für neue Anti-SARS-CoV-2-Medikamente entdeckt.","url":"https://k.at/news/coronavirus-forscher-identifizierten-ziel-fuer-arzneimittel/400989710","urlToImage":"https://image.k.at/images/facebook/4556042/81670356455784384_BLD_Online.jpg","publishedAt":"2020-08-03T14:46:44Z","content":null}]} -------------------------------------------------------------------------------- /site/server/news.php: -------------------------------------------------------------------------------- 1 | $sec_in_day) { 30 | $url = 'https://newsapi.org/v2/top-headlines?country=' . $country . '&q=coronavirus&apiKey=' . $newsAPIKey; 31 | $resp = file_get_contents($url); 32 | if(!$resp) { 33 | echo 'Bad Request'; 34 | } else { 35 | file_put_contents('news_content/' . $country . '.json', $resp); 36 | echo $resp; 37 | } 38 | } else { 39 | echo "Only update cache once a day at maximum."; 40 | } 41 | } 42 | } else { 43 | echo 'Bad Request'; 44 | } 45 | 46 | ?> -------------------------------------------------------------------------------- /site/server/news_content/mx.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":2,"articles":[{"source":{"id":null,"name":"El Universal"},"author":null,"title":"Coronavirus 4 de agosto. Suman casi 450 mil casos de Covid en México; hay 48 mil muertes | El Universal - El Universal","description":"Sigue aquí la transmisión completa de la conferencia sobre casos de coronavirus en México, desde Palacio Nacional","url":"https://www.eluniversal.com.mx/nacion/sociedad/coronavirus-4-de-agosto-suman-casi-450-mil-casos-de-covid-en-mexico-hay-48-mil","urlToImage":"https://www.eluniversal.com.mx/sites/default/files/2020/08/04/cmx.jpg","publishedAt":"2020-08-05T00:06:17Z","content":"México sumó, al corte de este 4 de agosto, 48 mil 869 muertes por Covid-19, con 449 mil 961 casos de contagios confirmados de coronavirus, según informaron autoridades de la Secretaría de Salud.\r\nJos… [+832 chars]"},{"source":{"id":null,"name":"Publimetro.com.mx"},"author":"Publisport","title":"El español Rafael Nadal no participará en el US Open - Publimetro México","description":"El tenista español, Rafael Nadal, anunció este martes que no participará en US Open debido a la situación que se está viviendo por el coronavirus","url":"https://www.publimetro.com.mx/mx/deportes/2020/08/04/rafael-nadal-no-participara-us-open.html","urlToImage":"https://media.metrolatam.com/2020/08/04/gettyimages11987-6e08b2f5b3d01973a25b10f65de21dc0-1200x800.jpg","publishedAt":"2020-08-04T18:33:00Z","content":"El tenista español, Rafael Nadal, anunció este martes que no participará en US Open debido a la situación que se está viviendo en Estados Unidos y en todo el mundo con la pandemia del coronavirus.\r\nM… [+1734 chars]"}]} -------------------------------------------------------------------------------- /site/server/news_content/ch.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":2,"articles":[{"source":{"id":null,"name":"20 Minuten"},"author":"SDA","title":"Ab Mittwoch: Belgien streicht Waadt und Wallis von der Risikoliste - 20 Minuten","description":"Belgien passt seine Coronavirus-Risikoliste an. Genf bleibt weiterhin darauf.","url":"https://www.20min.ch/story/waadt-und-wallis-ab-mittwoch-nicht-mehr-auf-belgischer-risiko-liste-663333915276","urlToImage":"https://cdn.unitycms.io/image/ocroped/1200,1200,1000,1000,0,0/4DnxshwmY-w/67iWi132q-R9ohP3914Et6.jpg","publishedAt":"2020-08-04T17:34:56Z","content":"Belgien passt seine Coronavirus-Risikoliste an. Genf bleibt weiterhin darauf. \r\n1 / 8Drei Kantone waren auf der belgischen Roten Liste: Waadt, Wallis und Genf. \r\nKEYSTONE\r\nNun wurde die Liste wieder … [+1704 chars]"},{"source":{"id":null,"name":"Tagesanzeiger.ch"},"author":"Werner Bartens","title":"Coronavirus-Spätfolgen – Selbst milde Covid-19-Verläufe können Spuren am Herzen hinterlassen - Tages-Anzeiger","description":"Auch nach einer überstandenen Corona-Infektion bleibt der Herzmuskel oft entzündet. Viele Patienten klagen zudem noch Monate später über Atemnot und Müdigkeit.","url":"https://www.tagesanzeiger.ch/selbst-milde-covid-19-verlaeufe-koennen-spuren-am-herzen-hinterlassen-462013726331","urlToImage":"https://cdn.unitycms.io/image/ocroped/1200,1200,1000,1000,0,0/9ex80b9i770/EUvPgjG9KUS8Bez4EnKHQQ.jpg","publishedAt":"2020-08-03T19:34:00Z","content":"Publiziert: 03.08.2020, 21:34\r\nPatient bei der Corona-Nachsorge in Italien. Auch nach einer überstandenen Infektion klagen viele Betroffene über Müdigkeit oder Schwierigkeiten beim Atmen.\r\nFoto: Marc… [+3673 chars]"}]} -------------------------------------------------------------------------------- /site/server/get_live_updates.php: -------------------------------------------------------------------------------- 1 | $sec_in_day ) { 20 | $respJSON = json_decode($resp, true); 21 | 22 | $latestVidId = ""; 23 | 24 | foreach ($respJSON['items'] as $idx => $item) { 25 | $itemtitle = strtolower($item['snippet']['title']); 26 | // not great identification for a press conference, but totally fine if it displays another one of WHOs videos 27 | // currently the WHO doesn't seem to be totally consistent in how they are showing their press briefings, on YouTube and on their website, so this is adequate for now 28 | if(contains('briefing', $itemtitle) || contains('press', $itemtitle) || contains('conference', $itemtitle)) { 29 | $latestVidId = $item['id']['videoId']; 30 | break; 31 | } 32 | } 33 | 34 | if(strlen($latestVidId) > 0) { 35 | file_put_contents("live_updates_data.js", "const liveVideoURL = 'https://www.youtube.com/embed/" . $latestVidId . "';"); 36 | echo "Success: " . $latestVidId; 37 | } else { 38 | echo "Latest press video not found"; 39 | } 40 | } else { 41 | echo "Only update once a day at maximum."; 42 | } 43 | } 44 | ?> 45 | -------------------------------------------------------------------------------- /site/server/news_content/se.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":2,"articles":[{"source":{"id":null,"name":"Aftonbladet.se"},"author":"TT","title":"Uppmärksammad antikroppsstudie anmäld - Aftonbladet","description":"Forskare vid Uppsala universitet provtog, utan etiskt tillstånd, drygt 450 personer för antikroppar mot coronaviruset i en uppmärksammad pilotstudie. Ärendet har plockats upp av åklagare – men studien var aldrig menad för publikation enligt forskarna, skriver…","url":"https://www.aftonbladet.se/nyheter/a/0nMAzg/uppmarksammad-antikroppsstudie-anmald","urlToImage":"https://imgs.aftonbladet-cdn.se/v2/images/e536973a-b745-4ba7-933b-8905991a28ff?fit=crop&h=1243&q=50&w=1900&s=c26b998b0db06c87e37eb41adb723e06c0ab1284","publishedAt":"2020-08-04T20:26:00Z","content":"Av: TT\r\nPublicerad: 04 augusti 2020 kl. 22.26\r\nForskare vid Uppsala universitet provtog, utan etiskt tillstånd, drygt 450 personer för antikroppar mot coronaviruset i en uppmärksammad pilotstudie.\r\nÄ… [+1402 chars]"},{"source":{"id":"svenska-dagbladet","name":"Svenska Dagbladet"},"author":"Johan Carlström","title":"Kronans utveckling hänger på andra coronavåg | Johan Carlström - Svenska Dagbladet","description":"ANALYS. Kronfesten kan mycket väl fortsätta. Mycket hänger på vad som händer på börsen och hur väl länder lyckas stoppa coronavirusets framfart.","url":"https://www.svd.se/kronans-framtid-hanger-pa-andra-virusvag","urlToImage":"https://svd.vgc.no/v2/images/dd215af0-a9e3-44cf-9506-971abab06bc7?h=630&q=80&upscale=true&w=1200&s=5a10702e26821b167ac516a0c4bb865457d0b382","publishedAt":"2020-08-04T18:03:56Z","content":"Kronan har gått otroligtstarkt under coronakrisen. Efter ett stort tapp under krisens inledningsfas har den svenska valutan återhämtat sig med råge och handlas i dag betydligt starkare än innan krise… [+180 chars]"}]} -------------------------------------------------------------------------------- /site/server/news_content/ve.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":2,"articles":[{"source":{"id":null,"name":"Elfildeo.com"},"author":"https://www.facebook.com/alejandra.gonzalezcen","title":"Crisis en los Cardenales: Yadier Molina anuncia que dio positivo por Coronavirus (Covid-19) - El Fildeo","description":"El receptor de los Cardenales de San Luis Yadier Molina anunció a través de su cuenta de Instagram que dio positivo por Coronavirus (Covid-19) en la temporada 2020 de MLB","url":"https://elfildeo.com/mlb/yadier-molina-positivo-coronavirus-covid-cardenales-ultimas-noticias/114514/2020/","urlToImage":"https://i0.wp.com/elfildeo.com/wp-content/uploads/2020/08/Yadier-Molina-Cardneales-de-San-Luis.jpg?fit=1200%2C800&ssl=1","publishedAt":"2020-08-04T16:27:00Z","content":"El receptor de los Cardenales de San Luis Yadier Molina anunció a través de su cuenta de Instagram que dio positivo por Coronavirus (Covid-19) en la temporada 2020 de MLB.\r\nYadier Molina es uno de lo… [+1742 chars]"},{"source":{"id":"cnn","name":"CNN"},"author":null,"title":"Nicolás Maduro tilda de «imbéciles» a los que dudan de la voz de Diosdado Cabello en enlace telefónico - CNN","description":"Maduro sostuvo una reunión por videoconferencia televisada, este lunes, con la dirección nacional del Partido Socialista Unido de Venezuela (PSUV). Cabello, quien tiene coronavirus, “no se pudo con…","url":"https://cnnespanol.cnn.com/2020/08/04/nicolas-maduro-tilda-de-imbeciles-a-los-que-dudan-de-que-era-la-voz-de-diosdado-cabello-en-enlace-telefonico/","urlToImage":"https://cnnespanol.cnn.com/wp-content/uploads/2019/08/190822142335-cnnee-diosdado-cabello-full-169.jpg?quality=100&strip=info","publishedAt":"2020-08-04T10:22:00Z","content":"(CNN Español) — El cuestionado presidente de Venezuela, Nicolás Maduro, calificó de «imbéciles» a quienes duden de la voz de Diosdado Cabello, tras un enlace telefónico atribuido al presidente de la … [+1399 chars]"}]} -------------------------------------------------------------------------------- /site/assets/js/current_cases.js: -------------------------------------------------------------------------------- 1 | // elm vars 2 | const currentCaseCountElm = document.querySelector('.panel.current-cases .case-count'); 3 | const deathsCountElm = document.querySelector('.panel.stats .deaths span'); 4 | const recoveriesCountElm = document.querySelector('.panel.stats .recoveries span'); 5 | const activeCountElm = document.querySelector('.panel.stats .active span'); 6 | const currentCaseCountLastUpdatedElm = document.querySelector('.panel.current-cases .last-updated'); 7 | 8 | // set current case count and last updated 9 | (() => { 10 | // current case count 11 | const numberParts = numberWithCommas(parseInt(totalCurrentCases)).split(','); 12 | let finalCurrentCaseCountHTML = ''; 13 | 14 | numberParts.forEach((part, ind) => { 15 | finalCurrentCaseCountHTML += `${part}`; 16 | if (ind < numberParts.length - 1) { 17 | finalCurrentCaseCountHTML += ','; 18 | } 19 | }); 20 | 21 | currentCaseCountElm.innerHTML = finalCurrentCaseCountHTML; 22 | 23 | // last updated 24 | currentCaseCountLastUpdatedElm.innerText = 'Updated ' + moment(totalCurrentCasesLastUpdated).fromNow(); 25 | 26 | // deaths and recoveries 27 | deathsCountElm.innerHTML = `${numberWithCommas(parseInt(totalDeaths))} (${Math.floor( 28 | (parseInt(totalDeaths) / parseInt(totalCurrentCases)) * 100 29 | ).toString()}%)`; 30 | recoveriesCountElm.innerHTML = `${numberWithCommas(parseInt(totalRecoveries))} (${Math.floor( 31 | (parseInt(totalRecoveries) / parseInt(totalCurrentCases)) * 100 32 | ).toString()}%)`; 33 | 34 | const totalActive = parseInt(totalCurrentCases) - parseInt(totalRecoveries) - parseInt(totalDeaths); 35 | activeCountElm.innerHTML = `${numberWithCommas(totalActive)} (${Math.floor( 36 | (totalActive / parseInt(totalCurrentCases)) * 100 37 | ).toString()}%)`; 38 | })(); 39 | 40 | window.addEventListener('load', () => { 41 | fitty(currentCaseCountElm); 42 | }); 43 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | Coronavirus (COVID-19) Web App 3 |

4 |

5 | GitHub last commit 6 | GitHub stars 7 | GitHub followers 8 |

9 | 10 | Your new hub for news, information, and latest updates about the Coronavirus (COVID-19) outbreak. 11 | 12 | ![Site Example Image](site_demo.png) 13 | 14 | ## Tech Stack 15 | 16 | - HTML, CSS, and Javascript (ES6) — Public Site 17 | - PHP — Public Routes to Update Cases (includes web scraping for cases) and Press Video Data 18 | - Node.js/Express.js — Local web server to scrape W.H.O. site for latest press video 19 | - Python — Cronjobs to request PHP servers and local servers 20 | 21 | ## Third Party Software Used 22 | 23 | - Various NPM packages including Express.js, Puppeteer, and more 24 | - Various Python/PyPi modules including requests, scheduler, and more 25 | - [NewsAPI](https://newsapi.org/) for fetching latest news 26 | - [Moment.js](https://momentjs.com/) for displaying dates and times nicely 27 | 28 | ## File Structure 29 | 30 | - `cronjobs` — Python programs to create services that run periodically to update data for the site. 31 | - `scrapers` — Web scrapers to scrape third-party sites for data. 32 | - `site` — The main frontend site written in plain HTML, CSS, and JavaScript. 33 | - `site/server` — Files which run on the server to update public data for the frontend site. These files are then called/requested by the cronjobs. 34 | 35 | ## License and Credits 36 | 37 | Coronavirus Live Monitor was built solely by web developer and student [Gabriel Romualdo](https://xtrp.io/). 38 | 39 | The code is completely OSS and is MIT Licensed. See LICENSE.txt for details. 40 | -------------------------------------------------------------------------------- /site/server/news_content/gb.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":3,"articles":[{"source":{"id":"bbc-news","name":"BBC News"},"author":"https://www.facebook.com/bbcnews","title":"Coronavirus: Are people in Manchester respecting the new restrictions? - BBC News","description":"People in Manchester react to new lockdown laws which make it illegal to visit each other's homes.","url":"https://www.bbc.co.uk/news/uk-england-manchester-53648368","urlToImage":"https://ichef.bbci.co.uk/news/1024/branded_news/AD3E/production/_113805344_hi062764318.jpg","publishedAt":"2020-08-04T23:06:18Z","content":"Image copyrightReutersImage caption\r\n Greater Manchester residents can be fined £100 rising to a maximum of £3,200 for flouting the rules\r\nIt has been five days since lockdown measures were tightened… [+5346 chars]"},{"source":{"id":null,"name":"The Guardian"},"author":"Jamie Grierson","title":"Lack of special border measures before UK coronavirus lockdown was 'serious mistake' - The Guardian","description":"Thousands of infections were brought to UK in 10 days prior to lockdown, MPs say","url":"https://www.theguardian.com/politics/2020/aug/05/lack-of-special-border-measures-before-uk-coronavirus-lockdown-was-serious-mistake","urlToImage":"https://i.guim.co.uk/img/media/948c9c95c705dfe89738ec4ada3ef987fd13a312/0_342_5315_3189/master/5315.jpg?width=1200&height=630&quality=85&auto=format&fit=crop&overlay-align=bottom%2Cleft&overlay-width=100p&overlay-base64=L2ltZy9zdGF0aWMvb3ZlcmxheXMvdGctZGVmYXVsdC5wbmc&enable=upscale&s=64f0046f43c62eb4312ccf3b565baceb","publishedAt":"2020-08-04T23:01:00Z","content":null},{"source":{"id":null,"name":"Mirror Online"},"author":"Joseph Wilkes","title":"UK coronavirus death toll rises by 89 in 25% drop on same day last week - Mirror Online","description":"The latest Department of Health figures have come out this afternoon and show the coronavirus death toll is now at 46,299 in all settings across the UK","url":"https://www.mirror.co.uk/news/uk-news/breaking-uk-coronavirus-death-toll-22468257","urlToImage":"https://i2-prod.mirror.co.uk/incoming/article22468337.ece/ALTERNATES/s1200/0_How-Royal-Papworth-Hospital-Adapted-To-Battle-A-Pandemic.jpg","publishedAt":"2020-08-04T17:14:00Z","content":"The UK's official coronavirus death toll has risen by 89 in the last 24 hours, the latest figures reveal. \r\nThis is a 25% drop from the same time last week - when 119 deaths were reported. \r\nA total … [+2788 chars]"}]} -------------------------------------------------------------------------------- /site/server/news_content/ng.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":3,"articles":[{"source":{"id":null,"name":"CNET"},"author":"Katie Conner","title":"How to vacation safely this summer during the coronavirus - CNET","description":"Keep these nine straightforward rules in mind if you're planning a getaway.","url":"https://www.cnet.com/health/how-to-vacation-safely-this-summer-during-the-coronavirus/","urlToImage":"https://cnet3.cbsistatic.com/img/g3aWWiy3IjP5ZCUXnZOhsogfD4w=/267x770:4608x3456/756x567/2017/12/09/96ea85b4-e89c-4671-857b-a4eab4f3ede9/dscn0135.jpg","publishedAt":"2020-08-04T22:15:03Z","content":"Be safe while vacationing during the pandemic.\r\nEric Mack/CNET\r\nFor the most up-to-date news and information about the coronavirus pandemic, visit the WHO website.\r\nThe continuing surge of COVID-19 a… [+7265 chars]"},{"source":{"id":null,"name":"P.M. News"},"author":null,"title":"JUST IN: Bristow Helicopters sacks 100 pilots, engineers - P.M. News","description":"Bristow Helicopters has sacked 100 pilots and engineers following negative impact of Coronavirus on its business and the nation’s economy.","url":"https://www.pmnewsnigeria.com/2020/08/04/just-in-bristow-helicopters-sacks-100-pilots-engineers/","urlToImage":"https://i1.wp.com/www.pmnewsnigeria.com/wp-content/uploads/2020/08/Bristow-Helicopters.jpg?fit=650%2C350&ssl=1","publishedAt":"2020-08-04T17:56:24Z","content":"Bristow Helicopters\r\nBristow Helicopters has sacked 100 pilots and engineers following negative impact of Coronavirus on its business and the nations economy.\r\nThe company, in a statement on Tuesday … [+1511 chars]"},{"source":{"id":null,"name":"Naija247news.com"},"author":"Bisola Akinlabi","title":"Group kick against the exclusion of HIV-infected people from COVID-19 vaccine trial - Naija247news","description":"As large trials get underway to test the vaccines needed to stop the global coronavirus pandemic, one group has realized it is being left out and is not happy: people living with HIV. Several compa…","url":"https://naija247news.com/2020/08/03/group-kick-against-the-exclusion-of-hiv-infected-people-from-covid-19-vaccine-trial/","urlToImage":"https://i1.wp.com/naija247news.com/wp-content/uploads/2018/12/cropped-InstaLogo.jpg?fit=512%2C512&ssl=1","publishedAt":"2020-08-03T08:59:58Z","content":"As large trials get underway to test the vaccines needed to stop the global coronavirus pandemic, one group has realized it is being left out and is not happy: people living with HIV.\r\nSeveral compan… [+4663 chars]"}]} -------------------------------------------------------------------------------- /site/server/news_content/co.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":3,"articles":[{"source":{"id":null,"name":"Portafolio.co"},"author":"Casa Editorial El Tiempo","title":"Autoridades entregan nuevo informe sobre coronavirus en el país - Portafolio.co","description":"En el país hay 142.716 casos activos. Hoy se reportaron 298 nuevas muertes por la enfermedad. | Economía | Portafolio.co","url":"https://www.portafolio.co/economia/casos-contagios-coronavirus-en-colombia-hoy-martes-4-de-agosto-de-2020-543354","urlToImage":"http://www.portafolio.co/files/article_content/uploads/2020/08/04/5f29ce0ccd6b3.jpeg","publishedAt":"2020-08-04T22:10:53Z","content":"El Ministerio de Salud y el Instituto Nacional de Salud confirmaron este martes otros 7.129 casos de coronavirus en el país, tras procesar 37.978 pruebas, con lo cual aumenta a 334.979 el número de p… [+1274 chars]"},{"source":{"id":null,"name":"Vanguardia.com"},"author":null,"title":"OMS no es tan optimista con la vacuna del coronavirus - Vanguardia","description":"La investigación de vacunas contra la COVID-19, que en algunos laboratorios de todo el mundo se halla ya en las últimas fases de pruebas es esperanzadora, pero “puede que nunca haya una panacea contra esta pandemia”, advirtió ayer el máximo responsable de la …","url":"https://www.vanguardia.com/mundo/oms-no-es-tan-optimista-con-la-vacuna-del-coronavirus-JM2709182","urlToImage":"https://www.vanguardia.com/binrepository/1200x800/0c86/1200d628/upper-right/12204/BXQB/c9e95827efbf038f0b0969f10113541505701dce_4684894_20200803171326.jpg","publishedAt":"2020-08-04T05:04:15Z","content":"La investigación de vacunas contra la COVID-19, que en algunos laboratorios de todo el mundo se halla ya en las últimas fases de pruebas es esperanzadora, pero puede que nunca haya una panacea contra… [+2308 chars]"},{"source":{"id":null,"name":"Laopinion.com.co"},"author":"Diario la Opinión","title":"Los cinco países en la carrera por la vacuna contra el coronavirus - La Opinión Cúcuta","description":"Se están desarrollando 149 vacunas experimentales para combatir la enfermedad.","url":"https://www.laopinion.com.co/mundo/los-cinco-paises-en-la-carrera-por-la-vacuna-contra-el-coronavirus-200527","urlToImage":"https://www.laopinion.com.co/sites/default/files/2020/08/03/imagen/vacuna.jpg","publishedAt":"2020-08-03T21:00:00Z","content":"Muchos laboratorios a nivel internacional han empezado a desarrollar la vacuna que ayudará a combatir el coronavirus.\r\nAntes de profundizar un poco el tema de vacunas, vale recordar de qué trata esta… [+2749 chars]"}]} -------------------------------------------------------------------------------- /site/server/news_content/ca.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":3,"articles":[{"source":{"id":"cbc-news","name":"CBC News"},"author":null,"title":"Bianca Andreescu will defend U.S. Open title, Rafael Nadal out due to pandemic - CBC.ca","description":"Canada's Bianca Andreescu will defend her women's title at the U.S. Open, but defending men's champion Rafael Nadal said Tuesday he will skip it due to the coronavirus pandemic.","url":"https://www.cbc.ca/sports/tennis/rafael-nadal-us-open-withdrawal-1.5673945","urlToImage":"https://i.cbc.ca/1.5673958.1596566621!/fileImage/httpImage/image.jpg_gen/derivatives/16x9_620/1166624849.jpg","publishedAt":"2020-08-04T19:23:00Z","content":"Bianca Andreescu, the first Canadian to win a Grand Slam singles championship, will defend her women's title at the U.S. Open, but defending men's champion Rafael Nadal said Tuesday he will skip it d… [+1664 chars]"},{"source":{"id":"cbc-news","name":"CBC News"},"author":null,"title":"Lord & Taylor files for bankruptcy protection, plans to close all 38 stores - CBC.ca","description":"Venerable U.S. retailer Lord & Taylor filed for Chapter 11 bankruptcy on Sunday, becoming the latest in a growing list of storied names to do so amid the ongoing coronavirus outbreak that has crippled the retail sector.","url":"https://www.cbc.ca/news/business/lord-taylor-bankruptcy-1.5673825","urlToImage":"https://i.cbc.ca/1.5124275.1596563705!/cpImage/httpImage/image.jpg_gen/derivatives/16x9_620/lord-taylor-flagship.jpg","publishedAt":"2020-08-04T17:57:00Z","content":"Venerable U.S. retailer Lord & Taylor filed for Chapter 11 bankruptcy on Sunday, becoming the latest in a growing list of storied names to do so amid the ongoing coronavirus outbreak that has cri… [+1666 chars]"},{"source":{"id":null,"name":"Global News"},"author":"Staff","title":"Wuhan scientists interviewed over coronavirus origins, WHO says - Global News","description":"A World Health Organization team in China to probe the origins of COVID-19 had \"extensive discussions\" and exchanges with scientists in Wuhan.","url":"https://globalnews.ca/news/7248879/coronavirus-who-wuhan-scientists-interviewed/","urlToImage":"https://globalnews.ca/wp-content/uploads/2020/08/2020-07-30T164438Z_2111495434_RC2S3I9TPAYB_RTRMADP_3_HEALTH-CORONAVIRUS-WHO.jpg?quality=85&strip=all&w=720&h=379&crop=1","publishedAt":"2020-08-04T11:13:36Z","content":"A World Health Organization team in China to probe the origins of COVID-19 had “extensive discussions” and exchanges with scientists in Wuhan where the outbreak was first detected, a spokesman said o… [+2384 chars]"}]} -------------------------------------------------------------------------------- /site/assets/css/parts/latest-news.css: -------------------------------------------------------------------------------- 1 | .panel.latest-news { 2 | max-height: calc(100vh - 8.25rem); 3 | overflow-y: auto; 4 | position: relative; 5 | padding-top: 0; 6 | } 7 | 8 | @media only screen and (max-width: 1050px) { 9 | .panel.latest-news { 10 | max-height: none; 11 | overflow-y: hidden; 12 | } 13 | } 14 | 15 | .panel.latest-news > .top { 16 | position: sticky; 17 | top: 0; 18 | background-color: var(--dark-color); 19 | padding-top: 1rem; 20 | z-index: 9998; 21 | } 22 | .panel.latest-news .panel-title { 23 | margin-bottom: 0.5rem; 24 | } 25 | 26 | /* select country */ 27 | .panel.latest-news .select-country { 28 | height: 1.25rem; 29 | font-size: 0.8rem; 30 | padding-bottom: 1rem; 31 | border-bottom: 1px solid var(--white-color); 32 | } 33 | .panel.latest-news .select-country * { 34 | display: block; 35 | float: left; 36 | height: 1.1rem; 37 | line-height: 1.1rem; 38 | font-size: 0.7rem; 39 | } 40 | 41 | .panel.latest-news .select-country span { 42 | margin-right: 0.5rem; 43 | } 44 | 45 | .panel.latest-news .select-country select { 46 | border: none; 47 | background-color: transparent; 48 | border: 1px solid var(--white-color); 49 | border-radius: 4px; 50 | } 51 | 52 | /* news list */ 53 | .panel.latest-news .news-list hr { 54 | border: none; 55 | border-top: 1px solid var(--medium-color); 56 | } 57 | .panel.latest-news .news-list hr:first-child { 58 | display: none; 59 | } 60 | .panel.latest-news .news-list .article { 61 | display: block; 62 | overflow: hidden; 63 | padding: 0.25rem 0; 64 | padding-bottom: 1rem; 65 | text-decoration: none; 66 | opacity: 0.7; 67 | transition: opacity 0.2s; 68 | } 69 | .panel.latest-news .news-list .article:hover { 70 | opacity: 1; 71 | } 72 | 73 | .panel.latest-news .news-list .article .top { 74 | height: 2.5rem; 75 | font-size: 0.9rem; 76 | box-sizing: border-box; 77 | padding: 0.25rem 0; 78 | } 79 | .panel.latest-news .news-list .article .top * { 80 | line-height: 2rem; 81 | display: block; 82 | float: right; 83 | } 84 | .panel.latest-news .news-list .article .top em { 85 | float: left; 86 | opacity: 0.7; 87 | } 88 | 89 | .panel.latest-news .news-list .article .main-picture { 90 | width: 100%; 91 | max-height: 10rem; 92 | object-fit: cover; 93 | border-radius: 4px; 94 | } 95 | @media only screen and (max-width: 1050px) { 96 | .panel.latest-news .news-list .article .main-picture { 97 | max-height: 45vw; 98 | } 99 | } 100 | 101 | .panel.latest-news .news-list .article .title { 102 | line-height: 1.35; 103 | font-size: 1rem; 104 | margin-top: 0.5rem; 105 | font-weight: 600; 106 | } 107 | -------------------------------------------------------------------------------- /site/assets/css/components/masthead.css: -------------------------------------------------------------------------------- 1 | .row.top { 2 | margin-bottom: 1.75rem; 3 | } 4 | .masthead { 5 | min-height: 4rem; 6 | padding-top: 0; 7 | margin-bottom: 0 !important; 8 | } 9 | .masthead > * { 10 | display: block; 11 | float: left; 12 | margin-top: 1rem; 13 | } 14 | 15 | .masthead .title { 16 | height: 2rem; 17 | line-height: 2rem; 18 | font-size: 1.85rem; 19 | text-transform: uppercase; 20 | font-weight: 300; 21 | letter-spacing: 0.05rem; 22 | } 23 | .masthead .mobile-title { 24 | display: none; 25 | width: 100%; 26 | overflow: hidden; 27 | } 28 | 29 | .masthead > svg { 30 | height: 2rem; 31 | transform: scale(1.2); 32 | width: auto; 33 | margin-left: 0.25rem; 34 | margin-right: 1rem; 35 | fill: var(--theme-color); 36 | } 37 | 38 | /* mobile */ 39 | .masthead .mobile-title { 40 | text-align: center; 41 | } 42 | .masthead .mobile-title .text { 43 | vertical-align: top; 44 | display: inline-block; 45 | line-height: 1.5; 46 | text-transform: uppercase; 47 | font-weight: 600; 48 | letter-spacing: 0.05rem; 49 | white-space: normal !important; 50 | } 51 | .masthead .mobile-nav { 52 | display: none; 53 | height: 3.75rem; 54 | width: 100%; 55 | overflow: hidden; 56 | margin-top: 0.5rem; 57 | } 58 | .masthead .mobile-nav button { 59 | border: none; 60 | background-color: transparent; 61 | width: 33.33%; 62 | display: block; 63 | float: left; 64 | height: 3.75rem; 65 | box-sizing: border-box; 66 | padding: 0.375rem 0; 67 | text-align: center; 68 | opacity: 0.7; 69 | border-radius: 3px; 70 | cursor: pointer; 71 | } 72 | .masthead .mobile-nav button:hover { 73 | opacity: 1; 74 | } 75 | .container.calculator-active .masthead .mobile-nav button.calculator, 76 | .container.news-active .masthead .mobile-nav button.news, 77 | .container.cases-about-active .masthead .mobile-nav button.cases-about { 78 | opacity: 1; 79 | background-color: var(--subdark-color); 80 | } 81 | .masthead .mobile-nav button svg { 82 | height: 1.75rem; 83 | width: auto; 84 | margin-bottom: 0.25rem; 85 | } 86 | .masthead .mobile-nav button p.label { 87 | height: 1rem; 88 | line-height: 1rem; 89 | font-size: 0.7rem; 90 | } 91 | 92 | @media only screen and (max-width: 1050px) { 93 | .row.top { 94 | position: sticky; 95 | top: -4px; 96 | z-index: 9999; 97 | } 98 | 99 | .masthead { 100 | border-bottom: 1px solid var(--medium-color); 101 | border-bottom-left-radius: 0; 102 | border-bottom-right-radius: 0; 103 | } 104 | 105 | .masthead .mobile-nav { 106 | display: block; 107 | } 108 | 109 | .masthead > svg { 110 | display: none; 111 | } 112 | .masthead .title { 113 | display: none; 114 | } 115 | 116 | .masthead .mobile-title { 117 | display: block; 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /site/server/news_content/nl.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":4,"articles":[{"source":{"id":null,"name":"Dpgmedia.net"},"author":null,"title":"Meerdere spelers en werknemers Ajax waren besmet met coronavirus - AD.nl","description":null,"url":"https://myprivacy.dpgmedia.net/?siteKey=V9f6VUvlHxq9wKIN&callbackUrl=https:%2f%2fwww.ad.nl%2fprivacy-gate%2faccept%3fredirectUri%3d%252fnederlands-voetbal%252fmeerdere-spelers-en-werknemers-ajax-waren-besmet-met-coronavirus%257ea05949b0%252f","urlToImage":null,"publishedAt":"2020-08-04T21:25:00Z","content":"AD en Krant.nl maken deel uit van DPG Media. Onze sites gebruiken cookies en vergelijkbare technologieën ('cookies') onder andere om je een optimale gebruikerservaring te bieden. Ook kunnen we hierdo… [+1389 chars]"},{"source":{"id":null,"name":"Dpgmedia.net"},"author":null,"title":"Live – Aandeel jongeren met coronavirus groeit | Den Haag zet meer handhavers en wielklem in op warme dagen - Volkskrant","description":null,"url":"https://myprivacy.dpgmedia.net/?siteKey=PUBX2BuuZfEPJ6vF&callbackUrl=https:%2f%2fwww.volkskrant.nl%2fprivacy-wall%2faccept%3fredirectUri%3d%252fnieuws-achtergrond%252flive-aandeel-jongeren-met-coronavirus-groeit-den-haag-zet-meer-handhavers-en-wielklem-in-op-warme-dagen%257eb1d89f42%252f","urlToImage":null,"publishedAt":"2020-08-04T20:05:00Z","content":"Volkskrant.nl en krant.nl maken deel uit van DPG Media. Onze sites gebruiken cookies en vergelijkbare technologieën (cookies) onder andere om u een optimale gebruikerservaring te bieden. Ook kunnen w… [+1252 chars]"},{"source":{"id":null,"name":"Dpgmedia.net"},"author":null,"title":"Steeds meer jonge mensen met coronavirus: 'Jongeren zijn niet onoverwinnelijk' - AD.nl","description":null,"url":"https://myprivacy.dpgmedia.net/?siteKey=V9f6VUvlHxq9wKIN&callbackUrl=https:%2f%2fwww.ad.nl%2fprivacy-gate%2faccept%3fredirectUri%3d%252fdossier-coronavirus%252fsteeds-meer-jonge-mensen-met-coronavirus-jongeren-zijn-niet-onoverwinnelijk%257ea1b90395f%252f","urlToImage":null,"publishedAt":"2020-08-04T18:58:19Z","content":"AD en Krant.nl maken deel uit van DPG Media. Onze sites gebruiken cookies en vergelijkbare technologieën ('cookies') onder andere om je een optimale gebruikerservaring te bieden. Ook kunnen we hierdo… [+1389 chars]"},{"source":{"id":null,"name":"Www.nu.nl"},"author":"NU.nl","title":"Aantal nieuwe coronabesmettingen bijna verdubbeld naar 2.588 - NU.nl","description":"2.588 personen in Nederland testten in de afgelopen week positief op het coronavirus, zo meldt het Rijksinstituut voor Volksgezondheid en Milieu (RIVM) dinsdag. Dat zijn er 1.259 meer dan de 1.329 positieve testuitslagen die vorige week zijn gemeld, terwijl e…","url":"https://www.nu.nl/coronavirus/6068591/aantal-nieuwe-coronabesmettingen-2588-bijna-verdubbeld-minder-getest.html","urlToImage":"https://media.nu.nl/m/ck7xznqayp8a_wd1280.jpg/aantal-nieuwe-coronabesmettingen-2588-bijna-verdubbeld-minder-getest.jpg","publishedAt":"2020-08-04T12:09:00Z","content":"2.588 personen in Nederland testten in de afgelopen week positief op het coronavirus, zo meldt het Rijksinstituut voor Volksgezondheid en Milieu (RIVM) dinsdag. Dat zijn er 1.259 meer dan de 1.329 po… [+3010 chars]"}]} -------------------------------------------------------------------------------- /site/server/news_content/za.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","totalResults":4,"articles":[{"source":{"id":null,"name":"CNET"},"author":"Katie Conner","title":"How to vacation safely this summer during the coronavirus - CNET","description":"Keep these nine straightforward rules in mind if you're planning a getaway.","url":"https://www.cnet.com/health/how-to-vacation-safely-this-summer-during-the-coronavirus/","urlToImage":"https://cnet3.cbsistatic.com/img/g3aWWiy3IjP5ZCUXnZOhsogfD4w=/267x770:4608x3456/756x567/2017/12/09/96ea85b4-e89c-4671-857b-a4eab4f3ede9/dscn0135.jpg","publishedAt":"2020-08-04T22:15:03Z","content":"Be safe while vacationing during the pandemic.\r\nEric Mack/CNET\r\nFor the most up-to-date news and information about the coronavirus pandemic, visit the WHO website.\r\nThe continuing surge of COVID-19 a… [+7265 chars]"},{"source":{"id":null,"name":"EWN"},"author":"Reuters","title":"Oil prices drop on fuel demand worries as coronavirus flares up - EWN","description":"US West Texas Intermediate (WTI) crude futures fell 22 cents, or 0.5% to $40.79 a barrel at 0132 GMT, while Brent crude futures fell 27 cents, or 0.6% to $43.88 a barrel.","url":"https://ewn.co.za/2020/08/04/oil-prices-drop-on-fuel-demand-worries-as-coronavirus-flares-up","urlToImage":"http://cdn.primedia.co.za/primedia-broadcasting/image/upload/c_fill,h_437,w_700/ftjfuzs593tkirgezp48","publishedAt":"2020-08-04T04:50:19Z","content":"US West Texas Intermediate (WTI) crude futures fell 22 cents, or 0.5% to $40.79 a barrel at 0132 GMT, while Brent crude futures fell 27 cents, or 0.6% to $43.88 a barrel.\r\n MELBOURNE Oil prices fell … [+2161 chars]"},{"source":{"id":null,"name":"Businesstech.co.za"},"author":"https://www.facebook.com/BusinessTechSA","title":"516,862 confirmed coronavirus cases in South Africa as deaths climb to 8,539 - BusinessTech","description":"Health minister Dr Zweli Mkhize has announced that there are now a total of 516,862 cases of coronavirus in South Africa.","url":"https://businesstech.co.za/news/trending/422244/516862-confirmed-coronavirus-cases-in-south-africa-as-deaths-climb-to-8539/","urlToImage":"https://businesstech.co.za/news/wp-content/uploads/2020/05/Covid-19-e1589870469837.png","publishedAt":"2020-08-03T20:04:10Z","content":"Health minister Dr Zweli Mkhize has announced that there are now a total of 516,862 cases of coronavirus in South Africa.\r\nThis is an increase of 5,377 cases from the 511,485 infections reported prev… [+2203 chars]"},{"source":{"id":"news24","name":"News24"},"author":"","title":"'Pathetic!' - Trump lashes out at virus coordinator - News24","description":"President Donald Trump has lashed out at his coronavirus response coordinator Deborah Birx after she sounded a grim warning about the pandemic's new surge, calling her remarks \"pathetic.\"","url":"https://www.news24.com/news24/world/news/pathetic-trump-lashes-out-at-virus-coordinator-20200803","urlToImage":"https://cdn.24.co.za/files/Cms/General/d/10352/d1c47c32fcb348fbb282e13c29594c83.jpg","publishedAt":"2020-08-03T16:01:45Z","content":"