129 lines
2.0 KiB
Vue
129 lines
2.0 KiB
Vue
|
<template>
|
||
|
<article class="content-page"
|
||
|
:class="{ 'is-mounted': isMounted }"
|
||
|
>
|
||
|
<h1 v-if="heading !== ''" class="page-heading page-title">{{ heading }}</h1>
|
||
|
<section class="content-container load-transition">
|
||
|
<div v-if="$slots.default" class="content">
|
||
|
<slot></slot>
|
||
|
</div>
|
||
|
</section>
|
||
|
<div v-if="$slots.background" class="background">
|
||
|
<slot name="background"></slot>
|
||
|
</div>
|
||
|
</article>
|
||
|
</template>
|
||
|
|
||
|
<script>
|
||
|
export default {
|
||
|
props: {
|
||
|
heading: {
|
||
|
type: String,
|
||
|
required: false,
|
||
|
default: '',
|
||
|
}
|
||
|
},
|
||
|
|
||
|
data () {
|
||
|
return {
|
||
|
isMounted: false,
|
||
|
}
|
||
|
},
|
||
|
|
||
|
mounted () {
|
||
|
this.$nextTick(() => {
|
||
|
this.isMounted = true
|
||
|
})
|
||
|
},
|
||
|
}
|
||
|
</script>
|
||
|
|
||
|
<style lang="scss" scoped>
|
||
|
$z-index-bottom: 5;
|
||
|
$z-index-top: 10;
|
||
|
|
||
|
.content-page {
|
||
|
display: flex;
|
||
|
flex-direction: column;
|
||
|
width: 100%;
|
||
|
height: 100%;
|
||
|
padding: $site-menu__header-width 0 0 0;
|
||
|
overflow-y: auto;
|
||
|
|
||
|
@media (min-width: $bp__layout) {
|
||
|
padding: 0 0 0 $site-menu__header-width;
|
||
|
overflow-y: hidden;
|
||
|
}
|
||
|
|
||
|
background-color: $color__neutral-100;
|
||
|
}
|
||
|
|
||
|
.content-container {
|
||
|
z-index: $z-index-top;
|
||
|
position: relative;
|
||
|
|
||
|
height: 100%;
|
||
|
width: 100%;
|
||
|
|
||
|
@media (min-width: $bp__layout) {
|
||
|
position: absolute;
|
||
|
top: 0;
|
||
|
right: 0;
|
||
|
|
||
|
overflow-y: auto;
|
||
|
overflow-x: hidden;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
.content {
|
||
|
position: absolute;
|
||
|
display: flex;
|
||
|
align-items: stretch;
|
||
|
justify-content: stretch;
|
||
|
width: 100%;
|
||
|
min-height: 100%;
|
||
|
top: 0;
|
||
|
right: 0;
|
||
|
|
||
|
padding: .5rem 1rem 2rem;
|
||
|
|
||
|
@media (min-width: $bp__layout) {
|
||
|
width: 50%;
|
||
|
padding: 1rem;
|
||
|
|
||
|
background-color: rgba(0, 0, 0, .5);
|
||
|
}
|
||
|
|
||
|
color: #fff; // TEMP
|
||
|
}
|
||
|
|
||
|
.page-heading {
|
||
|
z-index: $z-index-top + 5;
|
||
|
position: relative;
|
||
|
}
|
||
|
|
||
|
.background {
|
||
|
z-index: $z-index-bottom;
|
||
|
position: absolute;
|
||
|
width: 100%;
|
||
|
height: 100%;
|
||
|
top: 0;
|
||
|
left: 0;
|
||
|
|
||
|
opacity: .5;
|
||
|
|
||
|
@media (min-width: $bp__layout) {
|
||
|
opacity: 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
.load-transition {
|
||
|
transition: 2s 2s;
|
||
|
opacity: 0;
|
||
|
|
||
|
@at-root .is-mounted & {
|
||
|
opacity: 1;
|
||
|
}
|
||
|
}
|
||
|
</style>
|