frontend/src/lib/components/Trendingstocks.svelte
MuslemRahimi 52285fb69a ui fixes
2025-03-03 15:37:57 +01:00

146 lines
4.7 KiB
Svelte

<script lang="ts">
import { stockTicker } from "$lib/store";
import amdLogo from "$lib/images/stocks/logo/AMD.png";
import tslaLogo from "$lib/images/stocks/logo/TSLA.png";
import aaplLogo from "$lib/images/stocks/logo/AAPL.png";
import nvdaLogo from "$lib/images/stocks/logo/NVDA.png";
export let trendingList: List;
export let color;
async function stockSelector(state) {
stockTicker.update((value) => state);
}
$: {
if (trendingList) {
for (const item of trendingList) {
if (item?.symbol === "AMD") {
item.image = amdLogo;
} else if (item?.symbol === "TSLA") {
item.image = tslaLogo;
} else if (item?.symbol === "AAPL") {
item.image = aaplLogo;
} else if (item?.symbol === "NVDA") {
item.image = nvdaLogo;
}
}
trendingList = [...trendingList];
}
}
</script>
<section
class="relative flex justify-between items-center bg-[{color}] rounded-md"
>
<div class="max-w-3xl m-auto">
<div
class="flex flex-row justify-start items-cneter overflow-hidden w-full pb-2"
>
{#if trendingList?.length !== 0}
{#each trendingList as item}
<a
href={"/stocks/" + item?.symbol}
on:click={() => stockSelector(item?.symbol)}
class="h-18 w-[90px] sm:w-28 mt-5 rounded-xl flex flex-col justify-center items-center"
>
<img class="relative mb-2 rounded w-5 h-5" src={item?.image} />
<p class="text-center text-white text-sm whitespace-normal mb-0.5">
{item?.symbol}
</p>
<div
class="flex justify-center items-center m-auto text-xs sm:text-sm relative bottom-0"
>
{#if item?.changesPercentage >= 0}
<svg
class="w-2.5 h-2.5 inline-block mt-0.5 mr-0.5"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
><g
><path
fill="#00FC50"
d="M3 19h18a1.002 1.002 0 0 0 .823-1.569l-9-13c-.373-.539-1.271-.539-1.645 0l-9 13A.999.999 0 0 0 3 19z"
/></g
></svg
>
<span class="items-center justify-start text-[#00FC50]"
>+{item?.changesPercentage?.toFixed(2)}%</span
>
{:else}
<svg
class="w-2.5 h-2.5 inline-block mt-0.5 mr-1"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
><g transform="rotate(180 12 12)"
><path
fill="#FF2F1F"
d="M3 19h18a1.002 1.002 0 0 0 .823-1.569l-9-13c-.373-.539-1.271-.539-1.645 0l-9 13A.999.999 0 0 0 3 19z"
/></g
></svg
>
<span class="items-center justify-start text-[#FF2F1F]">
{item?.changesPercentage?.toFixed(2)}%
</span>
{/if}
</div>
</a>
{/each}
{:else}
<div class="m-auto w-full mt-5">
<div role="status" class="animate-pulse">
<div class="w-full flex flex-row items-center">
<div class="flex flex-col items-center mr-10 sm:mr-14">
<div class="bg-slate-400 rounded-full w-12 h-12"></div>
<div class="bg-slate-400 rounded-md w-12 h-4 mt-3"></div>
</div>
<div class="flex flex-col items-center mr-10 sm:mr-14">
<div class="bg-slate-400 rounded-full w-12 h-12"></div>
<div class="bg-slate-400 rounded-md w-12 h-4 mt-3"></div>
</div>
<div class="flex flex-col items-center mr-10 sm:mr-14">
<div class="bg-slate-400 rounded-full w-12 h-12"></div>
<div class="bg-slate-400 rounded-md w-12 h-4 mt-3"></div>
</div>
<div class="flex flex-col items-center">
<div class="bg-slate-400 rounded-full w-12 h-12"></div>
<div class="bg-slate-400 rounded-md w-12 h-4 mt-3"></div>
</div>
</div>
</div>
</div>
{/if}
</div>
</div>
</section>
<style>
a:hover img {
animation-name: shake;
animation-duration: 0.5s;
animation-iteration-count: infinite;
animation-timing-function: ease-in-out;
}
@keyframes shake {
0% {
transform: rotate(0deg);
}
25% {
transform: rotate(10deg);
}
50% {
transform: rotate(0deg);
}
75% {
transform: rotate(-10deg);
}
100% {
transform: rotate(0deg);
}
}
:root {
--primary-color: mediumslateblue;
}
</style>