diff --git a/network-api/networkapi/buyersguide/templates/bg_base.html b/network-api/networkapi/buyersguide/templates/bg_base.html new file mode 100644 index 00000000000..612abe3faf7 --- /dev/null +++ b/network-api/networkapi/buyersguide/templates/bg_base.html @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + Privacy Not Included + + +
+
+
+ +

*privacy not included

+
+ +
+
+
+
+ Home + Toys & Games + Smart Home + Entertainment + Wearables + Health & Exercise + Pets + About the Guide +
+
+ +
{% block guts %}{% endblock %}
+ + + + + diff --git a/network-api/networkapi/buyersguide/templates/buyersguide_home.html b/network-api/networkapi/buyersguide/templates/buyersguide_home.html index 99a16df1e3c..c7ad2dc99d3 100644 --- a/network-api/networkapi/buyersguide/templates/buyersguide_home.html +++ b/network-api/networkapi/buyersguide/templates/buyersguide_home.html @@ -1,5 +1,15 @@ -Buyer's guide homepage! +{% extends "./bg_base.html" %} -{% for product in products %} -
{{product.name}}
-{% endfor %} +{% block body-id %}home{% endblock %} + +{% block guts %} + +
+

Buyer's guide homepage!

+ + {% for product in products %} +
{{product.name}}
+ {% endfor %} +
+ +{% endblock %} diff --git a/network-api/networkapi/buyersguide/templates/product_page.html b/network-api/networkapi/buyersguide/templates/product_page.html index 8ae5bba718e..09c3d92ca5a 100644 --- a/network-api/networkapi/buyersguide/templates/product_page.html +++ b/network-api/networkapi/buyersguide/templates/product_page.html @@ -1,19 +1,31 @@ -

{{product.name}}

+{% extends "./bg_base.html" %} - -
- {{product.company}} +{% block body-id %}TODO-CATEGORY{% endblock %} + +{% block guts %} + +
+

{{product.name}}

