From 8cf1bb534dfcb12cda47c4c6656a48198ebdb0da Mon Sep 17 00:00:00 2001
From: Radiquum <kentai.waah@gmail.com>
Date: Thu, 3 Apr 2025 21:07:44 +0500
Subject: [PATCH 01/12] refactor: start redesign of user page

---
 .gitignore                                |   2 +
 app/components/Profile/Profile.Role.tsx   |  15 ++
 app/components/Profile/Profile.Social.tsx |  20 ++
 app/components/Profile/Profile.User.tsx   | 259 +++++++++++-----------
 app/pages/Profile.tsx                     | 100 ++++-----
 5 files changed, 211 insertions(+), 185 deletions(-)
 create mode 100644 app/components/Profile/Profile.Role.tsx
 create mode 100644 app/components/Profile/Profile.Social.tsx

diff --git a/.gitignore b/.gitignore
index f6c46f4..8595241 100644
--- a/.gitignore
+++ b/.gitignore
@@ -59,3 +59,5 @@ videos/*
 !videos/*.js
 !videos/*.ts
 public/_next-video
+
+API-Trace/*
\ No newline at end of file
diff --git a/app/components/Profile/Profile.Role.tsx b/app/components/Profile/Profile.Role.tsx
new file mode 100644
index 0000000..ac1e13a
--- /dev/null
+++ b/app/components/Profile/Profile.Role.tsx
@@ -0,0 +1,15 @@
+interface UserRoleProps {
+  name: string;
+  color: string;
+}
+
+export const UserRole = ({ name, color }: UserRoleProps) => {
+  return (
+    <div
+      className={`text-[var(--color)] border border-[var(--color)] rounded-md`}
+      style={{ "--color": `#${color}` } as React.CSSProperties}
+    >
+      <p className="px-1.5 py-0.5">{name}</p>
+    </div>
+  );
+};
diff --git a/app/components/Profile/Profile.Social.tsx b/app/components/Profile/Profile.Social.tsx
new file mode 100644
index 0000000..e9ae218
--- /dev/null
+++ b/app/components/Profile/Profile.Social.tsx
@@ -0,0 +1,20 @@
+interface UserSocialProps {
+  icon: string;
+  url?: string;
+  nickname: string;
+  color: string;
+}
+
+export const UserSocial = ({ nickname, icon, color }: UserSocialProps) => {
+  return (
+    <div
+      className={`border border-[var(--color)] rounded-md`}
+      style={{ "--color": `#${color}` } as React.CSSProperties}
+    >
+      <div className="flex gap-1 items-center px-1.5 py-1">
+          <span className={`iconify w-6 h-6 bg-[var(--color)] ${icon}`}></span>
+          <p>{nickname}</p>
+      </div>
+    </div>
+  );
+};
diff --git a/app/components/Profile/Profile.User.tsx b/app/components/Profile/Profile.User.tsx
index 2cdaa99..e2033cc 100644
--- a/app/components/Profile/Profile.User.tsx
+++ b/app/components/Profile/Profile.User.tsx
@@ -1,143 +1,150 @@
 "use client";
-import { Avatar, Card, Button } from "flowbite-react";
-import Link from "next/link";
-import { useRouter } from "next/navigation";
-import { Chip } from "../Chip/Chip";
 
-export const ProfileUser = (props: {
-  isOnline: boolean;
+import { Avatar, Card, useThemeMode } from "flowbite-react";
+import { UserRole } from "./Profile.Role";
+import { UserSocial } from "./Profile.Social";
+import Link from "next/link";
+
+interface ProfileUserProps {
   avatar: string;
   login: string;
   status: string;
-  socials: {
-    isPrivate: boolean;
-    hasSocials: boolean;
-    socials: {
-      name: string;
-      nickname: any;
-      icon: string;
-      urlPrefix?: string | undefined;
-    }[];
-  };
-  chips: {
-    hasChips: boolean;
-    isMyProfile: boolean;
-    isVerified: boolean;
-    isSponsor: boolean;
-    isBlocked: boolean;
-    roles?: {
-      id: number;
-      name: string;
-      color: string;
-    }[];
-  };
   rating: number;
-}) => {
-  const router = useRouter();
+  roles: {
+    id: number;
+    name: string;
+    color: string;
+  }[];
+  isMyProfile: boolean;
+  isSponsor: boolean;
+  isBlocked: boolean;
+  isVerified: boolean;
+  isOnline: boolean;
+  socials: {
+    vk: string;
+    tg: string;
+    tt: string;
+    inst: string;
+    discord: string;
+  };
+}
+
+export const ProfileUser = ({
+  avatar,
+  login,
+  status,
+  rating,
+  roles,
+  isMyProfile,
+  isVerified,
+  isOnline,
+  isSponsor,
+  isBlocked,
+  socials,
+}: ProfileUserProps) => {
+
+  const theme = useThemeMode().mode;
+
   return (
-    <Card className="h-fit">
-      {props.chips.hasChips && (
-        <div className="flex gap-1 overflow-x-auto scrollbar-thin">
-          {props.chips.isMyProfile && (
-            <Chip bg_color="bg-blue-500" name="Мой профиль" />
-          )}
-          {props.chips.isVerified && (
-            <Chip bg_color="bg-green-500" name="Верифицирован" />
-          )}
-          {props.chips.isSponsor && (
-            <Chip bg_color="bg-yellow-500" name="Спонсор Anixart" />
-          )}
-          {props.chips.isBlocked && (
-            <Chip bg_color="bg-red-500" name="Заблокирован" />
-          )}
-          {props.chips.roles &&
-            props.chips.roles.length > 0 &&
-            props.chips.roles.map((role: any) => (
-              <Chip
-                key={role.id}
-                bg_color={`bg-[var(--role-color)]`}
-                name={role.name}
-                style={
-                  {
-                    "--role-color": `#${role.color}`,
-                  } as React.CSSProperties
-                }
-              />
-            ))}
+    <Card>
+      {(isMyProfile ||
+        isVerified ||
+        isSponsor ||
+        isBlocked ||
+        roles.length > 0) && (
+        <div className="flex flex-wrap gap-2">
+          {isMyProfile && <UserRole name="Мой профиль" color="3f83f8" />}
+          {isBlocked && <UserRole name="Заблокирован" color="f56565" />}
+          {isVerified && <UserRole name="Верифицирован" color="0e9f6e" />}
+          {isSponsor && <UserRole name="Спонсор Anixart" color="ecc94b" />}
+          {roles.map((role) => (
+            <UserRole key={role.id} name={role.name} color={role.color} />
+          ))}
         </div>
       )}
-      <Avatar
-        alt=""
-        img={props.avatar}
-        rounded={true}
-        size={"lg"}
-        className="relative flex-col items-center justify-center sm:justify-start sm:flex-row"
-        bordered={true}
-        color={props.isOnline ? "success" : "light"}
-      >
-        <div className="space-y-1 text-2xl font-medium whitespace-pre-wrap dark:text-white">
-          <div className="text-center sm:text-left">
-            {props.login}{" "}
+      <div className="flex flex-col items-center gap-4 sm:items-start sm:flex-row">
+        <Avatar
+          alt=""
+          img={avatar}
+          rounded={true}
+          size={"lg"}
+          bordered={true}
+          color={isOnline ? "success" : "light"}
+          className="flex-shrink-0"
+        />
+        <div className="flex flex-col gap-2">
+          <p className="flex items-center gap-2 text-2xl font-semibold">
+            {login}
             <span
-              className={`border rounded-md px-2 py-1 text-sm ${
-                props.rating > 0
-                  ? "border-green-500 text-green-500"
-                  : "border-red-500 text-red-500"
+              className={`border rounded-md px-2 py-1 min-w-8 text-sm flex items-center justify-center ${
+                rating > 0 ?
+                  "border-green-500 text-green-500"
+                : "border-red-500 text-red-500"
               }`}
             >
-              {props.rating}
+              {rating}
             </span>
-          </div>
-          <div className="text-sm text-gray-500 whitespace-pre-wrap sm:text-md dark:text-gray-400 ">
-            {props.status}
-          </div>
+          </p>
+          <p className="text-sm whitespace-pre-wrap sm:text-md">{status}</p>
         </div>
-      </Avatar>
-      {props.socials.hasSocials && !props.socials.isPrivate && (
-        <div className="flex items-center gap-1 overflow-x-auto scrollbar-thin">
-          {props.socials.socials
-            .filter((social: any) => {
-              if (social.nickname == "") {
-                return false;
-              }
-              return true;
-            })
-            .map((social: any) => {
-              if (social.name == "discord" && social.nickname != "")
-                return (
-                  <Button
-                    color="light"
-                    key={social.name}
-                    onClick={() => {
-                      window.navigator.clipboard.writeText(social.nickname);
-                      alert("Скопировано!");
-                    }}
-                  >
-                    <div className="flex items-center justify-center gap-2">
-                      <span
-                        className={`iconify h-4 w-4 sm:h-6 sm:w-6 ${social.icon} dark:fill-white`}
-                      ></span>
-                      {social.nickname}
-                    </div>
-                  </Button>
-                );
-              return (
-                <Link
-                  key={social.name}
-                  href={`${social.urlPrefix}${social.nickname}`}
-                  target="_blank"
-                >
-                  <Button color="light">
-                    <div className="flex items-center justify-center gap-2">
-                      <span
-                        className={`iconify h-4 w-4 sm:h-6 sm:w-6 ${social.icon} dark:fill-white`}
-                      ></span>
-                      {social.nickname}
-                    </div>
-                  </Button>
-                </Link>
-              );
-            })}
+      </div>
+      {(socials.vk ||
+        socials.tg ||
+        socials.discord ||
+        socials.tt ||
+        socials.inst) && (
+        <div className="flex flex-wrap gap-2">
+          {socials.vk && (
+            <Link href={`https://vk.com/${socials.vk}`} target="_blank">
+              <UserSocial
+                nickname={socials.vk}
+                icon="fa6-brands--vk"
+                url={`https://vk.com/${socials.vk}`}
+                color="4a76a8"
+              />
+            </Link>
+          )}
+          {socials.tg && (
+            <Link href={`https://t.me/${socials.tg}`} target="_blank">
+              <UserSocial
+                nickname={socials.tg}
+                icon="fa6-brands--telegram"
+                url={`https://t.me/${socials.tg}`}
+                color="2aabee"
+              />
+            </Link>
+          )}
+          {socials.tt && (
+            <Link href={`https://tiktok.com/@${socials.tt}`} target="_blank">
+              <UserSocial
+                nickname={socials.tt}
+                icon="fa6-brands--tiktok"
+                url={`https://tiktok.com/@${socials.tt}`}
+                color={theme == "light" ? "000000" : "ffffff"}
+              />
+            </Link>
+          )}
+          {socials.inst && (
+            <Link
+              href={`https://instagram.com/${socials.inst}`}
+              target="_blank"
+            >
+              <UserSocial
+                nickname={socials.inst}
+                icon="fa6-brands--instagram"
+                url={`https://instagram.com/${socials.inst}`}
+                color="c32aa3"
+              />
+            </Link>
+          )}
+          {socials.discord && (
+            <UserSocial
+              nickname={socials.discord}
+              icon="fa6-brands--discord"
+              url={`https://discord.com/${socials.discord}`}
+              color="5865f2"
+            />
+          )}
         </div>
       )}
     </Card>
diff --git a/app/pages/Profile.tsx b/app/pages/Profile.tsx
index 7a81d93..65bd2c3 100644
--- a/app/pages/Profile.tsx
+++ b/app/pages/Profile.tsx
@@ -59,50 +59,7 @@ export const ProfilePage = (props: any) => {
     );
   }
 
-  const hasSocials =
-    user.vk_page != "" ||
-    user.tg_page != "" ||
-    user.tt_page != "" ||
-    user.inst_page != "" ||
-    user.discord_page != "" ||
-    false;
-  const socials = [
-    {
-      name: "vk",
-      nickname: user.vk_page,
-      icon: "fa6-brands--vk",
-      urlPrefix: "https://vk.com/",
-    },
-    {
-      name: "telegram",
-      nickname: user.tg_page,
-      icon: "fa6-brands--telegram",
-      urlPrefix: "https://t.me/",
-    },
-    {
-      name: "discord",
-      nickname: user.discord_page,
-      icon: "fa6-brands--discord",
-    },
-    {
-      name: "tiktok",
-      nickname: user.tt_page,
-      icon: "fa6-brands--tiktok",
-      urlPrefix: "https://tiktok.com/@",
-    },
-    {
-      name: "instagram",
-      nickname: user.inst_page,
-      icon: "fa6-brands--instagram",
-      urlPrefix: "https://instagram.com/",
-    },
-  ];
 
-  const hasChips =
-    user.is_verified ||
-    user.is_blocked ||
-    (user.roles && user.roles.length > 0) ||
-    isMyProfile;
   const isPrivacy =
     user.is_stats_hidden || user.is_counts_hidden || user.is_social_hidden;
 
@@ -120,7 +77,45 @@ export const ProfilePage = (props: any) => {
           is_me_blocked={user.is_me_blocked}
         />
       </div>
-      <div
+      <div className="grid grid-cols-1 gap-2 lg:grid-cols-2">
+        <div className="flex flex-col gap-2">
+          <ProfileUser
+            avatar={user.avatar}
+            login={user.login}
+            status={user.status}
+            roles={user.roles}
+            rating={user.rating_score}
+            isMyProfile={isMyProfile}
+            isVerified={user.is_verified}
+            isOnline={user.is_online}
+            isSponsor={user.is_sponsor}
+            isBlocked={user.is_blocked}
+            socials={{
+              vk: user.vk_page || null,
+              tg: user.tg_page || null,
+              tt: user.tt_page || null,
+              inst: user.inst_page || null,
+              discord: user.discord_page || null,
+            }}
+          />
+          {authUser.token && (
+            <ProfileActions
+              isMyProfile={isMyProfile}
+              profile_id={user.id}
+              isFriendRequestsDisallowed={user.is_friend_requests_disallowed}
+              friendStatus={user.friend_status}
+              my_profile_id={authUser.user.id}
+              token={authUser.token}
+              is_me_blocked={user.is_me_blocked}
+              is_blocked={user.is_blocked}
+              edit_isOpen={isOpen}
+              edit_setIsOpen={setIsOpen}
+            />
+          )}
+        </div>
+        <div className="flex flex-col gap-2"></div>
+      </div>
+      {/* <div
         className={`flex flex-wrap gap-2 ${
           isPrivacy || user.is_banned || user.is_perm_banned ? "mt-4" : ""
         }`}
@@ -171,20 +166,7 @@ export const ProfilePage = (props: any) => {
           )}
         </div>
         <div className="flex flex-col w-full gap-2 xl:flex-1 xl:w-auto ">
-          {authUser.token && (
-            <ProfileActions
-              isMyProfile={isMyProfile}
-              profile_id={user.id}
-              isFriendRequestsDisallowed={user.is_friend_requests_disallowed}
-              friendStatus={user.friend_status}
-              my_profile_id={authUser.user.id}
-              token={authUser.token}
-              is_me_blocked={user.is_me_blocked}
-              is_blocked={user.is_blocked}
-              edit_isOpen={isOpen}
-              edit_setIsOpen={setIsOpen}
-            />
-          )}
+          
           {!user.is_stats_hidden && (
             <>
               <ProfileStats
@@ -215,7 +197,7 @@ export const ProfilePage = (props: any) => {
             </>
           )}
         </div>
-      </div>
+      </div> */}
       <ProfileEditModal
         isOpen={isOpen && isMyProfile}
         setIsOpen={setIsOpen}

From cbdcfedb9b94f636962dc4c6f5d0773d4594017c Mon Sep 17 00:00:00 2001
From: Radiquum <kentai.waah@gmail.com>
Date: Thu, 3 Apr 2025 21:38:51 +0500
Subject: [PATCH 02/12] refactor: return user stats & made release votes
 preview as a list

---
 app/api/utils.ts                              |  4 +-
 .../Profile/Profile.ReleaseRatings.tsx        | 50 +++++-----
 app/pages/Profile.tsx                         | 91 +++++++------------
 3 files changed, 61 insertions(+), 84 deletions(-)

diff --git a/app/api/utils.ts b/app/api/utils.ts
index af3a4c3..f1f4b8d 100644
--- a/app/api/utils.ts
+++ b/app/api/utils.ts
@@ -212,9 +212,9 @@ export function unixToDate(
       " " +
       date.getFullYear() +
       ", " +
-      date.getHours() +
+      `${date.getHours()}`.padStart(2, "0") +
       ":" +
-      date.getMinutes()
+      `${date.getMinutes()}`.padStart(2, "0")
     );
   if (type === "dayMonth")
     return date.getDate() + " " + months[date.getMonth()];
diff --git a/app/components/Profile/Profile.ReleaseRatings.tsx b/app/components/Profile/Profile.ReleaseRatings.tsx
index 75af80d..0808d0a 100644
--- a/app/components/Profile/Profile.ReleaseRatings.tsx
+++ b/app/components/Profile/Profile.ReleaseRatings.tsx
@@ -51,33 +51,31 @@ export const ProfileReleaseRatings = (props: any) => {
           Посмотреть все
         </Button>
       </div>
-      <div className="flex min-h-[200px] items-center justify-center">
-        <Carousel theme={CarouselTheme}>
-          {props.ratings.map((release) => {
-            return (
-              <Link href={`/release/${release.id}`} key={`vote-${release.id}`}>
-                <div className="flex gap-4 xl:mx-20">
-                  <div className="max-w-32">
-                    <Poster image={release.image} />
-                  </div>
-                  <div className="flex flex-col gap-1 py-4">
-                    <h2 className="text-lg">{release.title_ru}</h2>
-                    <Rating size="md">
-                      <RatingStar filled={release.my_vote >= 1} />
-                      <RatingStar filled={release.my_vote >= 2} />
-                      <RatingStar filled={release.my_vote >= 3} />
-                      <RatingStar filled={release.my_vote >= 4} />
-                      <RatingStar filled={release.my_vote >= 5} />
-                    </Rating>
-                    <h2 className="text-gray-500 text-md dark:text-gray-400">
-                      {unixToDate(release.voted_at, "full")}
-                    </h2>
-                  </div>
+      <div className="flex flex-col w-full gap-4">
+        {props.ratings.map((release) => {
+          return (
+            <Link href={`/release/${release.id}`} key={`vote-${release.id}`}>
+              <div className="flex gap-4">
+                <div className="max-w-32">
+                  <Poster image={release.image} />
                 </div>
-              </Link>
-            );
-          })}
-        </Carousel>
+                <div className="flex flex-col gap-1 py-4">
+                  <h2 className="text-lg">{release.title_ru}</h2>
+                  <Rating size="md">
+                    <RatingStar filled={release.my_vote >= 1} />
+                    <RatingStar filled={release.my_vote >= 2} />
+                    <RatingStar filled={release.my_vote >= 3} />
+                    <RatingStar filled={release.my_vote >= 4} />
+                    <RatingStar filled={release.my_vote >= 5} />
+                  </Rating>
+                  <h2 className="text-gray-500 text-md dark:text-gray-400">
+                    {unixToDate(release.voted_at, "full")}
+                  </h2>
+                </div>
+              </div>
+            </Link>
+          );
+        })}
       </div>
       <ProfileReleaseRatingsModal
         profile_id={props.profile_id}
diff --git a/app/pages/Profile.tsx b/app/pages/Profile.tsx
index 65bd2c3..6e5d043 100644
--- a/app/pages/Profile.tsx
+++ b/app/pages/Profile.tsx
@@ -59,10 +59,6 @@ export const ProfilePage = (props: any) => {
     );
   }
 
