Updated app & header grid layout
This commit is contained in:
59
src/App.vue
59
src/App.vue
@@ -2,7 +2,10 @@
|
||||
<div id="app">
|
||||
<!-- Header and hamburger navigation -->
|
||||
<NavigationHeader class="header"></NavigationHeader>
|
||||
<NavigationIcons class="desktop-menu desktop-only" />
|
||||
|
||||
<div class="navigation-icons-gutter desktop-only">
|
||||
<NavigationIcons />
|
||||
</div>
|
||||
|
||||
<!-- Display the component assigned to the given route (default: home) -->
|
||||
<router-view class="content" :key="$route.fullPath"></router-view>
|
||||
@@ -37,36 +40,38 @@ export default {
|
||||
|
||||
#app {
|
||||
display: grid;
|
||||
// grid-template-columns: 90px 1fr 90px;
|
||||
grid-template-rows: var(--header-size);
|
||||
grid-template-columns: var(--header-size) 1fr;
|
||||
}
|
||||
|
||||
.header {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
grid-column: 1 / 3;
|
||||
grid-row: 1;
|
||||
z-index: 15;
|
||||
}
|
||||
|
||||
.content {
|
||||
grid-column: 2 / 3;
|
||||
grid-row: 2;
|
||||
z-index: 5;
|
||||
|
||||
@include mobile {
|
||||
grid-column: 1 / 3;
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.header {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
z-index: 15;
|
||||
}
|
||||
|
||||
.navigation-icons-gutter {
|
||||
position: fixed;
|
||||
height: 100vh;
|
||||
margin: 0;
|
||||
top: var(--header-size);
|
||||
width: var(--header-size);
|
||||
background-color: var(--background-color-secondary);
|
||||
}
|
||||
|
||||
.content {
|
||||
display: grid;
|
||||
grid-column: 2 / 3;
|
||||
grid-row: 2;
|
||||
z-index: 5;
|
||||
|
||||
@include mobile {
|
||||
grid-column: 1 / 3;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.desktop-menu {
|
||||
grid-column: 1 / 2;
|
||||
grid-row: 2;
|
||||
width: var(--header-size);
|
||||
position: fixed;
|
||||
top: var(--header-size);
|
||||
left: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
<script>
|
||||
import { mapActions, mapGetters } from "vuex";
|
||||
import Movie from "./Movie";
|
||||
import Movie from "./movie/Movie";
|
||||
import Person from "./Person";
|
||||
|
||||
export default {
|
||||
|
||||
@@ -9,11 +9,11 @@
|
||||
|
||||
<SearchInput />
|
||||
|
||||
<Hamburger />
|
||||
<Hamburger class="mobile-only" />
|
||||
|
||||
<NavigationIcon class="desktop-only" :route="profileRoute" />
|
||||
|
||||
<div class="nav__list mobile-only" :class="{ open: isOpen }">
|
||||
<div class="navigation-icons-grid mobile-only" :class="{ open: isOpen }">
|
||||
<NavigationIcons>
|
||||
<NavigationIcon :route="profileRoute" />
|
||||
</NavigationIcons>
|
||||
@@ -22,7 +22,7 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import storage from "@/storage";
|
||||
import { mapGetters, mapActions } from "vuex";
|
||||
import TmdbLogo from "../icons/tmdb-logo";
|
||||
import IconProfile from "../icons/IconProfile";
|
||||
import IconProfileLock from "../icons/IconProfileLock";
|
||||
@@ -32,7 +32,6 @@ import SearchInput from "@/components/SearchInput";
|
||||
import NavigationIcons from "src/components/NavigationIcons";
|
||||
import NavigationIcon from "src/components/ui/NavigationIcon";
|
||||
import Hamburger from "@/components/ui/Hamburger";
|
||||
import { mapGetters, mapActions } from "vuex";
|
||||
|
||||
export default {
|
||||
components: {
|
||||
@@ -46,11 +45,6 @@ export default {
|
||||
IconActivity,
|
||||
Hamburger
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
listTypes: storage.homepageLists
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapGetters("user", ["loggedIn"]),
|
||||
...mapGetters("hamburger", ["isOpen"]),
|
||||
@@ -112,7 +106,7 @@ nav {
|
||||
}
|
||||
}
|
||||
|
||||
.nav__list {
|
||||
.navigation-icons-grid {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
position: fixed;
|
||||
|
||||
@@ -32,44 +32,25 @@ export default {
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
routes: [],
|
||||
activeRoute: null
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
$route() {
|
||||
this.activeRoute = window.location.pathname;
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.activeRoute = window.location.pathname;
|
||||
this.routes = this.getAvailableRoutes();
|
||||
},
|
||||
methods: {
|
||||
getAvailableRoutes() {
|
||||
return [
|
||||
routes: [
|
||||
{
|
||||
title: "Requests",
|
||||
route: "/list/requests",
|
||||
apiPath: "/v2/requests",
|
||||
icon: IconInbox
|
||||
},
|
||||
{
|
||||
title: "Now Playing",
|
||||
route: "/list/now_playing",
|
||||
apiPath: "/v2/movie/now_playing",
|
||||
icon: IconNowPlaying
|
||||
},
|
||||
{
|
||||
title: "Popular",
|
||||
route: "/list/popular",
|
||||
apiPath: "/v2/movie/popular",
|
||||
icon: IconPopular
|
||||
},
|
||||
{
|
||||
title: "Upcoming",
|
||||
route: "/list/upcoming",
|
||||
apiPath: "/v2/movie/upcoming",
|
||||
icon: IconUpcoming
|
||||
},
|
||||
{
|
||||
@@ -84,8 +65,17 @@ export default {
|
||||
requiresAuth: true,
|
||||
icon: IconSettings
|
||||
}
|
||||
];
|
||||
],
|
||||
activeRoute: null
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
$route() {
|
||||
this.activeRoute = window.location.pathname;
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.activeRoute = window.location.pathname;
|
||||
}
|
||||
};
|
||||
</script>
|
||||
@@ -94,17 +84,20 @@ export default {
|
||||
@import "src/scss/media-queries";
|
||||
|
||||
.navigation-icons {
|
||||
display: inline-flex;
|
||||
flex-direction: column;
|
||||
margin: 0;
|
||||
display: grid;
|
||||
grid-column: 1fr;
|
||||
padding-left: 0;
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
background-color: var(--background-color-secondary);
|
||||
z-index: 15;
|
||||
width: 100%;
|
||||
|
||||
@include desktop {
|
||||
grid-template-rows: var(--header-size);
|
||||
}
|
||||
|
||||
@include mobile {
|
||||
flex-wrap: wrap;
|
||||
flex-direction: row;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
:detail="`Credited in ${movieCredits.length} movies`"
|
||||
v-if="credits"
|
||||
>
|
||||
<Cast :cast="movieCredits" />
|
||||
<CastList :cast="movieCredits" />
|
||||
</MovieDetail>
|
||||
|
||||
<MovieDetail
|
||||
@@ -62,7 +62,7 @@
|
||||
:detail="`Credited in ${showCredits.length} shows`"
|
||||
v-if="credits"
|
||||
>
|
||||
<Cast :cast="showCredits" />
|
||||
<CastList :cast="showCredits" />
|
||||
</MovieDetail>
|
||||
</div>
|
||||
</section>
|
||||
@@ -70,10 +70,10 @@
|
||||
|
||||
<script>
|
||||
import img from "@/directives/v-image";
|
||||
import Cast from "./Cast";
|
||||
import MovieDetail from "./ui/MovieDetail";
|
||||
import MovieDescription from "./ui/MovieDescription";
|
||||
import LoadingPlaceholder from "./ui/LoadingPlaceholder";
|
||||
import CastList from "@/components/CastList";
|
||||
import MovieDetail from "@/components/movie/Detail";
|
||||
import MovieDescription from "@/components/movie/Description";
|
||||
import LoadingPlaceholder from "@/components/ui/LoadingPlaceholder";
|
||||
|
||||
import { getPerson, getPersonCredits } from "@/api";
|
||||
|
||||
@@ -92,7 +92,7 @@ export default {
|
||||
components: {
|
||||
MovieDetail,
|
||||
MovieDescription,
|
||||
Cast,
|
||||
CastList,
|
||||
LoadingPlaceholder
|
||||
},
|
||||
directives: { img: img }, // TODO decide to remove or use
|
||||
|
||||
@@ -67,6 +67,7 @@ export default {
|
||||
&.shortList {
|
||||
overflow: auto;
|
||||
grid-auto-flow: column;
|
||||
max-width: 100vw;
|
||||
|
||||
@include noscrollbar;
|
||||
|
||||
|
||||
@@ -2,9 +2,7 @@
|
||||
<router-link
|
||||
:to="{ path: route.route }"
|
||||
:key="route.title"
|
||||
v-if="
|
||||
route.requiresAuth == undefined || (route.requiresAuth && userLoggedIn)
|
||||
"
|
||||
v-if="route.requiresAuth == undefined || (route.requiresAuth && loggedIn)"
|
||||
>
|
||||
<li class="navigation-link" :class="{ active: route.route == active }">
|
||||
<component class="navigation-icon" :is="route.icon"></component>
|
||||
@@ -14,6 +12,8 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapGetters, mapActions } from "vuex";
|
||||
|
||||
export default {
|
||||
name: "NavigationIcons",
|
||||
props: {
|
||||
@@ -27,9 +27,7 @@ export default {
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
userLoggedIn() {
|
||||
return localStorage.getItem("token") ? true : false;
|
||||
}
|
||||
...mapGetters("user", ["loggedIn"])
|
||||
}
|
||||
};
|
||||
</script>
|
||||
@@ -40,21 +38,14 @@ export default {
|
||||
.navigation-link {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
height: var(--header-size);
|
||||
min-height: var(--header-size);
|
||||
list-style: none;
|
||||
padding: 1rem 0.15rem;
|
||||
margin: 0;
|
||||
text-align: center;
|
||||
background-color: var(--background-color-secondary);
|
||||
transition: transform 0.3s ease, color 0.3s ease, stoke 0.3s ease,
|
||||
fill 0.3s ease, background-color 0.5s ease;
|
||||
|
||||
@include mobile {
|
||||
height: 90px;
|
||||
padding: 1rem;
|
||||
width: 50vw;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
transform: scale(1.05);
|
||||
}
|
||||
|
||||
@@ -8,51 +8,51 @@ let routes = [
|
||||
{
|
||||
name: "home",
|
||||
path: "/",
|
||||
component: resolve => require(["./components/Home.vue"], resolve)
|
||||
component: resolve => require(["./pages/Home.vue"], resolve)
|
||||
},
|
||||
{
|
||||
name: "activity",
|
||||
path: "/activity",
|
||||
meta: { requiresAuth: true },
|
||||
component: resolve => require(["./components/ActivityPage.vue"], resolve)
|
||||
component: resolve => require(["./pages/ActivityPage.vue"], resolve)
|
||||
},
|
||||
{
|
||||
name: "profile",
|
||||
path: "/profile",
|
||||
meta: { requiresAuth: true },
|
||||
component: resolve => require(["./components/Profile.vue"], resolve)
|
||||
component: resolve => require(["./pages/Profile.vue"], resolve)
|
||||
},
|
||||
{
|
||||
name: "list",
|
||||
path: "/list/requests",
|
||||
component: resolve => require(["./components/RequestPage.vue"], resolve)
|
||||
component: resolve => require(["./pages/RequestPage.vue"], resolve)
|
||||
},
|
||||
{
|
||||
name: "list",
|
||||
path: "/list/:name",
|
||||
component: resolve => require(["./components/ListPage.vue"], resolve)
|
||||
component: resolve => require(["./pages/ListPage.vue"], resolve)
|
||||
},
|
||||
{
|
||||
name: "search",
|
||||
path: "/search",
|
||||
component: resolve => require(["./components/SearchPage.vue"], resolve)
|
||||
component: resolve => require(["./pages/SearchPage.vue"], resolve)
|
||||
},
|
||||
{
|
||||
name: "register",
|
||||
path: "/register",
|
||||
component: resolve => require(["./components/Register.vue"], resolve)
|
||||
component: resolve => require(["./pages/Register.vue"], resolve)
|
||||
},
|
||||
{
|
||||
name: "settings",
|
||||
path: "/settings",
|
||||
meta: { requiresAuth: true },
|
||||
component: resolve => require(["./components/Settings.vue"], resolve)
|
||||
component: resolve => require(["./pages/Settings.vue"], resolve)
|
||||
},
|
||||
{
|
||||
name: "signin",
|
||||
path: "/signin",
|
||||
alias: "/login",
|
||||
component: resolve => require(["./components/Signin.vue"], resolve)
|
||||
component: resolve => require(["./pages/Signin.vue"], resolve)
|
||||
},
|
||||
// {
|
||||
// name: 'user-requests',
|
||||
@@ -64,7 +64,7 @@ let routes = [
|
||||
{
|
||||
name: "404",
|
||||
path: "/404",
|
||||
component: resolve => require(["./components/404.vue"], resolve)
|
||||
component: resolve => require(["./pages/404.vue"], resolve)
|
||||
},
|
||||
{
|
||||
path: "*",
|
||||
|
||||
Reference in New Issue
Block a user