2023-07-22 20:44:24 +02:00
|
|
|
<script>
|
|
|
|
import { inview } from 'svelte-inview'
|
2023-08-05 20:33:07 +02:00
|
|
|
import previewRice from '$lib/videos/end_4_rice_intro.mp4'
|
|
|
|
import previewRiceThumbnail from '$lib/videos/end_4_thumbnail.png'
|
2023-08-07 19:59:22 +02:00
|
|
|
import AudioIcon from '~icons/mingcute/volume-line'
|
|
|
|
import MuteIcon from '~icons/mingcute/volume-mute-line'
|
|
|
|
import clsx from 'clsx'
|
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 isShowingControls = false
|
|
|
|
let isMuted = true
|
|
|
|
|
|
|
|
function toggleMute() {
|
|
|
|
isMuted = !isMuted
|
|
|
|
}
|
|
|
|
function togglePlay() {
|
|
|
|
videoElement.paused ? videoElement.play() : videoElement.pause()
|
|
|
|
}
|
2023-07-22 20:44:24 +02:00
|
|
|
</script>
|
|
|
|
|
|
|
|
<section
|
2023-08-07 19:59:22 +02:00
|
|
|
class="max-w-7xl px-1 -mb-4 lg:px-8 w-full relative animate-in [animation-delay:1700ms] fade-in-0 fill-mode-backwards [animation-duration:2000ms] slide-in-from-bottom-10 z-20 {$$restProps.class}"
|
2023-07-22 20:44:24 +02:00
|
|
|
>
|
|
|
|
<div
|
2023-08-17 16:40:51 +02:00
|
|
|
class={clsx(
|
|
|
|
'rounded-xl group overflow-hidden border-sky-400 border-2 transition-all [transition-duration:1460ms] mx-3',
|
|
|
|
!isVisible && 'opacity-20 scale-90'
|
|
|
|
)}
|
2023-08-07 19:59:22 +02:00
|
|
|
role="banner"
|
2023-08-17 16:40:51 +02:00
|
|
|
use:inview={{ threshold: 0.8 }}
|
|
|
|
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-07 19:59:22 +02:00
|
|
|
on:mouseenter={() => (isShowingControls = true)}
|
|
|
|
on:mouseleave={() => (isShowingControls = false)}
|
2023-07-22 20:44:24 +02:00
|
|
|
>
|
|
|
|
<video
|
|
|
|
bind:this={videoElement}
|
|
|
|
src={previewRice}
|
|
|
|
disablepictureinpicture="true"
|
|
|
|
disableremoteplayback="true"
|
|
|
|
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-07-22 20:44:24 +02:00
|
|
|
/>
|
2023-08-07 19:59:22 +02:00
|
|
|
<div
|
|
|
|
class={clsx(
|
|
|
|
'opacity-0 transition-opacity z-20 ',
|
|
|
|
isShowingControls ? 'opacity-100' : 'pointer-events-none'
|
|
|
|
)}
|
|
|
|
>
|
|
|
|
<button
|
|
|
|
class="absolute p-2 h-10 bg-black/5 rounded-full w-10 bottom-4 right-8 opacity-70 hover:opacity-100"
|
|
|
|
on:click|stopPropagation={toggleMute}
|
|
|
|
>
|
|
|
|
{#if isMuted}
|
|
|
|
<MuteIcon class="h-full w-full" />
|
|
|
|
{:else}
|
|
|
|
<AudioIcon class="h-full w-full" />
|
|
|
|
{/if}
|
|
|
|
</button>
|
|
|
|
</div>
|
2023-07-22 20:44:24 +02:00
|
|
|
</div>
|
|
|
|
<div class="preview-rice-bg" aria="hidden" />
|
|
|
|
</section>
|
|
|
|
|
|
|
|
<style lang="postcss">
|
|
|
|
.preview-rice-bg {
|
2023-08-07 19:59:22 +02:00
|
|
|
@apply absolute inset-0 -top-20 -z-10 w-screen opacity-50;
|
2023-07-22 20:44:24 +02:00
|
|
|
/* background-color: red; */
|
2023-08-07 19:59:22 +02:00
|
|
|
background-image: radial-gradient(min(150vw, 1400px) 50%, theme(colors.sky.500), transparent);
|
2023-07-22 20:44:24 +02:00
|
|
|
}
|
|
|
|
</style>
|