mirror of
https://github.com/romancm/gamebrary
synced 2024-11-10 05:34:15 +00:00
more updates
This commit is contained in:
parent
a5f3d78752
commit
e77eb42a13
17 changed files with 370 additions and 308 deletions
BIN
public/img/open-source-logo.png
Normal file
BIN
public/img/open-source-logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 10 KiB |
1
public/img/vue-awesome-logo.svg
Normal file
1
public/img/vue-awesome-logo.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 8.4 KiB |
|
@ -28,7 +28,8 @@
|
|||
|
||||
<template v-if="user">
|
||||
<!-- TODO: show active board at top -->
|
||||
<h4 class="mx-2">Boards:</h4>
|
||||
<h4 class="my-2">Add to list:</h4>
|
||||
|
||||
<b-list-group flush>
|
||||
<b-list-group-item
|
||||
v-for="board in formattedBoards"
|
||||
|
|
52
src/components/Game/GameActions.vue
Normal file
52
src/components/Game/GameActions.vue
Normal file
|
@ -0,0 +1,52 @@
|
|||
|
||||
<template lang="html">
|
||||
<div>
|
||||
<portal v-if="user" to="headerActions">
|
||||
<b-button-group class="mr-2">
|
||||
<b-button @click="$bus.$emit('ADD_GAME', game.id)">
|
||||
<i class="fa-solid fa-plus fa-fw" />
|
||||
Add to list
|
||||
</b-button>
|
||||
|
||||
<b-button :to="{ name: 'game.tags', params: { id: game.id, slug: game.slug } }">
|
||||
<i class="fa-solid fa-tags fa-fw" />
|
||||
Tags
|
||||
</b-button>
|
||||
|
||||
<b-button :to="{ name: 'game.progress', params: { id: game.id, slug: game.slug } }">
|
||||
<i class="fa-solid fa-bars-progress fa-fw" />
|
||||
Track progress
|
||||
</b-button>
|
||||
|
||||
<b-button :to="{ name: 'game.notes', params: { id: game.id, slug: game.slug } }">
|
||||
<i class="fa-solid fa-note-sticky fa-fw" />
|
||||
Notes
|
||||
</b-button>
|
||||
|
||||
<b-button :to="{ name: 'game.news', params: { id: game.id, slug: game.slug } }">
|
||||
<i class="fa-solid fa-newspaper fa-fw" />
|
||||
News
|
||||
</b-button>
|
||||
|
||||
<b-button :to="{ name: 'game.media', params: { id: game.id, slug: game.slug } }">
|
||||
<i class="fa-solid fa-photo-film fa-fw" />
|
||||
Images / Videos
|
||||
</b-button>
|
||||
</b-button-group>
|
||||
</portal>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapState } from 'vuex';
|
||||
|
||||
export default {
|
||||
computed: {
|
||||
...mapState(['game', 'user']),
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" rel="stylesheet/scss" scoped>
|
||||
</style>
|
|
@ -1,29 +0,0 @@
|
|||
<template lang="html">
|
||||
<div>
|
||||
<game-note
|
||||
v-if="note"
|
||||
:note="note"
|
||||
class="cursor-pointer"
|
||||
@click.native="$router.push({ name: 'game.notes', params: { id: game.id } })"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapState } from 'vuex';
|
||||
import GameNote from '@/components/GameNote';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
GameNote,
|
||||
},
|
||||
|
||||
computed: {
|
||||
...mapState(['notes', 'game']),
|
||||
|
||||
note() {
|
||||
return this.notes[this.game?.id] || null;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
|
@ -1,15 +1,34 @@
|
|||
<template lang="html">
|
||||
<div>
|
||||
<b-col>
|
||||
<b-row>
|
||||
<b-col
|
||||
offset="2"
|
||||
offset-sm="0"
|
||||
cols="8"
|
||||
sm="4"
|
||||
md="4"
|
||||
xl="3"
|
||||
>
|
||||
<router-link :to="{ name: 'game', params: { id: game.id, slug: game.slug }}">
|
||||
<b-img :src="gameCoverUrl" width="200" rounded class="mb-2 mr-2" />
|
||||
<b-img
|
||||
:src="gameCoverUrl"
|
||||
rounded
|
||||
class="cursor-pointer"
|
||||
fluid-grow
|
||||
/>
|
||||
</router-link>
|
||||
</b-col>
|
||||
|
||||
<b-col>
|
||||
<b-col
|
||||
cols="12"
|
||||
sm="8"
|
||||
md="8"
|
||||
lg="8"
|
||||
xl="9"
|
||||
class="bg-white rounded p-5"
|
||||
>
|
||||
<slot />
|
||||
</b-col>
|
||||
</div>
|
||||
</b-row>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
|
|
@ -56,7 +56,7 @@ export default {
|
|||
},
|
||||
|
||||
async loadGames() {
|
||||
this.similarGames = [];
|
||||
// this.similarGames = [];
|
||||
|
||||
// TODO: use try catch
|
||||
// TODO: append cover url directly here
|
||||
|
|
|
@ -7,12 +7,14 @@
|
|||
img-top
|
||||
class="mb-2"
|
||||
footer-class="p-0 text-center font-weight-bold bold strong"
|
||||
@click="addGameToList"
|
||||
@click="handleClick"
|
||||
>
|
||||
<!-- :to="{ name: 'game', params: { id: game.id, slug: game.slug }}" -->
|
||||
|
||||
<template #footer>
|
||||
<small class="text-muted">
|
||||
<!-- <pre>{{ selectedBoard }}</pre> -->
|
||||
<!-- <pre>{{ selectedList }}</pre> -->
|
||||
<strong>{{ game.name }}</strong>
|
||||
</small>
|
||||
</template>
|
||||
|
@ -32,19 +34,69 @@ export default {
|
|||
},
|
||||
|
||||
computed: {
|
||||
...mapState(['user']),
|
||||
...mapState(['user', 'boards']),
|
||||
|
||||
coverUrl() {
|
||||
return getGameCoverUrl(this.game);
|
||||
}
|
||||
},
|
||||
|
||||
selectedBoard() {
|
||||
const { boardId } = this.$route.query;
|
||||
|
||||
return this.boards.find(({ id }) => id === boardId);
|
||||
},
|
||||
|
||||
selectedList() {
|
||||
const { listIndex } = this.$route.query;
|
||||
|
||||
return this.selectedBoard.lists[listIndex];
|
||||
},
|
||||
},
|
||||
|
||||
methods: {
|
||||
addGameToList() {
|
||||
handleClick() {
|
||||
const { listIndex, boardId } = this.$route.query;
|
||||
|
||||
if (listIndex && boardId) return this.addGameToList();
|
||||
|
||||
return this.user
|
||||
? this.$bus.$emit('ADD_GAME', this.game.id)
|
||||
: this.$router.push({ name: 'game', params: { id: this.game.id, slug: this.game.slug }});
|
||||
},
|
||||
|
||||
addGameToList() {
|
||||
return this.selectedList.games.includes(this.game.id)
|
||||
? this.removeGame()
|
||||
: this.addGame();
|
||||
},
|
||||
|
||||
async addGame() {
|
||||
const boardIndex = this.boards.findIndex(({ id }) => id === this.selectedBoard.id);
|
||||
const board = this.boards[boardIndex];
|
||||
console.log(board);
|
||||
|
||||
// board.lists[listIndex].games.push(this.game.id);
|
||||
|
||||
// try {
|
||||
// await this.$store.dispatch('SAVE_GAME_BOARD', board);
|
||||
// } catch (e) {
|
||||
// // this.$bvToast.toast(`There was an error adding "${this.game.name}"`, { title: list.name, variant: 'danger' });
|
||||
// }
|
||||
},
|
||||
|
||||
async removeGame({ listIndex, boardId }) {
|
||||
// const boardIndex = this.boards.findIndex(({ id }) => id === boardId);
|
||||
// const board = this.boards[boardIndex];
|
||||
// const gameIndex = board.lists[listIndex].games.indexOf(this.gameId);
|
||||
//
|
||||
// board.lists[listIndex].games.splice(gameIndex, 1);
|
||||
//
|
||||
// try {
|
||||
// await this.$store.dispatch('SAVE_GAME_BOARD', board);
|
||||
// } catch (e) {
|
||||
// // this.$bvToast.toast(`There was an error removing "${this.game.name}"`, { title: list.name, variant: 'danger' });
|
||||
// }
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<template lang="html">
|
||||
<b-container fluid>
|
||||
<div>
|
||||
<b-card
|
||||
v-for="({ games, hex, tagTextColor }, name) in tags"
|
||||
class="tags-list"
|
||||
|
@ -47,7 +47,7 @@
|
|||
/>
|
||||
</div>
|
||||
</b-card>
|
||||
</b-container>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
@ -79,6 +79,5 @@ export default {
|
|||
<style lang="scss" rel="stylesheet/scss" scoped>
|
||||
.tags-list {
|
||||
background: #fc0;
|
||||
max-width: 100%;
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -5,6 +5,20 @@
|
|||
<board-placeholder v-if="loading" />
|
||||
|
||||
<template v-else-if="showBoard">
|
||||
<portal to="headerTitle">
|
||||
<div class="w-100 d-flex align-items-center justify-content-between">
|
||||
<h3 class="m-0">{{ board.name }}</h3>
|
||||
|
||||
<b-button
|
||||
:to="{ name: 'board.edit', params: { id: board.id } }"
|
||||
variant="primary"
|
||||
class="mr-2"
|
||||
>
|
||||
Edit
|
||||
</b-button>
|
||||
</div>
|
||||
</portal>
|
||||
|
||||
<!-- TODO: put board in component -->
|
||||
<game-list
|
||||
v-for="(list, listIndex) in board.lists"
|
||||
|
|
|
@ -1,31 +1,10 @@
|
|||
<template lang="html">
|
||||
<b-container fluid>
|
||||
<portal to="headerTitle">
|
||||
test
|
||||
My Boards
|
||||
</portal>
|
||||
|
||||
<header>
|
||||
</header>
|
||||
|
||||
<b-button
|
||||
variant="primary"
|
||||
class="mr-2"
|
||||
:to="{ name: 'notes.settings' }"
|
||||
>
|
||||
Notes
|
||||
</b-button>
|
||||
|
||||
<b-button
|
||||
variant="primary"
|
||||
class="mr-2"
|
||||
:to="{ name: 'tags.settings' }"
|
||||
>
|
||||
Tags
|
||||
</b-button>
|
||||
|
||||
<div>
|
||||
My Boards
|
||||
|
||||
<portal to="headerActions">
|
||||
<b-button
|
||||
variant="primary"
|
||||
class="mr-2"
|
||||
|
@ -33,10 +12,9 @@
|
|||
>
|
||||
Create board
|
||||
</b-button>
|
||||
</portal>
|
||||
|
||||
<game-boards class="mb-3" />
|
||||
</div>
|
||||
|
||||
<game-boards class="mb-3" />
|
||||
|
||||
<empty-state
|
||||
v-if="boards.length === 0"
|
||||
|
|
|
@ -46,7 +46,6 @@
|
|||
label="Sort list by:"
|
||||
label-for="sortField"
|
||||
>
|
||||
<!-- description="We'll never share your email with anyone else." -->
|
||||
<b-form-select
|
||||
id="sortField"
|
||||
:options="sortOptions"
|
||||
|
@ -284,8 +283,9 @@ export default {
|
|||
|
||||
await this.$store.dispatch('LOAD_BOARD', this.$route.params.id)
|
||||
|
||||
// TODO: set default values
|
||||
this.list = JSON.parse(JSON.stringify(this.board.lists[this.$route.params.listIndex]));
|
||||
if (this.list.settings.sortOrder === undefined) this.list.settings.sortOrder = 'sortByCustom';
|
||||
if (this.list.settings.view === undefined) this.list.settings.view = 'single';
|
||||
|
||||
const hasGames = this.list?.games?.length > 0;
|
||||
|
||||
|
|
|
@ -5,51 +5,47 @@
|
|||
Loading...
|
||||
</div>
|
||||
|
||||
<b-form-row v-else>
|
||||
<game-sub-page>
|
||||
<b-col>
|
||||
<game-note v-if="note" :note="{ note }" />
|
||||
<game-sub-page v-else>
|
||||
<game-note v-if="note" :note="{ note }" />
|
||||
|
||||
<b-button
|
||||
variant="primary"
|
||||
:disabled="saving || !dirtied"
|
||||
@click="saveNote"
|
||||
>
|
||||
<b-spinner small v-if="saving" />
|
||||
<span v-else>{{ $t('global.save') }}</span>
|
||||
</b-button>
|
||||
<b-button
|
||||
variant="primary"
|
||||
:disabled="saving || !dirtied"
|
||||
@click="saveNote"
|
||||
>
|
||||
<b-spinner small v-if="saving" />
|
||||
<span v-else>{{ $t('global.save') }}</span>
|
||||
</b-button>
|
||||
|
||||
<b-button
|
||||
variant="danger"
|
||||
class="mr-1"
|
||||
v-if="notes[game.id] && !saving"
|
||||
:disabled="deleting"
|
||||
@click="deleteNote"
|
||||
>
|
||||
<b-spinner small v-if="deleting" />
|
||||
<b-button
|
||||
variant="danger"
|
||||
class="mr-1"
|
||||
v-if="notes[game.id] && !saving"
|
||||
:disabled="deleting"
|
||||
@click="deleteNote"
|
||||
>
|
||||
<b-spinner small v-if="deleting" />
|
||||
|
||||
<i class="d-sm-none fas fa-trash fa-fw" aria-hidden />
|
||||
<span class="d-none d-sm-inline">{{ $t('global.delete') }}</span>
|
||||
</b-button>
|
||||
<i class="d-sm-none fas fa-trash fa-fw" aria-hidden />
|
||||
<span class="d-none d-sm-inline">{{ $t('global.delete') }}</span>
|
||||
</b-button>
|
||||
|
||||
<b-form-textarea
|
||||
v-model.trim="note"
|
||||
placeholder="Type note here"
|
||||
rows="3"
|
||||
max-rows="20"
|
||||
/>
|
||||
<b-form-textarea
|
||||
v-model.trim="note"
|
||||
placeholder="Type note here"
|
||||
rows="3"
|
||||
max-rows="20"
|
||||
/>
|
||||
|
||||
<b-form-text id="input-live-help" v-b-modal.markdown-cheatsheet>
|
||||
<i class="fab fa-markdown fa-fw" />
|
||||
Markdown supported
|
||||
</b-form-text>
|
||||
<b-form-text id="input-live-help" v-b-modal.markdown-cheatsheet>
|
||||
<i class="fab fa-markdown fa-fw" />
|
||||
Markdown supported
|
||||
</b-form-text>
|
||||
|
||||
<b-modal id="markdown-cheatsheet" title="BootstrapVue">
|
||||
<markdown-cheatsheet />
|
||||
</b-modal>
|
||||
</b-col>
|
||||
</game-sub-page>
|
||||
</b-form-row>
|
||||
<b-modal id="markdown-cheatsheet" title="BootstrapVue">
|
||||
<markdown-cheatsheet />
|
||||
</b-modal>
|
||||
</game-sub-page>
|
||||
</b-container>
|
||||
</template>
|
||||
|
||||
|
|
|
@ -11,41 +11,9 @@
|
|||
<b-skeleton v-if="loading" />
|
||||
|
||||
<template v-else-if="game">
|
||||
<portal v-if="user" to="headerTitle">
|
||||
<b-button-group>
|
||||
<b-button @click="$bus.$emit('ADD_GAME', game.id)">
|
||||
<i class="fa-solid fa-plus fa-fw" />
|
||||
Add to list
|
||||
</b-button>
|
||||
<game-actions />
|
||||
|
||||
<b-button :to="{ name: 'game.tags', params: { id: game.id, slug: game.slug } }">
|
||||
<i class="fa-solid fa-tags fa-fw" />
|
||||
Tags
|
||||
</b-button>
|
||||
|
||||
<b-button :to="{ name: 'game.progress', params: { id: game.id, slug: game.slug } }">
|
||||
<i class="fa-solid fa-bars-progress fa-fw" />
|
||||
Track progress
|
||||
</b-button>
|
||||
|
||||
<b-button :to="{ name: 'game.notes', params: { id: game.id, slug: game.slug } }">
|
||||
<i class="fa-solid fa-note-sticky fa-fw" />
|
||||
Notes
|
||||
</b-button>
|
||||
|
||||
<b-button :to="{ name: 'game.news', params: { id: game.id, slug: game.slug } }">
|
||||
<i class="fa-solid fa-newspaper fa-fw" />
|
||||
News
|
||||
</b-button>
|
||||
|
||||
<b-button :to="{ name: 'game.media', params: { id: game.id, slug: game.slug } }">
|
||||
<i class="fa-solid fa-photo-film fa-fw" />
|
||||
Images / Videos
|
||||
</b-button>
|
||||
</b-button-group>
|
||||
</portal>
|
||||
|
||||
<b-row class="game">
|
||||
<b-row>
|
||||
<b-col
|
||||
offset="2"
|
||||
offset-sm="0"
|
||||
|
@ -57,7 +25,7 @@
|
|||
<b-img
|
||||
:src="gameCoverUrl"
|
||||
:alt="game.name"
|
||||
class="cursor-pointer game-cover"
|
||||
class="cursor-pointer"
|
||||
fluid-grow
|
||||
rounded
|
||||
@click.stop="openGameCover"
|
||||
|
@ -77,7 +45,7 @@
|
|||
<b-card
|
||||
v-if="boardsWithGame.length"
|
||||
body-class="p-3"
|
||||
class="mt-2 ml-n3"
|
||||
class="mt-2"
|
||||
>
|
||||
<h4>Game found in these boards:</h4>
|
||||
|
||||
|
@ -85,7 +53,6 @@
|
|||
v-for="board in boardsWithGame"
|
||||
:to="{ name: 'board', params: { id: board.id } }"
|
||||
:key="board.id"
|
||||
block
|
||||
>
|
||||
<b-avatar
|
||||
rounded
|
||||
|
@ -121,6 +88,7 @@
|
|||
xl="8"
|
||||
>
|
||||
<game-titles />
|
||||
|
||||
<b-progress
|
||||
v-if="progress"
|
||||
:value="progress"
|
||||
|
@ -146,7 +114,13 @@
|
|||
</b-badge>
|
||||
<game-description />
|
||||
|
||||
<game-notes />
|
||||
<game-note
|
||||
v-if="note"
|
||||
:note="note"
|
||||
class="cursor-pointer"
|
||||
@click.native="$router.push({ name: 'game.notes', params: { id: game.id } })"
|
||||
/>
|
||||
|
||||
</b-col>
|
||||
|
||||
<b-col
|
||||
|
@ -317,24 +291,26 @@
|
|||
import { mapState, mapGetters } from 'vuex';
|
||||
import { WEBSITE_CATEGORIES } from '@/constants';
|
||||
import AmazonLinks from '@/components/Game/AmazonLinks';
|
||||
import GameNotes from '@/components/Game/GameNotes';
|
||||
import GameDetails from '@/components/Game/GameDetails';
|
||||
import GameActions from '@/components/Game/GameActions';
|
||||
import GameTitles from '@/components/Game/GameTitles';
|
||||
import GameRating from '@/components/Game/GameRating';
|
||||
import GameDescription from '@/components/Game/GameDescription';
|
||||
import SimilarGames from '@/components/Game/SimilarGames';
|
||||
import GameWebsites from '@/components/Game/GameWebsites';
|
||||
// import GameSpeedruns from '@/components/Game/GameSpeedruns';
|
||||
import GameNote from '@/components/GameNote';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
// Timeline,
|
||||
AmazonLinks,
|
||||
GameNote,
|
||||
GameDescription,
|
||||
GameDetails,
|
||||
GameActions,
|
||||
GameTitles,
|
||||
GameRating,
|
||||
GameNotes,
|
||||
GameWebsites,
|
||||
// GameSpeedruns,
|
||||
SimilarGames,
|
||||
|
@ -357,9 +333,13 @@ export default {
|
|||
},
|
||||
|
||||
computed: {
|
||||
...mapState(['game', 'progresses', 'tags', 'boards', 'user']),
|
||||
...mapState(['game', 'progresses', 'tags', 'boards', 'user', 'notes']),
|
||||
...mapGetters(['gameTags']),
|
||||
|
||||
note() {
|
||||
return this.notes[this.game?.id] || null;
|
||||
},
|
||||
|
||||
boardsWithGame() {
|
||||
return this.boards
|
||||
.filter(({ lists }) => lists.some(({ games }) => games.includes(this.game.id)))
|
||||
|
@ -487,6 +467,7 @@ export default {
|
|||
|
||||
this.loading = true;
|
||||
this.$store.commit('CLEAR_GAME');
|
||||
this.$bus.$emit('UPDATE_WALLPAPER', null);
|
||||
|
||||
await this.$store.dispatch('LOAD_GAME', this.gameId)
|
||||
.catch(() => {
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
<template lang="html">
|
||||
<div>
|
||||
<div class="bg-white">
|
||||
|
||||
</div>
|
||||
<header class="masthead bg-white">
|
||||
<div class="container px-5">
|
||||
<div class="row gx-5 align-items-center">
|
||||
|
@ -7,10 +10,6 @@
|
|||
<div class="mb-5 mb-lg-0 text-center text-lg-start">
|
||||
<h1 class="display-1 mb-3">Organize <small class="display-4">your video games</small> beautifully.</h1>
|
||||
<p class="lead fw-normal text-muted mb-5">Learn about games, take notes, organize, customize, discover and more with Gamebrary</p>
|
||||
<div class="d-flex flex-column flex-lg-row align-items-center">
|
||||
<a class="me-lg-3 mb-4 mb-lg-0" href="#!"><img class="app-badge" src="assets/img/google-play-badge.svg" alt="..." /></a>
|
||||
<a href="#!"><img class="app-badge" src="assets/img/app-store-badge.svg" alt="..." /></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-6">
|
||||
|
@ -21,19 +20,17 @@
|
|||
</div>
|
||||
</header>
|
||||
|
||||
<!-- App features section-->
|
||||
<section id="features">
|
||||
<!-- <section id="features">
|
||||
<div class="container px-5">
|
||||
<div class="row gx-5 align-items-center">
|
||||
<div class="col-lg-8 order-lg-1 mb-5 mb-lg-0">
|
||||
<div class="container-fluid px-5">
|
||||
<div class="row gx-5">
|
||||
<div class="col-md-6 mb-5">
|
||||
<!--
|
||||
Gamebrary is open source, free and universally available, there is no need to install apps, updates, etc... Gamebrary works on all your devices. -->
|
||||
|
||||
Gamebrary is open source, free and universally available, there is no need to install apps, updates, etc... Gamebrary works on all your devices.
|
||||
|
||||
|
||||
<!-- Feature item-->
|
||||
<div class="text-center">
|
||||
<i class="bi-phone icon-feature text-gradient d-block mb-3"></i>
|
||||
<h3 class="font-alt">Notes</h3>
|
||||
|
@ -41,7 +38,6 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 mb-5">
|
||||
<!-- Feature item-->
|
||||
<div class="text-center">
|
||||
<i class="bi-camera icon-feature text-gradient d-block mb-3"></i>
|
||||
<h3 class="font-alt">Organize</h3>
|
||||
|
@ -51,7 +47,6 @@
|
|||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-5 mb-md-0">
|
||||
<!-- Feature item-->
|
||||
<div class="text-center">
|
||||
<i class="bi-gift icon-feature text-gradient d-block mb-3"></i>
|
||||
<h3 class="font-alt">Encyclopedia</h3>
|
||||
|
@ -61,7 +56,6 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<!-- Feature item-->
|
||||
<div class="text-center">
|
||||
<i class="bi-patch-check icon-feature text-gradient d-block mb-3"></i>
|
||||
<h3 class="font-alt">Track your progress</h3>
|
||||
|
@ -72,21 +66,20 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4 order-lg-0">
|
||||
<!-- Features section device mockup-->
|
||||
<img class="img-fluid rounded-circle" src="https://source.unsplash.com/u8Jn2rzYIps/900x900" alt="..." />
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</section> -->
|
||||
|
||||
<section class="text-center bg-dark p-5">
|
||||
<section class="feature bg-info py-3">
|
||||
<img src="/img/open-source-logo.png" alt="" width="80" />
|
||||
<h2 class="text-white">
|
||||
Open Source, free and universal
|
||||
</h2>
|
||||
</section>
|
||||
|
||||
<!-- Basic features section-->
|
||||
<section class="bg-dark">
|
||||
<div class="container px-5">
|
||||
<div class="row gx-5 align-items-center justify-content-center justify-content-lg-between">
|
||||
|
@ -101,14 +94,21 @@
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<section class="text-center bg-light p-5">
|
||||
<h2>
|
||||
Vue Awesome
|
||||
</h2>
|
||||
</section>
|
||||
<a href="https://awesome-vue.js.org/" target="_blank" class="feature py-5">
|
||||
<img
|
||||
src="/img/vue-awesome-logo.svg"
|
||||
alt="Vue Awesome"
|
||||
width="180"
|
||||
class="mb-2"
|
||||
/>
|
||||
|
||||
<!-- Call to action section-->
|
||||
<section class="bg-success py-5">
|
||||
<aside class="d-flex flex-column">
|
||||
<h3>Featured in Awesome Vue.js</h3>
|
||||
<p class="text-muted">A curated list of awesome things related to Vue.js</p>
|
||||
</aside>
|
||||
</a>
|
||||
|
||||
<!-- <section class="bg-success py-5">
|
||||
<div class="cta-content">
|
||||
<div class="container px-5">
|
||||
<h2 class="text-white display-3">Get started.
|
||||
|
@ -119,7 +119,8 @@
|
|||
<b-button pill variant="outline-light" size="lg" class="ml-3">Get Pro</b-button>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</section> -->
|
||||
|
||||
<public-page-footer />
|
||||
</div>
|
||||
</template>
|
||||
|
@ -131,44 +132,32 @@ export default {
|
|||
components: {
|
||||
PublicPageFooter,
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
features: [
|
||||
{
|
||||
title: 'Boards',
|
||||
message: 'Much like a bookshelf, display your games, drag and drop them, customize, sort and more!',
|
||||
},
|
||||
{
|
||||
title: 'Encyclopedia',
|
||||
message: '<strong>Powered by IGDB and Wikipedia</strong>. Gamebrary provides the best video game database with hundreds of thousands of video games.',
|
||||
},
|
||||
{
|
||||
title: 'Notes',
|
||||
message: 'Take game notes and view them all in place.',
|
||||
},
|
||||
{
|
||||
title: 'Track your progress',
|
||||
message: 'Keep track of your video game backlog.',
|
||||
},
|
||||
{
|
||||
title: 'Tags',
|
||||
message: 'Categorize games across the board, literally.',
|
||||
},
|
||||
{
|
||||
title: 'Open Source, free and universal',
|
||||
message: 'Gamebrary is open source, free and universally available, there is no need to install apps, updates, etc... Gamebrary works on all your devices.',
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" rel="stylesheet/scss" scoped>
|
||||
.features {
|
||||
.feature {
|
||||
display: grid;
|
||||
grid-template-columns: auto auto auto;
|
||||
grid-gap: 1rem;
|
||||
margin: 0 auto;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
align-items: center;
|
||||
grid-gap: 4rem;
|
||||
|
||||
@media(max-width: 768px) {
|
||||
grid-gap: 0;
|
||||
grid-template-columns: 1fr;
|
||||
|
||||
aside {
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
img {
|
||||
margin-left: auto;
|
||||
|
||||
@media(max-width: 768px) {
|
||||
margin: 0 auto;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -1,6 +1,23 @@
|
|||
<template lang="html">
|
||||
<b-container>
|
||||
<b-row>
|
||||
<portal to="headerTitle">
|
||||
<div class="w-100 d-flex align-items-center justify-content-between">
|
||||
<h3 class="m-0">Search</h3>
|
||||
|
||||
<b-button-toolbar key-nav aria-label="Toolbar with button groups" class="mr-1">
|
||||
<b-button-group class="mx-1">
|
||||
<b-button :variant="listView ? 'primary' : 'light'" @click="listView = true">
|
||||
<i class="fa-solid fa-list fa-fw" aria-hidden />
|
||||
</b-button>
|
||||
|
||||
<b-button :variant="listView ? 'light' : 'primary'" @click="listView = false">
|
||||
<i class="fa-solid fa-grip fa-fw" aria-hidden />
|
||||
</b-button>
|
||||
</b-button-group>
|
||||
</b-button-toolbar>
|
||||
</div>
|
||||
</portal>
|
||||
<!-- TODO: add filters -->
|
||||
<!-- TODO: add view toggle -->
|
||||
<!-- <b-col cols="3" class="position-sticky mt-2">
|
||||
|
@ -43,21 +60,12 @@
|
|||
<div v-else-if="searchResults.length > 0">
|
||||
<header class="my-2 d-flex align-items-center justify-content-between">
|
||||
<h3 v-if="activeBoardList">
|
||||
<pre>{{ activeBoardList }}</pre>
|
||||
Add games to <strong>{{ activeBoardList.name }}</strong>
|
||||
</h3>
|
||||
<h3>Search results</h3>
|
||||
|
||||
<b-button-toolbar key-nav aria-label="Toolbar with button groups">
|
||||
<b-button-group class="mx-1">
|
||||
<b-button :variant="listView ? 'primary' : 'secondary'" @click="listView = true">
|
||||
<i class="fa-solid fa-list fa-fw" aria-hidden />
|
||||
</b-button>
|
||||
|
||||
<b-button :variant="listView ? 'secondary' : 'primary'" @click="listView = false">
|
||||
<i class="fa-solid fa-grip fa-fw" aria-hidden />
|
||||
</b-button>
|
||||
</b-button-group>
|
||||
</b-button-toolbar>
|
||||
</header>
|
||||
|
||||
<template v-if="listView">
|
||||
|
@ -133,7 +141,7 @@ export default {
|
|||
},
|
||||
|
||||
activeBoardList() {
|
||||
if (!this.boardListIndex) return [];
|
||||
if (this.boardListIndex === undefined) return [];
|
||||
|
||||
return this.board?.lists[this.boardListIndex];
|
||||
},
|
||||
|
|
|
@ -1,109 +1,110 @@
|
|||
<template lang="html">
|
||||
<b-container>
|
||||
<div style="width: 400px; max-width: 100%">
|
||||
<language-settings />
|
||||
<b-row>
|
||||
<b-col>
|
||||
<language-settings />
|
||||
|
||||
<settings-card
|
||||
title="Wallpapers"
|
||||
description="Manage your wallpapers"
|
||||
icon="fa-images"
|
||||
@click.native="$router.push({ name: 'wallpapers' })"
|
||||
/>
|
||||
<settings-card
|
||||
title="Wallpapers"
|
||||
description="Manage your wallpapers"
|
||||
icon="fa-images"
|
||||
@click.native="$router.push({ name: 'wallpapers' })"
|
||||
/>
|
||||
|
||||
<settings-card
|
||||
title="Notes"
|
||||
description="View all your notes"
|
||||
icon="fa-note-sticky"
|
||||
@click.native="$router.push({ name: 'notes' })"
|
||||
/>
|
||||
<settings-card
|
||||
title="Notes"
|
||||
description="View all your notes"
|
||||
icon="fa-note-sticky"
|
||||
@click.native="$router.push({ name: 'notes' })"
|
||||
/>
|
||||
|
||||
<settings-card
|
||||
title="Tags"
|
||||
description="View all your tags"
|
||||
icon="fa-tags"
|
||||
@click.native="$router.push({ name: 'tags' })"
|
||||
/>
|
||||
<settings-card
|
||||
title="Tags"
|
||||
description="View all your tags"
|
||||
icon="fa-tags"
|
||||
@click.native="$router.push({ name: 'tags' })"
|
||||
/>
|
||||
|
||||
<settings-card
|
||||
title="Account"
|
||||
description="Manage your Gamebrary account"
|
||||
icon="fa-user"
|
||||
@click.native="$router.push({ name: 'account.settings' })"
|
||||
/>
|
||||
<settings-card
|
||||
title="Account"
|
||||
description="Manage your Gamebrary account"
|
||||
icon="fa-user"
|
||||
@click.native="$router.push({ name: 'account.settings' })"
|
||||
/>
|
||||
|
||||
<!-- TODO: fix -->
|
||||
<b-button
|
||||
block
|
||||
variant="secondary"
|
||||
v-b-modal.keyboard-shortcuts
|
||||
>
|
||||
Keyboard shortcuts
|
||||
</b-button>
|
||||
<!-- TODO: fix -->
|
||||
<b-button
|
||||
block
|
||||
variant="secondary"
|
||||
v-b-modal.keyboard-shortcuts
|
||||
>
|
||||
Keyboard shortcuts
|
||||
</b-button>
|
||||
|
||||
<b-button
|
||||
block
|
||||
variant="secondary"
|
||||
:to="{ name: 'dev.tools' }"
|
||||
>
|
||||
Dev tools
|
||||
</b-button>
|
||||
<b-button
|
||||
block
|
||||
variant="secondary"
|
||||
:to="{ name: 'dev.tools' }"
|
||||
>
|
||||
Dev tools
|
||||
</b-button>
|
||||
|
||||
<b-button
|
||||
href="https://github.com/romancm/gamebrary"
|
||||
target="_blank"
|
||||
block
|
||||
variant="secondary"
|
||||
>
|
||||
<i class="fab fa-github fa-fw" />
|
||||
GitHub
|
||||
</b-button>
|
||||
<b-button
|
||||
href="https://github.com/romancm/gamebrary"
|
||||
target="_blank"
|
||||
block
|
||||
variant="secondary"
|
||||
>
|
||||
<i class="fab fa-github fa-fw" />
|
||||
GitHub
|
||||
</b-button>
|
||||
|
||||
<b-button
|
||||
block
|
||||
variant="secondary"
|
||||
href="https://goo.gl/forms/r0juBCsZaUtJ03qb2"
|
||||
target="_blank"
|
||||
>
|
||||
Submit feedback
|
||||
</b-button>
|
||||
<b-button
|
||||
block
|
||||
variant="secondary"
|
||||
href="https://goo.gl/forms/r0juBCsZaUtJ03qb2"
|
||||
target="_blank"
|
||||
>
|
||||
Submit feedback
|
||||
</b-button>
|
||||
|
||||
<!-- TODO: hide for paid users -->
|
||||
<b-button
|
||||
block
|
||||
variant="outline-primary"
|
||||
href="https://www.paypal.me/RomanCervantes/5"
|
||||
target="_blank"
|
||||
>
|
||||
Buy me a coffee
|
||||
</b-button>
|
||||
<!-- TODO: hide for paid users -->
|
||||
<b-button
|
||||
block
|
||||
variant="outline-primary"
|
||||
href="https://www.paypal.me/RomanCervantes/5"
|
||||
target="_blank"
|
||||
>
|
||||
Buy me a coffee
|
||||
</b-button>
|
||||
|
||||
<hr />
|
||||
<hr />
|
||||
|
||||
<!-- <b-list-group-item exact exact-active-class="bg-primary text-white" :to="{ name: 'profile.settings' }">
|
||||
<i class="mr-2 fa-solid fa-user fa-fw" aria-hidden />
|
||||
<small>Profile</small>
|
||||
</b-list-group-item> -->
|
||||
<!-- <b-list-group-item exact exact-active-class="bg-primary text-white" :to="{ name: 'profile.settings' }">
|
||||
<i class="mr-2 fa-solid fa-user fa-fw" aria-hidden />
|
||||
<small>Profile</small>
|
||||
</b-list-group-item> -->
|
||||
|
||||
<account-settings />
|
||||
<!-- <b-list-group-item exact exact-active-class="bg-primary text-white" :to="{ name: 'steam.settings' }">
|
||||
<i class="mr-2 fab fa-steam fa-fw" aria-hidden></i>
|
||||
<small>Steam</small>
|
||||
</b-list-group-item> -->
|
||||
<!-- <b-list-group-item exact exact-active-class="bg-primary text-white" :to="{ name: 'steam.settings' }">
|
||||
<i class="mr-2 fab fa-steam fa-fw" aria-hidden></i>
|
||||
<small>Steam</small>
|
||||
</b-list-group-item> -->
|
||||
|
||||
<!-- <hr /> -->
|
||||
<!-- <hr /> -->
|
||||
|
||||
<!-- <b-list-group-item :to="{ name: 'profiles' }">
|
||||
<i class="mr-2 fa-solid fa-people-group fa-fw" aria-hidden />
|
||||
<small>Profiles</small>
|
||||
</b-list-group-item> -->
|
||||
<!-- <b-list-group-item :to="{ name: 'profiles' }">
|
||||
<i class="mr-2 fa-solid fa-people-group fa-fw" aria-hidden />
|
||||
<small>Profiles</small>
|
||||
</b-list-group-item> -->
|
||||
|
||||
<!-- {{ $t('global.donateMessage') }} -->
|
||||
<!-- <a href="https://www.paypal.me/RomanCervantes/5" target="_blank">
|
||||
{{ $t('global.donating') }}
|
||||
</a> -->
|
||||
<!-- {{ $t('global.donateMessage') }} -->
|
||||
<!-- <a href="https://www.paypal.me/RomanCervantes/5" target="_blank">
|
||||
{{ $t('global.donating') }}
|
||||
</a> -->
|
||||
|
||||
<small>© 2022 Gamebrary</small>
|
||||
</div>
|
||||
<small>© 2022 Gamebrary</small>
|
||||
</b-col>
|
||||
</b-row>
|
||||
</b-container>
|
||||
</template>
|
||||
|
||||
|
|
Loading…
Reference in a new issue