mirror of
https://github.com/NoCrypt/migu.git
synced 2026-04-21 00:22:08 +00:00
fix: Sidebar overlay
This commit is contained in:
parent
b970ed6282
commit
08c56ef70d
9 changed files with 67 additions and 23 deletions
|
|
@ -5,6 +5,7 @@
|
||||||
import IPC from '@/modules/ipc.js'
|
import IPC from '@/modules/ipc.js'
|
||||||
|
|
||||||
export const page = writable('home')
|
export const page = writable('home')
|
||||||
|
export const overlay = writable('none')
|
||||||
export const view = writable(null)
|
export const view = writable(null)
|
||||||
export async function handleAnime (anime) {
|
export async function handleAnime (anime) {
|
||||||
view.set(null)
|
view.set(null)
|
||||||
|
|
@ -23,6 +24,7 @@
|
||||||
import TorrentModal from './views/TorrentSearch/TorrentModal.svelte'
|
import TorrentModal from './views/TorrentSearch/TorrentModal.svelte'
|
||||||
import Menubar from './components/Menubar.svelte'
|
import Menubar from './components/Menubar.svelte'
|
||||||
import { Toaster } from 'svelte-sonner'
|
import { Toaster } from 'svelte-sonner'
|
||||||
|
import Login from './components/Login.svelte'
|
||||||
import Logout from './components/Logout.svelte'
|
import Logout from './components/Logout.svelte'
|
||||||
import Navbar from './components/Navbar.svelte'
|
import Navbar from './components/Navbar.svelte'
|
||||||
|
|
||||||
|
|
@ -31,13 +33,14 @@
|
||||||
|
|
||||||
<div class='page-wrapper with-transitions bg-dark position-relative' data-sidebar-type='overlayed-all'>
|
<div class='page-wrapper with-transitions bg-dark position-relative' data-sidebar-type='overlayed-all'>
|
||||||
<Menubar bind:page={$page} />
|
<Menubar bind:page={$page} />
|
||||||
<ViewAnime />
|
<Login />
|
||||||
<Logout />
|
<Logout />
|
||||||
<Sidebar bind:page={$page} />
|
<Sidebar bind:page={$page} />
|
||||||
<div class='overflow-hidden content-wrapper h-full z-10'>
|
<div class='overflow-hidden content-wrapper h-full'>
|
||||||
<Toaster visibleToasts={6} position='top-right' theme='dark' richColors duration={10000} closeButton />
|
<Toaster visibleToasts={6} position='top-right' theme='dark' richColors duration={10000} closeButton />
|
||||||
<TorrentModal />
|
<ViewAnime bind:overlay={$overlay} />
|
||||||
<Router bind:page={$page} />
|
<TorrentModal bind:overlay={$overlay} />
|
||||||
|
<Router bind:page={$page} bind:overlay={$overlay} />
|
||||||
</div>
|
</div>
|
||||||
<Navbar bind:page={$page} />
|
<Navbar bind:page={$page} />
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -45,6 +48,7 @@
|
||||||
<style>
|
<style>
|
||||||
.content-wrapper {
|
.content-wrapper {
|
||||||
will-change: width;
|
will-change: width;
|
||||||
|
white-space: pre-line;
|
||||||
top: 0 !important;
|
top: 0 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,6 @@
|
||||||
<script context='module'>
|
<script context='module'>
|
||||||
|
import { readable } from 'simple-store-svelte'
|
||||||
|
|
||||||
const mql = matchMedia('(min-width: 769px)')
|
const mql = matchMedia('(min-width: 769px)')
|
||||||
const isMobile = readable(!mql.matches, set => {
|
const isMobile = readable(!mql.matches, set => {
|
||||||
const check = ({ matches }) => set(!matches)
|
const check = ({ matches }) => set(!matches)
|
||||||
|
|
@ -15,17 +17,17 @@
|
||||||
import Miniplayer from 'svelte-miniplayer'
|
import Miniplayer from 'svelte-miniplayer'
|
||||||
import Search from './views/Search.svelte'
|
import Search from './views/Search.svelte'
|
||||||
import AiringSchedule from './views/AiringSchedule.svelte'
|
import AiringSchedule from './views/AiringSchedule.svelte'
|
||||||
import { readable } from 'simple-store-svelte'
|
|
||||||
|
|
||||||
export let page = 'home'
|
export let page = 'home'
|
||||||
|
export let overlay = 'none'
|
||||||
|
|
||||||
$: minwidth = $isMobile ? '200px' : '35rem'
|
$: minwidth = $isMobile ? '200px' : '35rem'
|
||||||
$: maxwidth = $isMobile ? '200px' : '60rem'
|
$: maxwidth = $isMobile ? '200px' : '60rem'
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class='w-full h-full position-absolute overflow-hidden'>
|
<div class='w-full h-full position-absolute overflow-hidden'>
|
||||||
<Miniplayer active={page !== 'player'} class='bg-dark-light z-10 {page === 'player' ? 'h-full' : ''}' {minwidth} {maxwidth} width='300px' padding='2rem' resize={!$isMobile}>
|
<Miniplayer active={(page !== 'player' && overlay !== 'torrent') || overlay === 'viewanime'} class='bg-dark-light z-100 {(page === "player" && overlay !== "viewanime") ? "h-full" : ""}' {minwidth} {maxwidth} width='300px' padding='2rem' resize={!$isMobile}>
|
||||||
<MediaHandler miniplayer={page !== 'player'} bind:page />
|
<MediaHandler miniplayer={page !== 'player' || overlay === 'viewanime'} bind:page bind:overlay />
|
||||||
</Miniplayer>
|
</Miniplayer>
|
||||||
</div>
|
</div>
|
||||||
{#if page === 'settings'}
|
{#if page === 'settings'}
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@
|
||||||
$: $logout && modal?.focus()
|
$: $logout && modal?.focus()
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class='modal z-40' class:show={$logout}>
|
<div class='modal z-101' class:show={$logout}>
|
||||||
{#if $logout}
|
{#if $logout}
|
||||||
<div class='modal-dialog' on:pointerup|self={close} on:keydown={checkClose} tabindex='-1' role='button' bind:this={modal}>
|
<div class='modal-dialog' on:pointerup|self={close} on:keydown={checkClose} tabindex='-1' role='button' bind:this={modal}>
|
||||||
<div class='modal-content d-flex justify-content-center flex-column'>
|
<div class='modal-content d-flex justify-content-center flex-column'>
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<script>
|
<script>
|
||||||
import { getContext } from 'svelte'
|
import { getContext } from 'svelte'
|
||||||
import { media } from '../views/Player/MediaHandler.svelte'
|
import { media } from '@/views/Player/MediaHandler.svelte'
|
||||||
import { settings } from '@/modules/settings.js'
|
import { settings } from '@/modules/settings.js'
|
||||||
import { toast } from 'svelte-sonner'
|
import { toast } from 'svelte-sonner'
|
||||||
import { click } from '@/modules/click.js'
|
import { click } from '@/modules/click.js'
|
||||||
|
|
@ -57,6 +57,7 @@
|
||||||
{
|
{
|
||||||
click: () => {
|
click: () => {
|
||||||
page = 'home'
|
page = 'home'
|
||||||
|
if ($view) $view = null
|
||||||
},
|
},
|
||||||
page: 'home',
|
page: 'home',
|
||||||
icon: 'home',
|
icon: 'home',
|
||||||
|
|
@ -65,6 +66,7 @@
|
||||||
{
|
{
|
||||||
click: () => {
|
click: () => {
|
||||||
page = 'search'
|
page = 'search'
|
||||||
|
if ($view) $view = null
|
||||||
},
|
},
|
||||||
page: 'search',
|
page: 'search',
|
||||||
icon: 'search',
|
icon: 'search',
|
||||||
|
|
@ -122,7 +124,7 @@
|
||||||
{#each links as { click: _click, icon, text, image, css, page: _page } (_click)}
|
{#each links as { click: _click, icon, text, image, css, page: _page } (_click)}
|
||||||
<div
|
<div
|
||||||
class='sidebar-link sidebar-link-with-icon pointer overflow-hidden {css}'
|
class='sidebar-link sidebar-link-with-icon pointer overflow-hidden {css}'
|
||||||
use:click={_click}>
|
use:click={() => { _click(); if (!icon.includes("login") && !icon.includes("favorite")) { window.dispatchEvent(new Event('overlay-check')) } } }>
|
||||||
<span class='text-nowrap d-flex align-items-center w-full h-full'>
|
<span class='text-nowrap d-flex align-items-center w-full h-full'>
|
||||||
{#if image}
|
{#if image}
|
||||||
<span class='material-symbols-outlined rounded' class:filled={page === _page}>
|
<span class='material-symbols-outlined rounded' class:filled={page === _page}>
|
||||||
|
|
@ -231,6 +233,9 @@
|
||||||
.sidebar.animated:hover {
|
.sidebar.animated:hover {
|
||||||
width: 22rem
|
width: 22rem
|
||||||
}
|
}
|
||||||
|
.sidebar.animated {
|
||||||
|
z-index: 60 !important;
|
||||||
|
}
|
||||||
.sidebar-overlay {
|
.sidebar-overlay {
|
||||||
width: var(--sidebar-width);
|
width: var(--sidebar-width);
|
||||||
transition: width .8s cubic-bezier(0.25, 0.8, 0.25, 1), left .8s cubic-bezier(0.25, 0.8, 0.25, 1) !important;
|
transition: width .8s cubic-bezier(0.25, 0.8, 0.25, 1), left .8s cubic-bezier(0.25, 0.8, 0.25, 1) !important;
|
||||||
|
|
|
||||||
|
|
@ -82,6 +82,10 @@ a[href]:active, button:not([disabled]):active, fieldset:not([disabled]):active,
|
||||||
z-index: 100;
|
z-index: 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.z-101 {
|
||||||
|
z-index: 101;
|
||||||
|
}
|
||||||
|
|
||||||
.material-symbols-outlined {
|
.material-symbols-outlined {
|
||||||
font-family: "Material Symbols Outlined Variable";
|
font-family: "Material Symbols Outlined Variable";
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
|
|
|
||||||
|
|
@ -255,6 +255,7 @@
|
||||||
|
|
||||||
export let miniplayer = false
|
export let miniplayer = false
|
||||||
export let page = 'home'
|
export let page = 'home'
|
||||||
|
export let overlay = 'none'
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Player files={$processed} {miniplayer} media={$nowPlaying} bind:playFile bind:page on:current={handleCurrent} />
|
<Player files={$processed} {miniplayer} media={$nowPlaying} bind:playFile bind:page bind:overlay on:current={handleCurrent} />
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,7 @@
|
||||||
export let miniplayer = false
|
export let miniplayer = false
|
||||||
$condition = () => !miniplayer && SUPPORTS.keybinds && !document.querySelector('.modal.show')
|
$condition = () => !miniplayer && SUPPORTS.keybinds && !document.querySelector('.modal.show')
|
||||||
export let page
|
export let page
|
||||||
|
export let overlay
|
||||||
export let files = []
|
export let files = []
|
||||||
$: updateFiles(files)
|
$: updateFiles(files)
|
||||||
let src = null
|
let src = null
|
||||||
|
|
@ -1105,10 +1106,10 @@
|
||||||
</div>
|
</div>
|
||||||
<div class='middle d-flex align-items-center justify-content-center flex-grow-1 position-relative'>
|
<div class='middle d-flex align-items-center justify-content-center flex-grow-1 position-relative'>
|
||||||
<!-- eslint-disable-next-line svelte/valid-compile -->
|
<!-- eslint-disable-next-line svelte/valid-compile -->
|
||||||
<div class='w-full h-full position-absolute toggle-fullscreen' on:dblclick={toggleFullscreen} on:click|self={() => { if (page === 'player') playPause(); page = 'player' }} />
|
<div class='w-full h-full position-absolute toggle-fullscreen' on:dblclick={toggleFullscreen} on:click|self={() => { if (page === 'player' && ['none', 'player'].includes(overlay)) playPause(); page = 'player'; window.dispatchEvent(new Event('overlay-check')) }} />
|
||||||
<!-- eslint-disable-next-line svelte/valid-compile -->
|
<!-- eslint-disable-next-line svelte/valid-compile -->
|
||||||
<div class='w-full h-full position-absolute toggle-immerse d-none' on:dblclick={toggleFullscreen} on:click|self={toggleImmerse} />
|
<div class='w-full h-full position-absolute toggle-immerse d-none' on:dblclick={toggleFullscreen} on:click|self={toggleImmerse} />
|
||||||
<div class='w-full h-full position-absolute mobile-focus-target d-none' use:click={() => { page = 'player' }} />
|
<div class='w-full h-full position-absolute mobile-focus-target d-none' use:click={() => { page = 'player'; window.dispatchEvent(new Event('overlay-check')) }} />
|
||||||
<!-- eslint-disable-next-line svelte/valid-compile -->
|
<!-- eslint-disable-next-line svelte/valid-compile -->
|
||||||
<span class='material-symbols-outlined ctrl h-full align-items-center justify-content-end w-150 mw-full mr-auto' on:click={rewind}> fast_rewind </span>
|
<span class='material-symbols-outlined ctrl h-full align-items-center justify-content-end w-150 mw-full mr-auto' on:click={rewind}> fast_rewind </span>
|
||||||
<span class='material-symbols-outlined ctrl' data-name='playPause' use:click={playPause}> {ended ? 'replay' : paused ? 'play_arrow' : 'pause'} </span>
|
<span class='material-symbols-outlined ctrl' data-name='playPause' use:click={playPause}> {ended ? 'replay' : paused ? 'play_arrow' : 'pause'} </span>
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,10 @@
|
||||||
export function playAnime (media, episode = 1, force) {
|
export function playAnime (media, episode = 1, force) {
|
||||||
episode = Number(episode)
|
episode = Number(episode)
|
||||||
episode = isNaN(episode) ? 1 : episode
|
episode = isNaN(episode) ? 1 : episode
|
||||||
if (!force && findInCurrent({ media, episode })) return
|
if (!force && findInCurrent({ media, episode })) {
|
||||||
|
window.dispatchEvent(new Event('overlay-check'))
|
||||||
|
return
|
||||||
|
}
|
||||||
rss.set({ media, episode })
|
rss.set({ media, episode })
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
@ -15,7 +18,10 @@
|
||||||
<script>
|
<script>
|
||||||
import TorrentMenu from './TorrentMenu.svelte'
|
import TorrentMenu from './TorrentMenu.svelte'
|
||||||
|
|
||||||
|
export let overlay
|
||||||
|
|
||||||
function close () {
|
function close () {
|
||||||
|
overlay = 'none'
|
||||||
$rss = null
|
$rss = null
|
||||||
}
|
}
|
||||||
function checkClose ({ keyCode }) {
|
function checkClose ({ keyCode }) {
|
||||||
|
|
@ -26,10 +32,21 @@
|
||||||
|
|
||||||
$: search = $rss
|
$: search = $rss
|
||||||
|
|
||||||
$: search && modal?.focus()
|
$: {
|
||||||
|
if (search) {
|
||||||
|
overlay = 'torrent'
|
||||||
|
modal?.focus()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
window.addEventListener('overlay-check', () => {
|
||||||
|
if (search) {
|
||||||
|
close()
|
||||||
|
}
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class='modal z-100' class:show={search} id='viewAnime'>
|
<div class='modal z-50' class:show={search} id='viewAnime'>
|
||||||
{#if search}
|
{#if search}
|
||||||
<div class='modal-dialog d-flex align-items-center px-md-15 pt-md-20' on:pointerup|self={close} on:keydown={checkClose} tabindex='-1' role='button' bind:this={modal}>
|
<div class='modal-dialog d-flex align-items-center px-md-15 pt-md-20' on:pointerup|self={close} on:keydown={checkClose} tabindex='-1' role='button' bind:this={modal}>
|
||||||
<div class='modal-content m-0 mw-full h-full rounded overflow-hidden bg-very-dark d-flex flex-column overflow-y-scroll pt-0 px-0'>
|
<div class='modal-content m-0 mw-full h-full rounded overflow-hidden bg-very-dark d-flex flex-column overflow-y-scroll pt-0 px-0'>
|
||||||
|
|
|
||||||
|
|
@ -14,18 +14,23 @@
|
||||||
import smoothScroll from '@/modules/scroll.js'
|
import smoothScroll from '@/modules/scroll.js'
|
||||||
import IPC from '@/modules/ipc.js'
|
import IPC from '@/modules/ipc.js'
|
||||||
|
|
||||||
|
export let overlay
|
||||||
const view = getContext('view')
|
const view = getContext('view')
|
||||||
function close () {
|
function close (play) {
|
||||||
$view = null
|
$view = null
|
||||||
|
if (!play) {
|
||||||
|
overlay = 'none'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$: media = $view
|
|
||||||
let modal
|
let modal
|
||||||
$: media && modal?.focus()
|
let container = null
|
||||||
|
$: media = $view
|
||||||
|
$: media && (modal?.focus(), overlay = 'viewanime', (container && container.dispatchEvent(new Event('scrolltop'))))
|
||||||
function checkClose ({ keyCode }) {
|
function checkClose ({ keyCode }) {
|
||||||
if (keyCode === 27) close()
|
if (keyCode === 27) close()
|
||||||
}
|
}
|
||||||
function play (episode) {
|
function play (episode) {
|
||||||
close()
|
close(true)
|
||||||
if (episode) return playAnime(media, episode)
|
if (episode) return playAnime(media, episode)
|
||||||
if (media.status === 'NOT_YET_RELEASED') return
|
if (media.status === 'NOT_YET_RELEASED') return
|
||||||
playMedia(media)
|
playMedia(media)
|
||||||
|
|
@ -59,12 +64,17 @@
|
||||||
IPC.emit('open', url)
|
IPC.emit('open', url)
|
||||||
}
|
}
|
||||||
let episodeOrder = true
|
let episodeOrder = true
|
||||||
|
window.addEventListener('overlay-check', () => {
|
||||||
|
if (media) {
|
||||||
|
close()
|
||||||
|
}
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class='modal modal-full z-100' class:show={media} on:keydown={checkClose} tabindex='-1' role='button' bind:this={modal}>
|
<div class='modal modal-full z-50' class:show={media} on:keydown={checkClose} tabindex='-1' role='button' bind:this={modal}>
|
||||||
{#if media}
|
{#if media}
|
||||||
<div class='h-full modal-content bg-very-dark p-0 overflow-y-auto position-relative' use:smoothScroll>
|
<div class='h-full modal-content bg-very-dark p-0 overflow-y-auto position-relative' bind:this={container} use:smoothScroll>
|
||||||
<button class='close pointer z-30 bg-dark top-20 right-0 position-fixed' type='button' use:click={close}> × </button>
|
<button class='close pointer z-30 bg-dark top-20 right-0 position-fixed' type='button' use:click={() => close()}> × </button>
|
||||||
<img class='w-full cover-img banner position-absolute' alt='banner' src={media.bannerImage || ' '} />
|
<img class='w-full cover-img banner position-absolute' alt='banner' src={media.bannerImage || ' '} />
|
||||||
<div class='row px-20'>
|
<div class='row px-20'>
|
||||||
<div class='col-lg-7 col-12 pb-10'>
|
<div class='col-lg-7 col-12 pb-10'>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue