aboutsummaryrefslogtreecommitdiff
path: root/src/lib/Media/Cover
diff options
context:
space:
mode:
authorFuwn <[email protected]>2024-01-02 02:14:22 -0800
committerFuwn <[email protected]>2024-01-02 02:14:22 -0800
commit1bf5e3fe55defe95114c9df69b62cc1b40761a0b (patch)
treec8f1269696769201156799bb136dd06243270bda /src/lib/Media/Cover
parentfix(hovercover): no hover null (diff)
downloaddue.moe-1bf5e3fe55defe95114c9df69b62cc1b40761a0b.tar.xz
due.moe-1bf5e3fe55defe95114c9df69b62cc1b40761a0b.zip
refactor(media): move hover cover
Diffstat (limited to 'src/lib/Media/Cover')
-rw-r--r--src/lib/Media/Cover/HoverCover.svelte34
-rw-r--r--src/lib/Media/Cover/hoverCover.ts52
2 files changed, 86 insertions, 0 deletions
diff --git a/src/lib/Media/Cover/HoverCover.svelte b/src/lib/Media/Cover/HoverCover.svelte
new file mode 100644
index 00000000..b0c15fc5
--- /dev/null
+++ b/src/lib/Media/Cover/HoverCover.svelte
@@ -0,0 +1,34 @@
+<script lang="ts">
+ import type { Media } from '$lib/AniList/media';
+ import type { SubsPleaseEpisode } from '../Anime/Airing/Subtitled/subsPlease';
+
+ export let hovering = false;
+ export let hoveredItem: SubsPleaseEpisode | null = null;
+ export let hoveredMedia: Media | null = null;
+ export let imageStyle = '';
+</script>
+
+{#if hovering}
+ <img
+ class="hover-image show"
+ src={hoveredMedia
+ ? hoveredMedia.coverImage.extraLarge
+ : `https://subsplease.org${hoveredItem?.image_url}`}
+ alt="Media Cover"
+ style={imageStyle}
+ />
+{/if}
+
+<style>
+ .hover-image {
+ position: fixed;
+ z-index: 1000;
+ width: 300px;
+ height: auto;
+ display: none;
+ }
+
+ .show {
+ display: block;
+ }
+</style>
diff --git a/src/lib/Media/Cover/hoverCover.ts b/src/lib/Media/Cover/hoverCover.ts
new file mode 100644
index 00000000..85e4db7c
--- /dev/null
+++ b/src/lib/Media/Cover/hoverCover.ts
@@ -0,0 +1,52 @@
+import type { Media } from '$lib/AniList/media';
+import { get } from 'svelte/store';
+import type { SubsPleaseEpisode } from '../Anime/Airing/Subtitled/subsPlease';
+import settings from '$stores/settings';
+
+interface OnMouseEnterLeave {
+ hovering: boolean;
+ item: SubsPleaseEpisode | null;
+ media: Media | null;
+}
+
+export const onMouseEnter = (media: Media | null, item: SubsPleaseEpisode | null = null) => {
+ if (!get(settings).displayHoverCover && !item)
+ return { hovering: false, item: null, media: null } as OnMouseEnterLeave;
+
+ return { hovering: true, item, media } as OnMouseEnterLeave;
+};
+
+export const onMouseLeave = () => {
+ return { hovering: false, item: null, media: null } as OnMouseEnterLeave;
+};
+
+interface OnMouseMove {
+ height: number;
+ style: string;
+}
+
+export const onMouseMove = (event: MouseEvent, imageWidth = 300) => {
+ const offset = 10;
+ let imageLeft = 0;
+ let imageTop = 0;
+ const image = document.getElementsByClassName('hover-image')[0] as HTMLImageElement;
+ const response: OnMouseMove = {
+ height: 0,
+ style: ''
+ };
+
+ if (image) {
+ image.onload = () => (response.height = image.height);
+ imageLeft =
+ event.pageX + imageWidth + offset > window.innerWidth
+ ? event.pageX - imageWidth - offset
+ : event.pageX + offset;
+ imageTop =
+ event.pageY + response.height + offset > window.innerHeight
+ ? event.pageY - response.height
+ : event.pageY + offset;
+ response.style = `top: ${imageTop}px; left: ${imageLeft}px;`;
+ }
+
+ return response;
+};