feat: fullscreen mode

This commit is contained in:
2025-05-03 13:35:39 +02:00
parent 93acfdb780
commit 05c04e4aa1
7 changed files with 57 additions and 8 deletions
+1 -1
View File
@@ -6,7 +6,7 @@
</transition>
<!-- Content -->
<Navbar />
<Navbar v-if="!globalStore.fullscreenMode" />
<MainContainer />
</div>
</template>
+10 -3
View File
@@ -1,15 +1,22 @@
<template>
<main
class="grid print:block print:bg-white p-3 mx-auto max-w-[800px] h-[calc(100vh-40px)] min-h-[300px] grid-rows-[auto_auto_1fr] gap-1"
class="grid print:block print:bg-white p-3 mx-auto max-w-[800px] min-h-[300px] gap-1 relative"
:class="{
'grid-rows-[auto_auto_1fr] h-[calc(100vh-40px)]': !globalStore.fullscreenMode,
'grid-rows-[1fr] h-screen': globalStore.fullscreenMode
}"
>
<SearchContainer />
<TimetableWarnings />
<SearchContainer v-if="!globalStore.fullscreenMode" />
<TimetableWarnings v-if="!globalStore.fullscreenMode" />
<TimetableContainer />
</main>
</template>
<script setup lang="ts">
import { useGlobalStore } from '../../stores/global.store';
import TimetableContainer from '../Timetable/TimetableContainer.vue';
import TimetableWarnings from '../Timetable/TimetableWarnings.vue';
import SearchContainer from '../TimetableSearch/SearchContainer.vue';
const globalStore = useGlobalStore();
</script>
+4 -1
View File
@@ -8,7 +8,10 @@
</div>
<div>
<button class="bg-slate-600 p-1 px-2 rounded-md hover:bg-slate-500 flex items-center" @click="changeLang()">
<button
class="bg-slate-600 p-1 px-2 rounded-md hover:bg-slate-500 flex items-center"
@click="changeLang()"
>
<GlobeIcon :size="18" class="mr-2" /> {{ i18n.locale.value == 'pl' ? 'POL' : 'ENG' }}
</button>
</div>
@@ -2,6 +2,15 @@
<!-- Timetable render based on current view mode -->
<CurrentTimetableView v-if="globalStore.currentTimetableData != null" />
<!-- Button closing fullscreen mode, relative to MainContainer -->
<button
v-if="globalStore.fullscreenMode"
class="absolute right-6 top-3 p-1 rounded-md bg-green-600 hover:bg-green-500 print:hidden"
@click="() => (globalStore.fullscreenMode = false)"
>
<Minimize2Icon :size="22" />
</button>
<!-- If there is no timetable chosen -->
<div class="overflow-auto text-center font-bold text-zinc-400 p-1 min-h-full" v-else>
<component :is="viewModes[globalStore.viewMode]" />
@@ -14,6 +23,7 @@ import LocalStorageView from '../TimetableViews/LocalStorageView.vue';
import JournalStorageView from '../TimetableViews/JournalStorageView.vue';
import ActiveDataView from '../TimetableViews/ActiveDataView.vue';
import CurrentTimetableView from '../TimetableViews/CurrentTimetableView.vue';
import { Minimize2Icon } from 'lucide-vue-next';
const globalStore = useGlobalStore();
@@ -1,5 +1,5 @@
<template>
<div class="flex justify-between gap-2">
<div class="flex justify-between gap-2" v-if="!globalStore.fullscreenMode">
<div class="flex gap-2">
<button
:class="`p-1 rounded-md ${
@@ -36,11 +36,19 @@
</div>
<div class="flex gap-2">
<button class="bg-zinc-800 p-1 rounded-md hover:bg-zinc-700 self-end" @click="toggleDarkMode">
<button class="bg-zinc-800 p-1 rounded-md hover:bg-zinc-700" @click="toggleDarkMode">
<MoonIcon v-if="globalStore.darkMode" />
<SunIcon v-else />
</button>
<button
class="bg-zinc-800 p-1 rounded-md hover:bg-zinc-700 disabled:opacity-60 disabled:hover:bg-zinc-800"
@click="toggleFullscreenMode()"
:disabled="globalStore.currentTimetableData == null"
>
<FullscreenIcon :size="24" />
</button>
<button
class="bg-zinc-800 p-1 rounded-md hover:bg-zinc-700 disabled:opacity-60 disabled:hover:bg-zinc-800"
:disabled="globalStore.currentTimetableData == null"
@@ -62,6 +70,12 @@
</button>
</div>
</div>
<div class="flex justify-end" v-else>
<button class="bg-zinc-800 p-1 rounded-md hover:bg-zinc-700 self-end" @click="toggleDarkMode">
<FullscreenIcon />
</button>
</div>
</template>
<script setup lang="ts">
@@ -71,6 +85,7 @@ import type { ViewMode, TimetableData } from '../../types/common.types';
import {
ArchiveIcon,
FolderDownIcon,
FullscreenIcon,
HistoryIcon,
MoonIcon,
PrinterIcon,
@@ -153,4 +168,8 @@ function openPrintingWindow() {
window.print();
}
function toggleFullscreenMode() {
globalStore.fullscreenMode = !globalStore.fullscreenMode;
}
</script>
@@ -1,13 +1,22 @@
<template>
<div
class="overflow-auto p-1 bg-white print:bg-white dark:bg-zinc-950 print:text-black text-black dark:text-white min-h-full"
class="overflow-auto p-1 bg-white print:bg-white dark:bg-zinc-950 print:text-black text-black dark:text-white min-h-full relative"
:class="{ dark: globalStore.darkMode }"
>
<!-- <button
v-if="globalStore.fullscreenMode"
class="fixed right-0 top-0 bg-green-600 p-1 m-1 rounded-md hover:bg-green-500 print:hidden"
@click="() => (globalStore.fullscreenMode = false)"
>
<Minimize2Icon :size="22" />
</button> -->
<TimetableContent />
</div>
</template>
<script setup lang="ts">
import { Minimize2Icon } from 'lucide-vue-next';
import { useGlobalStore } from '../../stores/global.store';
import TimetableContent from '../Timetable/TimetableContent.vue';
+1
View File
@@ -11,6 +11,7 @@ import { getHeadUnits } from '../utils/trainUtils';
export const useGlobalStore = defineStore('global', {
state: () => ({
darkMode: false,
fullscreenMode: false,
viewMode: 'active' as ViewMode,
selectedTrainId: null as string | null,