-
-  const isPrivacy =
-    user.is_stats_hidden || user.is_counts_hidden || user.is_social_hidden;
-
   return (
     <>
       <div className="flex flex-col gap-2">
@@ -73,23 +69,39 @@ export const ProfilePage = (props: any) => {
           ban_expires={user.ban_expires}
         />
         <ProfilePrivacyBanner
-          is_privacy={isPrivacy}
+          is_privacy={
+            user.is_stats_hidden ||
+            user.is_counts_hidden ||
+            user.is_social_hidden
+          }
           is_me_blocked={user.is_me_blocked}
         />
       </div>
-      <div className="grid grid-cols-1 gap-2 lg:grid-cols-2">
+      <div
+        className={`grid grid-cols-1 gap-2 lg:grid-cols-2 ${
+          (
+            user.is_banned ||
+            user.is_perm_banned ||
+            user.is_stats_hidden ||
+            user.is_counts_hidden ||
+            user.is_social_hidden
+          ) ?
+            "mt-4"
+          : ""
+        }`}
+      >
         <div className="flex flex-col gap-2">
           <ProfileUser
-            avatar={user.avatar}
-            login={user.login}
-            status={user.status}
-            roles={user.roles}
-            rating={user.rating_score}
-            isMyProfile={isMyProfile}
-            isVerified={user.is_verified}
-            isOnline={user.is_online}
-            isSponsor={user.is_sponsor}
-            isBlocked={user.is_blocked}
+            avatar={user.avatar || ""}
+            login={user.login || ""}
+            status={user.status || ""}
+            roles={user.roles || []}
+            rating={user.rating_score || 0}
+            isMyProfile={isMyProfile || false}
+            isVerified={user.is_verified || false}
+            isOnline={user.is_online || false}
+            isSponsor={user.is_sponsor || false}
+            isBlocked={user.is_blocked || false}
             socials={{
               vk: user.vk_page || null,
               tg: user.tg_page || null,
@@ -112,35 +124,6 @@ export const ProfilePage = (props: any) => {
               edit_setIsOpen={setIsOpen}
             />
           )}
-        </div>
-        <div className="flex flex-col gap-2"></div>
-      </div>
-      {/* <div
-        className={`flex flex-wrap gap-2 ${
-          isPrivacy || user.is_banned || user.is_perm_banned ? "mt-4" : ""
-        }`}
-      >
-        <div className="flex flex-col gap-2 w-full xl:w-[50%]">
-          <ProfileUser
-            isOnline={user.is_online}
-            avatar={user.avatar}
-            login={user.login}
-            status={user.status}
-            socials={{
-              isPrivate: user.is_social_hidden,
-              hasSocials: hasSocials,
-              socials: socials,
-            }}
-            chips={{
-              hasChips: hasChips,
-              isMyProfile: isMyProfile,
-              isVerified: user.is_verified,
-              isSponsor: user.is_sponsor,
-              isBlocked: user.is_blocked,
-              roles: user.roles,
-            }}
-            rating={user.rating_score}
-          />
           {!user.is_counts_hidden && (
             <ProfileActivity
               profile_id={user.id}
@@ -151,7 +134,7 @@ export const ProfilePage = (props: any) => {
             />
           )}
           {!user.is_stats_hidden && (
-            <div className="flex-col hidden gap-2 xl:flex">
+            <div className="flex-col hidden gap-2 lg:flex">
               {user.votes && user.votes.length > 0 && (
                 <ProfileReleaseRatings
                   ratings={user.votes}
@@ -159,14 +142,10 @@ export const ProfilePage = (props: any) => {
                   profile_id={user.id}
                 />
               )}
-              {user.history && user.history.length > 0 && (
-                <ProfileReleaseHistory history={user.history} />
-              )}
             </div>
           )}
         </div>
-        <div className="flex flex-col w-full gap-2 xl:flex-1 xl:w-auto ">
-          
+        <div className="flex flex-col gap-2">
           {!user.is_stats_hidden && (
             <>
               <ProfileStats
@@ -182,7 +161,7 @@ export const ProfilePage = (props: any) => {
                 profile_id={user.id}
               />
               <ProfileWatchDynamic watchDynamic={user.watch_dynamics || []} />
-              <div className="flex flex-col gap-2 xl:hidden">
+              <div className="flex flex-col gap-2 lg:hidden">
                 {user.votes && user.votes.length > 0 && (
                   <ProfileReleaseRatings
                     ratings={user.votes}
@@ -190,14 +169,14 @@ export const ProfilePage = (props: any) => {
                     profile_id={user.id}
                   />
                 )}
-                {user.history && user.history.length > 0 && (
-                  <ProfileReleaseHistory history={user.history} />
-                )}
               </div>
+              {user.history && user.history.length > 0 && (
+                <ProfileReleaseHistory history={user.history} />
+              )}
             </>
           )}
         </div>
-      </div> */}
+      </div>
       <ProfileEditModal
         isOpen={isOpen && isMyProfile}
         setIsOpen={setIsOpen}

From c4c422904ef30a5282cd20a874f55405f83c3791 Mon Sep 17 00:00:00 2001
From: Radiquum <kentai.waah@gmail.com>
Date: Thu, 3 Apr 2025 21:59:18 +0500
Subject: [PATCH 03/12] refactor: user recently watched

---
 .../Profile/Profile.ReleaseHistory.tsx        | 106 +++++++++++-------
 .../Profile/Profile.ReleaseRatings.tsx        |  29 +----
 2 files changed, 69 insertions(+), 66 deletions(-)

diff --git a/app/components/Profile/Profile.ReleaseHistory.tsx b/app/components/Profile/Profile.ReleaseHistory.tsx
index b579c11..2401f32 100644
--- a/app/components/Profile/Profile.ReleaseHistory.tsx
+++ b/app/components/Profile/Profile.ReleaseHistory.tsx
@@ -1,49 +1,79 @@
-import { Card, Carousel } from "flowbite-react";
-import type {
-  FlowbiteCarouselIndicatorsTheme,
-  FlowbiteCarouselControlTheme,
-  CustomFlowbiteTheme,
-} from "flowbite-react";
-import { ReleaseLink } from "../ReleaseLink/ReleaseLinkUpdate";
+import { Card } from "flowbite-react";
 
-const CarouselIndicatorsTheme: FlowbiteCarouselIndicatorsTheme = {
-  active: {
-    off: "bg-gray-400/50 hover:bg-gray-200",
-    on: "bg-gray-200",
-  },
-  base: "h-3 w-3 rounded-full max-w-[300px]",
-  wrapper: "absolute bottom-5 left-1/2 flex -translate-x-1/2 space-x-3",
-};
+import { ReleaseChips } from "../ReleasePoster/Chips";
+import { Poster } from "../ReleasePoster/Poster";
+import Link from "next/link";
 
-const CarouselControlsTheme: FlowbiteCarouselControlTheme = {
-  base: "inline-flex h-8 w-8 items-center justify-center rounded-full group-focus:outline-none group-focus:ring-4 bg-gray-400/30 group-hover:bg-gray-400/60 group-focus:ring-gray-400/70 sm:h-10 sm:w-10",
-  icon: "h-5 w-5 text-gray-400 sm:h-6 sm:w-6",
-};
-
-const CarouselTheme: CustomFlowbiteTheme["carousel"] = {
-  root: {
-    base: "relative h-full w-full max-w-[375px]",
-  },
-  indicators: CarouselIndicatorsTheme,
-  control: CarouselControlsTheme,
+const profile_lists = {
+  // 0: "Не смотрю",
+  1: { name: "Смотрю", bg_color: "bg-green-500" },
+  2: { name: "В планах", bg_color: "bg-purple-500" },
+  3: { name: "Просмотрено", bg_color: "bg-blue-500" },
+  4: { name: "Отложено", bg_color: "bg-yellow-500" },
+  5: { name: "Брошено", bg_color: "bg-red-500" },
 };
 
 export const ProfileReleaseHistory = (props: any) => {
   return (
     <Card className="h-fit">
       <h1 className="text-2xl font-bold">Недавно просмотренные</h1>
-      <div className="flex justify-center">
-        <Carousel theme={CarouselTheme}>
-          {props.history.map((release) => {
-            return (
-              <ReleaseLink
-                key={`history-${release.id}`}
-                {...release}
-                chipsSettings={{ lastWatchedHidden: false }}
-              />
-            );
-          })}
-        </Carousel>
+      <div className="flex flex-col gap-4">
+        {props.history.map((release) => {
+          const genres = [];
+          const grade = release.grade ? Number(release.grade.toFixed(1)) : null;
+          const profile_list_status = release.profile_list_status || null;
+          let user_list = null;
+          if (profile_list_status != null || profile_list_status != 0) {
+            user_list = profile_lists[profile_list_status];
+          }
+          if (release.genres) {
+            const genres_array = release.genres.split(",");
+            genres_array.forEach((genre) => {
+              genres.push(genre.trim());
+            });
+          }
+          return (
+            <Link href={`/release/${release.id}`} key={`history-${release.id}`}>
+              <div className="flex gap-2">
+                <div className="flex-shrink-0 w-32">
+                  <Poster image={release.image} className="h-auto" />
+                </div>
+                <div className="flex flex-col gap-1">
+                  <ReleaseChips
+                    {...release}
+                    user_list={user_list}
+                    grade={grade}
+                    settings={{ lastWatchedHidden: false }}
+                  />
+                  <div>
+                    {genres.length > 0 &&
+                      genres.map((genre: string, index: number) => {
+                        return (
+                          <span
+                            key={`release_${props.id}_genre_${genre}_${index}`}
+                            className="text-sm font-light dark:text-white"
+                          >
+                            {index > 0 && ", "}
+                            {genre}
+                          </span>
+                        );
+                      })}
+                  </div>
+                  {release.title_ru && (
+                    <p className="text-lg font-bold dark:text-white">
+                      {release.title_ru}
+                    </p>
+                  )}
+                  {release.title_original && (
+                    <p className="text-sm text-gray-600 dark:text-gray-300">
+                      {release.title_original}
+                    </p>
+                  )}
+                </div>
+              </div>
+            </Link>
+          );
+        })}
       </div>
     </Card>
   );
diff --git a/app/components/Profile/Profile.ReleaseRatings.tsx b/app/components/Profile/Profile.ReleaseRatings.tsx
index 0808d0a..ffdeee9 100644
--- a/app/components/Profile/Profile.ReleaseRatings.tsx
+++ b/app/components/Profile/Profile.ReleaseRatings.tsx
@@ -1,16 +1,11 @@
 import {
   Card,
-  Carousel,
   RatingStar,
   Rating,
   Modal,
   Button,
 } from "flowbite-react";
-import type {
-  FlowbiteCarouselIndicatorsTheme,
-  FlowbiteCarouselControlTheme,
-} from "flowbite-react";
-import Image from "next/image";
+
 import { unixToDate, useSWRfetcher } from "#/api/utils";
 import Link from "next/link";
 import { useCallback, useEffect, useState } from "react";
@@ -19,28 +14,6 @@ import useSWRInfinite from "swr/infinite";
 import { Spinner } from "../Spinner/Spinner";
 import { Poster } from "../ReleasePoster/Poster";
 
-const CarouselIndicatorsTheme: FlowbiteCarouselIndicatorsTheme = {
-  active: {
-    off: "bg-gray-300/50 hover:bg-gray-400 dark:bg-gray-400/50 dark:hover:bg-gray-200",
-    on: "bg-gray-600 dark:bg-gray-200",
-  },
-  base: "h-3 w-3 rounded-full",
-  wrapper: "absolute bottom-5 left-1/2 flex -translate-x-1/2 space-x-3",
-};
-
-const CarouselControlsTheme: FlowbiteCarouselControlTheme = {
-  base: "inline-flex h-8 w-8 items-center justify-center rounded-full bg-gray-600/30 group-hover:bg-gray-600/50 group-focus:outline-none group-focus:ring-4 group-focus:ring-gray-600 dark:bg-gray-400/30 dark:group-hover:bg-gray-400/60 dark:group-focus:ring-gray-400/70 sm:h-10 sm:w-10",
-  icon: "h-5 w-5 text-gray-600 dark:text-gray-400 sm:h-6 sm:w-6",
-};
-
-const CarouselTheme = {
-  root: {
-    base: "relative h-full w-full max-w-[700px]",
-  },
-  indicators: CarouselIndicatorsTheme,
-  control: CarouselControlsTheme,
-};
-
 export const ProfileReleaseRatings = (props: any) => {
   const [modal, setModal] = useState(false);
   return (

From 4aa48f589bc624d4ad914084bbb0ee04ef1aa1c4 Mon Sep 17 00:00:00 2001
From: Radiquum <kentai.waah@gmail.com>
Date: Thu, 3 Apr 2025 22:10:58 +0500
Subject: [PATCH 04/12] small changes

---
 .../Profile/Profile.ReleaseRatings.tsx        |   6 +-
 app/components/Profile/Profile.User.tsx       | 118 +++++++++---------
 app/pages/Profile.tsx                         |   3 +-
 3 files changed, 65 insertions(+), 62 deletions(-)

diff --git a/app/components/Profile/Profile.ReleaseRatings.tsx b/app/components/Profile/Profile.ReleaseRatings.tsx
index ffdeee9..c93e69f 100644
--- a/app/components/Profile/Profile.ReleaseRatings.tsx
+++ b/app/components/Profile/Profile.ReleaseRatings.tsx
@@ -28,12 +28,12 @@ export const ProfileReleaseRatings = (props: any) => {
         {props.ratings.map((release) => {
           return (
             <Link href={`/release/${release.id}`} key={`vote-${release.id}`}>
-              <div className="flex gap-4">
+              <div className="flex gap-2">
                 <div className="max-w-32">
                   <Poster image={release.image} />
                 </div>
-                <div className="flex flex-col gap-1 py-4">
-                  <h2 className="text-lg">{release.title_ru}</h2>
+                <div className="flex flex-col gap-1">
+                  <h2 className="text-lg font-bold dark:text-white">{release.title_ru}</h2>
                   <Rating size="md">
                     <RatingStar filled={release.my_vote >= 1} />
                     <RatingStar filled={release.my_vote >= 2} />
diff --git a/app/components/Profile/Profile.User.tsx b/app/components/Profile/Profile.User.tsx
index e2033cc..538cd62 100644
--- a/app/components/Profile/Profile.User.tsx
+++ b/app/components/Profile/Profile.User.tsx
@@ -27,6 +27,7 @@ interface ProfileUserProps {
     inst: string;
     discord: string;
   };
+  is_social_hidden: boolean;
 }
 
 export const ProfileUser = ({
@@ -41,8 +42,8 @@ export const ProfileUser = ({
   isSponsor,
   isBlocked,
   socials,
+  is_social_hidden,
 }: ProfileUserProps) => {
-
   const theme = useThemeMode().mode;
 
   return (
@@ -88,65 +89,66 @@ export const ProfileUser = ({
           <p className="text-sm whitespace-pre-wrap sm:text-md">{status}</p>
         </div>
       </div>
-      {(socials.vk ||
-        socials.tg ||
-        socials.discord ||
-        socials.tt ||
-        socials.inst) && (
-        <div className="flex flex-wrap gap-2">
-          {socials.vk && (
-            <Link href={`https://vk.com/${socials.vk}`} target="_blank">
+      {!is_social_hidden &&
+        (socials.vk ||
+          socials.tg ||
+          socials.discord ||
+          socials.tt ||
+          socials.inst) && (
+          <div className="flex flex-wrap gap-2">
+            {socials.vk && (
+              <Link href={`https://vk.com/${socials.vk}`} target="_blank">
+                <UserSocial
+                  nickname={socials.vk}
+                  icon="fa6-brands--vk"
+                  url={`https://vk.com/${socials.vk}`}
+                  color="4a76a8"
+                />
+              </Link>
+            )}
+            {socials.tg && (
+              <Link href={`https://t.me/${socials.tg}`} target="_blank">
+                <UserSocial
+                  nickname={socials.tg}
+                  icon="fa6-brands--telegram"
+                  url={`https://t.me/${socials.tg}`}
+                  color="2aabee"
+                />
+              </Link>
+            )}
+            {socials.tt && (
+              <Link href={`https://tiktok.com/@${socials.tt}`} target="_blank">
+                <UserSocial
+                  nickname={socials.tt}
+                  icon="fa6-brands--tiktok"
+                  url={`https://tiktok.com/@${socials.tt}`}
+                  color={theme == "light" ? "000000" : "ffffff"}
+                />
+              </Link>
+            )}
+            {socials.inst && (
+              <Link
+                href={`https://instagram.com/${socials.inst}`}
+                target="_blank"
+              >
+                <UserSocial
+                  nickname={socials.inst}
+                  icon="fa6-brands--instagram"
+                  url={`https://instagram.com/${socials.inst}`}
+                  color="c32aa3"
+                />
+              </Link>
+            )}
+            {socials.discord && (
               <UserSocial
-                nickname={socials.vk}
-                icon="fa6-brands--vk"
-                url={`https://vk.com/${socials.vk}`}
-                color="4a76a8"
+                nickname={socials.discord}
+                icon="fa6-brands--discord"
+                url={`https://discord.com/${socials.discord}`}
+                color="5865f2"
               />
-            </Link>
-          )}
-          {socials.tg && (
-            <Link href={`https://t.me/${socials.tg}`} target="_blank">
-              <UserSocial
-                nickname={socials.tg}
-                icon="fa6-brands--telegram"
-                url={`https://t.me/${socials.tg}`}
-                color="2aabee"
-              />
-            </Link>
-          )}
-          {socials.tt && (
-            <Link href={`https://tiktok.com/@${socials.tt}`} target="_blank">
-              <UserSocial
-                nickname={socials.tt}
-                icon="fa6-brands--tiktok"
-                url={`https://tiktok.com/@${socials.tt}`}
-                color={theme == "light" ? "000000" : "ffffff"}
-              />
-            </Link>
-          )}
-          {socials.inst && (
-            <Link
-              href={`https://instagram.com/${socials.inst}`}
-              target="_blank"
-            >
-              <UserSocial
-                nickname={socials.inst}
-                icon="fa6-brands--instagram"
-                url={`https://instagram.com/${socials.inst}`}
-                color="c32aa3"
-              />
-            </Link>
-          )}
-          {socials.discord && (
-            <UserSocial
-              nickname={socials.discord}
-              icon="fa6-brands--discord"
-              url={`https://discord.com/${socials.discord}`}
-              color="5865f2"
-            />
-          )}
-        </div>
-      )}
+            )}
+          </div>
+        )}
     </Card>
   );
 };
diff --git a/app/pages/Profile.tsx b/app/pages/Profile.tsx
index 6e5d043..77ce5f1 100644
--- a/app/pages/Profile.tsx
+++ b/app/pages/Profile.tsx
@@ -88,7 +88,7 @@ export const ProfilePage = (props: any) => {
           ) ?
             "mt-4"
           : ""
-        }`}
+        } mb-4`}
       >
         <div className="flex flex-col gap-2">
           <ProfileUser
@@ -109,6 +109,7 @@ export const ProfilePage = (props: any) => {
               inst: user.inst_page || null,
               discord: user.discord_page || null,
             }}
+            is_social_hidden={user.is_social_hidden}
           />
           {authUser.token && (
             <ProfileActions

From 8daab3b3c177187baf92df7ba81f5c51801864fb Mon Sep 17 00:00:00 2001
From: Radiquum <kentai.waah@gmail.com>
Date: Thu, 3 Apr 2025 22:56:07 +0500
Subject: [PATCH 05/12] feat: add view of user blocklist

---
 app/api/config.ts                             |   1 +
 .../Profile/Profile.BlockedUsersModal.tsx     | 177 ++++++++++++++++++
 app/components/Profile/Profile.EditModal.tsx  |  17 +-
 3 files changed, 193 insertions(+), 2 deletions(-)
 create mode 100644 app/components/Profile/Profile.BlockedUsersModal.tsx

diff --git a/app/api/config.ts b/app/api/config.ts
index d3a25d0..a4fc159 100644
--- a/app/api/config.ts
+++ b/app/api/config.ts
@@ -18,6 +18,7 @@ export const ENDPOINTS = {
     bookmark: `${API_PREFIX}/profile/list`,
     history: `${API_PREFIX}/history`,
     favorite: `${API_PREFIX}/favorite`,
+    blocklist: `${API_PREFIX}/profile/blocklist`,
     settings: {
       my: `${API_PREFIX}/profile/preference/my`,
       login: {
diff --git a/app/components/Profile/Profile.BlockedUsersModal.tsx b/app/components/Profile/Profile.BlockedUsersModal.tsx
new file mode 100644
index 0000000..d127a87
--- /dev/null
+++ b/app/components/Profile/Profile.BlockedUsersModal.tsx
@@ -0,0 +1,177 @@
+import { ENDPOINTS } from "#/api/config";
+import { tryCatchAPI, unixToDate, useSWRfetcher } from "#/api/utils";
+import { Avatar, Button, Modal, useThemeMode } from "flowbite-react";
+import { useCallback, useEffect, useState } from "react";
+import useSWRInfinite from "swr/infinite";
+import { Spinner } from "../Spinner/Spinner";
+import { toast } from "react-toastify";
+
+export const ProfileBlockedUsersModal = (props: {
+  isOpen: boolean;
+  setIsOpen: (isOpen: boolean) => void;
+  token: string;
+  profile_id: number;
+}) => {
+  const [currentRef, setCurrentRef] = useState<any>(null);
+  const theme = useThemeMode();
+  const [actionsDisabled, setActionsDisabled] = useState(false);
+  const [unblockedUsers, setUnblockedUsers] = useState([]);
+
+  const modalRef = useCallback((ref) => {
+    setCurrentRef(ref);
+  }, []);
+
+  const getKey = (pageIndex: number, previousPageData: any) => {
+    if (previousPageData && !previousPageData.content.length) return null;
+    let url = `${ENDPOINTS.user.blocklist}/all/${pageIndex}?token=${props.token}`;
+    return url;
+  };
+
+  const { data, error, isLoading, size, setSize } = useSWRInfinite(
+    getKey,
+    useSWRfetcher,
+    { initialSize: 2 }
+  );
+
+  async function _addToBlocklist(profile_id) {
+    setActionsDisabled(true);
+
+    const tid = toast.loading(
+      unblockedUsers.includes(profile_id) ?
+        "Блокируем пользователя..."
+      : "Разблокируем пользователя...",
+      {
+        position: "bottom-center",
+        hideProgressBar: true,
+        closeOnClick: false,
+        pauseOnHover: false,
+        draggable: false,
+        theme: theme.mode == "light" ? "light" : "dark",
+      }
+    );
+
+    let url = `${ENDPOINTS.user.blocklist}`;
+    unblockedUsers.includes(profile_id) ?
+      (url += "/add/")
+    : (url += "/remove/");
+    url += `${profile_id}?token=${props.token}`;
+
+    const { data, error } = await tryCatchAPI(fetch(url));
+    if (error) {
+      toast.update(tid, {
+        render:
+          unblockedUsers.includes(profile_id) ?
+            "Ошибка блокировки"
+          : "Ошибка разблокировки",
+        type: "error",
+        autoClose: 2500,
+        isLoading: false,
+        closeOnClick: true,
+        draggable: true,
+      });
+      setActionsDisabled(false);
+      return;
+    }
+
+    toast.update(tid, {
+      render:
+        unblockedUsers.includes(profile_id) ?
+          "Пользователь заблокирован"
+        : "Пользователь разблокирован",
+      type: "success",
+      autoClose: 2500,
+      isLoading: false,
+      closeOnClick: true,
+      draggable: true,
+    });
+
+    if (unblockedUsers.includes(profile_id)) {
+      setUnblockedUsers((prev) => {
+        return prev.filter((item) => item !== profile_id);
+      });
+    } else {
+      setUnblockedUsers((prev) => {
+        return [...prev, profile_id];
+      });
+    }
+    setActionsDisabled(false);
+  }
+
+  const [content, setContent] = useState([]);
+  useEffect(() => {
+    if (data) {
+      let allReleases = [];
+      for (let i = 0; i < data.length; i++) {
+        allReleases.push(...data[i].content);
+      }
+      setContent(allReleases);
+    }
+  }, [data]);
+
+  const [scrollPosition, setScrollPosition] = useState(0);
+  function handleScroll() {
+    const height = currentRef.scrollHeight - currentRef.clientHeight;
+    const windowScroll = currentRef.scrollTop;
+    const scrolled = (windowScroll / height) * 100;
+    setScrollPosition(Math.floor(scrolled));
+  }
+
+  useEffect(() => {
+    if (scrollPosition >= 95 && scrollPosition <= 96) {
+      setSize(size + 1);
+    }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [scrollPosition]);
+  return (
+    <>
+      <Modal
+        dismissible
+        show={props.isOpen}
+        onClose={() => props.setIsOpen(false)}
+        size={"7xl"}
+      >
+        <Modal.Header>Заблокированные пользователи</Modal.Header>
+        <div
+          className="flex flex-col gap-2 p-4 overflow-y-auto"
+          onScroll={handleScroll}
+          ref={modalRef}
+        >
+          {content && content.length > 0 ?
+            content.map((user) => {
+              return (
+                <div className="flex items-center justify-between gap-2" key={`blockeduser-${user.id}`}>
+                  <div className="flex gap-2">
+                    <Avatar
+                      alt=""
+                      img={user.avatar}
+                      rounded={true}
+                      size={"md"}
+                      bordered={true}
+                      color={user.is_online ? "success" : "light"}
+                      className="flex-shrink-0"
+                    />
+                    <div className="flex flex-col gap-1">
+                      <p className="text-lg font-semibold">{user.login}</p>
+                      <p>Заблокирован: {unixToDate(user.added_date, "full")}</p>
+                    </div>
+                  </div>
+                  <Button
+                    color={!unblockedUsers.includes(user.id) ? "blue" : "red"}
+                    onClick={() => _addToBlocklist(user.id)}
+                    disabled={actionsDisabled}
+                    className="flex-grow-0 h-fit"
+                  >
+                    {!unblockedUsers.includes(user.id) ?
+                      "Разблокировать"
+                    : "Заблокировать"}
+                  </Button>
+                </div>
+              );
+            })
+          : "Нет заблокированных пользователей"}
+          {isLoading && <Spinner />}
+        </div>
+      </Modal>
+    </>
+  );
+};
diff --git a/app/components/Profile/Profile.EditModal.tsx b/app/components/Profile/Profile.EditModal.tsx
index 897f3a7..3b01f0b 100644
--- a/app/components/Profile/Profile.EditModal.tsx
+++ b/app/components/Profile/Profile.EditModal.tsx
@@ -14,6 +14,7 @@ import { useSWRConfig } from "swr";
 import { useUserStore } from "#/store/auth";
 import { ProfileEditLoginModal } from "./Profile.EditLoginModal";
 import { toast } from "react-toastify";
+import { ProfileBlockedUsersModal } from "./Profile.BlockedUsersModal";
 
 export const ProfileEditModal = (props: {
   isOpen: boolean;
@@ -25,6 +26,7 @@ export const ProfileEditModal = (props: {
   const [statusModalOpen, setStatusModalOpen] = useState(false);
   const [socialModalOpen, setSocialModalOpen] = useState(false);
   const [loginModalOpen, setLoginModalOpen] = useState(false);
+  const [blockedModalOpen, setBlockedModalOpen] = useState(false);
   const [privacyModalSetting, setPrivacyModalSetting] = useState("none");
   const [privacySettings, setPrivacySettings] = useState({
     privacy_stats: 9,
@@ -355,13 +357,18 @@ export const ProfileEditModal = (props: {
                     }
                   </p>
                 </button>
-                {/* <button className="p-2 text-left rounded-md hover:bg-gray-100 dark:hover:bg-gray-900">
+                <button
+                  className="p-2 text-left rounded-md hover:bg-gray-100 dark:hover:bg-gray-900"
+                  onClick={() => {
+                    setBlockedModalOpen(true);
+                  }}
+                >
                   <p className="text-lg">Блоклист</p>
                   <p className="text-base text-gray-500 dark:text-gray-400">
                     Список пользователей, которым запрещён доступ к вашей
                     странице
                   </p>
-                </button> */}
+                </button>
               </div>
               <div>
                 <div className="flex flex-col">
@@ -431,6 +438,12 @@ export const ProfileEditModal = (props: {
             setLogin={setLogin}
             profile_id={props.profile_id}
           />
+          <ProfileBlockedUsersModal
+            isOpen={blockedModalOpen}
+            setIsOpen={setBlockedModalOpen}
+            token={props.token}
+            profile_id={props.profile_id}
+          />
         </>
       : ""}
     </>

From 329448c9fca8e5c10bdb4e9ecf11e123dd456a14 Mon Sep 17 00:00:00 2001
From: Radiquum <kentai.waah@gmail.com>
Date: Fri, 4 Apr 2025 00:29:19 +0500
Subject: [PATCH 06/12] chore: migrate to new flowbite-react

---
 .flowbite-react/.gitignore                    |   2 +
 .flowbite-react/config.json                   |   9 +
 app/App.tsx                                   |  12 +-
 .../ChangelogModal/ChangelogModal.tsx         |  28 +-
 app/components/Comments/Comments.Add.tsx      |  12 +-
 app/components/Comments/Comments.Comment.tsx  |  10 +-
 app/components/Comments/Comments.Edit.tsx     |  12 +-
 app/components/Comments/Comments.Main.tsx     |   6 +-
 app/components/CropModal/CropModal.tsx        |  12 +-
 .../Profile/Profile.BlockedUsersModal.tsx     |   4 +-
 .../Profile/Profile.EditLoginModal.tsx        |  12 +-
 app/components/Profile/Profile.EditModal.tsx  |   8 +-
 .../Profile/Profile.EditPrivacyModal.tsx      |   8 +-
 .../Profile/Profile.EditSocialModal.tsx       |  31 +-
 .../Profile/Profile.EditStatusModal.tsx       |  12 +-
 .../Profile/Profile.ReleaseRatings.tsx        |  10 +-
 .../ReleaseInfo/ReleaseInfo.Info.tsx          |  78 ++--
 .../ReleaseInfo/ReleaseInfo.Rating.tsx        | 132 ++++---
 .../ReleaseInfo/ReleaseInfo.UserList.tsx      |   8 +-
 .../ReleasePlayer/ReleasePlayer.tsx           |  10 +-
 .../ReleasePlayer/SourceSelector.tsx          |   6 +-
 .../ReleasePlayer/VoiceoverSelector.tsx       |  10 +-
 .../SettingsModal/SettingsModal.tsx           |  42 ++-
 app/pages/BookmarksCategory.tsx               |  10 +-
 app/pages/CreateCollection.tsx                |  25 +-
 app/pages/Favorites.tsx                       |   6 +-
 app/pages/IndexCategory.tsx                   |   6 +-
 app/pages/Search.tsx                          |  24 +-
 next.config.js                                |  71 ++--
 package-lock.json                             | 357 +++++++++++++++---
 package.json                                  |   7 +-
 tailwind.config.js                            |  14 +-
 32 files changed, 650 insertions(+), 344 deletions(-)
 create mode 100644 .flowbite-react/.gitignore
 create mode 100644 .flowbite-react/config.json

diff --git a/.flowbite-react/.gitignore b/.flowbite-react/.gitignore
new file mode 100644
index 0000000..da26dfd
--- /dev/null
+++ b/.flowbite-react/.gitignore
@@ -0,0 +1,2 @@
+class-list.json
+pid
\ No newline at end of file
diff --git a/.flowbite-react/config.json b/.flowbite-react/config.json
new file mode 100644
index 0000000..d04ad92
--- /dev/null
+++ b/.flowbite-react/config.json
@@ -0,0 +1,9 @@
+{
+  "$schema": "https://unpkg.com/flowbite-react/schema.json",
+  "components": [],
+  "dark": true,
+  "prefix": "",
+  "path": "src/components",
+  "tsx": true,
+  "rsc": true
+}
\ No newline at end of file
diff --git a/app/App.tsx b/app/App.tsx
index 69d1288..3733cd1 100644
--- a/app/App.tsx
+++ b/app/App.tsx
@@ -4,7 +4,7 @@ import { usePreferencesStore } from "./store/preferences";
 import { Navbar } from "./components/Navbar/NavbarUpdate";
 import { Inter } from "next/font/google";
 import { useEffect, useState } from "react";
-import { Button, Modal } from "flowbite-react";
+import { Button, Modal, ModalBody, ModalFooter, ModalHeader } from "flowbite-react";
 import { Spinner } from "./components/Spinner/Spinner";
 import { ChangelogModal } from "#/components/ChangelogModal/ChangelogModal";
 import PlausibleProvider from "next-plausible";
@@ -80,8 +80,8 @@ export const App = (props) => {
         show={preferencesStore.params.isFirstLaunch}
         onClose={() => preferencesStore.setParams({ isFirstLaunch: false })}
       >
-        <Modal.Header>Внимание</Modal.Header>
-        <Modal.Body>
+        <ModalHeader>Внимание</ModalHeader>
+        <ModalBody>
           <p>
             Данный сайт не связан с разработчиками приложения Anixart, это
             неофициальная имплементация веб клиента для этого приложения.
@@ -94,15 +94,15 @@ export const App = (props) => {
             На сайте могут присутствовать ошибки и не доработки, а так-же
             отсутствующий функционал.
           </p>
-        </Modal.Body>
-        <Modal.Footer>
+        </ModalBody>
+        <ModalFooter>
           <Button
             color={"blue"}
             onClick={() => preferencesStore.setParams({ isFirstLaunch: false })}
           >
             Принимаю
           </Button>
-        </Modal.Footer>
+        </ModalFooter>
       </Modal>
       {preferencesStore.flags.enableAnalytics && (
         <PlausibleProvider
diff --git a/app/components/ChangelogModal/ChangelogModal.tsx b/app/components/ChangelogModal/ChangelogModal.tsx
index 294ef8f..9cd52cf 100644
--- a/app/components/ChangelogModal/ChangelogModal.tsx
+++ b/app/components/ChangelogModal/ChangelogModal.tsx
@@ -1,6 +1,14 @@
 "use client";
 
-import { Modal, Accordion } from "flowbite-react";
+import {
+  Accordion,
+  AccordionContent,
+  AccordionPanel,
+  AccordionTitle,
+  Modal,
+  ModalBody,
+  ModalHeader,
+} from "flowbite-react";
 import Markdown from "markdown-to-jsx";
 import { useEffect, useState } from "react";
 import Styles from "./ChangelogModal.module.css";
@@ -37,8 +45,8 @@ export const ChangelogModal = (props: {
 
   return (
     <Modal show={props.isOpen} onClose={() => props.setIsOpen(false)}>
-      <Modal.Header>Список изменений v{props.version}</Modal.Header>
-      <Modal.Body>
+      <ModalHeader>Список изменений v{props.version}</ModalHeader>
+      <ModalBody>
         <Markdown className={Styles.markdown}>
           {currentVersionChangelog}
         </Markdown>
@@ -46,8 +54,8 @@ export const ChangelogModal = (props: {
           {props.previousVersions.length > 0 &&
             props.previousVersions.map((version) => {
               return (
-                <Accordion.Panel key={version}>
-                  <Accordion.Title
+                <AccordionPanel key={version}>
+                  <AccordionTitle
                     onClickCapture={(e) => {
                       if (!previousVersionsChangelog.hasOwnProperty(version)) {
                         _fetchVersionChangelog(version).then((data) => {
@@ -62,19 +70,19 @@ export const ChangelogModal = (props: {
                     }}
                   >
                     Список изменений v{version}
-                  </Accordion.Title>
-                  <Accordion.Content>
+                  </AccordionTitle>
+                  <AccordionContent>
                     {previousVersionsChangelog.hasOwnProperty(version) ?
                       <Markdown className={Styles.markdown}>
                         {previousVersionsChangelog[version]}
                       </Markdown>
                     : <div>Загрузка ...</div>}
-                  </Accordion.Content>
-                </Accordion.Panel>
+                  </AccordionContent>
+                </AccordionPanel>
               );
             })}
         </Accordion>
-      </Modal.Body>
+      </ModalBody>
     </Modal>
   );
 };
diff --git a/app/components/Comments/Comments.Add.tsx b/app/components/Comments/Comments.Add.tsx
index 66ffee8..edec270 100644
--- a/app/components/Comments/Comments.Add.tsx
+++ b/app/components/Comments/Comments.Add.tsx
@@ -1,4 +1,4 @@
-import { Button, Modal, ToggleSwitch, Label, Textarea } from "flowbite-react";
+import { Button, Label, Modal, ModalBody, ModalHeader, Textarea, ToggleSwitch } from "flowbite-react";
 import { CommentsComment } from "./Comments.Comment";
 import { useState } from "react";
 import { ENDPOINTS } from "#/api/config";
@@ -68,12 +68,12 @@ export const CommentsAddModal = (props: {
       show={props.isOpen}
       onClose={() => props.setIsOpen(false)}
     >
-      <Modal.Header>
+      <ModalHeader>
         <p className="text-lg font-bold text-gray-900 lg:text-2xl dark:text-white">
           {props.isReply ? "Ответ на комментарий" : "Оставить комментарий"}
         </p>
-      </Modal.Header>
-      <Modal.Body>
+      </ModalHeader>
+      <ModalBody>
         {props.isReply && (
           <div className="mb-4">
             <CommentsComment
@@ -98,7 +98,7 @@ export const CommentsAddModal = (props: {
         <form className="flex flex-col gap-4" onSubmit={(e) => _sendComment(e)}>
           <div>
             <div className="block mb-2 sr-only">
-              <Label htmlFor="comment" value="Ваш комментарий." />
+              <Label htmlFor="comment">Ваш комментарий.</Label>
             </div>
             <Textarea
               id="comment"
@@ -132,7 +132,7 @@ export const CommentsAddModal = (props: {
             </Button>
           </div>
         </form>
-      </Modal.Body>
+      </ModalBody>
     </Modal>
   );
 };
diff --git a/app/components/Comments/Comments.Comment.tsx b/app/components/Comments/Comments.Comment.tsx
index 87e93da..4b2953c 100644
--- a/app/components/Comments/Comments.Comment.tsx
+++ b/app/components/Comments/Comments.Comment.tsx
@@ -1,7 +1,7 @@
 import { unixToDate, sinceUnixDate } from "#/api/utils";
 import { useEffect, useState } from "react";
 import { ENDPOINTS } from "#/api/config";
-import { Button, Dropdown } from "flowbite-react";
+import { Button, Dropdown, DropdownItem } from "flowbite-react";
 import Link from "next/link";
 import { CommentsAddModal } from "./Comments.Add";
 import { CommentsEditModal } from "./Comments.Edit";
@@ -183,12 +183,12 @@ export const CommentsComment = (props: {
                 <span className="w-6 h-6 bg-gray-400 iconify mdi--more-horiz hover:bg-gray-800 active:bg-gray-800"></span>
               )}
             >
-              <Dropdown.Item onClick={() => setIsEditCommentsOpen(true)}>
+              <DropdownItem onClick={() => setIsEditCommentsOpen(true)}>
                 Редактировать
-              </Dropdown.Item>
-              <Dropdown.Item onClick={() => _deleteComment()}>
+              </DropdownItem>
+              <DropdownItem onClick={() => _deleteComment()}>
                 Удалить
-              </Dropdown.Item>
+              </DropdownItem>
             </Dropdown>
           )}
         </footer>
diff --git a/app/components/Comments/Comments.Edit.tsx b/app/components/Comments/Comments.Edit.tsx
index 2108d02..4cc7fd6 100644
--- a/app/components/Comments/Comments.Edit.tsx
+++ b/app/components/Comments/Comments.Edit.tsx
@@ -1,4 +1,4 @@
-import { Button, Modal, ToggleSwitch, Label, Textarea } from "flowbite-react";
+import { Button, Label, Modal, ModalBody, ModalHeader, Textarea, ToggleSwitch } from "flowbite-react";
 import { useState } from "react";
 import { ENDPOINTS } from "#/api/config";
 
@@ -56,16 +56,16 @@ export const CommentsEditModal = (props: {
       show={props.isOpen}
       onClose={() => props.setIsOpen(false)}
     >
-      <Modal.Header>
+      <ModalHeader>
         <p className="text-lg font-bold text-gray-900 lg:text-2xl dark:text-white">
           Редактировать комментарий
         </p>
-      </Modal.Header>
-      <Modal.Body>
+      </ModalHeader>
+      <ModalBody>
         <form className="flex flex-col gap-4" onSubmit={(e) => _sendComment(e)}>
           <div>
             <div className="block mb-2 sr-only">
-              <Label htmlFor="comment" value="Редактировать ваш комментарий." />
+              <Label htmlFor="comment" >Редактировать ваш комментарий.</Label>
             </div>
             <Textarea
               id="comment"
@@ -99,7 +99,7 @@ export const CommentsEditModal = (props: {
             </Button>
           </div>
         </form>
-      </Modal.Body>
+      </ModalBody>
     </Modal>
   );
 };
diff --git a/app/components/Comments/Comments.Main.tsx b/app/components/Comments/Comments.Main.tsx
index c3fa006..3411918 100644
--- a/app/components/Comments/Comments.Main.tsx
+++ b/app/components/Comments/Comments.Main.tsx
@@ -1,4 +1,4 @@
-import { Card, Button, Modal, Spinner } from "flowbite-react";
+import { Button, Card, Modal, ModalHeader, Spinner } from "flowbite-react";
 import { CommentsComment } from "./Comments.Comment";
 import { useState, useEffect, useCallback } from "react";
 import { ENDPOINTS } from "#/api/config";
@@ -149,7 +149,7 @@ const CommentsAllModal = (props: {
       show={props.isOpen}
       onClose={() => props.setIsOpen(false)}
     >
-      <Modal.Header>
+      <ModalHeader>
         <div className="flex flex-col gap-1">
           <h2 className="text-lg font-bold text-gray-900 lg:text-2xl dark:text-white">
             Все комментарии
@@ -158,7 +158,7 @@ const CommentsAllModal = (props: {
             всего: {isLoading ? "загрузка..." : data[0].total_count}
           </p>
         </div>
-      </Modal.Header>
+      </ModalHeader>
       <div
         className="flex flex-col gap-2 p-4 overflow-y-auto"
         onScroll={handleScroll}
diff --git a/app/components/CropModal/CropModal.tsx b/app/components/CropModal/CropModal.tsx
index 7f42690..86b48eb 100644
--- a/app/components/CropModal/CropModal.tsx
+++ b/app/components/CropModal/CropModal.tsx
@@ -1,7 +1,7 @@
 import React, { useRef } from "react";
 import Cropper, { ReactCropperElement } from "react-cropper";
 import "cropperjs/dist/cropper.css";
-import { Button, Modal } from "flowbite-react";
+import { Button, Modal, ModalBody, ModalFooter, ModalHeader } from "flowbite-react";
 
 type CropModalProps = {
   isOpen: boolean;
@@ -71,8 +71,8 @@ export const CropModal: React.FC<CropModalProps> = ({
       }}
       size={"7xl"}
     >
-      <Modal.Header>Обрезать изображение</Modal.Header>
-      <Modal.Body>
+      <ModalHeader>Обрезать изображение</ModalHeader>
+      <ModalBody>
         <Cropper
           src={selectedImage}
           style={{ height: 400, width: "100%" }}
@@ -95,8 +95,8 @@ export const CropModal: React.FC<CropModalProps> = ({
           </p>
           <p>Используйте колёсико мыши что-бы изменить масштаб</p>
         </div>
-      </Modal.Body>
-      <Modal.Footer>
+      </ModalBody>
+      <ModalFooter>
         <Button
           color={"blue"}
           disabled={isActionsDisabled}
@@ -120,7 +120,7 @@ export const CropModal: React.FC<CropModalProps> = ({
         >
           Отменить
         </Button>
-      </Modal.Footer>
+      </ModalFooter>
     </Modal>
   );
 };
diff --git a/app/components/Profile/Profile.BlockedUsersModal.tsx b/app/components/Profile/Profile.BlockedUsersModal.tsx
index d127a87..8262294 100644
--- a/app/components/Profile/Profile.BlockedUsersModal.tsx
+++ b/app/components/Profile/Profile.BlockedUsersModal.tsx
@@ -1,6 +1,6 @@
 import { ENDPOINTS } from "#/api/config";
 import { tryCatchAPI, unixToDate, useSWRfetcher } from "#/api/utils";
-import { Avatar, Button, Modal, useThemeMode } from "flowbite-react";
+import { Avatar, Button, Modal, ModalHeader, useThemeMode } from "flowbite-react";
 import { useCallback, useEffect, useState } from "react";
 import useSWRInfinite from "swr/infinite";
 import { Spinner } from "../Spinner/Spinner";
@@ -130,7 +130,7 @@ export const ProfileBlockedUsersModal = (props: {
         onClose={() => props.setIsOpen(false)}
         size={"7xl"}
       >
-        <Modal.Header>Заблокированные пользователи</Modal.Header>
+        <ModalHeader>Заблокированные пользователи</ModalHeader>
         <div
           className="flex flex-col gap-2 p-4 overflow-y-auto"
           onScroll={handleScroll}
diff --git a/app/components/Profile/Profile.EditLoginModal.tsx b/app/components/Profile/Profile.EditLoginModal.tsx
index 984fabe..ea07e61 100644
--- a/app/components/Profile/Profile.EditLoginModal.tsx
+++ b/app/components/Profile/Profile.EditLoginModal.tsx
@@ -1,6 +1,6 @@
 "use client";
 
-import { Button, Modal, Textarea, useThemeMode } from "flowbite-react";
+import { Button, Modal, ModalBody, ModalFooter, ModalHeader, Textarea, useThemeMode } from "flowbite-react";
 import { ENDPOINTS } from "#/api/config";
 import { useEffect, useState } from "react";
 import { useSWRConfig } from "swr";
@@ -138,8 +138,8 @@ export const ProfileEditLoginModal = (props: {
       onClose={() => props.setIsOpen(false)}
       size={"4xl"}
     >
-      <Modal.Header>Изменить никнейм</Modal.Header>
-      <Modal.Body>
+      <ModalHeader>Изменить никнейм</ModalHeader>
+      <ModalBody>
         {loading ?
           <div className="flex items-center justify-center py-8">
             <Spinner />
@@ -173,8 +173,8 @@ export const ProfileEditLoginModal = (props: {
             }
           </>
         }
-      </Modal.Body>
-      <Modal.Footer>
+      </ModalBody>
+      <ModalFooter>
         {_loginData.is_change_available && (
           <Button
             color="blue"
@@ -191,7 +191,7 @@ export const ProfileEditLoginModal = (props: {
         >
           Отмена
         </Button>
-      </Modal.Footer>
+      </ModalFooter>
     </Modal>
   );
 };
diff --git a/app/components/Profile/Profile.EditModal.tsx b/app/components/Profile/Profile.EditModal.tsx
index 3b01f0b..d20b39c 100644
--- a/app/components/Profile/Profile.EditModal.tsx
+++ b/app/components/Profile/Profile.EditModal.tsx
@@ -1,6 +1,6 @@
 "use client";
 
-import { FileInput, Label, Modal, useThemeMode } from "flowbite-react";
+import { FileInput, Label, Modal, ModalBody, ModalHeader, useThemeMode } from "flowbite-react";
 import { Spinner } from "../Spinner/Spinner";
 import useSWR from "swr";
 import { ENDPOINTS } from "#/api/config";
@@ -201,8 +201,8 @@ export const ProfileEditModal = (props: {
         onClose={() => props.setIsOpen(false)}
         size={"7xl"}
       >
-        <Modal.Header>Редактирование профиля</Modal.Header>
-        <Modal.Body>
+        <ModalHeader>Редактирование профиля</ModalHeader>
+        <ModalBody>
           {prefLoading ?
             <Spinner />
           : <div className="flex flex-col gap-4">
@@ -394,7 +394,7 @@ export const ProfileEditModal = (props: {
               </div>
             </div>
           }
-        </Modal.Body>
+        </ModalBody>
       </Modal>
       {props.token ?
         <>
diff --git a/app/components/Profile/Profile.EditPrivacyModal.tsx b/app/components/Profile/Profile.EditPrivacyModal.tsx
index 59c8bdb..9311edf 100644
--- a/app/components/Profile/Profile.EditPrivacyModal.tsx
+++ b/app/components/Profile/Profile.EditPrivacyModal.tsx
@@ -1,6 +1,6 @@
 "use client";
 
-import { Modal, useThemeMode } from "flowbite-react";
+import { Modal, ModalBody, ModalHeader, useThemeMode } from "flowbite-react";
 import { ENDPOINTS } from "#/api/config";
 import { useState } from "react";
 import { toast } from "react-toastify";
@@ -98,8 +98,8 @@ export const ProfileEditPrivacyModal = (props: {
       onClose={() => props.setIsOpen(false)}
       size={"4xl"}
     >
-      <Modal.Header>{setting_text[props.setting]}</Modal.Header>
-      <Modal.Body>
+      <ModalHeader>{setting_text[props.setting]}</ModalHeader>
+      <ModalBody>
         {props.setting != "none" ?
           <>
             <div className="flex flex-col gap-2">
@@ -202,7 +202,7 @@ export const ProfileEditPrivacyModal = (props: {
             </div>
           </>
         : ""}
-      </Modal.Body>
+      </ModalBody>
     </Modal>
   );
 };
diff --git a/app/components/Profile/Profile.EditSocialModal.tsx b/app/components/Profile/Profile.EditSocialModal.tsx
index 128c418..244e689 100644
--- a/app/components/Profile/Profile.EditSocialModal.tsx
+++ b/app/components/Profile/Profile.EditSocialModal.tsx
@@ -1,6 +1,15 @@
 "use client";
 
-import { Button, Modal, Label, TextInput, useThemeMode } from "flowbite-react";
+import {
+  Button,
+  Label,
+  Modal,
+  ModalBody,
+  ModalFooter,
+  ModalHeader,
+  TextInput,
+  useThemeMode,
+} from "flowbite-react";
 import { Spinner } from "../Spinner/Spinner";
 import { ENDPOINTS } from "#/api/config";
 import { useEffect, useState } from "react";
@@ -164,8 +173,8 @@ export const ProfileEditSocialModal = (props: {
       onClose={() => props.setIsOpen(false)}
       size={"4xl"}
     >
-      <Modal.Header>Соц. сети</Modal.Header>
-      <Modal.Body>
+      <ModalHeader>Соц. сети</ModalHeader>
+      <ModalBody>
         <p className="p-2 text-gray-400 border-2 border-gray-200 rounded-md dark:border-gray-500 dark:text-gray-300">
           Укажите ссылки на свои социальные сети, чтобы другие пользователи
           могли с вами связаться
@@ -177,7 +186,7 @@ export const ProfileEditSocialModal = (props: {
         : <div className="flex flex-col gap-4 py-4">
             <div>
               <div className="block mb-2">
-                <Label htmlFor="vk-page" value="ВКонтакте" />
+                <Label htmlFor="vk-page">ВКонтакте</Label>
               </div>
               <TextInput
                 id="vk-page"
@@ -189,7 +198,7 @@ export const ProfileEditSocialModal = (props: {
             </div>
             <div>
               <div className="block mb-2">
-                <Label htmlFor="tg-page" value="Telegram" />
+                <Label htmlFor="tg-page">Telegram</Label>
               </div>
               <TextInput
                 id="tg-page"
@@ -201,7 +210,7 @@ export const ProfileEditSocialModal = (props: {
             </div>
             <div>
               <div className="block mb-2">
-                <Label htmlFor="discord-page" value="Discord" />
+                <Label htmlFor="discord-page">Discord</Label>
               </div>
               <TextInput
                 id="discord-page"
@@ -213,7 +222,7 @@ export const ProfileEditSocialModal = (props: {
             </div>
             <div>
               <div className="block mb-2">
-                <Label htmlFor="inst-page" value="Instagram" />
+                <Label htmlFor="inst-page">Instagram</Label>
               </div>
               <TextInput
                 id="inst-page"
@@ -225,7 +234,7 @@ export const ProfileEditSocialModal = (props: {
             </div>
             <div>
               <div className="block mb-2">
-                <Label htmlFor="tt-page" value="TikTok" />
+                <Label htmlFor="tt-page">TikTok</Label>
               </div>
               <TextInput
                 id="tt-page"
@@ -237,8 +246,8 @@ export const ProfileEditSocialModal = (props: {
             </div>
           </div>
         }
-      </Modal.Body>
-      <Modal.Footer>
+      </ModalBody>
+      <ModalFooter>
         <Button
           color="blue"
           onClick={() => _setSocialSetting()}
@@ -253,7 +262,7 @@ export const ProfileEditSocialModal = (props: {
         >
           Отмена
         </Button>
-      </Modal.Footer>
+      </ModalFooter>
     </Modal>
   );
 };
diff --git a/app/components/Profile/Profile.EditStatusModal.tsx b/app/components/Profile/Profile.EditStatusModal.tsx
index d8d870f..13cafbe 100644
--- a/app/components/Profile/Profile.EditStatusModal.tsx
+++ b/app/components/Profile/Profile.EditStatusModal.tsx
@@ -1,6 +1,6 @@
 "use client";
 
-import { Button, Modal, Textarea, useThemeMode } from "flowbite-react";
+import { Button, Modal, ModalBody, ModalFooter, ModalHeader, Textarea, useThemeMode } from "flowbite-react";
 import { ENDPOINTS } from "#/api/config";
 import { useEffect, useState } from "react";
 import { useSWRConfig } from "swr";
@@ -96,8 +96,8 @@ export const ProfileEditStatusModal = (props: {
       onClose={() => props.setIsOpen(false)}
       size={"4xl"}
     >
-      <Modal.Header>Изменить статус</Modal.Header>
-      <Modal.Body>
+      <ModalHeader>Изменить статус</ModalHeader>
+      <ModalBody>
         <Textarea
           disabled={loading}
           rows={3}
@@ -111,8 +111,8 @@ export const ProfileEditStatusModal = (props: {
         <p className="text-sm text-right text-gray-500 dark:text-gray-300">
           {_stringLength}/80
         </p>
-      </Modal.Body>
-      <Modal.Footer>
+      </ModalBody>
+      <ModalFooter>
         <Button
           color="blue"
           onClick={() => _setStatusSetting()}
@@ -123,7 +123,7 @@ export const ProfileEditStatusModal = (props: {
         <Button color="red" onClick={() => props.setIsOpen(false)}>
           Отмена
         </Button>
-      </Modal.Footer>
+      </ModalFooter>
     </Modal>
   );
 };
diff --git a/app/components/Profile/Profile.ReleaseRatings.tsx b/app/components/Profile/Profile.ReleaseRatings.tsx
index c93e69f..108a522 100644
--- a/app/components/Profile/Profile.ReleaseRatings.tsx
+++ b/app/components/Profile/Profile.ReleaseRatings.tsx
@@ -1,10 +1,4 @@
-import {
-  Card,
-  RatingStar,
-  Rating,
-  Modal,
-  Button,
-} from "flowbite-react";
+import { Button, Card, Modal, ModalHeader, Rating, RatingStar } from "flowbite-react";
 
 import { unixToDate, useSWRfetcher } from "#/api/utils";
 import Link from "next/link";
@@ -119,7 +113,7 @@ const ProfileReleaseRatingsModal = (props: {
       onClose={() => props.setIsOpen(false)}
       size={"4xl"}
     >
-      <Modal.Header>Оценки</Modal.Header>
+      <ModalHeader>Оценки</ModalHeader>
       <div
         className="flex flex-col gap-2 p-4 overflow-y-auto"
         onScroll={handleScroll}
diff --git a/app/components/ReleaseInfo/ReleaseInfo.Info.tsx b/app/components/ReleaseInfo/ReleaseInfo.Info.tsx
index ae0219e..631ca88 100644
--- a/app/components/ReleaseInfo/ReleaseInfo.Info.tsx
+++ b/app/components/ReleaseInfo/ReleaseInfo.Info.tsx
@@ -1,4 +1,4 @@
-import { Card, Table } from "flowbite-react";
+import { Card, Table, TableBody, TableCell, TableRow } from "flowbite-react";
 import { ReleaseInfoSearchLink } from "#/components/ReleaseInfo/ReleaseInfo.SearchLink";
 import { unixToDate, minutesToTime } from "#/api/utils";
 const weekDay = [
@@ -30,9 +30,9 @@ export const ReleaseInfoInfo = (props: {
   return (
     <Card>
       <Table>
-        <Table.Body>
-          <Table.Row>
-            <Table.Cell className="py-0">
+        <TableBody>
+          <TableRow>
+            <TableCell className="py-0">
               {props.country ?
                 props.country.toLowerCase() == "япония" ?
                   <span className="w-8 h-8 iconify-color twemoji--flag-for-japan"></span>
@@ -40,45 +40,45 @@ export const ReleaseInfoInfo = (props: {
 
               : <span className="w-8 h-8 iconify-color twemoji--flag-for-united-nations "></span>
               }
-            </Table.Cell>
-            <Table.Cell className="font-medium text-gray-900 whitespace-nowrap dark:text-white">
+            </TableCell>
+            <TableCell className="font-medium text-gray-900 whitespace-nowrap dark:text-white">
               {props.country && props.country}
               {(props.aired_on_date != 0 || props.year) && ", "}
               {props.season && props.season != 0 ?
                 `${YearSeason[props.season]} `
               : ""}
               {props.year && `${props.year} г.`}
-            </Table.Cell>
-          </Table.Row>
-          <Table.Row>
-            <Table.Cell className="py-0">
+            </TableCell>
+          </TableRow>
+          <TableRow>
+            <TableCell className="py-0">
               <span className="w-8 h-8 iconify-color mdi--animation-play-outline dark:invert"></span>
-            </Table.Cell>
-            <Table.Cell className="font-medium text-gray-900 whitespace-nowrap dark:text-white">
+            </TableCell>
+            <TableCell className="font-medium text-gray-900 whitespace-nowrap dark:text-white">
               {props.episodes.released ? props.episodes.released : "?"}
               {"/"}
               {props.episodes.total ? props.episodes.total + " эп. " : "? эп. "}
               {props.duration != 0 &&
                 `по ${minutesToTime(props.duration, "daysHours")}`}
-            </Table.Cell>
-          </Table.Row>
-          <Table.Row>
-            <Table.Cell className="py-0">
+            </TableCell>
+          </TableRow>
+          <TableRow>
+            <TableCell className="py-0">
               <span className="w-8 h-8 iconify-color mdi--calendar-outline dark:invert"></span>
-            </Table.Cell>
-            <Table.Cell className="font-medium text-gray-900 dark:text-white">
+            </TableCell>
+            <TableCell className="font-medium text-gray-900 dark:text-white">
               {props.category}
               {", "}
               {props.broadcast == 0 ?
                 props.status.toLowerCase()
               : `выходит ${weekDay[props.broadcast]}`}
-            </Table.Cell>
-          </Table.Row>
-          <Table.Row>
-            <Table.Cell className="py-0">
+            </TableCell>
+          </TableRow>
+          <TableRow>
+            <TableCell className="py-0">
               <span className="w-8 h-8 iconify-color mdi--people-group-outline dark:invert"></span>
-            </Table.Cell>
-            <Table.Cell className="font-medium text-gray-900 dark:text-white">
+            </TableCell>
+            <TableCell className="font-medium text-gray-900 dark:text-white">
               {props.studio && (
                 <>
                   {"Студия: "}
@@ -117,13 +117,13 @@ export const ReleaseInfoInfo = (props: {
                   />
                 </>
               )}
-            </Table.Cell>
-          </Table.Row>
-          <Table.Row>
-            <Table.Cell className="py-0">
+            </TableCell>
+          </TableRow>
+          <TableRow>
+            <TableCell className="py-0">
               <span className="w-8 h-8 iconify-color mdi--tag-outline dark:invert"></span>
-            </Table.Cell>
-            <Table.Cell className="font-medium text-gray-900 dark:text-white">
+            </TableCell>
+            <TableCell className="font-medium text-gray-900 dark:text-white">
               {props.genres &&
                 props.genres.split(", ").map((genre: string, index: number) => {
                   return (
@@ -133,14 +133,14 @@ export const ReleaseInfoInfo = (props: {
                     </div>
                   );
                 })}
-            </Table.Cell>
-          </Table.Row>
+            </TableCell>
+          </TableRow>
           {props.status.toLowerCase() == "анонс" && (
-            <Table.Row>
-              <Table.Cell className="py-0">
+            <TableRow>
+              <TableCell className="py-0">
                 <span className="w-8 h-8 iconify-color mdi--clock-outline dark:invert"></span>
-              </Table.Cell>
-              <Table.Cell className="font-medium text-gray-900 whitespace-nowrap dark:text-white">
+              </TableCell>
+              <TableCell className="font-medium text-gray-900 whitespace-nowrap dark:text-white">
                 {props.aired_on_date != 0 ?
                   unixToDate(props.aired_on_date, "full")
                 : props.year ?
@@ -151,10 +151,10 @@ export const ReleaseInfoInfo = (props: {
                     {props.year && `${props.year} г.`}
                   </>
                 : "Скоро"}
-              </Table.Cell>
-            </Table.Row>
+              </TableCell>
+            </TableRow>
           )}
-        </Table.Body>
+        </TableBody>
       </Table>
     </Card>
   );
diff --git a/app/components/ReleaseInfo/ReleaseInfo.Rating.tsx b/app/components/ReleaseInfo/ReleaseInfo.Rating.tsx
index 6f78499..f63304f 100644
--- a/app/components/ReleaseInfo/ReleaseInfo.Rating.tsx
+++ b/app/components/ReleaseInfo/ReleaseInfo.Rating.tsx
@@ -1,20 +1,26 @@
 import {
-  Card,
-  Rating,
-  Flowbite,
   Button,
-  CustomFlowbiteTheme,
+  Card,
   Modal,
+  ModalBody,
+  ModalFooter,
+  ModalHeader,
+  Rating,
+  RatingAdvanced,
+  RatingStar,
+  RatingAdvancedTheme,
 } from "flowbite-react";
 import { numberDeclension } from "#/api/utils";
 import { useState } from "react";
 import { ENDPOINTS } from "#/api/config";
 
-const RatingTheme: CustomFlowbiteTheme = {
-  ratingAdvanced: {
-    progress: {
-      base: "mx-4 h-5 w-3/4 rounded bg-gray-200 dark:bg-gray-700",
-    },
+const CustomRatingTheme: RatingAdvancedTheme = {
+  base: "flex items-center",
+  label: "text-sm font-medium text-cyan-600 dark:text-cyan-500",
+  progress: {
+    base: "mx-4 h-5 w-3/4 rounded bg-gray-200 dark:bg-gray-700",
+    fill: "h-5 rounded bg-yellow-400",
+    label: "text-sm font-medium text-cyan-600 dark:text-cyan-500",
   },
 };
 export const ReleaseInfoRating = (props: {
@@ -39,7 +45,7 @@ export const ReleaseInfoRating = (props: {
       <Card>
         <div className="flex flex-col gap-2 sm:items-center sm:flex-row">
           <Rating>
-            <Rating.Star />
+            <RatingStar />
             <p className="ml-2 text-sm font-bold dark:text-white">
               {props.grade.toFixed(2)} из 5
             </p>
@@ -48,7 +54,7 @@ export const ReleaseInfoRating = (props: {
             <>
               <span className="mx-1.5 h-1 w-1 rounded-full bg-gray-500 dark:bg-gray-400 hidden lg:block" />
               <div className="flex items-center gap-2">
-                {vote ? (
+                {vote ?
                   <>
                     <p className="text-sm font-medium text-gray-500 dark:text-gray-400">
                       ваша оценка: {vote}
@@ -62,8 +68,7 @@ export const ReleaseInfoRating = (props: {
                       изменить
                     </Button>
                   </>
-                ) : (
-                  <Button
+                : <Button
                     size={"xs"}
                     className="text-gray-500 border border-gray-600 rounded-full hover:bg-black hover:text-white hover:border-black dark:text-gray-400 dark:border-gray-500"
                     color="inline"
@@ -71,7 +76,7 @@ export const ReleaseInfoRating = (props: {
                   >
                     оценить
                   </Button>
-                )}
+                }
               </div>
             </>
           )}
@@ -80,47 +85,50 @@ export const ReleaseInfoRating = (props: {
           {props.votes.total}{" "}
           {numberDeclension(props.votes.total, "голос", "голоса", "голосов")}
         </p>
-        <Flowbite theme={{ theme: RatingTheme }}>
-          <Rating.Advanced
-            percentFilled={Math.floor(
-              (props.votes["5"] / props.votes.total) * 100
-            )}
-            className="mb-2"
-          >
-            5
-          </Rating.Advanced>
-          <Rating.Advanced
-            percentFilled={Math.floor(
-              (props.votes["4"] / props.votes.total) * 100
-            )}
-            className="mb-2"
-          >
-            4
-          </Rating.Advanced>
-          <Rating.Advanced
-            percentFilled={Math.floor(
-              (props.votes["3"] / props.votes.total) * 100
-            )}
-            className="mb-2"
-          >
-            3
-          </Rating.Advanced>
-          <Rating.Advanced
-            percentFilled={Math.floor(
-              (props.votes["2"] / props.votes.total) * 100
-            )}
-            className="mb-2"
-          >
-            2
-          </Rating.Advanced>
-          <Rating.Advanced
-            percentFilled={Math.floor(
-              (props.votes["1"] / props.votes.total) * 100
-            )}
-          >
-            1
-          </Rating.Advanced>
-        </Flowbite>
+        <RatingAdvanced
+          theme={CustomRatingTheme}
+          percentFilled={Math.floor(
+            (props.votes["5"] / props.votes.total) * 100
+          )}
+          className="mb-2"
+        >
+          5
+        </RatingAdvanced>
+        <RatingAdvanced
+          theme={CustomRatingTheme}
+          percentFilled={Math.floor(
+            (props.votes["4"] / props.votes.total) * 100
+          )}
+          className="mb-2"
+        >
+          4
+        </RatingAdvanced>
+        <RatingAdvanced
+          theme={CustomRatingTheme}
+          percentFilled={Math.floor(
+            (props.votes["3"] / props.votes.total) * 100
+          )}
+          className="mb-2"
+        >
+          3
+        </RatingAdvanced>
+        <RatingAdvanced
+          theme={CustomRatingTheme}
+          percentFilled={Math.floor(
+            (props.votes["2"] / props.votes.total) * 100
+          )}
+          className="mb-2"
+        >
+          2
+        </RatingAdvanced>
+        <RatingAdvanced
+          theme={CustomRatingTheme}
+          percentFilled={Math.floor(
+            (props.votes["1"] / props.votes.total) * 100
+          )}
+        >
+          1
+        </RatingAdvanced>
       </Card>
       <ReleaseInfoRatingModal
         isOpen={isRatingModalOpen}
@@ -178,8 +186,8 @@ const ReleaseInfoRatingModal = (props: {
       show={props.isOpen}
       onClose={() => props.setIsOpen(false)}
     >
-      <Modal.Header>Оценка</Modal.Header>
-      <Modal.Body>
+      <ModalHeader>Оценка</ModalHeader>
+      <ModalBody>
         <div>
           <div className="block sm:hidden">
             <Rating size="md" className="justify-center">
@@ -191,7 +199,7 @@ const ReleaseInfoRatingModal = (props: {
                   onMouseOut={() => setCurElement(0)}
                   onClick={() => setVote(element)}
                 >
-                  <Rating.Star
+                  <RatingStar
                     filled={index + 1 <= curElement || index + 1 <= vote}
                   />
                 </Button>
@@ -208,7 +216,7 @@ const ReleaseInfoRatingModal = (props: {
                   onMouseOut={() => setCurElement(0)}
                   onClick={() => setVote(element)}
                 >
-                  <Rating.Star
+                  <RatingStar
                     filled={index + 1 <= curElement || index + 1 <= vote}
                   />
                 </Button>
@@ -216,8 +224,8 @@ const ReleaseInfoRatingModal = (props: {
             </Rating>
           </div>
         </div>
-      </Modal.Body>
-      <Modal.Footer>
+      </ModalBody>
+      <ModalFooter>
         <div className="flex gap-1 ml-auto">
           <Button
             disabled={isSending}
@@ -241,7 +249,7 @@ const ReleaseInfoRatingModal = (props: {
             Оценить
           </Button>
         </div>
-      </Modal.Footer>
+      </ModalFooter>
     </Modal>
   );
 };
diff --git a/app/components/ReleaseInfo/ReleaseInfo.UserList.tsx b/app/components/ReleaseInfo/ReleaseInfo.UserList.tsx
index b0fec48..bf2d5e1 100644
--- a/app/components/ReleaseInfo/ReleaseInfo.UserList.tsx
+++ b/app/components/ReleaseInfo/ReleaseInfo.UserList.tsx
@@ -5,7 +5,7 @@ import useSWRInfinite from "swr/infinite";
 import { useCallback, useEffect, useState } from "react";
 import { tryCatchAPI, useSWRfetcher } from "#/api/utils";
 import { toast } from "react-toastify";
-import { useThemeMode } from "flowbite-react";
+import { DropdownItem, ModalHeader, useThemeMode } from "flowbite-react";
 
 const lists = [
   { list: 0, name: "Не смотрю" },
@@ -174,12 +174,12 @@ export const ReleaseInfoUserList = (props: {
               disabled={listEventDisabled}
             >
               {lists.map((list) => (
-                <Dropdown.Item
+                <DropdownItem
                   key={list.list}
                   onClick={() => _addToList(list.list)}
                 >
                   {list.name}
-                </Dropdown.Item>
+                </DropdownItem>
               ))}
             </Dropdown>
             <Button
@@ -321,7 +321,7 @@ const AddReleaseToCollectionModal = (props: {
       show={props.isOpen}
       onClose={() => props.setIsOpen(false)}
     >
-      <Modal.Header>Выбор коллекции</Modal.Header>
+      <ModalHeader>Выбор коллекции</ModalHeader>
       <div
         className="flex flex-col gap-2 p-4 overflow-y-auto"
         onScroll={handleScroll}
diff --git a/app/components/ReleasePlayer/ReleasePlayer.tsx b/app/components/ReleasePlayer/ReleasePlayer.tsx
index 94dbb2e..6c33e68 100644
--- a/app/components/ReleasePlayer/ReleasePlayer.tsx
+++ b/app/components/ReleasePlayer/ReleasePlayer.tsx
@@ -3,7 +3,7 @@
 import { Spinner } from "#/components/Spinner/Spinner";
 import { useUserStore } from "#/store/auth";
 import { useUserPlayerPreferencesStore } from "#/store/player";
-import { Card, Dropdown, Button } from "flowbite-react";
+import { Button, Card, Dropdown, DropdownItem } from "flowbite-react";
 import { ENDPOINTS } from "#/api/config";
 import { useState, useEffect } from "react";
 import { Swiper, SwiperSlide } from "swiper/react";
@@ -270,14 +270,14 @@ export const ReleasePlayer = (props: { id: number }) => {
               theme={DropdownTheme}
             >
               {voiceoverInfo.map((voiceover: any) => (
-                <Dropdown.Item
+                <DropdownItem
                   key={`voiceover_${voiceover.id}`}
                   onClick={() =>
                     setSelectedVoiceoverAndSaveAsPreferred(voiceover)
                   }
                 >
                   {voiceover.name}
-                </Dropdown.Item>
+                </DropdownItem>
               ))}
             </Dropdown>
             <Dropdown
@@ -286,12 +286,12 @@ export const ReleasePlayer = (props: { id: number }) => {
               theme={DropdownTheme}
             >
               {sourcesInfo.map((source: any) => (
-                <Dropdown.Item
+                <DropdownItem
                   key={`source_${source.id}`}
                   onClick={() => setSelectedPlayerAndSaveAsPreferred(source)}
                 >
                   {source.name}
-                </Dropdown.Item>
+                </DropdownItem>
               ))}
             </Dropdown>
           </div>
diff --git a/app/components/ReleasePlayer/SourceSelector.tsx b/app/components/ReleasePlayer/SourceSelector.tsx
index a8d0514..e02cbfb 100644
--- a/app/components/ReleasePlayer/SourceSelector.tsx
+++ b/app/components/ReleasePlayer/SourceSelector.tsx
@@ -1,6 +1,6 @@
 "use client";
 
-import { Dropdown } from "flowbite-react";
+import { Dropdown, DropdownItem } from "flowbite-react";
 import { numberDeclension } from "#/api/utils";
 import { useUserPlayerPreferencesStore } from "#/store/player";
 
@@ -55,7 +55,7 @@ export const SourceSelector = (props: {
       )}
     >
       {props.availableSource.map((source: Source) => (
-        <Dropdown.Item
+        <DropdownItem
           key={`source_${source.id}`}
           onClick={() => {
             playerPreferenceStore.setPreferredPlayer(
@@ -69,7 +69,7 @@ export const SourceSelector = (props: {
           }}
         >
           <DropdownItem {...source} />
-        </Dropdown.Item>
+        </DropdownItem>
       ))}
     </Dropdown>
   );
diff --git a/app/components/ReleasePlayer/VoiceoverSelector.tsx b/app/components/ReleasePlayer/VoiceoverSelector.tsx
index 6ee2448..80cf8d1 100644
--- a/app/components/ReleasePlayer/VoiceoverSelector.tsx
+++ b/app/components/ReleasePlayer/VoiceoverSelector.tsx
@@ -1,6 +1,6 @@
 "use client";
 
-import { Dropdown } from "flowbite-react";
+import { Dropdown, DropdownItem } from "flowbite-react";
 import { numberDeclension } from "#/api/utils";
 import { useUserPlayerPreferencesStore } from "#/store/player";
 
@@ -26,7 +26,7 @@ const DropdownTrigger = ({ icon, name, pinned }: Voiceover) => {
   );
 };
 
-const DropdownItem = ({
+const DropdownItemInternal = ({
   icon,
   name,
   pinned,
@@ -80,7 +80,7 @@ export const VoiceoverSelector = (props: {
       )}
     >
       {props.availableVoiceover.map((voiceover: Voiceover) => (
-        <Dropdown.Item
+        <DropdownItem
           className="w-fit"
           key={`voiceover_${voiceover.id}`}
           onClick={() => {
@@ -94,8 +94,8 @@ export const VoiceoverSelector = (props: {
             });
           }}
         >
-          <DropdownItem {...voiceover} />
-        </Dropdown.Item>
+          <DropdownItemInternal {...voiceover} />
+        </DropdownItem>
       ))}
     </Dropdown>
   );
diff --git a/app/components/SettingsModal/SettingsModal.tsx b/app/components/SettingsModal/SettingsModal.tsx
index 3786e80..8254957 100644
--- a/app/components/SettingsModal/SettingsModal.tsx
+++ b/app/components/SettingsModal/SettingsModal.tsx
@@ -4,12 +4,16 @@ import { CURRENT_APP_VERSION } from "#/api/config";
 import { useUserStore } from "#/store/auth";
 import { usePreferencesStore } from "#/store/preferences";
 import {
-  Modal,
   Button,
-  useThemeMode,
-  ToggleSwitch,
-  HR,
+  ButtonGroup,
   Dropdown,
+  DropdownItem,
+  HR,
+  Modal,
+  ModalBody,
+  ModalHeader,
+  ToggleSwitch,
+  useThemeMode,
 } from "flowbite-react";
 import Link from "next/link";
 
@@ -54,8 +58,8 @@ export const SettingsModal = (props: { isOpen: boolean; setIsOpen: any }) => {
       show={props.isOpen}
       onClose={() => props.setIsOpen(false)}
     >
-      <Modal.Header>Настройки</Modal.Header>
-      <Modal.Body>
+      <ModalHeader>Настройки</ModalHeader>
+      <ModalBody>
         <div className="space-y-6">
           <div className="flex items-center gap-2">
             <span className="w-6 h-6 iconify material-symbols--palette-outline"></span>
@@ -63,7 +67,7 @@ export const SettingsModal = (props: { isOpen: boolean; setIsOpen: any }) => {
           </div>
           <div className="flex items-center justify-between">
             <p className=" dark:text-white">Тема</p>
-            <Button.Group>
+            <ButtonGroup>
               <Button
                 color={computedMode == "light" ? "blue" : "gray"}
                 onClick={() => setMode("light")}
@@ -76,7 +80,7 @@ export const SettingsModal = (props: { isOpen: boolean; setIsOpen: any }) => {
               >
                 Темная
               </Button>
-            </Button.Group>
+            </ButtonGroup>
           </div>
           <div className="flex items-center justify-between">
             <p className=" dark:text-white max-w-96">
@@ -121,7 +125,7 @@ export const SettingsModal = (props: { isOpen: boolean; setIsOpen: any }) => {
                 >
                   {Object.keys(HomeCategory).map((key) => {
                     return (
-                      <Dropdown.Item
+                      <DropdownItem
                         key={key}
                         onClick={() =>
                           preferenceStore.setParams({
@@ -133,7 +137,7 @@ export const SettingsModal = (props: { isOpen: boolean; setIsOpen: any }) => {
                         }
                       >
                         {HomeCategory[key]}
-                      </Dropdown.Item>
+                      </DropdownItem>
                     );
                   })}
                 </Dropdown>
@@ -152,7 +156,7 @@ export const SettingsModal = (props: { isOpen: boolean; setIsOpen: any }) => {
                 >
                   {Object.keys(BookmarksCategory).map((key) => {
                     return (
-                      <Dropdown.Item
+                      <DropdownItem
                         key={key}
                         onClick={() =>
                           preferenceStore.setParams({
@@ -164,7 +168,7 @@ export const SettingsModal = (props: { isOpen: boolean; setIsOpen: any }) => {
                         }
                       >
                         {BookmarksCategory[key]}
-                      </Dropdown.Item>
+                      </DropdownItem>
                     );
                   })}
                 </Dropdown>
@@ -182,7 +186,7 @@ export const SettingsModal = (props: { isOpen: boolean; setIsOpen: any }) => {
               {Object.keys(NavbarTitles).map(
                 (key: "always" | "links" | "selected" | "never") => {
                   return (
-                    <Dropdown.Item
+                    <DropdownItem
                       className={`${key == "links" ? "hidden lg:flex" : ""}`}
                       key={`navbar-titles-${key}`}
                       onClick={() =>
@@ -192,7 +196,7 @@ export const SettingsModal = (props: { isOpen: boolean; setIsOpen: any }) => {
                       }
                     >
                       {NavbarTitles[key]}
-                    </Dropdown.Item>
+                    </DropdownItem>
                   );
                 }
               )}
@@ -211,7 +215,7 @@ export const SettingsModal = (props: { isOpen: boolean; setIsOpen: any }) => {
                   : "Нет"
                 }
               >
-                <Dropdown.Item
+                <DropdownItem
                   onClick={() =>
                     preferenceStore.setFlags({
                       showFifthButton: null,
@@ -219,10 +223,10 @@ export const SettingsModal = (props: { isOpen: boolean; setIsOpen: any }) => {
                   }
                 >
                   Не показывать
-                </Dropdown.Item>
+                </DropdownItem>
                 {Object.keys(FifthButton).map((key) => {
                   return (
-                    <Dropdown.Item
+                    <DropdownItem
                       key={`navbar-fifthbutton-${key}`}
                       onClick={() =>
                         preferenceStore.setFlags({
@@ -231,7 +235,7 @@ export const SettingsModal = (props: { isOpen: boolean; setIsOpen: any }) => {
                       }
                     >
                       {FifthButton[key]}
-                    </Dropdown.Item>
+                    </DropdownItem>
                   );
                 })}
               </Dropdown>
@@ -340,7 +344,7 @@ export const SettingsModal = (props: { isOpen: boolean; setIsOpen: any }) => {
             </div>
           </Link>
         </div>
-      </Modal.Body>
+      </ModalBody>
     </Modal>
   );
 };
diff --git a/app/pages/BookmarksCategory.tsx b/app/pages/BookmarksCategory.tsx
index ea4ed0b..b53b3fa 100644
--- a/app/pages/BookmarksCategory.tsx
+++ b/app/pages/BookmarksCategory.tsx
@@ -5,7 +5,7 @@ import { Spinner } from "#/components/Spinner/Spinner";
 import { useState, useEffect } from "react";
 import { useScrollPosition } from "#/hooks/useScrollPosition";
 import { useUserStore } from "../store/auth";
-import { Dropdown, Button } from "flowbite-react";
+import { Button, ButtonGroup, Dropdown, DropdownItem } from "flowbite-react";
 import { sort } from "./common";
 import { ENDPOINTS } from "#/api/config";
 import { BookmarksList, useSWRfetcher } from "#/api/utils";
@@ -151,7 +151,7 @@ export function BookmarksCategoryPage(props: any) {
         </form>
       : ""}
       <div className="m-4 overflow-auto">
-        <Button.Group>
+        <ButtonGroup>
           <Button
             className="whitespace-nowrap"
             disabled={props.slug == "watching"}
@@ -222,7 +222,7 @@ export function BookmarksCategoryPage(props: any) {
           >
             {props.SectionTitleMapping["abandoned"]}
           </Button>
-        </Button.Group>
+        </ButtonGroup>
       </div>
       <div className="flex items-center justify-between px-4 py-2 border-b-2 border-black dark:border-white">
         <h1 className="font-bold text-md sm:text-xl md:text-lg xl:text-xl">
@@ -237,7 +237,7 @@ export function BookmarksCategoryPage(props: any) {
           theme={DropdownTheme}
         >
           {sort.values.map((item, index) => (
-            <Dropdown.Item key={index} onClick={() => setSelectedSort(index)}>
+            <DropdownItem key={index} onClick={() => setSelectedSort(index)}>
               <span
                 className={`w-6 h-6 iconify ${
                   sort.values[index].value.split("_")[1] == "descending" ?
@@ -246,7 +246,7 @@ export function BookmarksCategoryPage(props: any) {
                 }`}
               ></span>
               {item.name}
-            </Dropdown.Item>
+            </DropdownItem>
           ))}
         </Dropdown>
       </div>
diff --git a/app/pages/CreateCollection.tsx b/app/pages/CreateCollection.tsx
index cd0c3b7..bdb690c 100644
--- a/app/pages/CreateCollection.tsx
+++ b/app/pages/CreateCollection.tsx
@@ -5,14 +5,15 @@ import { useEffect, useState, useCallback } from "react";
 import { useSearchParams, useRouter } from "next/navigation";
 import { ENDPOINTS } from "#/api/config";
 import {
-  Card,
   Button,
+  Card,
   Checkbox,
-  TextInput,
-  Textarea,
   FileInput,
   Label,
   Modal,
+  ModalHeader,
+  Textarea,
+  TextInput,
   useThemeMode,
 } from "flowbite-react";
 import { PosterWithStuff } from "#/components/ReleasePoster/PosterWithStuff";
@@ -388,10 +389,9 @@ export const CreateCollectionPage = () => {
           </Label>
           <div className="flex-1">
             <div className="block mb-2">
-              <Label
-                htmlFor="title"
-                value="Название (минимум 10, максимум 60 символов)"
-              />
+              <Label htmlFor="title">
+                Название (минимум 10, максимум 60 символов)
+              </Label>
             </div>
             <TextInput
               id="title"
@@ -408,10 +408,9 @@ export const CreateCollectionPage = () => {
               {stringLength.title}/60
             </p>
             <div className="block mt-2 mb-2">
-              <Label
-                htmlFor="description"
-                value="Описание (максимум 1000 символов)"
-              />
+              <Label htmlFor="description">
+                Описание (максимум 1000 символов)
+              </Label>
             </div>
             <Textarea
               rows={4}
@@ -434,7 +433,7 @@ export const CreateCollectionPage = () => {
                   checked={isPrivate}
                   onChange={(e) => setIsPrivate(e.target.checked)}
                 />
-                <Label htmlFor="private" value="Приватная коллекция" />
+                <Label htmlFor="private">Приватная коллекция</Label>
               </div>
             </div>
             <Button
@@ -603,7 +602,7 @@ export const ReleasesEditModal = (props: {
       onClose={() => props.setIsOpen(false)}
       size={"7xl"}
     >
-      <Modal.Header>Изменить релизы в коллекции</Modal.Header>
+      <ModalHeader>Изменить релизы в коллекции</ModalHeader>
       <div
         onScroll={handleScroll}
         ref={modalRef}
diff --git a/app/pages/Favorites.tsx b/app/pages/Favorites.tsx
index 9589599..238df86 100644
--- a/app/pages/Favorites.tsx
+++ b/app/pages/Favorites.tsx
@@ -5,7 +5,7 @@ import { Spinner } from "#/components/Spinner/Spinner";
 import { useState, useEffect } from "react";
 import { useScrollPosition } from "#/hooks/useScrollPosition";
 import { useUserStore } from "../store/auth";
-import { Dropdown, Button } from "flowbite-react";
+import { Button, Dropdown, DropdownItem } from "flowbite-react";
 import { sort } from "./common";
 import { ENDPOINTS } from "#/api/config";
 import { useRouter } from "next/navigation";
@@ -126,7 +126,7 @@ export function FavoritesPage() {
           theme={DropdownTheme}
         >
           {sort.values.map((item, index) => (
-            <Dropdown.Item key={index} onClick={() => setSelectedSort(index)}>
+            <DropdownItem key={index} onClick={() => setSelectedSort(index)}>
               <span
                 className={`w-6 h-6 iconify ${
                   sort.values[index].value.split("_")[1] == "descending"
@@ -135,7 +135,7 @@ export function FavoritesPage() {
                 }`}
               ></span>
               {item.name}
-            </Dropdown.Item>
+            </DropdownItem>
           ))}
         </Dropdown>
       </div>
diff --git a/app/pages/IndexCategory.tsx b/app/pages/IndexCategory.tsx
index f79dbf7..f3ba11d 100644
--- a/app/pages/IndexCategory.tsx
+++ b/app/pages/IndexCategory.tsx
@@ -5,7 +5,7 @@ import { useState, useEffect } from "react";
 import { useScrollPosition } from "#/hooks/useScrollPosition";
 import { useUserStore } from "../store/auth";
 import { _FetchHomePageReleases } from "#/api/utils";
-import { Button } from "flowbite-react";
+import { Button, ButtonGroup } from "flowbite-react";
 import { useRouter } from "next/navigation";
 
 export function IndexCategoryPage(props) {
@@ -53,13 +53,13 @@ export function IndexCategoryPage(props) {
   return (
     <>
       <div className="mb-4 overflow-auto">
-        <Button.Group>
+        <ButtonGroup>
           <Button className="whitespace-nowrap" disabled={props.slug == "last"} color="light" onClick={() => router.push("/home/last")}>{props.SectionTitleMapping["last"]}</Button>
           <Button className="whitespace-nowrap" disabled={props.slug == "finished"} color="light" onClick={() => router.push("/home/finished")}>{props.SectionTitleMapping["finished"]}</Button>
           <Button className="whitespace-nowrap" disabled={props.slug == "ongoing"} color="light" onClick={() => router.push("/home/ongoing")}>{props.SectionTitleMapping["ongoing"]}</Button>
           <Button className="whitespace-nowrap" disabled={props.slug == "announce"} color="light" onClick={() => router.push("/home/announce")}>{props.SectionTitleMapping["announce"]}</Button>
           <Button className="whitespace-nowrap" disabled={props.slug == "films"} color="light" onClick={() => router.push("/home/films")}>{props.SectionTitleMapping["films"]}</Button>
-        </Button.Group>
+        </ButtonGroup>
       </div>
       {content && content.length > 0 ? (
         <ReleaseSection
diff --git a/app/pages/Search.tsx b/app/pages/Search.tsx
index f1ee103..bba699e 100644
--- a/app/pages/Search.tsx
+++ b/app/pages/Search.tsx
@@ -8,7 +8,7 @@ import { useScrollPosition } from "#/hooks/useScrollPosition";
 import { useRouter } from "next/navigation";
 import { useSearchParams } from "next/navigation";
 import { useUserStore } from "../store/auth";
-import { Button, Dropdown, Modal } from "flowbite-react";
+import { Button, Dropdown, DropdownItem, Modal, ModalBody, ModalFooter, ModalHeader } from "flowbite-react";
 import { CollectionsSection } from "#/components/CollectionsSection/CollectionsSection";
 import { UserSection } from "#/components/UserSection/UserSection";
 import { useSWRfetcher } from "#/api/utils";
@@ -360,8 +360,8 @@ const FiltersModal = (props: {
 
   return (
     <Modal show={props.isOpen} onClose={() => _cancel()}>
-      <Modal.Header>Фильтры</Modal.Header>
-      <Modal.Body>
+      <ModalHeader>Фильтры</ModalHeader>
+      <ModalBody>
         <div className="my-4">
           <div className="flex items-center justify-between">
             <p className="font-bold dark:text-white">Искать в</p>
@@ -376,12 +376,12 @@ const FiltersModal = (props: {
                   return <></>;
                 } else {
                   return (
-                    <Dropdown.Item
+                    <DropdownItem
                       onClick={() => setWhere(item)}
                       key={`where--${item}`}
                     >
                       {WhereMapping[item]}
-                    </Dropdown.Item>
+                    </DropdownItem>
                   );
                 }
               })}
@@ -395,12 +395,12 @@ const FiltersModal = (props: {
               <Dropdown label={ListsMapping[list].name} color="blue">
                 {Object.keys(ListsMapping).map((item) => {
                   return (
-                    <Dropdown.Item
+                    <DropdownItem
                       onClick={() => setList(item)}
                       key={`list--${item}`}
                     >
                       {ListsMapping[item].name}
-                    </Dropdown.Item>
+                    </DropdownItem>
                   );
                 })}
               </Dropdown>
@@ -414,20 +414,20 @@ const FiltersModal = (props: {
               <Dropdown label={TagMapping[searchBy].name} color="blue">
                 {Object.keys(TagMapping).map((item) => {
                   return (
-                    <Dropdown.Item
+                    <DropdownItem
                       onClick={() => setSearchBy(item)}
                       key={`tag--${item}`}
                     >
                       {TagMapping[item].name}
-                    </Dropdown.Item>
+                    </DropdownItem>
                   );
                 })}
               </Dropdown>
             </div>
           </div>
         : ""}
-      </Modal.Body>
-      <Modal.Footer>
+      </ModalBody>
+      <ModalFooter>
         <div className="flex justify-end w-full gap-2">
           <Button color="red" onClick={() => _cancel()}>
             Отменить
@@ -436,7 +436,7 @@ const FiltersModal = (props: {
             Применить
           </Button>
         </div>
-      </Modal.Footer>
+      </ModalFooter>
     </Modal>
   );
 };
diff --git a/next.config.js b/next.config.js
index 1b76294..627945f 100644
--- a/next.config.js
+++ b/next.config.js
@@ -1,8 +1,7 @@
 const { withPlausibleProxy } = require("next-plausible");
-
-module.exports = withPlausibleProxy({
-  customDomain: "https://analytics.wah.su",
-})({
+const withFlowbiteReact = require("flowbite-react/plugin/nextjs");
+/** @type {import('next').NextConfig} */
+const NextConfig = {
   reactStrictMode: false,
   images: {
     unoptimized: true,
@@ -10,68 +9,88 @@ module.exports = withPlausibleProxy({
   async headers() {
     return [
       {
-        source: '/bookmarks/:slug*',
+        source: "/bookmarks/:slug*",
         headers: [
           {
-            key: 'Cache-Control',
-            value: 's-maxage=2592000, stale-while-revalidate=86400',
+            key: "Cache-Control",
+            value: "s-maxage=2592000, stale-while-revalidate=86400",
           },
         ],
       },
       {
-        source: '/collection/:slug*',
+        source: "/collection/:slug*",
         headers: [
           {
-            key: 'Cache-Control',
-            value: 's-maxage=2592000, stale-while-revalidate=86400',
+            key: "Cache-Control",
+            value: "s-maxage=2592000, stale-while-revalidate=86400",
           },
         ],
       },
       {
-        source: '/home/:slug*',
+        source: "/home/:slug*",
         headers: [
           {
-            key: 'Cache-Control',
-            value: 's-maxage=2592000, stale-while-revalidate=86400',
+            key: "Cache-Control",
+            value: "s-maxage=2592000, stale-while-revalidate=86400",
           },
         ],
       },
       {
-        source: '/profile/:slug*',
+        source: "/profile/:slug*",
         headers: [
           {
-            key: 'Cache-Control',
-            value: 's-maxage=2592000, stale-while-revalidate=86400',
+            key: "Cache-Control",
+            value: "s-maxage=2592000, stale-while-revalidate=86400",
           },
         ],
       },
       {
-        source: '/release/:slug*',
+        source: "/release/:slug*",
         headers: [
           {
-            key: 'Cache-Control',
-            value: 's-maxage=2592000, stale-while-revalidate=86400',
+            key: "Cache-Control",
+            value: "s-maxage=2592000, stale-while-revalidate=86400",
           },
         ],
       },
       {
-        source: '/related/:slug*',
+        source: "/related/:slug*",
         headers: [
           {
-            key: 'Cache-Control',
-            value: 's-maxage=2592000, stale-while-revalidate=86400',
+            key: "Cache-Control",
+            value: "s-maxage=2592000, stale-while-revalidate=86400",
           },
         ],
       },
       {
-        source: '/search',
+        source: "/search",
         headers: [
           {
-            key: 'Cache-Control',
-            value: 's-maxage=2592000, stale-while-revalidate=86400',
+            key: "Cache-Control",
+            value: "s-maxage=2592000, stale-while-revalidate=86400",
           },
         ],
       },
     ];
   },
-});
+};
+
+const config = () => {
+  const plugins = [withPlausibleProxy, withFlowbiteReact];
+  return (
+    plugins.reduce((acc, next) => {
+      console.log(`INIT: ${next.name}`);
+      if (next.name === "withPlausibleProxy") {
+        return next(acc, {
+          customDomain: "https://analytics.wah.su",
+        });
+      }
+
+      return next(acc);
+    }),
+    { ...NextConfig }
+  );
+};
+
+console.log(config());
+module.exports = config();
diff --git a/package-lock.json b/package-lock.json
index 3f175bf..7238a77 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,7 +11,7 @@
         "apexcharts": "^3.52.0",
         "deepmerge-ts": "^7.1.0",
         "flowbite": "^2.4.1",
-        "flowbite-react": "^0.10.1",
+        "flowbite-react": "^0.11.7",
         "hls-video-element": "^1.5.0",
         "markdown-to-jsx": "^7.4.7",
         "media-chrome": "^4.8.0",
@@ -153,12 +153,12 @@
       }
     },
     "node_modules/@floating-ui/core": {
-      "version": "1.6.6",
-      "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.6.tgz",
-      "integrity": "sha512-Vkvsw6EcpMHjvZZdMkSY+djMGFbt7CRssW99Ne8tar2WLnZ/l3dbxeTShbLQj+/s35h+Qb4cmnob+EzwtjrXGQ==",
+      "version": "1.6.9",
+      "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz",
+      "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==",
       "license": "MIT",
       "dependencies": {
-        "@floating-ui/utils": "^0.2.6"
+        "@floating-ui/utils": "^0.2.9"
       }
     },
     "node_modules/@floating-ui/dom": {
@@ -172,18 +172,18 @@
       }
     },
     "node_modules/@floating-ui/react": {
-      "version": "0.26.21",
-      "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.21.tgz",
-      "integrity": "sha512-7P5ncDIiYd6RrwpCDbKyFzvabM014QlzlumtDbK3Bck0UueC+Rp8BLS34qcGBcN1pZCTodl4QNnCVmKv4tSxfQ==",
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.3.tgz",
+      "integrity": "sha512-CLHnes3ixIFFKVQDdICjel8muhFLOBdQH7fgtHNPY8UbCNqbeKZ262G7K66lGQOUQWWnYocf7ZbUsLJgGfsLHg==",
       "license": "MIT",
       "dependencies": {
-        "@floating-ui/react-dom": "^2.1.1",
-        "@floating-ui/utils": "^0.2.6",
+        "@floating-ui/react-dom": "^2.1.2",
+        "@floating-ui/utils": "^0.2.9",
         "tabbable": "^6.0.0"
       },
       "peerDependencies": {
-        "react": ">=16.8.0",
-        "react-dom": ">=16.8.0"
+        "react": ">=17.0.0",
+        "react-dom": ">=17.0.0"
       }
     },
     "node_modules/@floating-ui/react-dom": {
@@ -243,6 +243,12 @@
       "dev": true,
       "license": "BSD-3-Clause"
     },
+    "node_modules/@iarna/toml": {
+      "version": "2.2.5",
+      "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz",
+      "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==",
+      "license": "ISC"
+    },
     "node_modules/@iconify-json/fa6-brands": {
       "version": "1.2.5",
       "resolved": "https://registry.npmjs.org/@iconify-json/fa6-brands/-/fa6-brands-1.2.5.tgz",
@@ -1619,6 +1625,12 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/array-timsort": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz",
+      "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==",
+      "license": "MIT"
+    },
     "node_modules/array-union": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
@@ -1749,6 +1761,18 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/ast-types": {
+      "version": "0.16.1",
+      "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz",
+      "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==",
+      "license": "MIT",
+      "dependencies": {
+        "tslib": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
     "node_modules/ast-types-flow": {
       "version": "0.0.8",
       "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
@@ -2106,6 +2130,22 @@
         "node": ">= 6"
       }
     },
+    "node_modules/comment-json": {
+      "version": "4.2.5",
+      "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.5.tgz",
+      "integrity": "sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==",
+      "license": "MIT",
+      "dependencies": {
+        "array-timsort": "^1.0.3",
+        "core-util-is": "^1.0.3",
+        "esprima": "^4.0.1",
+        "has-own-prop": "^2.0.0",
+        "repeat-string": "^1.6.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
     "node_modules/concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -2138,6 +2178,12 @@
         "webpack": "^5.1.0"
       }
     },
+    "node_modules/core-util-is": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+      "license": "MIT"
+    },
     "node_modules/cropperjs": {
       "version": "1.6.2",
       "resolved": "https://registry.npmjs.org/cropperjs/-/cropperjs-1.6.2.tgz",
@@ -2245,9 +2291,9 @@
       }
     },
     "node_modules/debounce": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/debounce/-/debounce-2.1.0.tgz",
-      "integrity": "sha512-OkL3+0pPWCqoBc/nhO9u6TIQNTK44fnBnzuVtJAbp13Naxw9R6u21x+8tVTka87AhDZ3htqZ2pSSsZl9fqL2Wg==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/debounce/-/debounce-2.2.0.tgz",
+      "integrity": "sha512-Xks6RUDLZFdz8LIdR6q0MTH44k7FikOmnh5xkSjMig6ch45afc8sjTjRQf3P6ax8dMgcQrYO/AR2RGWURrruqw==",
       "license": "MIT",
       "engines": {
         "node": ">=18"
@@ -2260,7 +2306,6 @@
       "version": "4.4.0",
       "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
       "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "ms": "^2.1.3"
@@ -3049,6 +3094,19 @@
         "url": "https://opencollective.com/eslint"
       }
     },
+    "node_modules/esprima": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+      "license": "BSD-2-Clause",
+      "bin": {
+        "esparse": "bin/esparse.js",
+        "esvalidate": "bin/esvalidate.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
     "node_modules/esquery": {
       "version": "1.6.0",
       "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
@@ -3288,34 +3346,174 @@
       }
     },
     "node_modules/flowbite-react": {
-      "version": "0.10.2",
-      "resolved": "https://registry.npmjs.org/flowbite-react/-/flowbite-react-0.10.2.tgz",
-      "integrity": "sha512-qkayK6IFmfH7zuuDnHmS0hJxLtL0KpW4vo4i/VQfZ6ZfaNlUsNLQxCGcmXwbZZtUm2WVw8x71aaDOAxftG9tmg==",
+      "version": "0.11.7",
+      "resolved": "https://registry.npmjs.org/flowbite-react/-/flowbite-react-0.11.7.tgz",
+      "integrity": "sha512-Z8m+ycHEsXPacSAi8P4yYDeff7LvcHNwbGAnL/+Fpiv+6ZWDEAGY/YPKhUofZsZa837JTYrbcbmgjqQ1bpt51g==",
       "license": "MIT",
       "dependencies": {
-        "@floating-ui/core": "1.6.6",
-        "@floating-ui/react": "0.26.21",
+        "@floating-ui/core": "1.6.9",
+        "@floating-ui/react": "0.27.3",
+        "@iarna/toml": "2.2.5",
+        "@typescript-eslint/typescript-estree": "8.26.0",
+        "chokidar": "4.0.3",
         "classnames": "2.5.1",
-        "debounce": "2.1.0",
-        "flowbite": "2.5.1",
-        "react-icons": "5.2.1",
-        "tailwind-merge": "2.4.0"
+        "comment-json": "4.2.5",
+        "debounce": "2.2.0",
+        "deepmerge-ts": "7.1.4",
+        "klona": "2.0.6",
+        "package-manager-detector": "0.2.9",
+        "recast": "0.23.11",
+        "tailwind-merge-v2": "npm:tailwind-merge@2.6.0",
+        "tailwind-merge-v3": "npm:tailwind-merge@3.0.1"
+      },
+      "bin": {
+        "flowbite-react": "dist/cli/bin.js"
       },
       "peerDependencies": {
-        "react": ">=18",
-        "react-dom": ">=18",
-        "tailwindcss": "^3"
+        "react": "^18 || ^19",
+        "react-dom": "^18 || ^19",
+        "tailwindcss": "^3 || ^4"
       }
     },
-    "node_modules/flowbite-react/node_modules/flowbite": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/flowbite/-/flowbite-2.5.1.tgz",
-      "integrity": "sha512-7jP1jy9c3QP7y+KU9lc8ueMkTyUdMDvRP+lteSWgY5TigSZjf9K1kqZxmqjhbx2gBnFQxMl1GAjVThCa8cEpKA==",
+    "node_modules/flowbite-react/node_modules/@typescript-eslint/types": {
+      "version": "8.26.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.26.0.tgz",
+      "integrity": "sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA==",
+      "license": "MIT",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/flowbite-react/node_modules/@typescript-eslint/typescript-estree": {
+      "version": "8.26.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.26.0.tgz",
+      "integrity": "sha512-tiJ1Hvy/V/oMVRTbEOIeemA2XoylimlDQ03CgPPNaHYZbpsc78Hmngnt+WXZfJX1pjQ711V7g0H7cSJThGYfPQ==",
       "license": "MIT",
       "dependencies": {
-        "@popperjs/core": "^2.9.3",
-        "flowbite-datepicker": "^1.3.0",
-        "mini-svg-data-uri": "^1.4.3"
+        "@typescript-eslint/types": "8.26.0",
+        "@typescript-eslint/visitor-keys": "8.26.0",
+        "debug": "^4.3.4",
+        "fast-glob": "^3.3.2",
+        "is-glob": "^4.0.3",
+        "minimatch": "^9.0.4",
+        "semver": "^7.6.0",
+        "ts-api-utils": "^2.0.1"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.8.4 <5.9.0"
+      }
+    },
+    "node_modules/flowbite-react/node_modules/@typescript-eslint/visitor-keys": {
+      "version": "8.26.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.26.0.tgz",
+      "integrity": "sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg==",
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/types": "8.26.0",
+        "eslint-visitor-keys": "^4.2.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/flowbite-react/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/flowbite-react/node_modules/chokidar": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+      "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+      "license": "MIT",
+      "dependencies": {
+        "readdirp": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 14.16.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/flowbite-react/node_modules/deepmerge-ts": {
+      "version": "7.1.4",
+      "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.4.tgz",
+      "integrity": "sha512-fxqo6nHGQ9zOVgI4KXqtWXJR/yCLtC7aXIVq+6jc8tHPFUxlFmuUcm2kC4vztQ+LJxQ3gER/XAWearGYQ8niGA==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/flowbite-react/node_modules/eslint-visitor-keys": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
+      "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/flowbite-react/node_modules/minimatch": {
+      "version": "9.0.5",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/flowbite-react/node_modules/readdirp": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+      "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 14.18.0"
+      },
+      "funding": {
+        "type": "individual",
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/flowbite-react/node_modules/ts-api-utils": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+      "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18.12"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.8.4"
       }
     },
     "node_modules/for-each": {
@@ -3660,6 +3858,15 @@
         "node": ">=8"
       }
     },
+    "node_modules/has-own-prop": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz",
+      "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/has-property-descriptors": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
@@ -4417,6 +4624,15 @@
         "json-buffer": "3.0.1"
       }
     },
+    "node_modules/klona": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz",
+      "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
     "node_modules/language-subtag-registry": {
       "version": "0.3.23",
       "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
@@ -4670,7 +4886,6 @@
       "version": "2.1.3",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
       "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
-      "dev": true,
       "license": "MIT"
     },
     "node_modules/mz": {
@@ -5035,6 +5250,12 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/package-manager-detector": {
+      "version": "0.2.9",
+      "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.9.tgz",
+      "integrity": "sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==",
+      "license": "MIT"
+    },
     "node_modules/parent-module": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -5416,15 +5637,6 @@
         "react": "^18.3.1"
       }
     },
-    "node_modules/react-icons": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.2.1.tgz",
-      "integrity": "sha512-zdbW5GstTzXaVKvGSyTaBalt7HSfuK5ovrzlpyiWHAFXndXTdd/1hdDHI4xBM1Mn7YriT6aqESucFl9kEXzrdw==",
-      "license": "MIT",
-      "peerDependencies": {
-        "react": "*"
-      }
-    },
     "node_modules/react-is": {
       "version": "16.13.1",
       "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
@@ -5478,6 +5690,22 @@
         "url": "https://github.com/sponsors/jonschlinkert"
       }
     },
+    "node_modules/recast": {
+      "version": "0.23.11",
+      "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz",
+      "integrity": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==",
+      "license": "MIT",
+      "dependencies": {
+        "ast-types": "^0.16.1",
+        "esprima": "~4.0.0",
+        "source-map": "~0.6.1",
+        "tiny-invariant": "^1.3.3",
+        "tslib": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 4"
+      }
+    },
     "node_modules/reflect.getprototypeof": {
       "version": "1.0.10",
       "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
@@ -5522,6 +5750,15 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/repeat-string": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+      "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
     "node_modules/require-from-string": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
@@ -5790,7 +6027,6 @@
       "version": "7.7.1",
       "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
       "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
-      "dev": true,
       "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
@@ -5984,9 +6220,7 @@
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
       "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "dev": true,
       "license": "BSD-3-Clause",
-      "peer": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -6458,10 +6692,22 @@
       "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==",
       "license": "MIT"
     },
-    "node_modules/tailwind-merge": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.4.0.tgz",
-      "integrity": "sha512-49AwoOQNKdqKPd9CViyH5wJoSKsCDjUlzL8DxuGp3P1FsGY36NJDAa18jLZcaHAUUuTj+JB8IAo8zWgBNvBF7A==",
+    "node_modules/tailwind-merge-v2": {
+      "name": "tailwind-merge",
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz",
+      "integrity": "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/dcastil"
+      }
+    },
+    "node_modules/tailwind-merge-v3": {
+      "name": "tailwind-merge",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.0.1.tgz",
+      "integrity": "sha512-AvzE8FmSoXC7nC+oU5GlQJbip2UO7tmOhOfQyOmPhrStOGXHU08j8mZEHZ4BmCqY5dWTCo4ClWkNyRNx1wpT0g==",
       "license": "MIT",
       "funding": {
         "type": "github",
@@ -6621,6 +6867,12 @@
         "node": ">=0.8"
       }
     },
+    "node_modules/tiny-invariant": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
+      "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
+      "license": "MIT"
+    },
     "node_modules/tinyglobby": {
       "version": "0.2.12",
       "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz",
@@ -6796,7 +7048,6 @@
       "version": "5.8.2",
       "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz",
       "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==",
-      "dev": true,
       "license": "Apache-2.0",
       "peer": true,
       "bin": {
diff --git a/package.json b/package.json
index 750aeb8..6519a9b 100644
--- a/package.json
+++ b/package.json
@@ -6,13 +6,14 @@
     "dev": "next dev",
     "build": "next build",
     "start": "next start",
-    "lint": "next lint"
+    "lint": "next lint",
+    "postinstall": "flowbite-react patch"
   },
   "dependencies": {
     "apexcharts": "^3.52.0",
     "deepmerge-ts": "^7.1.0",
     "flowbite": "^2.4.1",
-    "flowbite-react": "^0.10.1",
+    "flowbite-react": "^0.11.7",
     "hls-video-element": "^1.5.0",
     "markdown-to-jsx": "^7.4.7",
     "media-chrome": "^4.8.0",
@@ -43,4 +44,4 @@
     "tailwind-scrollbar": "^3.1.0",
     "tailwindcss": "^3.4.1"
   }
-}
+}
\ No newline at end of file
diff --git a/tailwind.config.js b/tailwind.config.js
index 6befeef..e25fe12 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -1,5 +1,9 @@
 const { addIconSelectors } = require("@iconify/tailwind");
-import flowbite from "flowbite-react/tailwind";
+const flowbiteReact = require("flowbite-react/plugin/tailwindcss");
+
+flowbiteReact.config = {
+  charts: true,
+}
 
 /** @type {import('tailwindcss').Config} */
 module.exports = {
@@ -7,14 +11,12 @@ module.exports = {
     "./pages/**/*.{js,ts,jsx,tsx,mdx}",
     "./components/**/*.{js,ts,jsx,tsx,mdx}",
     "./app/**/*.{js,ts,jsx,tsx,mdx}",
-    flowbite.content(),
+    ".flowbite-react\\class-list.json"
   ],
   plugins: [
     addIconSelectors(["mdi", "material-symbols", "twemoji", "fa6-brands"]),
     require("tailwind-scrollbar"),
-    flowbite.plugin()({
-      charts: true,
-    }),
+    flowbiteReact
   ],
   darkMode: "selector",
   theme: {
@@ -43,4 +45,4 @@ module.exports = {
       },
     },
   },
-};
+};
\ No newline at end of file

From 491f9b48b58ae734f6cbaa52017b011b4d8470cc Mon Sep 17 00:00:00 2001
From: Radiquum <kentai.waah@gmail.com>
Date: Fri, 4 Apr 2025 00:41:04 +0500
Subject: [PATCH 07/12] fix build and lints

---
 .eslintrc.json                                 |  6 +-----
 app/components/Profile/Profile.EditModal.tsx   |  1 +
 .../ReleaseInfo.LicensedPlatforms.tsx          |  5 +++--
 .../ReleasePlayer/ReleasePlayerCustom.tsx      |  6 +++++-
 .../ReleasePlayer/SourceSelector.tsx           |  4 ++--
 .../ReleasePlayer/VoiceoverSelector.tsx        |  6 ++++--
 app/pages/CreateCollection.tsx                 |  1 +
 package-lock.json                              | 18 +-----------------
 package.json                                   |  3 +--
 9 files changed, 19 insertions(+), 31 deletions(-)

diff --git a/.eslintrc.json b/.eslintrc.json
index ab5cdb0..957cd15 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -1,7 +1,3 @@
 {
-  "extends": ["next/core-web-vitals", "prettier"],
-  "rules": {
-    "prettier/prettier": "error"
-  },
-  "plugins": ["prettier"]
+  "extends": ["next/core-web-vitals"]
 }
diff --git a/app/components/Profile/Profile.EditModal.tsx b/app/components/Profile/Profile.EditModal.tsx
index d20b39c..7048df5 100644
--- a/app/components/Profile/Profile.EditModal.tsx
+++ b/app/components/Profile/Profile.EditModal.tsx
@@ -188,6 +188,7 @@ export const ProfileEditModal = (props: {
     if (avatarModalProps.croppedImage) {
       _uploadAvatar();
     }
+  // eslint-disable-next-line react-hooks/exhaustive-deps
   }, [avatarModalProps.croppedImage]);
 
   if (!prefData || !loginData || prefError || loginError) {
diff --git a/app/components/ReleaseInfo/ReleaseInfo.LicensedPlatforms.tsx b/app/components/ReleaseInfo/ReleaseInfo.LicensedPlatforms.tsx
index 25f4d24..bbb2a28 100644
--- a/app/components/ReleaseInfo/ReleaseInfo.LicensedPlatforms.tsx
+++ b/app/components/ReleaseInfo/ReleaseInfo.LicensedPlatforms.tsx
@@ -14,7 +14,7 @@ export const ReleaseInfoStreaming = (props: { release_id: number }) => {
       setData(await response.json());
     };
     _getData();
-  }, []);
+  }, [props.release_id]);
 
   return (
     <>
@@ -32,7 +32,8 @@ export const ReleaseInfoStreaming = (props: { release_id: number }) => {
                   key={`platform_${item.id}`}
                   className="flex items-center gap-2 px-4 py-2 transition-colors bg-gray-100 rounded-lg hover:bg-gray-300 dark:bg-gray-700 dark:hover:bg-gray-600 "
                 >
-                  <img src={item.icon} className="w-6 h-6 rounded-full" />
+                  {/* eslint-disable-next-line @next/next/no-img-element */}
+                  <img alt="" src={item.icon} className="w-6 h-6 rounded-full" />
                   <p className="text-sm line-clamp-2">{item.name}</p>
                 </a>
               );
diff --git a/app/components/ReleasePlayer/ReleasePlayerCustom.tsx b/app/components/ReleasePlayer/ReleasePlayerCustom.tsx
index d73a892..6aa170c 100644
--- a/app/components/ReleasePlayer/ReleasePlayerCustom.tsx
+++ b/app/components/ReleasePlayer/ReleasePlayerCustom.tsx
@@ -212,7 +212,8 @@ export const ReleasePlayerCustom = (props: {
       }
     };
     __getInfo();
-  }, []);
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [props.id, props.token]);
 
   useEffect(() => {
     const __getInfo = async () => {
@@ -244,6 +245,7 @@ export const ReleasePlayerCustom = (props: {
     if (voiceover.selected) {
       __getInfo();
     }
+  // eslint-disable-next-line react-hooks/exhaustive-deps
   }, [voiceover.selected]);
 
   useEffect(() => {
@@ -284,6 +286,7 @@ export const ReleasePlayerCustom = (props: {
     if (source.selected) {
       __getInfo();
     }
+  // eslint-disable-next-line react-hooks/exhaustive-deps
   }, [source.selected]);
 
   useEffect(() => {
@@ -346,6 +349,7 @@ export const ReleasePlayerCustom = (props: {
       setPlayerError(null);
       __getInfo();
     }
+  // eslint-disable-next-line react-hooks/exhaustive-deps
   }, [episode.selected]);
 
   return (
diff --git a/app/components/ReleasePlayer/SourceSelector.tsx b/app/components/ReleasePlayer/SourceSelector.tsx
index e02cbfb..bdf6deb 100644
--- a/app/components/ReleasePlayer/SourceSelector.tsx
+++ b/app/components/ReleasePlayer/SourceSelector.tsx
@@ -20,7 +20,7 @@ const DropdownTrigger = ({ name }: Source) => {
   );
 };
 
-const DropdownItem = ({ name, episodes_count }: Source) => {
+const DropdownItemInternal = ({ name, episodes_count }: Source) => {
   return (
     <div className="flex flex-col gap-2 cursor-pointer">
       <div className="flex items-center gap-2">
@@ -68,7 +68,7 @@ export const SourceSelector = (props: {
             });
           }}
         >
-          <DropdownItem {...source} />
+          <DropdownItemInternal {...source} />
         </DropdownItem>
       ))}
     </Dropdown>
diff --git a/app/components/ReleasePlayer/VoiceoverSelector.tsx b/app/components/ReleasePlayer/VoiceoverSelector.tsx
index 80cf8d1..81d5127 100644
--- a/app/components/ReleasePlayer/VoiceoverSelector.tsx
+++ b/app/components/ReleasePlayer/VoiceoverSelector.tsx
@@ -16,7 +16,8 @@ interface Voiceover {
 const DropdownTrigger = ({ icon, name, pinned }: Voiceover) => {
   return (
     <div className="flex items-center gap-2 cursor-pointer">
-      {icon && <img className="w-6 h-6 rounded-full" src={icon}></img>}
+      {/* eslint-disable-next-line @next/next/no-img-element */}
+      {icon && <img alt="" className="w-6 h-6 rounded-full" src={icon}></img>}
       <p>{name}</p>
       {pinned && (
         <span className="h-6 bg-gray-700 dark:bg-gray-300 iconify material-symbols--push-pin"></span>
@@ -36,7 +37,8 @@ const DropdownItemInternal = ({
   return (
     <div className="flex flex-col gap-2 cursor-pointer">
       <div className="flex items-center gap-2">
-        {icon && <img className="w-6 h-6 rounded-full" src={icon}></img>}
+        {/* eslint-disable-next-line @next/next/no-img-element */}
+        {icon && <img alt="" className="w-6 h-6 rounded-full" src={icon}></img>}
         <p>{name}</p>
         {pinned && (
           <span className="h-6 iconify material-symbols--push-pin"></span>
diff --git a/app/pages/CreateCollection.tsx b/app/pages/CreateCollection.tsx
index bdb690c..a7b2982 100644
--- a/app/pages/CreateCollection.tsx
+++ b/app/pages/CreateCollection.tsx
@@ -34,6 +34,7 @@ export const CreateCollectionPage = () => {
     if (userStore.state === "finished" && !userStore.token) {
       router.push("/login?redirect=/collections/create");
     }
+  // eslint-disable-next-line react-hooks/exhaustive-deps
   }, [userStore]);
 
   const [edit, setEdit] = useState(false);
diff --git a/package-lock.json b/package-lock.json
index 7238a77..773239b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7,6 +7,7 @@
     "": {
       "name": "new",
       "version": "0.1.0",
+      "hasInstallScript": true,
       "dependencies": {
         "apexcharts": "^3.52.0",
         "deepmerge-ts": "^7.1.0",
@@ -38,7 +39,6 @@
         "eslint": "^8",
         "eslint-config-next": "14.2.5",
         "postcss": "^8",
-        "prettier": "^3.5.3",
         "tailwind-scrollbar": "^3.1.0",
         "tailwindcss": "^3.4.1"
       }
@@ -5532,22 +5532,6 @@
         "node": ">= 0.8.0"
       }
     },
-    "node_modules/prettier": {
-      "version": "3.5.3",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz",
-      "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "prettier": "bin/prettier.cjs"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/prettier/prettier?sponsor=1"
-      }
-    },
     "node_modules/prop-types": {
       "version": "15.8.1",
       "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
diff --git a/package.json b/package.json
index 6519a9b..709f0c9 100644
--- a/package.json
+++ b/package.json
@@ -40,8 +40,7 @@
     "eslint": "^8",
     "eslint-config-next": "14.2.5",
     "postcss": "^8",
-    "prettier": "^3.5.3",
     "tailwind-scrollbar": "^3.1.0",
     "tailwindcss": "^3.4.1"
   }
-}
\ No newline at end of file
+}

From 7df11a467aff53110645e0cfc46f99a900cb08fc Mon Sep 17 00:00:00 2001
From: Radiquum <kentai.waah@gmail.com>
Date: Fri, 4 Apr 2025 00:44:00 +0500
Subject: [PATCH 08/12] fix build fr

---
 .../ReleaseInfo/ReleaseInfo.Related.tsx       | 26 ++-----------------
 1 file changed, 2 insertions(+), 24 deletions(-)

diff --git a/app/components/ReleaseInfo/ReleaseInfo.Related.tsx b/app/components/ReleaseInfo/ReleaseInfo.Related.tsx
index 80a5cac..2d4a326 100644
--- a/app/components/ReleaseInfo/ReleaseInfo.Related.tsx
+++ b/app/components/ReleaseInfo/ReleaseInfo.Related.tsx
@@ -1,31 +1,9 @@
 "use client";
 
-import { Card, Carousel, CustomFlowbiteTheme, FlowbiteCarouselControlTheme, FlowbiteCarouselIndicatorsTheme } from "flowbite-react";
+import { Card, Carousel } from "flowbite-react";
 import { ReleaseLink } from "#/components/ReleaseLink/ReleaseLinkUpdate";
 import Link from "next/link";
 
-const CarouselIndicatorsTheme: FlowbiteCarouselIndicatorsTheme = {
-  active: {
-    off: "bg-gray-400/50 hover:bg-gray-200",
-    on: "bg-gray-200",
-  },
-  base: "h-3 w-3 rounded-full max-w-[300px]",
-  wrapper: "absolute bottom-5 left-1/2 flex -translate-x-1/2 space-x-3",
-};
-
-const CarouselControlsTheme: FlowbiteCarouselControlTheme = {
-  base: "inline-flex h-8 w-8 items-center justify-center rounded-full group-focus:outline-none group-focus:ring-4 bg-gray-400/30 group-hover:bg-gray-400/60 group-focus:ring-gray-400/70 sm:h-10 sm:w-10",
-  icon: "h-5 w-5 text-gray-400 sm:h-6 sm:w-6",
-};
-
-const CarouselTheme: CustomFlowbiteTheme["carousel"] = {
-  root: {
-    base: "relative h-full w-full max-w-[300px]",
-  },
-  indicators: CarouselIndicatorsTheme,
-  control: CarouselControlsTheme,
-};
-
 export const ReleaseInfoRelated = (props: {
   release_id: number;
   related: any;
@@ -45,7 +23,7 @@ export const ReleaseInfoRelated = (props: {
         )}
       </div>
       <div className="flex justify-center mt-2">
-        <Carousel pauseOnHover={true} theme={CarouselTheme}>
+        <Carousel pauseOnHover={true}>
           {props.related_releases
             .filter((release: any) => {
               if (release.id == props.release_id) {

From 141cb9a1ce4d6257780863331028fdfe7accb017 Mon Sep 17 00:00:00 2001
From: Radiquum <kentai.waah@gmail.com>
Date: Fri, 4 Apr 2025 01:05:37 +0500
Subject: [PATCH 09/12] fix: next plugins use

---
 next.config.js    | 22 ++++------------------
 package-lock.json | 16 ++++++++++++++++
 package.json      |  1 +
 3 files changed, 21 insertions(+), 18 deletions(-)

diff --git a/next.config.js b/next.config.js
index 627945f..bdba023 100644
--- a/next.config.js
+++ b/next.config.js
@@ -75,22 +75,8 @@ const NextConfig = {
   },
 };
 
-const config = () => {
-  const plugins = [withPlausibleProxy, withFlowbiteReact];
-  return (
-    plugins.reduce((acc, next) => {
-      console.log(`INIT: ${next.name}`);
-      if (next.name === "withPlausibleProxy") {
-        return next(acc, {
-          customDomain: "https://analytics.wah.su",
-        });
-      }
+const config = withPlausibleProxy({
+  customDomain: "https://analytics.wah.su",
+})(withFlowbiteReact(NextConfig));
 
-      return next(acc);
-    }),
-    { ...NextConfig }
-  );
-};
-
-console.log(config());
-module.exports = config();
+module.exports = config;
diff --git a/package-lock.json b/package-lock.json
index 773239b..f5b0543 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -18,6 +18,7 @@
         "media-chrome": "^4.8.0",
         "next": "^14.2.26",
         "next-plausible": "^3.12.1",
+        "prettier": "^3.5.3",
         "react": "^18",
         "react-cropper": "^2.3.3",
         "react-dom": "^18",
@@ -5532,6 +5533,21 @@
         "node": ">= 0.8.0"
       }
     },
+    "node_modules/prettier": {
+      "version": "3.5.3",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz",
+      "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==",
+      "license": "MIT",
+      "bin": {
+        "prettier": "bin/prettier.cjs"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/prettier/prettier?sponsor=1"
+      }
+    },
     "node_modules/prop-types": {
       "version": "15.8.1",
       "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
diff --git a/package.json b/package.json
index 709f0c9..bc3c771 100644
--- a/package.json
+++ b/package.json
@@ -19,6 +19,7 @@
     "media-chrome": "^4.8.0",
     "next": "^14.2.26",
     "next-plausible": "^3.12.1",
+    "prettier": "^3.5.3",
     "react": "^18",
     "react-cropper": "^2.3.3",
     "react-dom": "^18",

From 29ae447636e8ec870a09a9354bf4ac7a905e4d02 Mon Sep 17 00:00:00 2001
From: Radiquum <kentai.waah@gmail.com>
Date: Fri, 4 Apr 2025 03:14:00 +0500
Subject: [PATCH 10/12] Revert to "fix: next plugins use"

This reverts commit 141cb9a1ce4d6257780863331028fdfe7accb017.
---
 package-lock.json | 304 +++++++++++++++++++++++-----------------------
 1 file changed, 152 insertions(+), 152 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index f5b0543..ebded87 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -415,15 +415,15 @@
       }
     },
     "node_modules/@napi-rs/wasm-runtime": {
-      "version": "0.2.7",
-      "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.7.tgz",
-      "integrity": "sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw==",
+      "version": "0.2.8",
+      "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.8.tgz",
+      "integrity": "sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg==",
       "dev": true,
       "license": "MIT",
       "optional": true,
       "dependencies": {
-        "@emnapi/core": "^1.3.1",
-        "@emnapi/runtime": "^1.3.1",
+        "@emnapi/core": "^1.4.0",
+        "@emnapi/runtime": "^1.4.0",
         "@tybys/wasm-util": "^0.9.0"
       }
     },
@@ -1003,9 +1003,9 @@
       "license": "ISC"
     },
     "node_modules/@unrs/resolver-binding-darwin-arm64": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.3.2.tgz",
-      "integrity": "sha512-ddnlXgRi0Fog5+7U5Q1qY62wl95Q1lB4tXQX1UIA9YHmRCHN2twaQW0/4tDVGCvTVEU3xEayU7VemEr7GcBYUw==",
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.3.3.tgz",
+      "integrity": "sha512-EpRILdWr3/xDa/7MoyfO7JuBIJqpBMphtu4+80BK1bRfFcniVT74h3Z7q1+WOc92FuIAYatB1vn9TJR67sORGw==",
       "cpu": [
         "arm64"
       ],
@@ -1017,9 +1017,9 @@
       ]
     },
     "node_modules/@unrs/resolver-binding-darwin-x64": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.3.2.tgz",
-      "integrity": "sha512-tnl9xoEeg503jis+LW5cuq4hyLGQyqaoBL8VdPSqcewo/FL1C8POHbzl+AL25TidWYJD+R6bGUTE381kA1sT9w==",
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.3.3.tgz",
+      "integrity": "sha512-ntj/g7lPyqwinMJWZ+DKHBse8HhVxswGTmNgFKJtdgGub3M3zp5BSZ3bvMP+kBT6dnYJLSVlDqdwOq1P8i0+/g==",
       "cpu": [
         "x64"
       ],
@@ -1031,9 +1031,9 @@
       ]
     },
     "node_modules/@unrs/resolver-binding-freebsd-x64": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.3.2.tgz",
-      "integrity": "sha512-zyPn9LFCCjhKPeCtECZaiMUgkYN/VpLb4a9Xv7QriJmTaQxsuDtXqOHifrzUXIhorJTyS+5MOKDuNL0X9I4EHA==",
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.3.3.tgz",
+      "integrity": "sha512-l6BT8f2CU821EW7U8hSUK8XPq4bmyTlt9Mn4ERrfjJNoCw0/JoHAh9amZZtV3cwC3bwwIat+GUnrcHTG9+qixw==",
       "cpu": [
         "x64"
       ],
@@ -1045,9 +1045,9 @@
       ]
     },
     "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.3.2.tgz",
-      "integrity": "sha512-UWx56Wh59Ro69fe+Wfvld4E1n9KG0e3zeouWLn8eSasyi/yVH/7ZW3CLTVFQ81oMKSpXwr5u6RpzttDXZKiO4g==",
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.3.3.tgz",
+      "integrity": "sha512-8ScEc5a4y7oE2BonRvzJ+2GSkBaYWyh0/Ko4Q25e/ix6ANpJNhwEPZvCR6GVRmsQAYMIfQvYLdM6YEN+qRjnAQ==",
       "cpu": [
         "arm"
       ],
@@ -1059,9 +1059,9 @@
       ]
     },
     "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.3.2.tgz",
-      "integrity": "sha512-VYGQXsOEJtfaoY2fOm8Z9ii5idFaHFYlrq3yMFZPaFKo8ufOXYm8hnfru7qetbM9MX116iWaPC0ZX5sK+1Dr+g==",
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.3.3.tgz",
+      "integrity": "sha512-8qQ6l1VTzLNd3xb2IEXISOKwMGXDCzY/UNy/7SovFW2Sp0K3YbL7Ao7R18v6SQkLqQlhhqSBIFRk+u6+qu5R5A==",
       "cpu": [
         "arm"
       ],
@@ -1073,9 +1073,9 @@
       ]
     },
     "node_modules/@unrs/resolver-binding-linux-arm64-gnu": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.3.2.tgz",
-      "integrity": "sha512-3zP420zxJfYPD1rGp2/OTIBxF8E3+/6VqCG+DEO6kkDgBiloa7Y8pw1o7N9BfgAC+VC8FPZsFXhV2lpx+lLRMQ==",
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.3.3.tgz",
+      "integrity": "sha512-v81R2wjqcWXJlQY23byqYHt9221h4anQ6wwN64oMD/WAE+FmxPHFZee5bhRkNVtzqO/q7wki33VFWlhiADwUeQ==",
       "cpu": [
         "arm64"
       ],
@@ -1087,9 +1087,9 @@
       ]
     },
     "node_modules/@unrs/resolver-binding-linux-arm64-musl": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.3.2.tgz",
-      "integrity": "sha512-ZWjSleUgr88H4Kei7yT4PlPqySTuWN1OYDDcdbmMCtLWFly3ed+rkrcCb3gvqXdDbYrGOtzv3g2qPEN+WWNv5Q==",
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.3.3.tgz",
+      "integrity": "sha512-cAOx/j0u5coMg4oct/BwMzvWJdVciVauUvsd+GQB/1FZYKQZmqPy0EjJzJGbVzFc6gbnfEcSqvQE6gvbGf2N8Q==",
       "cpu": [
         "arm64"
       ],
@@ -1101,9 +1101,9 @@
       ]
     },
     "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.3.2.tgz",
-      "integrity": "sha512-p+5OvYJ2UOlpjes3WfBlxyvQok2u26hLyPxLFHkYlfzhZW0juhvBf/tvewz1LDFe30M7zL9cF4OOO5dcvtk+cw==",
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.3.3.tgz",
+      "integrity": "sha512-mq2blqwErgDJD4gtFDlTX/HZ7lNP8YCHYFij2gkXPtMzrXxPW1hOtxL6xg4NWxvnj4bppppb0W3s/buvM55yfg==",
       "cpu": [
         "ppc64"
       ],
@@ -1115,9 +1115,9 @@
       ]
     },
     "node_modules/@unrs/resolver-binding-linux-s390x-gnu": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.3.2.tgz",
-      "integrity": "sha512-yweY7I6SqNn3kvj6vE4PQRo7j8Oz6+NiUhmgciBNAUOuI3Jq0bnW29hbHJdxZRSN1kYkQnSkbbA1tT8VnK816w==",
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.3.3.tgz",
+      "integrity": "sha512-u0VRzfFYysarYHnztj2k2xr+eu9rmgoTUUgCCIT37Nr+j0A05Xk2c3RY8Mh5+DhCl2aYibihnaAEJHeR0UOFIQ==",
       "cpu": [
         "s390x"
       ],
@@ -1129,9 +1129,9 @@
       ]
     },
     "node_modules/@unrs/resolver-binding-linux-x64-gnu": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.3.2.tgz",
-      "integrity": "sha512-fNIvtzJcGN9hzWTIayrTSk2+KHQrqKbbY+I88xMVMOFV9t4AXha4veJdKaIuuks+2JNr6GuuNdsL7+exywZ32w==",
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.3.3.tgz",
+      "integrity": "sha512-OrVo5ZsG29kBF0Ug95a2KidS16PqAMmQNozM6InbquOfW/udouk063e25JVLqIBhHLB2WyBnixOQ19tmeC/hIg==",
       "cpu": [
         "x64"
       ],
@@ -1143,9 +1143,9 @@
       ]
     },
     "node_modules/@unrs/resolver-binding-linux-x64-musl": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.3.2.tgz",
-      "integrity": "sha512-OaFEw8WAjiwBGxutQgkWhoAGB5BQqZJ8Gjt/mW+m6DWNjimcxU22uWCuEtfw1CIwLlKPOzsgH0429fWmZcTGkg==",
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.3.3.tgz",
+      "integrity": "sha512-PYnmrwZ4HMp9SkrOhqPghY/aoL+Rtd4CQbr93GlrRTjK6kDzfMfgz3UH3jt6elrQAfupa1qyr1uXzeVmoEAxUA==",
       "cpu": [
         "x64"
       ],
@@ -1157,9 +1157,9 @@
       ]
     },
     "node_modules/@unrs/resolver-binding-wasm32-wasi": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.3.2.tgz",
-      "integrity": "sha512-u+sumtO7M0AGQ9bNQrF4BHNpUyxo23FM/yXZfmVAicTQ+mXtG06O7pm5zQUw3Mr4jRs2I84uh4O0hd8bdouuvQ==",
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.3.3.tgz",
+      "integrity": "sha512-81AnQY6fShmktQw4hWDUIilsKSdvr/acdJ5azAreu2IWNlaJOKphJSsUVWE+yCk6kBMoQyG9ZHCb/krb5K0PEA==",
       "cpu": [
         "wasm32"
       ],
@@ -1174,9 +1174,9 @@
       }
     },
     "node_modules/@unrs/resolver-binding-win32-arm64-msvc": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.3.2.tgz",
-      "integrity": "sha512-ZAJKy95vmDIHsRFuPNqPQRON8r2mSMf3p9DoX+OMOhvu2c8OXGg8MvhGRf3PNg45ozRrPdXDnngURKgaFfpGoQ==",
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.3.3.tgz",
+      "integrity": "sha512-X/42BMNw7cW6xrB9syuP5RusRnWGoq+IqvJO8IDpp/BZg64J1uuIW6qA/1Cl13Y4LyLXbJVYbYNSKwR/FiHEng==",
       "cpu": [
         "arm64"
       ],
@@ -1188,9 +1188,9 @@
       ]
     },
     "node_modules/@unrs/resolver-binding-win32-ia32-msvc": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.3.2.tgz",
-      "integrity": "sha512-nQG4YFAS2BLoKVQFK/FrWJvFATI5DQUWQrcPcsWG9Ve5BLLHZuPOrJ2SpAJwLXQrRv6XHSFAYGI8wQpBg/CiFA==",
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.3.3.tgz",
+      "integrity": "sha512-EGNnNGQxMU5aTN7js3ETYvuw882zcO+dsVjs+DwO2j/fRVKth87C8e2GzxW1L3+iWAXMyJhvFBKRavk9Og1Z6A==",
       "cpu": [
         "ia32"
       ],
@@ -1202,9 +1202,9 @@
       ]
     },
     "node_modules/@unrs/resolver-binding-win32-x64-msvc": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.3.2.tgz",
-      "integrity": "sha512-XBWpUP0mHya6yGBwNefhyEa6V7HgYKCxEAY4qhTm/PcAQyBPNmjj97VZJOJkVdUsyuuii7xmq0pXWX/c2aToHQ==",
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.3.3.tgz",
+      "integrity": "sha512-GraLbYqOJcmW1qY3osB+2YIiD62nVf2/bVLHZmrb4t/YSUwE03l7TwcDJl08T/Tm3SVhepX8RQkpzWbag/Sb4w==",
       "cpu": [
         "x64"
       ],
@@ -1991,9 +1991,9 @@
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001707",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz",
-      "integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==",
+      "version": "1.0.30001709",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001709.tgz",
+      "integrity": "sha512-NgL3vUTnDrPCZ3zTahp4fsugQ4dc7EKTSzwQDPEel6DMoMnfH2jhry9n2Zm8onbSR+f/QtKHFOA+iAQu4kbtWA==",
       "funding": [
         {
           "type": "opencollective",
@@ -2037,39 +2037,18 @@
       }
     },
     "node_modules/chokidar": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
-      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+      "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
       "license": "MIT",
       "dependencies": {
-        "anymatch": "~3.1.2",
-        "braces": "~3.0.2",
-        "glob-parent": "~5.1.2",
-        "is-binary-path": "~2.1.0",
-        "is-glob": "~4.0.1",
-        "normalize-path": "~3.0.0",
-        "readdirp": "~3.6.0"
+        "readdirp": "^4.0.1"
       },
       "engines": {
-        "node": ">= 8.10.0"
+        "node": ">= 14.16.0"
       },
       "funding": {
         "url": "https://paulmillr.com/funding/"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.2"
-      }
-    },
-    "node_modules/chokidar/node_modules/glob-parent": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
-      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
-      "license": "ISC",
-      "dependencies": {
-        "is-glob": "^4.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
       }
     },
     "node_modules/chrome-trace-event": {
@@ -2460,9 +2439,9 @@
       "license": "MIT"
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.5.128",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.128.tgz",
-      "integrity": "sha512-bo1A4HH/NS522Ws0QNFIzyPcyUUNV/yyy70Ho1xqfGYzPUme2F/xr4tlEOuM6/A538U1vDA7a4XfCd1CKRegKQ==",
+      "version": "1.5.131",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.131.tgz",
+      "integrity": "sha512-fJFRYXVEJgDCiqFOgRGJm8XR97hZ13tw7FXI9k2yC5hgY+nyzC2tMO8baq1cQR7Ur58iCkASx2zrkZPZUnfzPg==",
       "dev": true,
       "license": "ISC",
       "peer": true
@@ -2961,9 +2940,9 @@
       }
     },
     "node_modules/eslint-plugin-react": {
-      "version": "7.37.4",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz",
-      "integrity": "sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==",
+      "version": "7.37.5",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz",
+      "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2977,7 +2956,7 @@
         "hasown": "^2.0.2",
         "jsx-ast-utils": "^2.4.1 || ^3.0.0",
         "minimatch": "^3.1.2",
-        "object.entries": "^1.1.8",
+        "object.entries": "^1.1.9",
         "object.fromentries": "^2.0.8",
         "object.values": "^1.2.1",
         "prop-types": "^15.8.1",
@@ -3441,21 +3420,6 @@
         "balanced-match": "^1.0.0"
       }
     },
-    "node_modules/flowbite-react/node_modules/chokidar": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
-      "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
-      "license": "MIT",
-      "dependencies": {
-        "readdirp": "^4.0.1"
-      },
-      "engines": {
-        "node": ">= 14.16.0"
-      },
-      "funding": {
-        "url": "https://paulmillr.com/funding/"
-      }
-    },
     "node_modules/flowbite-react/node_modules/deepmerge-ts": {
       "version": "7.1.4",
       "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.4.tgz",
@@ -3492,19 +3456,6 @@
         "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "node_modules/flowbite-react/node_modules/readdirp": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
-      "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 14.18.0"
-      },
-      "funding": {
-        "type": "individual",
-        "url": "https://paulmillr.com/funding/"
-      }
-    },
     "node_modules/flowbite-react/node_modules/ts-api-utils": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
@@ -5667,27 +5618,16 @@
       }
     },
     "node_modules/readdirp": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
-      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
-      "license": "MIT",
-      "dependencies": {
-        "picomatch": "^2.2.1"
-      },
-      "engines": {
-        "node": ">=8.10.0"
-      }
-    },
-    "node_modules/readdirp/node_modules/picomatch": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+      "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
       "license": "MIT",
       "engines": {
-        "node": ">=8.6"
+        "node": ">= 14.18.0"
       },
       "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
+        "type": "individual",
+        "url": "https://paulmillr.com/funding/"
       }
     },
     "node_modules/recast": {
@@ -6764,6 +6704,66 @@
         "node": ">=14.0.0"
       }
     },
+    "node_modules/tailwindcss/node_modules/chokidar": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+      "license": "MIT",
+      "dependencies": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "glob-parent": "~5.1.2",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.6.0"
+      },
+      "engines": {
+        "node": ">= 8.10.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/tailwindcss/node_modules/chokidar/node_modules/glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "license": "ISC",
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/tailwindcss/node_modules/picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/tailwindcss/node_modules/readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+      "license": "MIT",
+      "dependencies": {
+        "picomatch": "^2.2.1"
+      },
+      "engines": {
+        "node": ">=8.10.0"
+      }
+    },
     "node_modules/tapable": {
       "version": "2.2.1",
       "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
@@ -7098,30 +7098,30 @@
       }
     },
     "node_modules/unrs-resolver": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.3.2.tgz",
-      "integrity": "sha512-ZKQBC351Ubw0PY8xWhneIfb6dygTQeUHtCcNGd0QB618zabD/WbFMYdRyJ7xeVT+6G82K5v/oyZO0QSHFtbIuw==",
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.3.3.tgz",
+      "integrity": "sha512-PFLAGQzYlyjniXdbmQ3dnGMZJXX5yrl2YS4DLRfR3BhgUsE1zpRIrccp9XMOGRfIHpdFvCn/nr5N1KMVda4x3A==",
       "dev": true,
       "license": "MIT",
       "funding": {
         "url": "https://github.com/sponsors/JounQin"
       },
       "optionalDependencies": {
-        "@unrs/resolver-binding-darwin-arm64": "1.3.2",
-        "@unrs/resolver-binding-darwin-x64": "1.3.2",
-        "@unrs/resolver-binding-freebsd-x64": "1.3.2",
-        "@unrs/resolver-binding-linux-arm-gnueabihf": "1.3.2",
-        "@unrs/resolver-binding-linux-arm-musleabihf": "1.3.2",
-        "@unrs/resolver-binding-linux-arm64-gnu": "1.3.2",
-        "@unrs/resolver-binding-linux-arm64-musl": "1.3.2",
-        "@unrs/resolver-binding-linux-ppc64-gnu": "1.3.2",
-        "@unrs/resolver-binding-linux-s390x-gnu": "1.3.2",
-        "@unrs/resolver-binding-linux-x64-gnu": "1.3.2",
-        "@unrs/resolver-binding-linux-x64-musl": "1.3.2",
-        "@unrs/resolver-binding-wasm32-wasi": "1.3.2",
-        "@unrs/resolver-binding-win32-arm64-msvc": "1.3.2",
-        "@unrs/resolver-binding-win32-ia32-msvc": "1.3.2",
-        "@unrs/resolver-binding-win32-x64-msvc": "1.3.2"
+        "@unrs/resolver-binding-darwin-arm64": "1.3.3",
+        "@unrs/resolver-binding-darwin-x64": "1.3.3",
+        "@unrs/resolver-binding-freebsd-x64": "1.3.3",
+        "@unrs/resolver-binding-linux-arm-gnueabihf": "1.3.3",
+        "@unrs/resolver-binding-linux-arm-musleabihf": "1.3.3",
+        "@unrs/resolver-binding-linux-arm64-gnu": "1.3.3",
+        "@unrs/resolver-binding-linux-arm64-musl": "1.3.3",
+        "@unrs/resolver-binding-linux-ppc64-gnu": "1.3.3",
+        "@unrs/resolver-binding-linux-s390x-gnu": "1.3.3",
+        "@unrs/resolver-binding-linux-x64-gnu": "1.3.3",
+        "@unrs/resolver-binding-linux-x64-musl": "1.3.3",
+        "@unrs/resolver-binding-wasm32-wasi": "1.3.3",
+        "@unrs/resolver-binding-win32-arm64-msvc": "1.3.3",
+        "@unrs/resolver-binding-win32-ia32-msvc": "1.3.3",
+        "@unrs/resolver-binding-win32-x64-msvc": "1.3.3"
       }
     },
     "node_modules/update-browserslist-db": {
@@ -7507,9 +7507,9 @@
       "license": "ISC"
     },
     "node_modules/yaml": {
-      "version": "2.7.0",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz",
-      "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==",
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz",
+      "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==",
       "license": "ISC",
       "bin": {
         "yaml": "bin.mjs"

From 442a04604330c9ab4e6a2f1fd99c2a7a5b11b579 Mon Sep 17 00:00:00 2001
From: Radiquum <kentai.waah@gmail.com>
Date: Fri, 4 Apr 2025 03:17:48 +0500
Subject: [PATCH 11/12] remove unused deps

---
 app/pages/About.tsx |  1 -
 package-lock.json   | 14 --------------
 package.json        |  1 -
 tailwind.config.js  |  1 -
 4 files changed, 17 deletions(-)

diff --git a/app/pages/About.tsx b/app/pages/About.tsx
index 851641e..7f6ce53 100644
--- a/app/pages/About.tsx
+++ b/app/pages/About.tsx
@@ -15,7 +15,6 @@ import {
   AccordionPanel,
   AccordionTitle,
 } from "flowbite-react";
-import { version } from "node:os";
 import Link from "next/link";
 
 export const AboutPage = () => {
diff --git a/package-lock.json b/package-lock.json
index ebded87..95d906f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -40,7 +40,6 @@
         "eslint": "^8",
         "eslint-config-next": "14.2.5",
         "postcss": "^8",
-        "tailwind-scrollbar": "^3.1.0",
         "tailwindcss": "^3.4.1"
       }
     },
@@ -6654,19 +6653,6 @@
         "url": "https://github.com/sponsors/dcastil"
       }
     },
-    "node_modules/tailwind-scrollbar": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/tailwind-scrollbar/-/tailwind-scrollbar-3.1.0.tgz",
-      "integrity": "sha512-pmrtDIZeHyu2idTejfV59SbaJyvp1VRjYxAjZBH0jnyrPRo6HL1kD5Glz8VPagasqr6oAx6M05+Tuw429Z8jxg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=12.13.0"
-      },
-      "peerDependencies": {
-        "tailwindcss": "3.x"
-      }
-    },
     "node_modules/tailwindcss": {
       "version": "3.4.17",
       "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz",
diff --git a/package.json b/package.json
index bc3c771..3b6056f 100644
--- a/package.json
+++ b/package.json
@@ -41,7 +41,6 @@
     "eslint": "^8",
     "eslint-config-next": "14.2.5",
     "postcss": "^8",
-    "tailwind-scrollbar": "^3.1.0",
     "tailwindcss": "^3.4.1"
   }
 }
diff --git a/tailwind.config.js b/tailwind.config.js
index e25fe12..1864db8 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -15,7 +15,6 @@ module.exports = {
   ],
   plugins: [
     addIconSelectors(["mdi", "material-symbols", "twemoji", "fa6-brands"]),
-    require("tailwind-scrollbar"),
     flowbiteReact
   ],
   darkMode: "selector",

From 6cc9cdaa9e19083aa14f1896a65dd91d8aa73f8b Mon Sep 17 00:00:00 2001
From: Radiquum <kentai.waah@gmail.com>
Date: Fri, 4 Apr 2025 03:44:12 +0500
Subject: [PATCH 12/12] fix: color issues

---
 .../Profile/Profile.WatchDynamic.tsx          |  1 +
 .../SettingsModal/SettingsModal.tsx           | 40 +------------------
 2 files changed, 3 insertions(+), 38 deletions(-)

diff --git a/app/components/Profile/Profile.WatchDynamic.tsx b/app/components/Profile/Profile.WatchDynamic.tsx
index 1abd8e4..4dcdf40 100644
--- a/app/components/Profile/Profile.WatchDynamic.tsx
+++ b/app/components/Profile/Profile.WatchDynamic.tsx
@@ -28,6 +28,7 @@ export const ProfileWatchDynamic = (props: { watchDynamic: Array<any> }) => {
     },
     tooltip: {
       enabled: true,
+      theme:"dark",
       x: {
         show: false,
       },
diff --git a/app/components/SettingsModal/SettingsModal.tsx b/app/components/SettingsModal/SettingsModal.tsx
index 8254957..6bf5db8 100644
--- a/app/components/SettingsModal/SettingsModal.tsx
+++ b/app/components/SettingsModal/SettingsModal.tsx
@@ -69,13 +69,13 @@ export const SettingsModal = (props: { isOpen: boolean; setIsOpen: any }) => {
             <p className=" dark:text-white">Тема</p>
             <ButtonGroup>
               <Button
-                color={computedMode == "light" ? "blue" : "gray"}
+                color={computedMode == "light" ? "blue" : "light"}
                 onClick={() => setMode("light")}
               >
                 Светлая
               </Button>
               <Button
-                color={computedMode == "dark" ? "blue" : "gray"}
+                color={computedMode == "dark" ? "blue" : "light"}
                 onClick={() => setMode("dark")}
               >
                 Темная
@@ -89,15 +89,6 @@ export const SettingsModal = (props: { isOpen: boolean; setIsOpen: any }) => {
             </p>
             <ToggleSwitch
               color="blue"
-              theme={{
-                toggle: {
-                  checked: {
-                    color: {
-                      blue: "border-blue-700 bg-blue-700",
-                    },
-                  },
-                },
-              }}
               onChange={() =>
                 preferenceStore.setParams({
                   skipToCategory: {
@@ -250,15 +241,6 @@ export const SettingsModal = (props: { isOpen: boolean; setIsOpen: any }) => {
             <p className=" dark:text-white">Показывать список изменений</p>
             <ToggleSwitch
               color="blue"
-              theme={{
-                toggle: {
-                  checked: {
-                    color: {
-                      blue: "border-blue-700 bg-blue-700",
-                    },
-                  },
-                },
-              }}
               onChange={() =>
                 preferenceStore.setFlags({
                   showChangelog: !preferenceStore.flags.showChangelog,
@@ -276,15 +258,6 @@ export const SettingsModal = (props: { isOpen: boolean; setIsOpen: any }) => {
             </div>
             <ToggleSwitch
               color="blue"
-              theme={{
-                toggle: {
-                  checked: {
-                    color: {
-                      blue: "border-blue-700 bg-blue-700",
-                    },
-                  },
-                },
-              }}
               onChange={() =>
                 preferenceStore.setFlags({
                   enableAnalytics: !preferenceStore.flags.enableAnalytics,
@@ -307,15 +280,6 @@ export const SettingsModal = (props: { isOpen: boolean; setIsOpen: any }) => {
             </div>
             <ToggleSwitch
               color="blue"
-              theme={{
-                toggle: {
-                  checked: {
-                    color: {
-                      blue: "border-blue-700 bg-blue-700",
-                    },
-                  },
-                },
-              }}
               onChange={() =>
                 preferenceStore.setParams({
                   experimental: {