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: {