hyprland-website/src/routes/PreviewRiceSlice.svelte

154 lines
3.6 KiB
Svelte
Raw Normal View History

2023-08-17 16:46:35 +02:00
<script>
2023-07-22 20:44:24 +02:00
import { inview } from 'svelte-inview'
2023-08-05 20:33:07 +02:00
import previewRice from '$lib/videos/end_4_rice_intro.mp4'
2023-09-10 08:09:06 +02:00
import previewRiceThumbnail from '$lib/videos/end_4_thumbnail.webp'
2023-08-17 16:45:47 +02:00
import PauseIcon from '~icons/mingcute/pause-circle-line'
2023-08-07 19:59:22 +02:00
import clsx from 'clsx'
2023-08-17 16:45:47 +02:00
import { onMount } from 'svelte'
import { getIsMobile } from '$lib/Helper.mjs'
2023-07-22 20:44:24 +02:00
/** @type HTMLVideoElement */
let videoElement
2023-08-07 19:59:22 +02:00
2023-08-17 16:40:51 +02:00
let isVisible = false
2023-08-07 19:59:22 +02:00
let isMuted = true
2023-08-17 16:45:47 +02:00
let isPaused = false
2023-09-03 18:00:52 +02:00
// Video has no sound anymore
// function toggleMute() {
// isMuted = !isMuted
// }
2023-08-07 19:59:22 +02:00
function togglePlay() {
videoElement.paused ? videoElement.play() : videoElement.pause()
2023-08-17 16:45:47 +02:00
isPaused = videoElement.paused
}
function makeFullscreen() {
videoElement.requestFullscreen()
2023-08-07 19:59:22 +02:00
}
2023-08-17 16:45:47 +02:00
onMount(() => {
const isMobile = getIsMobile()
if (isMobile) {
//
}
})
2023-07-22 20:44:24 +02:00
</script>
2023-09-07 21:03:47 +02:00
<section class={$$restProps.class} class:isVisible>
2023-07-22 20:44:24 +02:00
<div
2023-09-03 18:00:52 +02:00
class="rice-video"
2023-08-07 19:59:22 +02:00
role="banner"
2023-09-03 18:00:52 +02:00
use:inview={{ threshold: 0.5 }}
2023-08-17 16:40:51 +02:00
on:inview_enter={() => {
isVisible = true
2023-07-31 11:32:19 +02:00
videoElement.play()
2023-07-22 20:44:24 +02:00
}}
2023-08-17 16:40:51 +02:00
on:inview_leave={() => {
isVisible = false
videoElement.pause()
}}
2023-08-17 16:45:47 +02:00
on:inview_leave={() => (isVisible = false)}
2023-07-22 20:44:24 +02:00
>
<video
bind:this={videoElement}
src={previewRice}
disablepictureinpicture="true"
disableremoteplayback="true"
2023-08-27 17:02:35 +02:00
class="rounded-xl"
2023-07-22 20:44:24 +02:00
loop
2023-08-07 19:59:22 +02:00
muted={isMuted}
2023-07-22 20:44:24 +02:00
preload="auto"
2023-08-05 20:33:07 +02:00
poster={previewRiceThumbnail}
2023-08-07 19:59:22 +02:00
on:click={togglePlay}
2023-08-17 16:45:47 +02:00
on:dblclick={makeFullscreen}
2023-07-22 20:44:24 +02:00
/>
2023-08-07 19:59:22 +02:00
<div
class={clsx(
2023-09-03 18:00:52 +02:00
'z-20 opacity-0 transition-opacity ',
2023-09-07 21:03:47 +02:00
isPaused ? 'opacity-100' : 'pointer-events-none'
2023-08-07 19:59:22 +02:00
)}
>
2023-09-05 21:09:18 +02:00
<!-- Currently there is no audio. Component might get refractored into a stand-alone player, so lets leave that here -->
2023-09-03 18:00:52 +02:00
<!-- <button
class="absolute bottom-4 right-4 h-10 w-10 rounded-full bg-black/5 p-2 opacity-70 hover:opacity-100"
2023-08-07 19:59:22 +02:00
on:click|stopPropagation={toggleMute}
>
{#if isMuted}
<MuteIcon class="h-full w-full" />
{:else}
<AudioIcon class="h-full w-full" />
{/if}
2023-09-03 18:00:52 +02:00
</button> -->
2023-08-17 16:45:47 +02:00
{#if isPaused}
<div
2023-09-03 18:00:52 +02:00
class="pointer-events-none absolute left-1/2 top-1/2 h-14 w-14 -translate-x-1/2 -translate-y-1/2 rounded-full opacity-80 hover:opacity-100"
2023-08-17 16:45:47 +02:00
>
<PauseIcon class="h-full w-full" />
</div>
{/if}
2023-08-07 19:59:22 +02:00
</div>
2023-08-27 17:02:35 +02:00
<a
2023-09-03 18:00:52 +02:00
class="absolute -bottom-7 left-0 block max-w-max px-3 pt-2 text-sm font-medium text-slate-100/70 hover:underline"
2023-08-27 17:02:35 +02:00
href="https://github.com/end-4/">Setup by @end_4</a
>
2023-07-22 20:44:24 +02:00
</div>
2023-08-27 17:02:35 +02:00
2023-09-03 18:00:52 +02:00
<div class="preview-rice-bg" aria="hidden" />
2023-07-22 20:44:24 +02:00
</section>
<style lang="postcss">
2023-09-07 21:03:47 +02:00
section {
2023-09-10 18:03:08 +02:00
@apply relative z-10 -mb-4 w-full max-w-[1400px] px-1 animate-in fade-in-0 slide-in-from-bottom-10 fill-mode-backwards [animation-delay:1700ms] [animation-duration:2000ms] md:-mt-8 lg:px-8;
2023-09-07 21:03:47 +02:00
contain: layout style content;
}
2023-09-03 18:00:52 +02:00
.rice-video {
@apply mx-3 rounded-xl transition-all;
transition-duration: 1460ms;
position: relative;
box-shadow: 0px 0px 44px theme(colors.primary / 80%);
border: solid 2px theme(colors.sky.400);
scale: 0.9;
background: theme(colors.cyan.300 / 70%);
& video {
@apply transition-opacity;
transition-duration: 1460ms;
opacity: 0.3;
}
.isVisible & {
scale: 1;
background: transparent;
box-shadow: 0px 0px 24px theme(colors.primary / 50%);
& video {
opacity: 1;
}
}
}
2023-07-22 20:44:24 +02:00
.preview-rice-bg {
2023-09-03 18:00:52 +02:00
position: absolute;
z-index: -10;
2023-09-10 08:09:06 +02:00
pointer-events: none;
2023-09-03 18:00:52 +02:00
opacity: 0.4;
min-width: 2800px;
overflow-x: hidden;
top: -160px;
left: 50%;
translate: -50% 0px;
width: 1100px;
height: 200%;
background-image: radial-gradient(
closest-side,
theme(colors.sky.500),
theme(colors.indigo.500 / 0%)
);
2023-07-22 20:44:24 +02:00
}
</style>