├── .eslintignore ├── public ├── google3d1057c68ff035a9.html ├── img │ ├── ogimage.png │ ├── ogimage.xcf │ └── icons │ │ ├── favicon.ico │ │ └── favicon-196.png ├── manifest.json ├── contribute.json └── index.html ├── src ├── components │ ├── views │ │ ├── styl │ │ │ ├── SummaryMetric.styl │ │ │ ├── DashboardSection.styl │ │ │ ├── Metric.styl │ │ │ ├── includes │ │ │ │ └── lib.styl │ │ │ ├── CustomizableDate.styl │ │ │ ├── Chart.styl │ │ │ ├── LabelledSelector.styl │ │ │ ├── Spinner.styl │ │ │ ├── StripedHeader.styl │ │ │ ├── NextButton.styl │ │ │ ├── Header.styl │ │ │ ├── BrowserHacks.styl │ │ │ ├── Dashboard.styl │ │ │ ├── MetricOverview.styl │ │ │ ├── Home.styl │ │ │ ├── DataTable.styl │ │ │ ├── Footer.styl │ │ │ └── Application.styl │ │ ├── css │ │ │ └── README │ │ ├── img │ │ │ ├── social_logos_sprite.png │ │ │ ├── diagonal-line_yellow.png │ │ │ └── moz-wordmark-light-reverse.svg │ │ ├── fonts │ │ │ └── FiraSans │ │ │ │ ├── firasansot-bold-webfont.eot │ │ │ │ ├── firasansot-bold-webfont.ttf │ │ │ │ ├── firasansot-bold-webfont.woff │ │ │ │ ├── firasansot-light-webfont.eot │ │ │ │ ├── firasansot-light-webfont.ttf │ │ │ │ ├── firasansot-light-webfont.woff │ │ │ │ ├── firasansot-medium-webfont.eot │ │ │ │ ├── firasansot-medium-webfont.ttf │ │ │ │ ├── firasansot-medium-webfont.woff │ │ │ │ ├── firasansot-regular-webfont.eot │ │ │ │ ├── firasansot-regular-webfont.ttf │ │ │ │ ├── firasansot-regular-webfont.woff │ │ │ │ ├── firasansot-bolditalic-webfont.eot │ │ │ │ ├── firasansot-bolditalic-webfont.ttf │ │ │ │ ├── firasansot-bolditalic-webfont.woff │ │ │ │ ├── firasansot-lightitalic-webfont.eot │ │ │ │ ├── firasansot-lightitalic-webfont.ttf │ │ │ │ ├── firasansot-lightitalic-webfont.woff │ │ │ │ ├── firasansot-mediumitalic-webfont.eot │ │ │ │ ├── firasansot-mediumitalic-webfont.ttf │ │ │ │ ├── firasansot-mediumitalic-webfont.woff │ │ │ │ ├── firasansot-regularitalic-webfont.eot │ │ │ │ ├── firasansot-regularitalic-webfont.ttf │ │ │ │ └── firasansot-regularitalic-webfont.woff │ │ ├── NextButton.jsx │ │ ├── StripedHeader.jsx │ │ ├── NotFound.jsx │ │ ├── Error.jsx │ │ ├── DashboardSection.jsx │ │ ├── Header.jsx │ │ ├── Application.jsx │ │ ├── MetricOverviewCollection.jsx │ │ ├── Contact.jsx │ │ ├── DataTable.jsx │ │ ├── Spinner.jsx │ │ ├── CustomizableDate.jsx │ │ ├── Main.jsx │ │ ├── MetricOverview.jsx │ │ ├── Footer.jsx │ │ ├── Home.jsx │ │ ├── Dashboard.jsx │ │ ├── SummaryMetric.jsx │ │ └── Chart.jsx │ ├── containers │ │ ├── DataTableContainer.jsx │ │ ├── CustomizableDateContainer.jsx │ │ ├── DashboardContainer.jsx │ │ ├── MetricOverviewContainer.jsx │ │ ├── SummaryMetricContainer.jsx │ │ └── ChartContainer.jsx │ └── decorators │ │ ├── withNextButton.jsx │ │ └── withTracker.jsx ├── setupTests.js ├── tests │ ├── nightwatch │ │ ├── footer.js │ │ ├── basics.js │ │ ├── contact.js │ │ ├── menu.js │ │ ├── routes.js │ │ ├── noindex.js │ │ ├── jsDisabled.js │ │ ├── home.js │ │ ├── dashboards │ │ │ ├── usage-behavior.js │ │ │ ├── user-activity.js │ │ │ └── hardware.js │ │ ├── utils.js │ │ └── regionSelector.js │ └── jest │ │ ├── Dashboard.test.jsx │ │ └── MetricOverview.test.jsx ├── lib │ ├── lazyLoad.jsx │ └── utils.js ├── config.json ├── index.jsx └── registerServiceWorker.js ├── .env ├── .gitignore ├── .editorconfig ├── CODE_OF_CONDUCT.md ├── scripts └── generateVersionJSON.js ├── .stylintrc ├── nightwatch.conf.js ├── README.md ├── .eslintrc.extra.js ├── package.json └── LICENSE /.eslintignore: -------------------------------------------------------------------------------- 1 | build 2 | package-lock.json 3 | -------------------------------------------------------------------------------- /public/google3d1057c68ff035a9.html: -------------------------------------------------------------------------------- 1 | google-site-verification: google3d1057c68ff035a9.html -------------------------------------------------------------------------------- /public/img/ogimage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/public/img/ogimage.png -------------------------------------------------------------------------------- /public/img/ogimage.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/public/img/ogimage.xcf -------------------------------------------------------------------------------- /public/img/icons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/public/img/icons/favicon.ico -------------------------------------------------------------------------------- /src/components/views/styl/SummaryMetric.styl: -------------------------------------------------------------------------------- 1 | .bar-label, 2 | .bar-arrow { 3 | display: none; 4 | } 5 | -------------------------------------------------------------------------------- /public/img/icons/favicon-196.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/public/img/icons/favicon-196.png -------------------------------------------------------------------------------- /src/components/views/css/README: -------------------------------------------------------------------------------- 1 | These filed are auto-generated. Edit the files in the "styl" directory instead. 2 | -------------------------------------------------------------------------------- /src/components/views/styl/DashboardSection.styl: -------------------------------------------------------------------------------- 1 | .dashboard-section-title { 2 | font-size: 1.2rem; 3 | font-weight: normal; 4 | } 5 | -------------------------------------------------------------------------------- /src/components/views/img/social_logos_sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/img/social_logos_sprite.png -------------------------------------------------------------------------------- /src/components/views/img/diagonal-line_yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/img/diagonal-line_yellow.png -------------------------------------------------------------------------------- /src/components/views/styl/Metric.styl: -------------------------------------------------------------------------------- 1 | .metric-title { 2 | font-size: 1rem; 3 | font-weight: normal; 4 | margin-bottom: 0; 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /src/components/views/fonts/FiraSans/firasansot-bold-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/fonts/FiraSans/firasansot-bold-webfont.eot -------------------------------------------------------------------------------- /src/components/views/fonts/FiraSans/firasansot-bold-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/fonts/FiraSans/firasansot-bold-webfont.ttf -------------------------------------------------------------------------------- /src/components/views/fonts/FiraSans/firasansot-bold-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/fonts/FiraSans/firasansot-bold-webfont.woff -------------------------------------------------------------------------------- /src/components/views/fonts/FiraSans/firasansot-light-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/fonts/FiraSans/firasansot-light-webfont.eot -------------------------------------------------------------------------------- /src/components/views/fonts/FiraSans/firasansot-light-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/fonts/FiraSans/firasansot-light-webfont.ttf -------------------------------------------------------------------------------- /src/components/views/fonts/FiraSans/firasansot-light-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/fonts/FiraSans/firasansot-light-webfont.woff -------------------------------------------------------------------------------- /src/components/views/fonts/FiraSans/firasansot-medium-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/fonts/FiraSans/firasansot-medium-webfont.eot -------------------------------------------------------------------------------- /src/components/views/fonts/FiraSans/firasansot-medium-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/fonts/FiraSans/firasansot-medium-webfont.ttf -------------------------------------------------------------------------------- /src/components/views/fonts/FiraSans/firasansot-medium-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/fonts/FiraSans/firasansot-medium-webfont.woff -------------------------------------------------------------------------------- /src/components/views/fonts/FiraSans/firasansot-regular-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/fonts/FiraSans/firasansot-regular-webfont.eot -------------------------------------------------------------------------------- /src/components/views/fonts/FiraSans/firasansot-regular-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/fonts/FiraSans/firasansot-regular-webfont.ttf -------------------------------------------------------------------------------- /src/components/views/fonts/FiraSans/firasansot-regular-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/fonts/FiraSans/firasansot-regular-webfont.woff -------------------------------------------------------------------------------- /src/components/views/fonts/FiraSans/firasansot-bolditalic-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/fonts/FiraSans/firasansot-bolditalic-webfont.eot -------------------------------------------------------------------------------- /src/components/views/fonts/FiraSans/firasansot-bolditalic-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/fonts/FiraSans/firasansot-bolditalic-webfont.ttf -------------------------------------------------------------------------------- /src/components/views/fonts/FiraSans/firasansot-bolditalic-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/fonts/FiraSans/firasansot-bolditalic-webfont.woff -------------------------------------------------------------------------------- /src/components/views/fonts/FiraSans/firasansot-lightitalic-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/fonts/FiraSans/firasansot-lightitalic-webfont.eot -------------------------------------------------------------------------------- /src/components/views/fonts/FiraSans/firasansot-lightitalic-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/fonts/FiraSans/firasansot-lightitalic-webfont.ttf -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | BROWSER=firefox 2 | 3 | NODE_ENV=development 4 | 5 | REACT_APP_GA_TRACKING_ID='UA-00000000-0' 6 | REACT_APP_SITE_TITLE='Firefox Public Data Report' 7 | REACT_APP_VALUE_DECIMAL_PLACES=3 8 | -------------------------------------------------------------------------------- /src/components/views/fonts/FiraSans/firasansot-lightitalic-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/fonts/FiraSans/firasansot-lightitalic-webfont.woff -------------------------------------------------------------------------------- /src/components/views/fonts/FiraSans/firasansot-mediumitalic-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/fonts/FiraSans/firasansot-mediumitalic-webfont.eot -------------------------------------------------------------------------------- /src/components/views/fonts/FiraSans/firasansot-mediumitalic-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/fonts/FiraSans/firasansot-mediumitalic-webfont.ttf -------------------------------------------------------------------------------- /src/components/views/fonts/FiraSans/firasansot-mediumitalic-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/fonts/FiraSans/firasansot-mediumitalic-webfont.woff -------------------------------------------------------------------------------- /src/components/views/fonts/FiraSans/firasansot-regularitalic-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/fonts/FiraSans/firasansot-regularitalic-webfont.eot -------------------------------------------------------------------------------- /src/components/views/fonts/FiraSans/firasansot-regularitalic-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/fonts/FiraSans/firasansot-regularitalic-webfont.ttf -------------------------------------------------------------------------------- /src/components/views/fonts/FiraSans/firasansot-regularitalic-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ensemble/HEAD/src/components/views/fonts/FiraSans/firasansot-regularitalic-webfont.woff -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Node 2 | /npm-debug.log* 3 | /node_modules 4 | 5 | # Tests 6 | /*driver.log 7 | /tests_output 8 | 9 | # Generated files 10 | /src/**/css/* 11 | !/src/**/css/README 12 | /build 13 | 14 | # Miscellaneous 15 | .DS_Store 16 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | # Unix line endings 5 | end_of_line = lf 6 | insert_final_newline = true 7 | 8 | trim_trailing_whitespace = true 9 | 10 | [*.{py,yml,html,css,styl,js,json,md}] 11 | indent_style = space 12 | indent_size = 4 13 | -------------------------------------------------------------------------------- /src/components/views/styl/includes/lib.styl: -------------------------------------------------------------------------------- 1 | // Responsive Breakpoints 2 | $base-tablet = unquote('all and (min-width: 550px)'); 3 | $base-desktop = unquote('all and (min-width: 1200px)'); 4 | 5 | // Colours 6 | $link-color-normal = #0070ff; 7 | 8 | // TODO: padding/margin spacing. 9 | -------------------------------------------------------------------------------- /src/components/views/NextButton.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Link } from 'react-router-dom'; 3 | 4 | import './css/NextButton.css'; 5 | 6 | 7 | export default props => ( 8 |
9 | {props.text} 10 |
11 | ); 12 | -------------------------------------------------------------------------------- /src/components/views/StripedHeader.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import './css/StripedHeader.css'; 4 | 5 | 6 | export default props => { 7 | return React.createElement( 8 | props.tag, 9 | {className: 'striped'}, 10 | {props.label} 11 | ); 12 | }; 13 | -------------------------------------------------------------------------------- /src/setupTests.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { configure, shallow } from 'enzyme'; 3 | import Adapter from 'enzyme-adapter-react-16'; 4 | 5 | 6 | configure({ adapter: new Adapter() }); 7 | 8 | // Make React and shallow available to individual test files 9 | global.React = React; 10 | global.shallow = shallow; 11 | -------------------------------------------------------------------------------- /src/tests/nightwatch/footer.js: -------------------------------------------------------------------------------- 1 | const { linksWork } = require('./utils'); 2 | 3 | 4 | module.exports = { 5 | before: browser => { 6 | browser.url(browser.launchUrl); 7 | }, 8 | 9 | 'All footer links work': browser => { 10 | browser.waitForElementVisible('footer'); 11 | linksWork(browser, 'footer a'); 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /src/components/views/styl/CustomizableDate.styl: -------------------------------------------------------------------------------- 1 | .customizable-date { 2 | display: flex; 3 | flex-wrap: wrap; 4 | justify-content: space-around; 5 | width: 100%; 6 | 7 | &.spaced { 8 | margin-top: 25px; 9 | } 10 | .labelled-selector { 11 | margin: 20px 0; 12 | } 13 | .striped { 14 | width: 100%; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/components/views/styl/Chart.styl: -------------------------------------------------------------------------------- 1 | .chart { 2 | margin-top: 20px; 3 | } 4 | 5 | /* Work around the following issue, which has been fixed, but not yet released 6 | to NPM. Any version of metrics-graphics after 2.15.6 should include the fix. 7 | https://github.com/metricsgraphics/metrics-graphics/issues/839 */ 8 | .mg-active-datapoint-container { 9 | transform: translate(0, -50px); 10 | } 11 | -------------------------------------------------------------------------------- /src/components/views/NotFound.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Helmet } from 'react-helmet'; 3 | 4 | import ErrorComponent from './Error'; 5 | 6 | 7 | export default () => ( 8 | 9 | 10 | 11 | 12 | 13 | 14 | ); 15 | -------------------------------------------------------------------------------- /src/components/views/styl/LabelledSelector.styl: -------------------------------------------------------------------------------- 1 | .labelled-selector { 2 | display: flex; 3 | align-items: center; 4 | justify-content: center; 5 | width: 100%; 6 | 7 | select { 8 | padding-top: 0; 9 | padding-bottom: 0; 10 | } 11 | label { 12 | margin-right: 10px; 13 | 14 | &::after { 15 | content: ': '; 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/components/views/Error.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | 4 | export default props => { 5 | let maybeMessage = null; 6 | 7 | if (props.message) { 8 | maybeMessage =

{props.message}

; 9 | } 10 | 11 | return ( 12 |
13 |

{props.title}

14 | {maybeMessage} 15 |
16 | ); 17 | }; 18 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Firefox Public Data Report", 3 | "name": "Firefox Public Data Report", 4 | "icons": [ 5 | { 6 | "src": "icons/favicon.ico", 7 | "sizes": "32x32 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "icons/favicon-196.png", 12 | "sizes": "196x196", 13 | "type": "image/png" 14 | } 15 | ], 16 | "start_url": ".", 17 | "display": "minimal-ui", 18 | "theme_color": "#ffffff", 19 | "background_color": "#ffffff" 20 | } 21 | -------------------------------------------------------------------------------- /src/tests/nightwatch/basics.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | before: browser => { 3 | browser.url(browser.launchUrl); 4 | }, 5 | 6 | 'React app renders': browser => { 7 | browser.expect.element('#application').to.be.present; 8 | }, 9 | 10 | 'Site

is correct': browser => { 11 | browser.expect.element('h1').text.to.be.equal('Firefox Public Data Report'); 12 | }, 13 | 14 | '