pro only filters on the stock screener

This commit is contained in:
MuslemRahimi 2024-11-10 11:07:21 +01:00
parent 2af85814b4
commit 33edefa9bd
6 changed files with 27 additions and 1025 deletions

View File

@ -1,26 +0,0 @@
export const load = async ({ locals, setHeaders }) => {
const getMostRetailVolume = async () => {
const { apiKey, apiURL, user } = locals;
// make the POST request to the endpoint
const response = await fetch(apiURL + "/most-retail-volume", {
method: "GET",
headers: {
"Content-Type": "application/json",
"X-API-KEY": apiKey,
},
});
let output = await response.json();
output = user?.tier !== "Pro" ? output?.slice(0, 6) : output;
setHeaders({ "cache-control": "public, max-age=3000" });
return output;
};
// Make sure to return a promise
return {
getMostRetailVolume: await getMostRetailVolume(),
};
};

View File

@ -1,361 +0,0 @@
<script lang="ts">
import { goto } from "$app/navigation";
import { numberOfUnreadNotification, screenWidth } from "$lib/store";
import { abbreviateNumber } from "$lib/utils";
import { onMount } from "svelte";
import UpgradeToPro from "$lib/components/UpgradeToPro.svelte";
import ArrowLogo from "lucide-svelte/icons/move-up-right";
export let data;
let cloudFrontUrl = import.meta.env.VITE_IMAGE_URL;
let isLoaded = false;
let rawData = [];
let stockList = [];
async function handleScroll() {
const scrollThreshold = document.body.offsetHeight * 0.8; // 80% of the website height
const isBottom = window.innerHeight + window.scrollY >= scrollThreshold;
if (isBottom && stockList?.length !== rawData?.length) {
const nextIndex = stockList?.length;
const filteredNewResults = rawData?.slice(nextIndex, nextIndex + 25);
stockList = [...stockList, ...filteredNewResults];
}
}
onMount(() => {
rawData = data?.getMostRetailVolume ?? [];
stockList = rawData?.slice(0, 20) ?? [];
isLoaded = true;
if (data?.user?.tier === "Pro") {
window.addEventListener("scroll", handleScroll);
return () => {
window.removeEventListener("scroll", handleScroll);
};
}
});
$: charNumber = $screenWidth < 640 ? 15 : 40;
</script>
<svelte:head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>
{$numberOfUnreadNotification > 0 ? `(${$numberOfUnreadNotification})` : ""} Most
Retail Investor Volume · stocknear
</title>
<meta
name="description"
content={`On a daily basis we update the retail investor volume to see where most money flows into.`}
/>
<!-- Other meta tags -->
<meta
property="og:title"
content={`Most Retail Investor Volume · stocknear`}
/>
<meta
property="og:description"
content={`On a daily basis we update the retail investor volume to see where most money flows into.`}
/>
<meta property="og:type" content="website" />
<!-- Add more Open Graph meta tags as needed -->
<!-- Twitter specific meta tags -->
<meta name="twitter:card" content="summary_large_image" />
<meta
name="twitter:title"
content={`Most Retail Investor Volume · stocknear`}
/>
<meta
name="twitter:description"
content={`On a daily basis we update the retail investor volume to see where most money flows into.`}
/>
<!-- Add more Twitter meta tags as needed -->
</svelte:head>
<section
class="w-full max-w-3xl sm:max-w-screen-2xl overflow-hidden min-h-screen pt-5 pb-40"
>
<div class="text-sm sm:text-[1rem] breadcrumbs ml-4">
<ul>
<li><a href="/" class="text-gray-300">Home</a></li>
<li class="text-gray-300">Retail Trader Volume</li>
</ul>
</div>
<div class="w-full overflow-hidden m-auto mt-5">
<div class="sm:p-0 flex justify-center w-full m-auto overflow-hidden">
<div
class="relative flex justify-center items-start overflow-hidden w-full"
>
<main class="w-full lg:w-3/4 lg:pr-5">
<div
class="w-full m-auto sm:bg-[#27272A] sm:rounded-xl h-auto pl-10 pr-10 pt-5 sm:pb-10 sm:pt-10 mt-3 mb-8"
>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-10">
<!-- Start Column -->
<div>
<div class="flex flex-row justify-center items-center">
<h1
class="text-3xl sm:text-4xl text-white text-center font-bold mb-5"
>
Retail Trader Activity
</h1>
</div>
<span
class="text-white text-md font-medium text-center flex justify-center items-center"
>
Find out the Top 100 stocks where retail traders are investing
the most daily.
</span>
</div>
<!-- End Column -->
<!-- Start Column -->
<div
class="hidden sm:block relative m-auto mb-5 mt-5 sm:mb-0 sm:mt-0"
>
<svg
class="w-40 -my-5"
viewBox="0 0 200 200"
xmlns="http://www.w3.org/2000/svg"
>
<defs>
<filter id="glow">
<feGaussianBlur stdDeviation="5" result="glow" />
<feMerge>
<feMergeNode in="glow" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
</defs>
<path
fill="#1E40AF"
d="M57.6,-58.7C72.7,-42.6,81.5,-21.3,82,0.5C82.5,22.3,74.7,44.6,59.7,60.1C44.6,75.6,22.3,84.3,0,84.3C-22.3,84.2,-44.6,75.5,-61.1,60.1C-77.6,44.6,-88.3,22.3,-87.6,0.7C-86.9,-20.8,-74.7,-41.6,-58.2,-57.7C-41.6,-73.8,-20.8,-85.2,0.2,-85.4C21.3,-85.6,42.6,-74.7,57.6,-58.7Z"
transform="translate(100 100)"
filter="url(#glow)"
/>
</svg>
<div class="z-1 absolute -top-3">
<img
class="w-28 ml-6"
src={cloudFrontUrl + "/assets/retail_logo.png"}
alt="logo"
loading="lazy"
/>
</div>
</div>
<!-- End Column -->
</div>
</div>
{#if isLoaded}
<div
class="w-full text-center sm:text-start sm:flex sm:flex-row sm:items-center m-auto text-gray-100 border border-gray-800 sm:rounded-lg h-auto p-5"
>
<svg
class="w-5 h-5 inline-block sm:mr-2 flex-shrink-0"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 256 256"
><path
fill="#fff"
d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m-4 48a12 12 0 1 1-12 12a12 12 0 0 1 12-12m12 112a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 0 16"
/></svg
>
We update on a daily basis where retail investor are trading the most
to never miss out the next hype. Daily sentiments can either be bullish
(strong buying of retail investors) or bearish (more selling) for each
stock.
</div>
<div class="w-screen sm:w-full m-auto mt-20 sm:mt-10">
<div
class="w-screen sm:w-full m-auto rounded-none sm:rounded-lg mb-4 overflow-x-scroll sm:overflow-hidden"
>
<table
class="table table-sm table-compact rounded-none sm:rounded-md w-full bg-[#09090B] border-bg-[#09090B] m-auto"
>
<thead>
<tr class="bg-[#09090B] border-b border-[#27272A]">
<th
class="text-end bg-[#09090B] text-white text-[1rem] font-semibold"
>
#
</th>
<th
class="text-start bg-[#09090B] text-white text-[1rem] font-semibold"
>
Symbol
</th>
<th
class=" text-start bg-[#09090B] text-white text-[1rem] font-semibold"
>
Name
</th>
<th
class="text-center bg-[#09090B] text-white text-[1rem] font-semibold"
>
Daily Traded
</th>
<th
class="text-end bg-[#09090B] text-white text-[1rem] font-semibold"
>
Volume in %
</th>
<th
class="text-end bg-[#09090B] text-white text-[1rem] font-semibold"
>
Sentiment
</th>
</tr>
</thead>
<tbody>
{#each stockList as item, index}
<tr
class="sm:hover:bg-[#245073] border-b border-[#27272A] sm:hover:bg-opacity-[0.2] odd:bg-[#27272A] {index +
1 ===
stockList?.length && data?.user?.tier !== 'Pro'
? 'opacity-[0.1]'
: ''}"
>
<td
class="text-white text-sm sm:text-[1rem] font-medium text-white text-end"
>
{index + 1}
</td>
<td class="text-sm sm:text-[1rem] text-start">
<a
href={"/stocks/" + item?.symbol}
class="sm:hover:text-white text-blue-400"
>
{item?.symbol}
</a>
</td>
<td
class="whitespace-nowrap text-white text-sm sm:text-[1rem] text-white text-start"
>
{item?.name?.length > charNumber
? item?.name?.slice(0, charNumber) + "..."
: item?.name}
</td>
<td
class="text-center text-sm sm:text-[1rem] font-medium text-white"
>
{abbreviateNumber(item?.traded, true)}
</td>
<td
class="text-end text-sm sm:text-[1rem] font-medium text-white"
>
{item?.retailStrength}%
</td>
<td
class="text-end text-sm sm:text-[1rem] font-medium {item?.sentiment >
0
? 'text-[#00FC50]'
: item?.sentiment < 0
? 'text-[#E57C34]'
: 'text-[#C6A755]'}"
>
{item?.sentiment > 0
? "Bullish"
: item?.sentiment < 0
? "Bearish"
: "Mixed"}
</td>
</tr>
{/each}
</tbody>
</table>
</div>
<UpgradeToPro
{data}
title="Get the top 100 stocks that retail investors put their money on the market to never miss out the next hype"
/>
</div>
{:else}
<div class="flex justify-center items-center h-80">
<div class="relative">
<label
class="bg-[#09090B] rounded-xl h-14 w-14 flex justify-center items-center absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2"
>
<span class="loading loading-spinner loading-md text-gray-400"
></span>
</label>
</div>
</div>
{/if}
</main>
<aside class="hidden lg:block relative fixed w-1/4 ml-4">
{#if data?.user?.tier !== "Pro" || data?.user?.freeTrial}
<div
on:click={() => goto("/pricing")}
class="w-full text-white border border-gray-600 rounded-md h-fit pb-4 mt-4 cursor-pointer"
>
<div
class="w-auto lg:w-full p-1 flex flex-col m-auto px-2 sm:px-0"
>
<div class="w-full flex justify-between items-center p-3 mt-3">
<h2 class="text-start text-xl font-semibold text-white ml-3">
Pro Subscription 🔥
</h2>
<ArrowLogo class="w-8 h-8 mr-3 flex-shrink-0" />
</div>
<span class="text-white p-3 ml-3 mr-3">
Upgrade now for unlimited access to all data and tools.
</span>
</div>
</div>
{/if}
<div
on:click={() => goto("/cramer-tracker")}
class="w-full text-white border border-gray-600 rounded-md h-fit pb-4 mt-4 cursor-pointer"
>
<div class="w-auto lg:w-full p-1 flex flex-col m-auto px-2 sm:px-0">
<div class="w-full flex justify-between items-center p-3 mt-3">
<h2 class="text-start text-xl font-semibold text-white ml-3">
Cramer Tracker 📉
</h2>
<ArrowLogo class="w-8 h-8 mr-3 flex-shrink-0" />
</div>
<span class="text-white p-3 ml-3 mr-3">
Follow Jim Cramer latest stock picks
</span>
</div>
</div>
<div
on:click={() => goto("/reddit-tracker")}
class="w-full text-white border border-gray-600 rounded-md h-fit pb-4 mt-4 cursor-pointer"
>
<div class="w-auto lg:w-full p-1 flex flex-col m-auto px-2 sm:px-0">
<div class="w-full flex justify-between items-center p-3 mt-3">
<h2 class="text-start text-xl font-semibold text-white ml-3">
Reddit Tracker 🚀
</h2>
<ArrowLogo class="w-8 h-8 mr-3 flex-shrink-0" />
</div>
<span class="text-white p-3 ml-3 mr-3">
Get the latest trends of r/Wallstreetbets
</span>
</div>
</div>
</aside>
</div>
</div>
</div>
</section>

View File

@ -60,12 +60,10 @@ const pages = [
{ title: "/list/bitcoin-etfs" },
{ title: "/stock-screener" },
{ title: "/market-news" },
{ title: "/market-news/crypto" },
{ title: "/market-news/general" },
{ title: "/earnings-calendar" },
{ title: "/economic-calendar" },
{ title: "/dividends-calendar" },
{ title: "/stock-splits-calendar" },
{ title: "/market-mover/gainers" },
{ title: "/market-mover/losers" },
{ title: "/market-mover/active" },

View File

@ -1466,13 +1466,14 @@
}
function changeRule(state: string) {
searchTerm = "";
selectedPopularStrategy = "";
ruleName = state;
handleAddRule();
//const closePopup = document.getElementById("ruleModal");
//closePopup?.dispatchEvent(new MouseEvent('click'))
if (data?.user?.tier !== "Pro" && state === "score") {
goto("/pricing");
} else {
searchTerm = "";
selectedPopularStrategy = "";
ruleName = state;
handleAddRule();
}
}
const handleMessage = (event) => {
@ -1856,10 +1857,7 @@ const handleKeyDown = (event) => {
{ condition: "over", name: "marketCap", value: "100M" },
],
},
topAIStocks: {
name: "Top AI Stocks",
rules: [{ condition: "", name: "score", value: "Strong Buy" }],
},
momentumTAStocks: {
name: "Momentum TA Stocks",
rules: [
@ -2217,12 +2215,7 @@ const handleKeyDown = (event) => {
>
Top Shorted Stocks
</DropdownMenu.Item>
<DropdownMenu.Item
on:click={() => popularStrategy("topAIStocks")}
class="cursor-pointer hover:bg-[#27272A]"
>
Top AI Stocks
</DropdownMenu.Item>
<DropdownMenu.Item
on:click={() => popularStrategy("momentumTAStocks")}
class="cursor-pointer hover:bg-[#27272A]"
@ -3156,9 +3149,23 @@ const handleKeyDown = (event) => {
>
{/if}
</td>
<td class="text-start border-b border-[#262626]"
>{row?.label}</td
>
<td class="text-start border-b border-[#262626]">
{row?.label}
{#if row?.rule === "score"}
<svg
class="{data?.user?.tier === 'Pro'
? 'hidden'
: ''} ml-1 -mt-0.5 w-3.5 h-3.5 inline-block"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
>
<path
fill="#A3A3A3"
d="M17 9V7c0-2.8-2.2-5-5-5S7 4.2 7 7v2c-1.7 0-3 1.3-3 3v7c0 1.7 1.3 3 3 3h10c1.7 0 3-1.3 3-3v-7c0-1.7-1.3-3-3-3M9 7c0-1.7 1.3-3 3-3s3 1.3 3 3v2H9z"
/>
</svg>
{/if}
</td>
</tr>
{/each}
</tbody>

View File

@ -1,23 +0,0 @@
export const load = async ({ locals, setHeaders }) => {
const getStockSplitsCalendar = async () => {
const { apiKey, apiURL } = locals;
// make the POST request to the endpoint
const response = await fetch(apiURL + "/stock-splits-calendar", {
method: "GET",
headers: {
"Content-Type": "application/json",
"X-API-KEY": apiKey,
},
});
const output = await response.json();
setHeaders({ "cache-control": "public, max-age=3000" });
return output;
};
// Make sure to return a promise
return {
getStockSplitsCalendar: await getStockSplitsCalendar(),
};
};

View File

@ -1,593 +0,0 @@
<script lang="ts">
import {
format,
startOfWeek,
addDays,
addWeeks,
subWeeks,
differenceInWeeks,
} from "date-fns";
import { screenWidth, numberOfUnreadNotification } from "$lib/store";
import logo from "$lib/images/split_logo.png";
import { goto } from "$app/navigation";
import { abbreviateNumber } from "$lib/utils";
import ArrowLogo from "lucide-svelte/icons/move-up-right";
export let data;
let currentWeek = startOfWeek(new Date(), { weekStartsOn: 1 });
let stockSplitsCalendar = data?.getStockSplitsCalendar;
const maxWeeksChange = 4; // Maximum allowed week change
let previousMax = false;
let nextMax = false;
const today = new Date();
let formattedMonday = startOfWeek(currentWeek, { weekStartsOn: 1 });
let formattedTuesday = format(addDays(formattedMonday, 1), "EEE, MMM d");
let formattedWednesday = format(addDays(formattedMonday, 2), "EEE, MMM d");
let formattedThursday = format(addDays(formattedMonday, 3), "EEE, MMM d");
let formattedFriday = format(addDays(formattedMonday, 4), "EEE, MMM d");
formattedMonday = format(formattedMonday, "EEE, MMM d");
let formattedWeekday = [
formattedMonday,
formattedTuesday,
formattedWednesday,
formattedThursday,
formattedFriday,
];
let weekday = [];
let startDate = startOfWeek(currentWeek, { weekStartsOn: 1 });
let endDate = addDays(startDate, 4);
let formattedStartDate = format(startDate, "yyyy-MM-dd");
let formattedEndDate = format(endDate, "yyyy-MM-dd");
let daysOfWeek = [
{
name: "Monday",
date: formattedStartDate,
},
{
name: "Tuesday",
date: format(addDays(startDate, 1), "yyyy-MM-dd"),
},
{
name: "Wednesday",
date: format(addDays(startDate, 2), "yyyy-MM-dd"),
},
{
name: "Thursday",
date: format(addDays(startDate, 3), "yyyy-MM-dd"),
},
{
name: "Friday",
date: formattedEndDate,
},
];
let currentDate = new Date();
let currentWeekday = Math.min((currentDate.getDay() + 6) % 7, 4);
let selectedWeekday = currentWeekday;
function toggleDate(index) {
if ($screenWidth > 640) {
selectedWeekday = index;
}
}
function clickWeekday(state, index) {
if (state === "next" && selectedWeekday + 1 <= 4) {
selectedWeekday = selectedWeekday + 1;
} else if (state === "previous" && selectedWeekday - 1 >= 0) {
selectedWeekday--;
} else if (
state === "previous" &&
index === 0 &&
differenceInWeeks(currentWeek, today) > -maxWeeksChange
) {
changeWeek(state);
selectedWeekday = 4;
} else if (
state === "next" &&
index === 4 &&
differenceInWeeks(currentWeek, today) < maxWeeksChange
) {
changeWeek(state);
selectedWeekday = 0;
}
}
async function changeWeek(state) {
//Limit the user to go back max 4 weeks and look forward 4 weeks
if (
state === "previous" &&
differenceInWeeks(currentWeek, today) > -maxWeeksChange
) {
currentWeek = subWeeks(currentWeek, 1);
} else if (
state === "next" &&
differenceInWeeks(currentWeek, today) < maxWeeksChange
) {
currentWeek = addWeeks(currentWeek, 1);
}
formattedMonday = startOfWeek(currentWeek, { weekStartsOn: 1 });
formattedTuesday = format(addDays(formattedMonday, 1), "EEE, MMM d");
formattedWednesday = format(addDays(formattedMonday, 2), "EEE, MMM d");
formattedThursday = format(addDays(formattedMonday, 3), "EEE, MMM d");
formattedFriday = format(addDays(formattedMonday, 4), "EEE, MMM d");
formattedMonday = format(formattedMonday, "EEE, MMM d");
formattedWeekday = [
formattedMonday,
formattedTuesday,
formattedWednesday,
formattedThursday,
formattedFriday,
];
weekday = [];
startDate = startOfWeek(currentWeek, { weekStartsOn: 1 });
endDate = addDays(startDate, 4);
formattedStartDate = format(startDate, "yyyy-MM-dd");
formattedEndDate = format(endDate, "yyyy-MM-dd");
daysOfWeek = [
{
name: "Monday",
date: formattedStartDate,
},
{
name: "Tuesday",
date: format(addDays(startDate, 1), "yyyy-MM-dd"),
},
{
name: "Wednesday",
date: format(addDays(startDate, 2), "yyyy-MM-dd"),
},
{
name: "Thursday",
date: format(addDays(startDate, 3), "yyyy-MM-dd"),
},
{
name: "Friday",
date: formattedEndDate,
},
];
stockSplitsCalendar = daysOfWeek.map((day) => {
return {
name: day.name,
data: data?.getStockSplitsCalendar?.filter(
(item) => item.date === day.date,
),
};
});
if (stockSplitsCalendar?.length) {
// Loop through each day of the week
for (let i = 0; i < stockSplitsCalendar.length; i++) {
const dayData = stockSplitsCalendar[i].data;
// Filter out entries with company name "---"
// Sort and map the filtered data
weekday[i] = dayData.sort((a, b) => b.marketCap - a.marketCap);
}
}
}
$: {
if (stockSplitsCalendar) {
stockSplitsCalendar = daysOfWeek.map((day) => {
return {
name: day.name,
data: data?.getStockSplitsCalendar?.filter(
(item) => item.date === day.date,
),
};
});
if (stockSplitsCalendar?.length) {
// Loop through each day of the week
for (let i = 0; i < stockSplitsCalendar.length; i++) {
const dayData = stockSplitsCalendar[i].data;
// Filter out entries with company name "---"
// Sort and map the filtered data
weekday[i] = dayData.sort((a, b) => b.marketCap - a.marketCap);
}
}
}
}
$: {
if (currentWeek) {
if (differenceInWeeks(currentWeek, today) > -maxWeeksChange) {
previousMax = false;
} else {
previousMax = true;
}
}
}
$: {
if (currentWeek) {
if (differenceInWeeks(currentWeek, today) < maxWeeksChange) {
nextMax = false;
} else {
nextMax = true;
}
}
}
</script>
<svelte:head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>
{$numberOfUnreadNotification > 0 ? `(${$numberOfUnreadNotification})` : ""} Stock
Splits Calendar · stocknear
</title>
<meta
name="description"
content={`A list of upcoming stock splits on the US stock market, with dates, times and market cap.`}
/>
<!-- Other meta tags -->
<meta property="og:title" content={`Stock Splits Calendar · stocknear`} />
<meta
property="og:description"
content={`A list of upcoming stock splits on the US stock market, with dates, times and market cap.`}
/>
<meta property="og:type" content="website" />
<!-- Add more Open Graph meta tags as needed -->
<!-- Twitter specific meta tags -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content={`Stock Splits Calendar · stocknear`} />
<meta
name="twitter:description"
content={`A list of upcoming stock splits on the US stock market, with dates, times and market cap.`}
/>
<!-- Add more Twitter meta tags as needed -->
</svelte:head>
<section
class="w-full max-w-3xl sm:max-w-screen-2xl overflow-hidden min-h-screen pt-5 pb-40"
>
<div class="text-sm sm:text-[1rem] breadcrumbs ml-4">
<ul>
<li><a href="/" class="text-gray-300">Home</a></li>
<li class="text-gray-300">Stock Splits Calendar</li>
</ul>
</div>
<div class="w-full overflow-hidden m-auto mt-5">
<div class="sm:p-0 flex justify-center w-full m-auto overflow-hidden">
<div
class="relative flex justify-center items-start overflow-hidden w-full"
>
<main class="w-full lg:w-3/4 lg:pr-5">
<div
class="w-full m-auto sm:bg-[#27272A] sm:rounded-xl h-auto pl-10 pr-10 pt-5 sm:pb-10 sm:pt-10 mt-3 mb-8"
>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-10">
<!-- Start Column -->
<div>
<div class="flex flex-row justify-center items-center">
<h1
class="text-3xl sm:text-4xl text-white text-center font-bold mb-5"
>
Stock Splits Calendar
</h1>
</div>
<span
class="hidden sm:block text-white text-md font-medium text-center flex justify-center items-center"
>
Stay updated on upcoming Splits in the stock market.
</span>
</div>
<!-- End Column -->
<!-- Start Column -->
<div
class="hidden sm:block relative m-auto mb-5 mt-5 sm:mb-0 sm:mt-0"
>
<svg
class="w-40 -my-5"
viewBox="0 0 200 200"
xmlns="http://www.w3.org/2000/svg"
>
<defs>
<filter id="glow">
<feGaussianBlur stdDeviation="5" result="glow" />
<feMerge>
<feMergeNode in="glow" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
</defs>
<path
fill="#1E40AF"
d="M57.6,-58.7C72.7,-42.6,81.5,-21.3,82,0.5C82.5,22.3,74.7,44.6,59.7,60.1C44.6,75.6,22.3,84.3,0,84.3C-22.3,84.2,-44.6,75.5,-61.1,60.1C-77.6,44.6,-88.3,22.3,-87.6,0.7C-86.9,-20.8,-74.7,-41.6,-58.2,-57.7C-41.6,-73.8,-20.8,-85.2,0.2,-85.4C21.3,-85.6,42.6,-74.7,57.6,-58.7Z"
transform="translate(100 100)"
filter="url(#glow)"
/>
</svg>
<div class="z-1 absolute top-1">
<img class="w-36 ml-7" src={logo} alt="logo" loading="lazy" />
</div>
</div>
<!-- End Column -->
</div>
</div>
<!-- Page wrapper -->
<div class="flex justify-center w-full m-auto h-full overflow-hidden">
<!-- Content area -->
<div class="relative flex flex-col flex-1 overflow-hidden">
<!-- Cards -->
<div
class="w-full flex flex-row justify-center m-auto items-center pl-2 pr-2 sm:pl-0 sm:pr-0"
>
<!-- Start Columns -->
<label
on:click={() => changeWeek("previous")}
class="{previousMax
? 'opacity-80'
: ''} hidden sm:flex h-16 w-48 cursor-pointer border m-auto flex bg-[#27272A] border border-gray-600 mb-3"
>
<svg
class="w-6 h-6 m-auto rotate-180"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
><path
fill="white"
d="M8.025 22L6.25 20.225L14.475 12L6.25 3.775L8.025 2l10 10l-10 10Z"
/></svg
>
</label>
{#each weekday as day, index}
<div
class="w-full {index === selectedWeekday
? ''
: 'hidden sm:block'}"
>
<label
on:click={() => toggleDate(index)}
class="w-11/12 sm:w-full m-auto cursor-pointer h-16 {index ===
selectedWeekday
? 'bg-[#fff] sm:hover:bg-gray-300'
: ''} rounded sm:rounded-none flex bg-[#09090B] sm:hover:bg-[#fff] transition duration-50 border border-gray-600 mb-3"
>
<div
class=" flex flex-row justify-center items-center w-full"
>
<label
on:click={() => clickWeekday("previous", index)}
class="sm:hidden ml-auto"
>
<svg
class="w-8 h-8 inline-block rotate-180"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
><path
fill="white"
d="M8.025 22L6.25 20.225L14.475 12L6.25 3.775L8.025 2l10 10l-10 10Z"
/></svg
>
</label>
<div
class="flex flex-col items-center text-white truncate m-auto p-1"
>
<span class="font-medium text-md"
>{formattedWeekday[index]}</span
>
<span class="text-[1rem] sm:text-sm m-auto pt-1 pb-1">
{day?.length > 1
? `${day?.length} Splits`
: `${day?.length} Split`}</span
>
</div>
<label
on:click={() => clickWeekday("next", index)}
class="sm:hidden mr-auto"
>
<svg
class="w-8 h-8 inline-block"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
><path
fill="white"
d="M8.025 22L6.25 20.225L14.475 12L6.25 3.775L8.025 2l10 10l-10 10Z"
/></svg
>
</label>
</div>
</label>
</div>
{/each}
<label
on:click={() => changeWeek("next")}
class="{nextMax
? 'opacity-80'
: ''} hidden sm:flex h-16 w-48 cursor-pointer border m-auto flex bg-[#27272A] border border-gray-600 mb-3"
>
<svg
class="w-6 h-6 m-auto"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
><path
fill="white"
d="M8.025 22L6.25 20.225L14.475 12L6.25 3.775L8.025 2l10 10l-10 10Z"
/></svg
>
</label>
</div>
{#each weekday as day, index}
{#if index === selectedWeekday}
{#if day?.length !== 0}
<div class="w-full overflow-x-scroll">
<table
class="table-sm table-compact rounded-none sm:rounded-md w-full border-bg-[#09090B] m-auto mt-4"
>
<thead>
<tr>
<th
class="text-slate-200 font-semibold text-[1rem] text-start"
>Symbol</th
>
<th
class="text-slate-200 font-semibold whitespace-nowrap text-[1rem] text-start"
>Company Name</th
>
<th
class="text-slate-200 font-semibold whitespace-nowrap text-[1rem] text-end"
>EPS</th
>
<th
class="text-slate-200 font-semibold whitespace-nowrap text-[1rem] text-end"
>Market Cap</th
>
<th
class="text-slate-200 font-semibold whitespace-nowrap text-[1rem] text-end"
>Split</th
>
</tr>
</thead>
<tbody>
{#each day as item}
<!-- row -->
<tr
class="sm:hover:bg-[#245073] sm:hover:bg-opacity-[0.2] odd:bg-[#27272A] border-b-[#09090B]"
>
<td
class="text-sm sm:text-[1rem] whitespace-nowrap border-b-[#09090B]"
>
<a
href={"/stocks/" + item?.symbol}
class="sm:hover:text-white text-blue-400"
>
{item?.symbol}
</a>
</td>
<td
class="text-white text-sm sm:text-[1rem] whitespace-nowrap border-b-[#09090B]"
>
{item?.name?.length > 40
? item?.name?.slice(0, 40) + "..."
: item?.name}
</td>
<td
class="text-white text-sm text-end sm:text-[1rem] whitespace-nowrap font-medium border-b-[#09090B]"
>
{item?.eps !== null ? item?.eps : "-"}
</td>
<td
class="text-white text-sm sm:text-[1rem] text-end whitespace-nowrap font-medium border-b-[#09090B]"
>
{item?.marketCap !== null
? abbreviateNumber(item?.marketCap)
: "-"}
</td>
<td
class="text-white font-medium text-sm sm:text-[1rem] whitespace-nowrap text-end mr-1 border-b-[#09090B]"
>
<span class=""
>From {item?.denominator} to {item?.numerator}</span
>
</td>
</tr>
{/each}
</tbody>
</table>
</div>
{:else}
<div
class="text-white p-5 mt-5 w-fit m-auto rounded-lg sm:flex sm:flex-row sm:items-center border border-slate-800 text-[1rem]"
>
<svg
class="w-6 h-6 flex-shrink-0 inline-block sm:mr-2"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 256 256"
><path
fill="#fff"
d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m-4 48a12 12 0 1 1-12 12a12 12 0 0 1 12-12m12 112a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 0 16"
/></svg
>
No Stock Splits available for the day.
</div>
{/if}
{/if}
{/each}
</div>
</div>
</main>
<aside class="hidden lg:block relative fixed w-1/4 ml-4">
{#if data?.user?.tier !== "Pro" || data?.user?.freeTrial}
<div
on:click={() => goto("/pricing")}
class="w-full text-white border border-gray-600 rounded-md h-fit pb-4 mt-4 cursor-pointer"
>
<div
class="w-auto lg:w-full p-1 flex flex-col m-auto px-2 sm:px-0"
>
<div class="w-full flex justify-between items-center p-3 mt-3">
<h2 class="text-start text-xl font-semibold text-white ml-3">
Pro Subscription
</h2>
<ArrowLogo class="w-8 h-8 mr-3 flex-shrink-0" />
</div>
<span class="text-white p-3 ml-3 mr-3">
Upgrade now for unlimited access to all data and tools.
</span>
</div>
</div>
{/if}
<div
on:click={() => goto("/analysts")}
class="w-full text-white border border-gray-600 rounded-md h-fit pb-4 mt-4 cursor-pointer"
>
<div class="w-auto lg:w-full p-1 flex flex-col m-auto px-2 sm:px-0">
<div class="w-full flex justify-between items-center p-3 mt-3">
<h2 class="text-start text-xl font-semibold text-white ml-3">
Wallstreet Analyst
</h2>
<ArrowLogo class="w-8 h-8 mr-3 flex-shrink-0" />
</div>
<span class="text-white p-3 ml-3 mr-3">
Get the latest top Wall Street analyst ratings.
</span>
</div>
</div>
<div
on:click={() => goto("/politicians")}
class="w-full text-white border border-gray-600 rounded-md h-fit pb-4 mt-4 cursor-pointer"
>
<div class="w-auto lg:w-full p-1 flex flex-col m-auto px-2 sm:px-0">
<div class="w-full flex justify-between items-center p-3 mt-3">
<h2 class="text-start text-xl font-semibold text-white ml-3">
Congress Trading
</h2>
<ArrowLogo class="w-8 h-8 mr-3 flex-shrink-0" />
</div>
<span class="text-white p-3 ml-3 mr-3">
Get the latest top Congress trading insights.
</span>
</div>
</div>
</aside>
</div>
</div>
</div>
</section>