diff --git a/public/img/item-icons/tile-icons/networking/compliance.png b/public/img/item-icons/tile-icons/networking/compliance.png
new file mode 100644
index 00000000..9f6a838f
Binary files /dev/null and b/public/img/item-icons/tile-icons/networking/compliance.png differ
diff --git a/src/components/Collapsable.vue b/src/components/Collapsable.vue
index 9c9e350e..c6efc5d9 100644
--- a/src/components/Collapsable.vue
+++ b/src/components/Collapsable.vue
@@ -74,7 +74,6 @@ export default {
@import '../../src/styles/constants.scss';
.collapsable {
- // width: 310px;
padding: 5px;
margin: 10px;
border-radius: $curve-factor;
@@ -82,7 +81,9 @@ export default {
// background: -webkit-linear-gradient(to left top, #9F86FF, #1CA8DD, #007AE1);
// background: linear-gradient(to left top, #9F86FF, #1CA8DD, #007AE1);
box-shadow: 1px 1px 2px #130f23;
- width: auto;
+ height: fit-content;
+ width: 100%;
+ width: stretch;
// &.col-1 { width: 155px; }
// &.col-2 { width: 310px; }
// &.col-3 { width: 465px; }
diff --git a/src/lib/vue-masonry-css.js b/src/lib/vue-masonry-css.js
deleted file mode 100644
index 79f8f6d7..00000000
--- a/src/lib/vue-masonry-css.js
+++ /dev/null
@@ -1,226 +0,0 @@
-/* eslint-disable */
-// the component name ``
-// can be overridden with `Vue.use(Masonry, { name: 'the-masonry' });`
-const componentName = 'masonry';
-
-const props = {
- tag: {
- type: [String],
- default: 'div',
- },
- cols: {
- type: [Object, Number, String],
- default: 2,
- },
- gutter: {
- type: [Object, Number, String],
- default: 0,
- },
- css: {
- type: [Boolean],
- default: true,
- },
- columnTag: {
- type: [String],
- default: 'div',
- },
- columnClass: {
- type: [String, Array, Object],
- default: () => [],
- },
- columnAttr: {
- type: [Object],
- default: () => ({}),
- },
-};
-
-// Get the resulting value from `:col=` prop
-// based on the window width
-const breakpointValue = (mixed, windowWidth) => {
- const valueAsNum = parseInt(mixed);
-
- if (valueAsNum > -1) {
- return mixed;
- } if (typeof mixed !== 'object') {
- return 0;
- }
-
- let matchedBreakpoint = Infinity;
- let matchedValue = mixed.default || 0;
-
- for (const k in mixed) {
- const breakpoint = parseInt(k);
- const breakpointValRaw = mixed[breakpoint];
- const breakpointVal = parseInt(breakpointValRaw);
-
- if (isNaN(breakpoint) || isNaN(breakpointVal)) {
- continue;
- }
-
- const isNewBreakpoint = windowWidth <= breakpoint && breakpoint < matchedBreakpoint;
-
- if (isNewBreakpoint) {
- matchedBreakpoint = breakpoint;
- matchedValue = breakpointValRaw;
- }
- }
-
- return matchedValue;
-};
-
-const component = {
- props,
-
- data() {
- return {
- displayColumns: 2,
- displayGutter: 0,
- };
- },
-
- mounted() {
- this.$nextTick(() => {
- this.reCalculate();
- });
-
- // Bind resize handler to page
- if (window) {
- window.addEventListener('resize', this.reCalculate);
- }
- },
-
- updated() {
- this.$nextTick(() => {
- this.reCalculate();
- });
- },
-
- beforeDestroy() {
- if (window) {
- window.removeEventListener('resize', this.reCalculate);
- }
- },
-
- methods: {
- // Recalculate how many columns to display based on window width
- // and the value of the passed `:cols=` prop
- reCalculate() {
- const previousWindowWidth = this.windowWidth;
-
- this.windowWidth = (window ? window.innerWidth : null) || Infinity;
-
- // Window resize events get triggered on page height
- // change which when loading the page can result in multiple
- // needless calculations. We prevent this here.
- if (previousWindowWidth === this.windowWidth) {
- return;
- }
-
- this._reCalculateColumnCount(this.windowWidth);
-
- this._reCalculateGutterSize(this.windowWidth);
- },
-
- _reCalculateGutterSize(windowWidth) {
- this.displayGutter = breakpointValue(this.gutter, windowWidth);
- },
-
- _reCalculateColumnCount(windowWidth) {
- let newColumns = breakpointValue(this.cols, windowWidth);
-
- // Make sure we can return a valid value
- newColumns = Math.max(1, Number(newColumns) || 0);
-
- this.displayColumns = newColumns;
- },
-
- _getChildItemsInColumnsArray() {
- const columns = [];
- let childItems = this.$slots.default || [];
-
- // This component does not work with a child ..yet,
- // so for now we think it may be helpful to ignore until we can find a way for support
- if (childItems.length === 1 && childItems[0].componentOptions && childItems[0].componentOptions.tag == 'transition-group') {
- childItems = childItems[0].componentOptions.children;
- }
-
- // Loop through child elements
- for (let i = 0, visibleItemI = 0; i < childItems.length; i++, visibleItemI++) {
- // skip Vue elements without tags, which includes
- // whitespace elements and also plain text
- if (!childItems[i].tag) {
- visibleItemI--;
-
- continue;
- }
-
- // Get the column index the child item will end up in
- const columnIndex = visibleItemI % this.displayColumns;
-
- if (!columns[columnIndex]) {
- columns[columnIndex] = [];
- }
-
- columns[columnIndex].push(childItems[i]);
- }
-
- return columns;
- },
- },
-
- render(createElement) {
- const columnsContainingChildren = this._getChildItemsInColumnsArray();
- const isGutterSizeUnitless = parseInt(this.displayGutter) === this.displayGutter * 1;
- const gutterSizeWithUnit = isGutterSizeUnitless ? `${this.displayGutter}px` : this.displayGutter;
-
- const columnStyle = {
- boxSizing: 'border-box',
- backgroundClip: 'padding-box',
- width: `${100 / this.displayColumns}%`,
- border: '0 solid transparent',
- borderLeftWidth: gutterSizeWithUnit,
- };
-
- const columns = columnsContainingChildren.map((children, index) =>
- // / Create column element and inject the children
- createElement(this.columnTag, {
- key: `${index}-${columnsContainingChildren.length}`,
- style: this.css ? columnStyle : null,
- class: this.columnClass,
- attrs: this.columnAttr,
- }, children), // specify child items here
- );
-
- const containerStyle = {
- display: ['-webkit-box', '-ms-flexbox', 'flex'],
- marginLeft: `-${gutterSizeWithUnit}`,
- };
-
- // Return wrapper with columns
- return createElement(
- this.tag, // tag name
- this.css ? { style: containerStyle } : null, // element options
- columns, // column vue elements
- );
- },
-};
-
-const Plugin = function () {};
-
-Plugin.install = function (Vue, options) {
- if (Plugin.installed) {
- return;
- }
-
- if (options && options.name) {
- Vue.component(options.name, component);
- } else {
- Vue.component(componentName, component);
- }
-};
-
-if (typeof window !== 'undefined' && window.Vue) {
- window.Vue.use(Plugin);
-}
-
-export default Plugin;
diff --git a/src/main.js b/src/main.js
index 1f01c1bd..219d4eee 100644
--- a/src/main.js
+++ b/src/main.js
@@ -4,10 +4,8 @@ import 'element-ui/lib/theme-chalk/index.css';
import App from './App.vue';
import router from './router';
import './registerServiceWorker';
-import VueMasonry from './lib/vue-masonry-css'; // Thank you @PaulCollett 🙌 https://git.io/JeeYC
Vue.use(Element);
-Vue.use(VueMasonry);
Vue.config.productionTip = false;
new Vue({
diff --git a/src/styles/media-queries.scss b/src/styles/media-queries.scss
new file mode 100644
index 00000000..24d835a0
--- /dev/null
+++ b/src/styles/media-queries.scss
@@ -0,0 +1,40 @@
+
+/* Widths in px */
+$tiny: 600px;
+$small: 780px;
+$medium: 1150px;
+$large: 1780px;
+$extra-large: 2800px;
+
+/* Usage @include tablet { ... } */
+
+@mixin phone {
+ @media (max-width: #{$tiny - 1px}) {
+ @content;
+ }
+}
+
+@mixin tablet {
+ @media (min-width: #{$tiny}) and (max-width: #{$small - 1px}) {
+ @content;
+ }
+}
+
+@mixin laptop {
+ @media (min-width: #{$small}) and (max-width: #{$medium - 1px}) {
+ @content;
+ }
+}
+
+@mixin monitor {
+ @media (min-width: #{$medium}) and (max-width: #{$large - 1px}) {
+ @content;
+ }
+}
+
+@mixin big-screen {
+ @media (min-width: #{$large}) {
+ @content;
+ }
+}
+
diff --git a/src/views/Home.vue b/src/views/Home.vue
index dccf26f9..9b24a238 100644
--- a/src/views/Home.vue
+++ b/src/views/Home.vue
@@ -3,20 +3,15 @@
-
-
-
+
@@ -69,22 +64,34 @@ export default {