Added configurator
parent
9c4392ade6
commit
6c6b982623
|
@ -2,6 +2,7 @@
|
||||||
<div class="layout-wrapper">
|
<div class="layout-wrapper">
|
||||||
<app-topbar @menubutton-click="onMenuButtonClick"/>
|
<app-topbar @menubutton-click="onMenuButtonClick"/>
|
||||||
<app-menu :active="sidebarActive" />
|
<app-menu :active="sidebarActive" />
|
||||||
|
<app-configurator />
|
||||||
<div :class="['layout-mask', {'layout-mask-active': sidebarActive}]" @click="onMaskClick"></div>
|
<div :class="['layout-mask', {'layout-mask-active': sidebarActive}]" @click="onMaskClick"></div>
|
||||||
<div class="layout-content">
|
<div class="layout-content">
|
||||||
<router-view/>
|
<router-view/>
|
||||||
|
@ -18,6 +19,7 @@
|
||||||
import AppTopBar from '@/AppTopBar.vue';
|
import AppTopBar from '@/AppTopBar.vue';
|
||||||
import AppMenu from '@/AppMenu.vue';
|
import AppMenu from '@/AppMenu.vue';
|
||||||
import AppFooter from '@/AppFooter.vue';
|
import AppFooter from '@/AppFooter.vue';
|
||||||
|
import AppConfigurator from '@/AppConfigurator.vue';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
data() {
|
data() {
|
||||||
|
@ -42,7 +44,8 @@ export default {
|
||||||
components: {
|
components: {
|
||||||
'app-topbar': AppTopBar,
|
'app-topbar': AppTopBar,
|
||||||
'app-menu': AppMenu,
|
'app-menu': AppMenu,
|
||||||
'app-footer': AppFooter
|
'app-footer': AppFooter,
|
||||||
|
'app-configurator': AppConfigurator
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -0,0 +1,178 @@
|
||||||
|
<template>
|
||||||
|
<div :class="containerClass">
|
||||||
|
<div class="layout-config-content-wrapper">
|
||||||
|
<a href="#" class="layout-config-button" @click="toggleConfigurator">
|
||||||
|
<i class="pi pi-cog"></i>
|
||||||
|
</a>
|
||||||
|
<a href="#" class="layout-config-close" @click="hideConfigurator">
|
||||||
|
<i class="pi pi-times"></i>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<div class="layout-config-content">
|
||||||
|
<div class="free-themes">
|
||||||
|
<h1 style="margin-top: 0">FREE THEMES</h1>
|
||||||
|
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
|
||||||
|
<div class="p-grid">
|
||||||
|
<div class="p-col-3">
|
||||||
|
<button class="p-link">
|
||||||
|
<img src="./assets/images/layouts/themeswitcher-nova-light.png" alt="Nova Light" @click="changeTheme($event, 'nova-light', false)"/>
|
||||||
|
<i class="pi pi-check" v-if="theme === 'nova-light'" />
|
||||||
|
</button>
|
||||||
|
<span>Nova-Light</span>
|
||||||
|
</div>
|
||||||
|
<div class="p-col-3">
|
||||||
|
<button class="p-link">
|
||||||
|
<img src="./assets/images/layouts/themeswitcher-nova-dark.png" alt="Nova Dark" @click="changeTheme($event, 'nova-dark', false)"/>
|
||||||
|
<i class="pi pi-check" v-if="theme === 'nova-dark'" />
|
||||||
|
</button>
|
||||||
|
<span>Nova-Dark</span>
|
||||||
|
</div>
|
||||||
|
<div class="p-col-3">
|
||||||
|
<button class="p-link">
|
||||||
|
<img src="./assets/images/layouts/themeswitcher-nova-colored.png" alt="Nova Colored" @click="changeTheme($event, 'nova-colored', false)"/>
|
||||||
|
<i class="pi pi-check" v-if="theme === 'nova-colored'" />
|
||||||
|
</button>
|
||||||
|
<span>Nova-Colored</span>
|
||||||
|
</div>
|
||||||
|
<div class="p-col-3">
|
||||||
|
<button class="p-link">
|
||||||
|
<img src="./assets/images/layouts/themeswitcher-luna-blue.png" alt="Luna Blue" @click="changeTheme($event, 'luna-blue', false)"/>
|
||||||
|
<i class="pi pi-check" v-if="theme === 'luna-blue'" />
|
||||||
|
</button>
|
||||||
|
<span>Luna-Blue</span>
|
||||||
|
</div>
|
||||||
|
<div class="p-col-3">
|
||||||
|
<button class="p-link">
|
||||||
|
<img src="./assets/images/layouts/themeswitcher-luna-green.png" alt="Luna Green" @click="changeTheme($event, 'luna-green', false)"/>
|
||||||
|
<i class="pi pi-check" v-if="theme === 'luna-blue'" />
|
||||||
|
</button>
|
||||||
|
<span>Luna-Green</span>
|
||||||
|
</div>
|
||||||
|
<div class="p-col-3">
|
||||||
|
<button class="p-link">
|
||||||
|
<img src="./assets/images/layouts/themeswitcher-luna-amber.png" alt="Luna Amber" @click="changeTheme($event, 'luna-amber', false)" target="_blank"/>
|
||||||
|
<i class="pi pi-check" v-if="theme === 'luna-amber'" />
|
||||||
|
</button>
|
||||||
|
<span>Luna-Amber</span>
|
||||||
|
</div>
|
||||||
|
<div class="p-col-3">
|
||||||
|
<button class="p-link">
|
||||||
|
<img src="./assets/images/layouts/themeswitcher-luna-pink.png" alt="Luna Pink" @click="changeTheme($event, 'luna-pink', false)" target="_blank"/>
|
||||||
|
<i class="pi pi-check" v-if="theme === 'luna-pink'" />
|
||||||
|
</button>
|
||||||
|
<span>Luna-Pink</span>
|
||||||
|
</div>
|
||||||
|
<div class="p-col-3">
|
||||||
|
<button class="p-link">
|
||||||
|
<img src="./assets/images/layouts/themeswitcher-rhea.png" alt="Rhea" @click="changeTheme($event, 'rhea', false)" target="_blank"/>
|
||||||
|
<i class="pi pi-check" v-if="theme === 'rhea'" />
|
||||||
|
</button>
|
||||||
|
<span>Rhea</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="premium-themes">
|
||||||
|
<h1>PREMIUM VUE-CLI TEMPLATES</h1>
|
||||||
|
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
|
||||||
|
<div class="p-grid">
|
||||||
|
<div class="p-col-12">
|
||||||
|
<a href="https://www.primefaces.org/layouts/sapphire-vue">
|
||||||
|
<img alt="Sapphire" src="./assets/images/layouts/sapphire.jpg">
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="p-col-12">
|
||||||
|
<a href="https://www.primefaces.org/layouts/babylon-vue">
|
||||||
|
<img alt="Babylon" src="./assets/images/layouts/babylon.jpg">
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="p-col-12">
|
||||||
|
<a href="https://www.primefaces.org/layouts/avalon-vue">
|
||||||
|
<img alt="Avalon" src="./assets/images/layouts/avalon.jpg">
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
active: false,
|
||||||
|
theme: 'nova-light'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
outsideClickListener: null,
|
||||||
|
watch: {
|
||||||
|
$route() {
|
||||||
|
if (this.active) {
|
||||||
|
this.active = false;
|
||||||
|
this.unbindOutsideClickListener();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
containerClass() {
|
||||||
|
return ['layout-config', {'layout-config-active': this.active}];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
toggleConfigurator(event) {
|
||||||
|
this.active = !this.active;
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
if (this.active)
|
||||||
|
this.bindOutsideClickListener();
|
||||||
|
else
|
||||||
|
this.unbindOutsideClickListener();
|
||||||
|
},
|
||||||
|
hideConfigurator(event) {
|
||||||
|
this.active = false;
|
||||||
|
this.unbindOutsideClickListener();
|
||||||
|
event.preventDefault();
|
||||||
|
},
|
||||||
|
changeTheme(event, theme, dark) {
|
||||||
|
let themeElement = document.getElementById('theme-link');
|
||||||
|
themeElement.setAttribute('href', themeElement.getAttribute('href').replace(this.theme, theme));
|
||||||
|
this.theme = theme;
|
||||||
|
const hasBodyDarkTheme = this.hasClass(document.body, 'dark-theme');
|
||||||
|
|
||||||
|
if (dark) {
|
||||||
|
if (!hasBodyDarkTheme) {
|
||||||
|
this.addClass(document.body, 'dark-theme');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(hasBodyDarkTheme) {
|
||||||
|
this.removeClass(document.body, 'dark-theme');
|
||||||
|
}
|
||||||
|
|
||||||
|
this.hideThemesMenu();
|
||||||
|
event.preventDefault();
|
||||||
|
},
|
||||||
|
bindOutsideClickListener() {
|
||||||
|
if (!this.outsideClickListener) {
|
||||||
|
this.outsideClickListener = (event) => {
|
||||||
|
if (this.active && this.isOutsideClicked(event)) {
|
||||||
|
this.active = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
document.addEventListener('click', this.outsideClickListener);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
unbindOutsideClickListener() {
|
||||||
|
if (this.outsideClickListener) {
|
||||||
|
document.removeEventListener('click', this.outsideClickListener);
|
||||||
|
this.outsideClickListener = null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
isOutsideClicked(event) {
|
||||||
|
return !(this.$el.isSameNode(event.target) || this.$el.contains(event.target));
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
|
@ -40,6 +40,21 @@
|
||||||
border-top-right-radius: $val;
|
border-top-right-radius: $val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@mixin border-radius-left($val) {
|
||||||
|
-moz-border-radius-topleft: $val;
|
||||||
|
-webkit-border-top-left-radius: $val;
|
||||||
|
border-top-left-radius: $val;
|
||||||
|
-moz-border-radius-bottomleft: $val;
|
||||||
|
-webkit-border-bottom-left-radius: $val;
|
||||||
|
border-bottom-left-radius: $val;
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin border-radius($val) {
|
||||||
|
-moz-border-radius: $val;
|
||||||
|
-webkit-border-radius: $val;
|
||||||
|
border-radius: $val;
|
||||||
|
}
|
||||||
|
|
||||||
@keyframes pulse {
|
@keyframes pulse {
|
||||||
0% {
|
0% {
|
||||||
background-color: rgba(165, 165, 165, 0.1)
|
background-color: rgba(165, 165, 165, 0.1)
|
||||||
|
@ -52,6 +67,14 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@mixin rotate($deg) {
|
||||||
|
-webkit-transform: rotate($deg);
|
||||||
|
-moz-transform: rotate($deg);
|
||||||
|
-o-transform: rotate($deg);
|
||||||
|
-ms-transform: rotate($deg);
|
||||||
|
transform: rotate($deg);
|
||||||
|
}
|
||||||
|
|
||||||
$focusBorderColor:#8dcdff;
|
$focusBorderColor:#8dcdff;
|
||||||
|
|
||||||
body {
|
body {
|
||||||
|
@ -59,7 +82,7 @@ body {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
background-color: #20272a;
|
background-color: #ffffff;
|
||||||
font-family: "Open Sans", "Helvetica Neue", sans-serif;
|
font-family: "Open Sans", "Helvetica Neue", sans-serif;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
color: #484848;
|
color: #484848;
|
||||||
|
@ -114,7 +137,7 @@ body {
|
||||||
|
|
||||||
&:focus {
|
&:focus {
|
||||||
outline: 0 none;
|
outline: 0 none;
|
||||||
transition: box-shadow .3s;
|
transition: box-shadow .2s;
|
||||||
box-shadow: 0 0 0 0.2em $focusBorderColor;
|
box-shadow: 0 0 0 0.2em $focusBorderColor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -150,7 +173,7 @@ body {
|
||||||
&:focus {
|
&:focus {
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
outline: 0 none;
|
outline: 0 none;
|
||||||
transition: box-shadow .3s;
|
transition: box-shadow .2s;
|
||||||
box-shadow: inset 0 0 0 0.2em $focusBorderColor;
|
box-shadow: inset 0 0 0 0.2em $focusBorderColor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -345,7 +368,7 @@ body {
|
||||||
&:focus {
|
&:focus {
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
outline: 0 none;
|
outline: 0 none;
|
||||||
transition: box-shadow .3s;
|
transition: box-shadow .2s;
|
||||||
box-shadow: inset 0 0 0 0.2em $focusBorderColor;
|
box-shadow: inset 0 0 0 0.2em $focusBorderColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -497,7 +520,7 @@ body {
|
||||||
|
|
||||||
&:focus {
|
&:focus {
|
||||||
outline: 0 none;
|
outline: 0 none;
|
||||||
transition: box-shadow .3s;
|
transition: box-shadow .2s;
|
||||||
box-shadow: 0 0 0 0.2em $focusBorderColor;
|
box-shadow: 0 0 0 0.2em $focusBorderColor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -594,7 +617,7 @@ body {
|
||||||
|
|
||||||
&:focus {
|
&:focus {
|
||||||
outline: 0 none;
|
outline: 0 none;
|
||||||
transition: background-color .3s, box-shadow .3s;
|
transition: background-color .2s, box-shadow .2s;
|
||||||
box-shadow: 0 0 0 0.2em $focusBorderColor;
|
box-shadow: 0 0 0 0.2em $focusBorderColor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -713,6 +736,199 @@ body {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.layout-config {
|
||||||
|
position: fixed;
|
||||||
|
padding: 0;
|
||||||
|
top: 70px;
|
||||||
|
display: block;
|
||||||
|
right: 0;
|
||||||
|
width: 550px;
|
||||||
|
z-index: 996;
|
||||||
|
height: calc(100% - 70px);
|
||||||
|
transform: translate3d(550px, 0px, 0px);
|
||||||
|
@include transition(transform .2s);
|
||||||
|
background-color: #ffffff;
|
||||||
|
|
||||||
|
&.layout-config-active {
|
||||||
|
transform: translate3d(0px, 0px, 0px);
|
||||||
|
|
||||||
|
.layout-config-content {
|
||||||
|
.layout-config-button {
|
||||||
|
i {
|
||||||
|
@include rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.layout-config-content-wrapper {
|
||||||
|
position: relative;
|
||||||
|
height: 100%;
|
||||||
|
padding: 0;
|
||||||
|
@include shadow(0 2px 10px 0 rgba(0, 0, 0, 0.24));
|
||||||
|
|
||||||
|
.layout-config-button {
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
width: 52px;
|
||||||
|
height: 52px;
|
||||||
|
line-height: 52px;
|
||||||
|
background-color: #445c71;
|
||||||
|
text-align: center;
|
||||||
|
color: #fafafa;
|
||||||
|
top: 230px;
|
||||||
|
left: -51px;
|
||||||
|
z-index: -1;
|
||||||
|
overflow: hidden;
|
||||||
|
cursor: pointer;
|
||||||
|
@include border-radius-left(3px);
|
||||||
|
@include transition(background-color .2s, box-shadow .2s);
|
||||||
|
box-shadow: 0 7px 8px -4px rgba(0, 0, 0, 0.2),
|
||||||
|
0 5px 22px 4px rgba(0, 0, 0, 0.12),
|
||||||
|
0 12px 17px 2px rgba(0, 0, 0, 0.14);
|
||||||
|
|
||||||
|
i {
|
||||||
|
font-size: 42px;
|
||||||
|
line-height: inherit;
|
||||||
|
cursor: pointer;
|
||||||
|
@include rotate(0deg);
|
||||||
|
@include transition(transform 1s);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: #577691;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.layout-config-content {
|
||||||
|
overflow: auto;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.layout-config-close {
|
||||||
|
position: absolute;
|
||||||
|
width: 25px;
|
||||||
|
height: 25px;
|
||||||
|
line-height: 25px;
|
||||||
|
text-align: center;
|
||||||
|
right: 20px;
|
||||||
|
top: 20px;
|
||||||
|
z-index: 999;
|
||||||
|
background-color: #41b783;
|
||||||
|
@include border-radius(50%);
|
||||||
|
@include transition(background-color .2s, box-shadow .2s);
|
||||||
|
|
||||||
|
i {
|
||||||
|
color: #ffffff;
|
||||||
|
line-height: inherit;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: #3aa476;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
outline: 0 none;
|
||||||
|
box-shadow: 0 0 0 0.2em $focusBorderColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 18px;
|
||||||
|
letter-spacing: .1px;
|
||||||
|
margin: 0 0 .5em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.p-grid > div {
|
||||||
|
padding: 1em;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
span {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin: 0 0 2em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.free-themes {
|
||||||
|
padding: 2em;
|
||||||
|
color: #484848;
|
||||||
|
background-color: #ffffff;
|
||||||
|
|
||||||
|
p {
|
||||||
|
color: #727272;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.current-theme {
|
||||||
|
box-shadow: 0 0 0 0.2em $focusBorderColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
text-align: center;
|
||||||
|
position: relative;
|
||||||
|
@include transition(box-shadow .2s);
|
||||||
|
|
||||||
|
i {
|
||||||
|
line-height: inherit;
|
||||||
|
font-size: 28px;
|
||||||
|
color: #41b783;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 50%;
|
||||||
|
margin-left: -18px;
|
||||||
|
margin-top: -18px;
|
||||||
|
padding: .18em;
|
||||||
|
box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.25);
|
||||||
|
background-color: #ffffff;
|
||||||
|
border-radius: 50%;
|
||||||
|
width: 36px;
|
||||||
|
height: 36px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
box-shadow: 0 0 0 0.2em $focusBorderColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.premium-themes {
|
||||||
|
padding: 2em;
|
||||||
|
background-color: #2c3135;
|
||||||
|
color: #ffffff;
|
||||||
|
|
||||||
|
p {
|
||||||
|
color: #d8d8d8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 1024px) {
|
||||||
|
.layout-config {
|
||||||
|
top: 110px;
|
||||||
|
height: calc(100% - 110px);
|
||||||
|
transform: translate3d(100%, 0px, 0px);
|
||||||
|
|
||||||
|
.layout-config-button {
|
||||||
|
left: auto;
|
||||||
|
right: -52px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.layout-config-active {
|
||||||
|
width: 100%;
|
||||||
|
transform: translate3d(0px, 0px, 0px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
.clearfix {
|
.clearfix {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue