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 {