From 5cb3b909be9dee5c03912a2a0faae4a79db8e4d8 Mon Sep 17 00:00:00 2001 From: Rafi Arrafif Date: Sun, 15 Mar 2026 21:11:20 +0700 Subject: [PATCH] =?UTF-8?q?=F0=9F=91=94=20feat:=20add=20title=20and=20addi?= =?UTF-8?q?tional=20attributes=20to=20card?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(session)/(main)/layout.tsx | 2 +- app/globals.css | 51 +++++++++++++++++++ .../home/actions/getRecommenationAnime.ts | 3 +- .../Recommendation/components/Card.tsx | 22 ++++++-- .../home/sections/Recommendation/main.tsx | 2 +- .../home/sections/Recommendation/wrapper.tsx | 10 ++-- 6 files changed, 79 insertions(+), 11 deletions(-) diff --git a/app/(session)/(main)/layout.tsx b/app/(session)/(main)/layout.tsx index fb2280e..5b83505 100644 --- a/app/(session)/(main)/layout.tsx +++ b/app/(session)/(main)/layout.tsx @@ -3,7 +3,7 @@ import React from "react"; const layout = ({ children }: Readonly<{ children: React.ReactNode }>) => { return ( -
+
{children}
diff --git a/app/globals.css b/app/globals.css index d5c556e..4998592 100644 --- a/app/globals.css +++ b/app/globals.css @@ -146,3 +146,54 @@ border-radius: 9px; border: 3px none #000000; } + +@keyframes aircraft-strobe { + /* Kedipan 1: Agak lambat/lama */ + 0%, + 20% { + opacity: 1; + } + + /* Jeda singkat */ + 35% { + opacity: 0; + } + + /* Kedipan 2: Cepat */ + 40% { + opacity: 1; + } + 43% { + opacity: 0; + } + + /* Jeda sangat singkat */ + 48% { + opacity: 0; + } + + /* Kedipan 3: Cepat */ + 53% { + opacity: 1; + } + 56% { + opacity: 0; + } + + /* Jeda panjang sebelum mengulang loop (gelap) */ + 100% { + opacity: 1; + } +} + +/* Class untuk diterapkan ke elemen */ +.blink-strobe { + animation: aircraft-strobe 2s linear infinite; +} + +.hide-scrollbar { + scrollbar-width: none; /* Firefox */ +} +.hide-scrollbar::-webkit-scrollbar { + display: none; /* Chrome, Edge, Safari */ +} diff --git a/features/home/actions/getRecommenationAnime.ts b/features/home/actions/getRecommenationAnime.ts index fbe220b..a05b646 100644 --- a/features/home/actions/getRecommenationAnime.ts +++ b/features/home/actions/getRecommenationAnime.ts @@ -121,7 +121,8 @@ export const getRecommendationAnimeAction = async (): Promise< thumbnail_url: "https://myanimelist.net/images/anime/1046/122722.jpg", }, { - title: "Mobile Suit Gundam: The Origin", + title: + "Mobile Suit Gundam: The Origin (lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore et dolore magna aliqua)", rating: 8.42, type: "OVA", status: "finished", diff --git a/features/home/sections/Recommendation/components/Card.tsx b/features/home/sections/Recommendation/components/Card.tsx index d7708d0..d4662c4 100644 --- a/features/home/sections/Recommendation/components/Card.tsx +++ b/features/home/sections/Recommendation/components/Card.tsx @@ -1,14 +1,24 @@ import { RecommendationAnime } from "@/features/home/actions/getRecommenationAnime"; import { Icon } from "@iconify/react"; -import { StarOff } from "lucide-react"; const AnimeRecommendationCard = ({ data }: { data: RecommendationAnime }) => { return (
-
+ {data.status === "airing" && ( +
+ + Airing +
+ )} +
- {data.rating ?? "N/A"} + + {data.rating ?? "N/A"} +
{ draggable={false} />
+
+

{data.title}

+
+ {data.release_year} +
+
); }; diff --git a/features/home/sections/Recommendation/main.tsx b/features/home/sections/Recommendation/main.tsx index f7ef6e2..430821c 100644 --- a/features/home/sections/Recommendation/main.tsx +++ b/features/home/sections/Recommendation/main.tsx @@ -5,7 +5,7 @@ const RecommendationMain = async () => { const data = async () => await getRecommendationAnimeAction(); const result = await data(); return ( -
+
{result.map((item, index) => ( ))} diff --git a/features/home/sections/Recommendation/wrapper.tsx b/features/home/sections/Recommendation/wrapper.tsx index 923b533..caf67b2 100644 --- a/features/home/sections/Recommendation/wrapper.tsx +++ b/features/home/sections/Recommendation/wrapper.tsx @@ -1,15 +1,15 @@ import { Suspense } from "react"; import RecommendationMain from "./main"; import RecommendationSkeleton from "./skeleton"; -import { getRecommendationAnimeAction } from "../../actions/getRecommenationAnime"; const Recommendation = async () => { return (
-

- Maybe You Like -
-

+
+

+ Maybe You Like +

+
}>