+ +
+ + +
+ {{product.company}} +
+
{{product.blurb}}
+
{{product.url}}
+
{{product.price}}
+
Camera: {{product.camera}}
+
Microphone: {{product.microphone}}
+
Location: {{product.location}}
+
Need account: {{product.need_account}}
+
Privacy Controls: {{product.privacy_controls}}
+
Delete Data: {{product.delete_data}}
+
Share Data: {{product.share_data}}
+
Child rules: {{product.child_rules}}
+
Privacy Policy: {{product.privacy_policy}}
+
Worst case scenario: {{product.worst_case}}
-
{{product.blurb}}
-
{{product.url}}
-
{{product.price}}
-
Camera: {{product.camera}}
-
Microphone: {{product.microphone}}
-
Location: {{product.location}}
-
Need account: {{product.need_account}}
-
Privacy Controls: {{product.privacy_controls}}
-
Delete Data: {{product.delete_data}}
-
Share Data: {{product.share_data}}
-
Child rules: {{product.child_rules}}
-
Privacy Policy: {{product.privacy_policy}}
-
Worst case scenario: {{product.worst_case}}
+ +{% endblock %} diff --git a/package.json b/package.json index 274e0b462a7..972e61a8291 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "build:images": "shx rm -rf network-api/networkapi/frontend/_images && shx cp -r source/images network-api/networkapi/frontend/_images", "build:js-uncompressed": "webpack", "build:js": "webpack -p", - "build:sass": "shx mkdir -p network-api/networkapi/frontend/_css && node-sass source/sass/main.scss network-api/networkapi/frontend/_css/main.compiled.css && npm run autoprefix", + "build:sass": "shx mkdir -p network-api/networkapi/frontend/_css && node-sass source/sass/main.scss network-api/networkapi/frontend/_css/main.compiled.css && node-sass source/sass/buyers-guide/bg-main.scss network-api/networkapi/frontend/_css/buyers-guide.compiled.css && npm run autoprefix", "build": "npm run build:common && npm run build:js", "build-uncompressed": "npm run build:common && npm run build:js-uncompressed", "heroku-postbuild": "npm run build", @@ -23,7 +23,7 @@ "server": "pipenv run python network-api/manage.py runserver", "start": "npm i && npm run build-uncompressed && run-p server watch:**", "snyk": "snyk test --file=package.json", - "test:eslint": "eslint --config ./.eslintrc.yaml scripts/**/*.js source/js/**/*.js source/js/components/**/*.jsx", + "test:eslint": "eslint --config ./.eslintrc.yaml scripts/**/*.js source/js/**/*.js source/js/components/**/*.jsx webpack.config.js", "test:scss": "stylelint \"source/sass/**/*.scss\" \"source/js/components/**/*.scss\" --syntax scss", "test": "npm run build && run-s test:**", "watch:images": "chokidar 'source/images/**/*' -c 'npm run build:images'", diff --git a/source/images/glyphs/email.svg b/source/images/glyphs/email.svg new file mode 100644 index 00000000000..34ec0e2d8f3 --- /dev/null +++ b/source/images/glyphs/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/source/images/glyphs/fb.svg b/source/images/glyphs/fb.svg new file mode 100644 index 00000000000..64dc50a0a01 --- /dev/null +++ b/source/images/glyphs/fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/source/js/buyers-guide/bg-main.js b/source/js/buyers-guide/bg-main.js new file mode 100644 index 00000000000..728ee8511ec --- /dev/null +++ b/source/js/buyers-guide/bg-main.js @@ -0,0 +1,21 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; + +import Creepometer from './components/creepometer/creepometer.jsx'; + +let main = { + init() { + this.injectReactComponents(); + }, + + // Embed various React components based on the existence of containers within the current page + injectReactComponents() { + if (document.querySelectorAll(`.creepometer`)) { + Array.from(document.querySelectorAll(`.creepometer`)).forEach(element => { + ReactDOM.render(, element); + }); + } + } +}; + +main.init(); diff --git a/source/js/buyers-guide/components/creepometer/creepometer.jsx b/source/js/buyers-guide/components/creepometer/creepometer.jsx new file mode 100644 index 00000000000..535ef569a2a --- /dev/null +++ b/source/js/buyers-guide/components/creepometer/creepometer.jsx @@ -0,0 +1,15 @@ +import React from 'react'; + +export default class Creepometer extends React.Component { + constructor(props) { + super(props); + + this.state = {}; + } + + render() { + return ( +
Creepometer 😬
+ ); + } +} diff --git a/source/js/buyers-guide/components/creepometer/creepometer.scss b/source/js/buyers-guide/components/creepometer/creepometer.scss new file mode 100644 index 00000000000..4a1fc320878 --- /dev/null +++ b/source/js/buyers-guide/components/creepometer/creepometer.scss @@ -0,0 +1,3 @@ +.creepometer { + border: 1px solid papayawhip; +} diff --git a/source/js/main.js b/source/js/main.js index eee73aac16d..2c1ebbf9a38 100644 --- a/source/js/main.js +++ b/source/js/main.js @@ -322,4 +322,3 @@ let main = { }; main.init(); - diff --git a/source/sass/buyers-guide/bg-main.scss b/source/sass/buyers-guide/bg-main.scss new file mode 100644 index 00000000000..e249da19d6d --- /dev/null +++ b/source/sass/buyers-guide/bg-main.scss @@ -0,0 +1,105 @@ +// Bootstrap + +@import '../../../node_modules/mofo-bootstrap/dest/css/mofo-bootstrap'; +@import '../../../node_modules/mofo-bootstrap/src/scss/custom/_colors'; +@import '../../../node_modules/bootstrap/scss/_variables'; +@import '../../../node_modules/bootstrap/scss/mixins'; + +// Breakpoints (imported from Bootstrap) + +$bp-xs: #{map-get($grid-breakpoints, xs)}; // < 576px +$bp-sm: #{map-get($grid-breakpoints, sm)}; // >= 576px +$bp-md: #{map-get($grid-breakpoints, md)}; // >= 768px +$bp-lg: #{map-get($grid-breakpoints, lg)}; // >= 992px +$bp-xl: #{map-get($grid-breakpoints, xl)}; // >= 1200px + +//Site-wide + +@import '../colors'; +@import '../mixins'; + +// React Components + +@import '../../js/buyers-guide/components/creepometer/creepometer'; + +// Non-React Components + +@import './components/future-non-react-component'; + +.btn-blue { + color: $white; + background: #3302ff; + + &:hover { + color: $white; + background: #4a90e2; + } +} + +// Misc + +@import '../resets'; +@import '../type'; +@import '../buttons'; +@import '../global'; +@import '../utilities'; + +// Header + +.moz-logo { + width: 97px; + height: 28px; + background-image: url("../_images/mozilla-on-black.svg"); + flex-shrink: 0; +} + +.primary-nav { + overflow-x: scroll; + white-space: nowrap; + border-top: 1px solid #ccc; + border-bottom: 1px solid #ccc; + + a { + display: inline-block; + font-family: "Nunito Sans"; + font-size: 17px; + color: #909090; + font-weight: 900; + margin-right: 20px; + padding: 10px 0 6px; + text-decoration: none; + + &:hover { + color: $black; + } + } +} + +#pni-home .nav-home { + border-bottom: 4px solid $black; + color: $black; +} + +.social-button { + display: block; + width: 25px; + height: 25px; + margin: 0 12px; + background-size: contain; + background-repeat: no-repeat; + background-position: center; +} + +.social-button-fb { + background-image: url("/_images/glyphs/fb.svg"); +} + +.social-button-twitter { + background-image: url("/_images/glyphs/twitter.svg"); +} + +.social-button-email { + background-image: url("/_images/glyphs/email.svg"); +} + +// View specific diff --git a/source/sass/buyers-guide/components/future-non-react-component.scss b/source/sass/buyers-guide/components/future-non-react-component.scss new file mode 100644 index 00000000000..70b786d12ed --- /dev/null +++ b/source/sass/buyers-guide/components/future-non-react-component.scss @@ -0,0 +1 @@ +// TODO diff --git a/webpack.config.js b/webpack.config.js index 7f5e7c3eebc..0f0f69f16b9 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,17 +1,28 @@ -module.exports = { +let loaders = [ + { + test: /\.js(x?)$/, + exclude: /node_modules/, + loader: `babel-loader`, + query: { + presets: [`es2015`, `react`] + } + } +]; + +module.exports = [{ entry: `./source/js/main.js`, output: { filename: `./network-api/networkapi/frontend/_js/main.compiled.js` }, module: { - loaders: [ - { - test: /\.js(x?)$/, - exclude: /node_modules/, - loader: `babel-loader`, - query: { - presets: [`es2015`, `react`] - } - } - ] - }}; + loaders: loaders + } +}, { + entry: `./source/js/buyers-guide/bg-main.js`, + output: { + filename: `./network-api/networkapi/frontend/_js/bg-main.compiled.js` + }, + module: { + loaders: loaders + } +}];