Styling improvements

This commit is contained in:
Aleksi Lassila
2023-08-09 02:36:09 +03:00
parent 536d11cf78
commit a8d328dec5
15 changed files with 308 additions and 270 deletions

View File

@@ -21,7 +21,7 @@
'focus-visible:bg-zinc-200 focus-visible:text-zinc-800 hover:bg-zinc-200 hover:text-zinc-800':
(type === 'secondary' || type === 'tertiary') && !disabled,
'rounded-full': type === 'tertiary',
'py-3 px-6': size === 'lg',
'py-2 px-6 sm:py-3 sm:px-6': size === 'lg',
'py-2 px-6': size === 'md',
'py-1 px-3': size === 'sm',
'opacity-50': disabled,

View File

@@ -4,58 +4,62 @@
import { ChevronLeft, ChevronRight } from 'radix-icons-svelte';
import classNames from 'classnames';
export let gradientFromColor = 'from-stone-900';
export let gradientFromColor = 'from-stone-950';
export let heading = '';
let carousel: HTMLDivElement | undefined;
let scrollX = 0;
</script>
<div class="flex justify-between items-center mx-2 sm:mx-8 gap-4">
<slot name="title">
<div class="font-semibold text-xl">{heading}</div>
</slot>
<div
class={classNames('flex gap-2', {
hidden: (carousel?.scrollWidth || 0) === (carousel?.clientWidth || 0)
})}
>
<IconButton
on:click={() => {
carousel?.scrollTo({ left: scrollX - carousel?.clientWidth * 0.8, behavior: 'smooth' });
}}
<div class={classNames('flex flex-col gap-4', $$restProps.class)}>
<div class={'flex justify-between items-center gap-4'}>
<slot name="title">
<div class="font-semibold text-xl">{heading}</div>
</slot>
<div
class={classNames('flex gap-2', {
hidden: (carousel?.scrollWidth || 0) === (carousel?.clientWidth || 0)
})}
>
<ChevronLeft size={20} />
</IconButton>
<IconButton
on:click={() => {
carousel?.scrollTo({ left: scrollX + carousel?.clientWidth * 0.8, behavior: 'smooth' });
}}
>
<ChevronRight size={20} />
</IconButton>
<IconButton
on:click={() => {
carousel?.scrollTo({ left: scrollX - carousel?.clientWidth * 0.8, behavior: 'smooth' });
}}
>
<ChevronLeft size={20} />
</IconButton>
<IconButton
on:click={() => {
carousel?.scrollTo({ left: scrollX + carousel?.clientWidth * 0.8, behavior: 'smooth' });
}}
>
<ChevronRight size={20} />
</IconButton>
</div>
</div>
</div>
<div class="relative">
<div
class="flex overflow-x-scroll items-center overflow-y-hidden gap-4 relative px-2 sm:px-8 scrollbar-hide py-4"
bind:this={carousel}
tabindex="-1"
on:scroll={() => (scrollX = carousel?.scrollLeft || scrollX)}
>
<slot />
<div class="relative">
<div
class="flex overflow-x-scroll items-center overflow-y-hidden gap-4 relative scrollbar-hide"
bind:this={carousel}
tabindex="-1"
on:scroll={() => (scrollX = carousel?.scrollLeft || scrollX)}
>
<slot />
</div>
{#if scrollX > 50}
<div
transition:fade={{ duration: 200 }}
class={'absolute inset-y-0 left-0 w-0 sm:w-16 md:w-24 bg-gradient-to-r ' +
gradientFromColor}
/>
{/if}
{#if carousel && scrollX < carousel?.scrollWidth - carousel?.clientWidth - 50}
<div
transition:fade={{ duration: 200 }}
class={'absolute inset-y-0 right-0 w-0 sm:w-16 md:w-24 bg-gradient-to-l ' +
gradientFromColor}
/>
{/if}
</div>
{#if scrollX > 50}
<div
transition:fade={{ duration: 200 }}
class={'absolute inset-y-4 left-0 w-0 sm:w-16 md:w-24 bg-gradient-to-r ' + gradientFromColor}
/>
{/if}
{#if carousel && scrollX < carousel?.scrollWidth - carousel?.clientWidth - 50}
<div
transition:fade={{ duration: 200 }}
class={'absolute inset-y-4 right-0 w-0 sm:w-16 md:w-24 bg-gradient-to-l ' + gradientFromColor}
/>
{/if}
</div>

View File

@@ -63,7 +63,7 @@
<button
on:click
class={classNames(
'aspect-video bg-center bg-cover bg-no-repeat rounded-lg overflow-hidden transition-all shadow-lg relative selectable flex-shrink-0 placeholder-image flex',
'aspect-video bg-center bg-cover bg-no-repeat rounded-lg overflow-hidden transition-all shadow-lg relative selectable flex-shrink-0 placeholder-image flex flex-col',
{
'h-40': size === 'md',
'h-full': size === 'dynamic',
@@ -77,7 +77,7 @@
>
<div
class={classNames(
'flex-1 flex flex-col justify-between group-hover:opacity-0 transition-all',
'w-full flex-1 flex flex-col justify-between group-hover:opacity-0 transition-all',
{
'px-2 lg:px-3 pt-2': true,
'pb-4 lg:pb-6': progress,

View File

@@ -22,7 +22,7 @@
}
</script>
<svelte:window bind:innerHeight={windowHeight} />
<svelte:window bind:outerHeight={windowHeight} />
<div
style={"background-image: url('" +
@@ -31,13 +31,25 @@
"'); height: " +
imageHeight.toFixed() +
'px'}
class="fixed inset-x-0 bg-center bg-cover z-[-10]"
class="hidden sm:block fixed inset-x-0 bg-center bg-cover z-[-10]"
>
<div class="absolute inset-0 bg-darken" />
</div>
<div class="flex flex-col h-screen" transition:fade>
<div class="flex-1 relative flex pt-24 px-4 sm:px-8">
<div
style={"background-image: url('" +
TMDB_IMAGES_ORIGINAL +
posterPath +
"'); height: " +
imageHeight.toFixed() +
'px'}
class="sm:hidden fixed inset-x-0 bg-center bg-cover z-[-10]"
>
<div class="absolute inset-0 bg-darken" />
</div>
<div class="flex flex-col h-[85vh] sm:h-screen" transition:fade>
<div class="flex-1 relative flex pt-24 px-4 sm:px-8 pb-6">
<div class="absolute inset-0 bg-gradient-to-t from-stone-950 to-30%" />
<div class="z-[1] flex-1 flex justify-end gap-8 items-end max-w-screen-2xl mx-auto">
<div
@@ -67,18 +79,16 @@
</div>
</div>
</div>
<div bind:clientHeight={bottomHeight} class="py-6 bg-stone-950">
<div bind:clientHeight={bottomHeight} class="pb-6 bg-stone-950">
<div class="max-w-screen-2xl mx-auto">
<div class="2xl:-mx-8">
<slot name="episodes-carousel" />
</div>
<slot name="episodes-carousel" />
</div>
</div>
</div>
<div class="flex flex-col gap-6 bg-stone-950">
<div class="flex flex-col gap-6 bg-stone-950 px-2 sm:px-4 lg:px-8 2xl:px-0 pb-6">
<div
class="mx-4 sm:mx-8 grid grid-cols-4 sm:grid-cols-6 gap-4 sm:gap-x-8 rounded-xl py-6 max-w-screen-2xl 2xl:mx-auto"
class="grid grid-cols-4 sm:grid-cols-6 gap-4 sm:gap-x-8 rounded-xl max-w-screen-2xl 2xl:mx-auto py-4"
>
<slot name="info-description">
<div
@@ -126,34 +136,28 @@
</div>
</slot>
</div>
<div class="max-w-screen-2xl 2xl:mx-auto">
<div class="2xl:-mx-8">
<Carousel gradientFromColor="from-stone-950">
<slot name="cast-crew-carousel-title" slot="title" />
<slot name="cast-crew-carousel">
<CarouselPlaceholderItems />
</slot>
</Carousel>
</div>
<div class="max-w-screen-2xl 2xl:mx-auto w-full">
<Carousel gradientFromColor="from-stone-950">
<slot name="cast-crew-carousel-title" slot="title" />
<slot name="cast-crew-carousel">
<CarouselPlaceholderItems />
</slot>
</Carousel>
</div>
<div class="max-w-screen-2xl 2xl:mx-auto">
<div class="2xl:-mx-8">
<Carousel gradientFromColor="from-stone-950">
<slot name="recommendations-carousel-title" slot="title" />
<slot name="recommendations-carousel">
<CarouselPlaceholderItems />
</slot>
</Carousel>
</div>
<div class="max-w-screen-2xl 2xl:mx-auto w-full">
<Carousel gradientFromColor="from-stone-950">
<slot name="recommendations-carousel-title" slot="title" />
<slot name="recommendations-carousel">
<CarouselPlaceholderItems />
</slot>
</Carousel>
</div>
<div class="max-w-screen-2xl 2xl:mx-auto">
<div class="2xl:-mx-8">
<Carousel gradientFromColor="from-stone-950">
<slot name="similar-carousel-title" slot="title" />
<slot name="similar-carousel">
<CarouselPlaceholderItems />
</slot>
</Carousel>
</div>
<div class="max-w-screen-2xl 2xl:mx-auto w-full">
<Carousel gradientFromColor="from-stone-950">
<slot name="similar-carousel-title" slot="title" />
<slot name="similar-carousel">
<CarouselPlaceholderItems />
</slot>
</Carousel>
</div>
</div>

View File

@@ -67,10 +67,15 @@
});
</script>
<div class="h-screen relative pt-24 flex">
<div class="relative z-[1] px-16 py-8 flex-1 grid grid-cols-6">
<div class="h-[80vh] sm:h-screen relative pt-24 flex">
<div
class={classNames(
'relative z-[1] px-4 lg:px-16 2xl:px-32 py-4 lg:py-8 2xl:py-16 flex-1 sm:grid grid-cols-6 grid-rows-3',
'flex flex-col justify-end gap-8'
)}
>
{#if UIVisible}
<div class="flex flex-col justify-center col-span-3 gap-6 max-w-screen-md -mt-20">
<div class="flex flex-col col-span-3 gap-6 max-w-screen-md">
<div class="flex flex-col gap-1">
<div
class="flex items-center gap-1 uppercase text-sm text-zinc-300 font-semibold tracking-wider"
@@ -85,8 +90,8 @@
</div>
<h1
class={classNames('font-medium tracking-wider text-stone-200', {
'text-6xl': title.length < 15,
'text-5xl': title.length >= 15
'text-5xl sm:text-6xl 2xl:text-7xl': title.length < 15,
'text-4xl sm:text-5xl 2xl:text-6xl': title.length >= 15
})}
in:fly|global={{ y: -10, delay: ANIMATION_DURATION, duration: ANIMATION_DURATION }}
out:fly|global={{ y: 10, duration: ANIMATION_DURATION }}
@@ -128,7 +133,7 @@
</div> -->
</div>
<div
class="flex-1 flex flex-col gap-6 justify-end col-span-2 col-start-1"
class="sm:flex-1 flex flex-col gap-6 justify-end col-span-2 col-start-1 row-start-3"
in:fade|global={{ delay: ANIMATION_DURATION, duration: ANIMATION_DURATION }}
out:fade|global={{ duration: ANIMATION_DURATION }}
>
@@ -215,7 +220,7 @@
</div> -->
</div>
{/if}
<div class="row-start-2 col-start-4 col-span-3 flex items-end justify-end">
<div class="hidden lg:flex items-end justify-end col-start-4 row-start-3 col-span-3">
<div class="flex gap-6 items-center">
<div>
<p class="text-zinc-400 text-sm font-medium">Release Date</p>
@@ -239,6 +244,21 @@
/>
</div>
</div>
{#if UIVisible}
<div
class="hidden lg:flex absolute inset-x-4 lg:inset-x-16 2xl:inset-x-32 bottom-4 lg:bottom-8 2xl:bottom-16 opacity-70 gap-3 justify-end lg:justify-center"
in:fade={{ delay: ANIMATION_DURATION, duration: ANIMATION_DURATION }}
out:fade={{ duration: ANIMATION_DURATION }}
>
{#each Array.from({ length: showcaseLength }, (_, i) => i) as i}
{#if i === showcaseIndex}
<DotFilled size={15} class="opacity-100" />
{:else}
<DotFilled size={15} class="opacity-20" />
{/if}
{/each}
</div>
{/if}
</div>
{#if !trailerVisible}
<div
@@ -261,13 +281,13 @@
{/if}
{#if UIVisible}
<div
class="absolute inset-0 bg-gradient-to-t from-stone-950 via-darken via-[30%] to-darken opacity-50"
class="absolute inset-0 bg-gradient-to-t from-stone-950 via-darken via-[20%] to-darken"
in:fade={{ duration: ANIMATION_DURATION }}
out:fade={{ duration: ANIMATION_DURATION }}
/>
{:else if !UIVisible}
<div
class="absolute inset-x-0 top-0 h-24 bg-gradient-to-b from-darken opacity-50"
class="absolute inset-x-0 top-0 h-24 bg-gradient-to-b from-darken"
in:fade={{ duration: ANIMATION_DURATION }}
out:fade={{ duration: ANIMATION_DURATION }}
/>
@@ -292,19 +312,4 @@
class="opacity-0 peer-hover:opacity-20 transition-opacity bg-gradient-to-l from-darken absolute inset-0"
/>
</div>
{#if UIVisible}
<div
class="absolute inset-x-0 bottom-8 flex justify-center opacity-70 gap-3"
in:fade={{ delay: ANIMATION_DURATION, duration: ANIMATION_DURATION }}
out:fade={{ duration: ANIMATION_DURATION }}
>
{#each Array.from({ length: showcaseLength }, (_, i) => i) as i}
{#if i === showcaseIndex}
<DotFilled size={15} class="opacity-100" />
{:else}
<DotFilled size={15} class="opacity-20" />
{/if}
{/each}
</div>
{/if}
</div>

View File

@@ -102,7 +102,7 @@
})}
>
<IconButton on:click={modalProps.close}>
<Cross2 />
<Cross2 size={25} />
</IconButton>
</div>
</div>

View File

@@ -5,7 +5,7 @@
</script>
<div class="overflow-hidden w-full h-full">
<div class="youtube-container scale-[150%] hidden sm:block h-full w-full">
<div class="youtube-container scale-[150%] h-full w-full">
<iframe
src={'https://www.youtube.com/embed/' +
videoId +