The weeb for the next gen discord boat - Wamellow wamellow.com
bot discord
3
fork

Configure Feed

Select the types of activity you want to include in your feed.

add native billing

Luna 780f0c69 93fd8c02

+942 -535
+21
app/(home)/premium/checkout/api.ts
··· 1 + import type { ApiError } from "next/dist/server/api-utils"; 2 + 3 + interface CheckoutResponse { 4 + url: string; 5 + } 6 + 7 + export async function createCheckout(session: string, donationQuantity: number) { 8 + const response = await fetch(`${process.env.NEXT_PUBLIC_API}/users/@me/billing/checkout`, { 9 + method: "PUT", 10 + headers: { 11 + "Content-Type": "application/json", 12 + Cookie: `session=${session}` 13 + }, 14 + body: JSON.stringify({ donationQuantity }) 15 + }); 16 + 17 + const res = await response.json() as CheckoutResponse | ApiError; 18 + 19 + if ("message" in res || !res.url) throw new Error("message" in res && res.message ? res.message : "unknown error"); 20 + return res.url; 21 + }
+27
app/(home)/premium/checkout/route.ts
··· 1 + import { cookies } from "next/headers"; 2 + import { redirect } from "next/navigation"; 3 + 4 + import { createCheckout } from "./api"; 5 + 6 + export async function GET(request: Request) { 7 + if (request.url.includes("rsc")) return new Response(null, { status: 204 }); 8 + 9 + const { searchParams } = new URL(request.url); 10 + const jar = await cookies(); 11 + 12 + const session = jar.get("session"); 13 + if (!session?.value) { 14 + redirect("/login?callback=" + encodeURIComponent("/" + request.url.split("/").slice(3).join("/"))); 15 + } 16 + 17 + const donationQuantity = parseInt(searchParams.get("donation") || "0"); 18 + const url = await createCheckout(session.value, donationQuantity) 19 + .catch((e) => e); 20 + 21 + if (url instanceof Error) { 22 + console.log(url); 23 + return new Response(url.message, { status: 400 }); 24 + } 25 + 26 + redirect(url); 27 + }
+114
app/(home)/premium/subscribe.component.tsx
··· 1 + "use client"; 2 + import Link from "next/link"; 3 + import { type HTMLProps, useState } from "react"; 4 + import { HiArrowDown, HiArrowUp, HiLightningBolt, HiOutlineInformationCircle } from "react-icons/hi"; 5 + 6 + import { userStore } from "@/common/user"; 7 + import { Button } from "@/components/ui/button"; 8 + import { InputBase, InputBaseAdornment, InputBaseAdornmentButton, InputBaseControl, InputBaseInput } from "@/components/ui/input-base"; 9 + import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; 10 + 11 + export function Subscribe() { 12 + const premium = userStore((u) => u?.premium || false); 13 + const [donation, setDonation] = useState(0); 14 + 15 + if (premium) { 16 + return ( 17 + <Button 18 + asChild 19 + variant="secondary" 20 + > 21 + <Link 22 + className="w-full" 23 + prefetch={false} 24 + href="/profile/billing" 25 + > 26 + <HiLightningBolt /> 27 + Manage Subscription 28 + </Link> 29 + </Button> 30 + ); 31 + } 32 + 33 + return ( 34 + <div className="w-full flex gap-4"> 35 + <DonationSelect 36 + className="w-56" 37 + donation={donation} 38 + setDonation={setDonation} 39 + /> 40 + 41 + <Button 42 + asChild 43 + variant="secondary" 44 + > 45 + <Link 46 + className="w-full" 47 + prefetch={false} 48 + href={`/premium/checkout?donation=${donation}`} 49 + > 50 + <HiLightningBolt /> 51 + Subscribe 52 + </Link> 53 + </Button> 54 + </div> 55 + ); 56 + } 57 + 58 + interface DonationProps extends HTMLProps<HTMLDivElement> { 59 + donation: number; 60 + setDonation: (value: number) => void; 61 + } 62 + 63 + export function DonationSelect({ donation, setDonation, ...props }: DonationProps) { 64 + return ( 65 + <InputBase {...props}> 66 + <InputBaseAdornment className="flex"> 67 + <div className="relative right-1 flex gap-1"> 68 + <Button 69 + className="h-7" 70 + size="icon" 71 + onClick={() => setDonation(Math.min(donation + 1, 100))} 72 + disabled={donation >= 100} 73 + > 74 + <HiArrowUp className="!size-3" /> 75 + </Button> 76 + <Button 77 + className="h-7" 78 + size="icon" 79 + onClick={() => setDonation(Math.max(donation - 1, 0))} 80 + disabled={donation <= 0} 81 + > 82 + <HiArrowDown className="!size-3" /> 83 + </Button> 84 + </div> 85 + $ 86 + </InputBaseAdornment> 87 + <InputBaseControl> 88 + <InputBaseInput 89 + placeholder="extra donation" 90 + defaultValue={0} 91 + onChange={(e) => { 92 + const num = Number(e.target.value); 93 + if (isNaN(num)) return; 94 + 95 + setDonation(Math.max(Math.min(num, 100), 0)); 96 + }} 97 + value={donation} 98 + /> 99 + </InputBaseControl> 100 + <Tooltip delayDuration={0}> 101 + <InputBaseAdornment> 102 + <InputBaseAdornmentButton asChild> 103 + <TooltipTrigger> 104 + <HiOutlineInformationCircle /> 105 + </TooltipTrigger> 106 + </InputBaseAdornmentButton> 107 + </InputBaseAdornment> 108 + <TooltipContent> 109 + <p>Extra donation</p> 110 + </TooltipContent> 111 + </Tooltip> 112 + </InputBase> 113 + ); 114 + }
+29 -78
app/(home)/pro/page.tsx app/(home)/premium/page.tsx
··· 2 2 import { Montserrat } from "next/font/google"; 3 3 import Link from "next/link"; 4 4 import { BsQuestionLg } from "react-icons/bs"; 5 - import { HiLightningBolt, HiOutlineCheck, HiUserAdd, HiX } from "react-icons/hi"; 5 + import { HiLightningBolt, HiOutlineCheck, HiX } from "react-icons/hi"; 6 6 import { IoMdInfinite } from "react-icons/io"; 7 7 8 8 import Comment from "@/components/comment"; 9 9 import ImageGrid from "@/components/image-grid"; 10 10 import { Badge } from "@/components/ui/badge"; 11 - import { Button } from "@/components/ui/button"; 12 11 import { defaultFetchOptions } from "@/lib/api"; 13 12 import type { ApiV1TopguildsGetResponse } from "@/typings"; 14 13 import { cn } from "@/utils/cn"; 15 14 import { getBaseUrl, getCanonicalUrl } from "@/utils/urls"; 16 15 16 + import { Subscribe } from "./subscribe.component"; 17 + 17 18 const montserrat = Montserrat({ subsets: ["latin"] }); 18 19 const maybe = null; 19 20 20 21 const items = [ 21 - { title: "Price", free: "$0 /month", pro: "$3.99 /month" }, 22 - { title: "Custom commands", free: 30, pro: Infinity }, 23 - { title: "Social notifications", free: 30, pro: Infinity }, 24 - { title: "Dailyposts", free: 30, pro: Infinity }, 25 - // { title: "Stickymessages", free: 10, pro: 50 }, 26 - // { title: "Custom footers", free: false, pro: true }, 27 - { title: "Welcome roles", free: 5, pro: 10 }, 28 - { title: "Welcome pings", free: 5, pro: 15 }, 29 - // { title: "Level roles", free: 15, pro: 25 }, 30 - { title: "Spotify control", free: maybe, pro: true, url: "/profile/spotify" }, 31 - { title: "Custom /rank sub-text", free: false, pro: true }, 32 - // { title: "Display user as webhook", free: false, pro: true }, 33 - { title: "Passport bypass", free: false, pro: true }, 34 - // { title: "Custom page color", free: false, pro: true }, 35 - // { title: "Statistics & Analytics", free: false, pro: true }, 36 - { title: "Crosspost social notifications", free: false, pro: true } 22 + { title: "Price", free: "$0", premium: "$4 /month" }, 23 + { title: "TTS Translations", free: 10_000, premium: 100_000, unit: "chars" }, 24 + { title: "Custom commands", free: 30, premium: Infinity }, 25 + { title: "Social notifications", free: 30, premium: Infinity }, 26 + { title: "Dailyposts", free: 4, premium: 20 }, 27 + { title: "Welcome roles", free: 5, premium: 10 }, 28 + { title: "Welcome pings", free: 5, premium: 15 }, 29 + { title: "Passport bypass", free: false, premium: true }, 30 + { title: "Crosspost social notifications", free: false, premium: true } 37 31 ]; 38 32 39 33 export const revalidate = 3600; 40 34 41 35 export const generateMetadata = (): Metadata => { 42 36 43 - const title = "Professional experience"; 44 - const description = "Get epic Pro+ ULTRA HD features for wamellow to upgrade your servers to a whole new experience and unlock tons of premium features."; 45 - const url = getCanonicalUrl("pro"); 37 + const title = "Premium"; 38 + const description = "Get epic premium+ ULTRA HD features for wamellow to upgrade your servers to a whole new experience and unlock tons of premium features."; 39 + const url = getCanonicalUrl("premium"); 46 40 47 41 return { 48 42 title, ··· 76 70 <div className="md:text-5xl text-4xl font-semibold md:mb-6 mb-4 dark:text-neutral-100 text-neutral-900 flex gap-2 items-center w-full"> 77 71 <h1 className={cn("flex gap-4", montserrat.className)}> 78 72 <span className="hidden md:block">Wamellow</span> 79 - <span className="bg-gradient-to-r from-indigo-400 to-pink-400 bg-clip-text text-transparent break-keep block md:hidden">Pro</span> 80 - <span className="bg-gradient-to-r from-indigo-400 to-pink-400 bg-clip-text text-transparent break-keep hidden md:block">Professional</span> 73 + <span className="bg-gradient-to-r from-indigo-400 to-pink-400 bg-clip-text text-transparent break-keep">Premium</span> 81 74 </h1> 82 75 <HiLightningBolt className="text-pink-400 rotate-6" /> 83 - <Badge 84 - className="ml-auto mt-1.5" 85 - size="lg" 86 - variant="flat" 87 - radius="rounded" 88 - > 89 - Not available 90 - </Badge> 91 76 </div> 92 77 93 78 {topGuilds && ··· 106 91 <div className="flex items-center py-4 text-2xl font-semibold"> 107 92 <span className="dark:text-neutral-100 text-neutral-900 w-2/4 block md:hidden">Features</span> 108 93 <span className="dark:text-neutral-100 text-neutral-900 w-2/4 hidden md:block">Pricing and Features</span> 109 - 110 94 <span className="bg-gradient-to-r from-red-400 to-pink-400 bg-clip-text text-transparent w-1/4 ">Free</span> 111 - 112 - <span className="bg-gradient-to-r from-indigo-400 to-pink-400 bg-clip-text text-transparent w-1/4 block md:hidden">Pro</span> 113 - <span className="bg-gradient-to-r from-indigo-400 to-pink-400 bg-clip-text text-transparent w-1/4 hidden md:block">Pro+ ULTRA HD</span> 95 + <span className="bg-gradient-to-r from-indigo-400 to-pink-400 bg-clip-text text-transparent w-1/4">Premium</span> 114 96 </div> 115 97 116 98 {items.map((item) => ( 117 99 <div key={item.title} className="flex items-center py-4"> 118 100 <span className="md:text-base text-sm font-medium w-2/4 md:pr-0 pr-4">{item.title}</span> 119 101 <span className="dark:text-neutral-200 text-neutral-700 font-medium w-1/4"> 120 - {displayState(item.free)} 102 + {displayState(item.free, item.unit)} 121 103 </span> 122 104 <span className="dark:text-neutral-200 text-neutral-700 font-medium w-1/4 flex"> 123 - {displayState(item.pro)} 105 + {displayState(item.premium, item.unit)} 124 106 {item.url && <Link href={item.url} target="_blank" className="ml-auto mr-3 hover:underline italic text-sm text-neutral-500 hidden md:block relative top-0.5">Take me there {"->"}</Link>} 125 107 </span> 126 108 </div> 127 109 ))} 128 110 129 - <div className="flex items-center pt-4"> 130 - <div className="w-1/2" /> 131 - <div className="hidden md:flex w-1/2 gap-4"> 111 + <div className="hidden md:flex items-center pt-4"> 112 + <div className="w-1/2 text-sm text-neutral-400"> 113 + support the project {"<3"} 114 + </div> 115 + <div className="flex w-1/2 gap-4"> 132 116 <Subscribe /> 133 117 </div> 134 118 </div> ··· 156 140 <div className="dark:bg-wamellow bg-wamellow-100 backdrop-blur-xl backdrop-brightness-50 rounded-lg shadow-md w-full flex flex-col gap-2 items-center justify-center p-3"> 157 141 158 142 <div className="flex gap-2 items-center"> 159 - <span className="dark:text-neutral-200 text-neutral-800 font-medium text-sm">Upgrade your guilds further!</span> 143 + <span className="dark:text-neutral-200 text-neutral-800 font-medium text-sm">Upgrade your experience further!</span> 160 144 <Badge 161 145 variant="flat" 162 146 radius="rounded" 163 147 > 164 - Not available 148 + $4/month 165 149 </Badge> 166 150 </div> 167 151 168 - <button className="flex dark:text-violet-400 text-violet-600 bg-violet-600/30 hover:bg-violet-600/10 py-2 px-4 rounded-md duration-200 justify-center gap-2 w-full opacity-30 cursor-not-allowed" disabled> 169 - <HiLightningBolt className="relative top-1" /> 170 - <span className="ml-2">Subscribe</span> 171 - </button> 172 - 152 + <Subscribe /> 173 153 </div> 174 154 </div> 175 155 ··· 177 157 ); 178 158 } 179 159 180 - function displayState(is: string | number | boolean | null) { 160 + function displayState(is: string | number | boolean | null, unit?: string) { 181 161 if (typeof is === "boolean" || is === null) { 182 162 if (is === true) return <HiOutlineCheck className="dark:text-violet-400 text-violet-600 w-6 h-6" />; 183 163 if (is === false) return <HiX className="dark:text-red-400 text-red-600 w-6 h-6" />; ··· 185 165 } 186 166 187 167 if (is === Infinity) return <IoMdInfinite className="w-7 h-7" title="Infinite" />; 168 + if (typeof is === "number") return <>{is.toLocaleString()} {unit}</>; 188 169 return is; 189 - } 190 - 191 - function Subscribe() { 192 - return (<> 193 - <Button asChild> 194 - <Link 195 - className="w-1/2" 196 - prefetch={false} 197 - href="/invite" 198 - target="_blank" 199 - > 200 - <HiUserAdd /> 201 - Invite Wamellow 202 - </Link> 203 - </Button> 204 - <Button 205 - asChild 206 - variant="secondary" 207 - > 208 - <Link 209 - className="w-1/2" 210 - prefetch={false} 211 - href="https://ko-fi.com/mwlica" 212 - target="_blank" 213 - > 214 - <HiLightningBolt /> 215 - Subscribe 216 - </Link> 217 - </Button> 218 - </>); 219 170 }
+1 -1
app/globals.css
··· 40 40 --destructive-foreground: 210 20% 98%; 41 41 42 42 --border: 260 3% 16%; 43 - --input: 258 89% 66%; 43 + --input: 260 3% 16%; 44 44 --ring: 258 89% 66%; 45 45 46 46 --chart-1: 220 70% 50%;
+2 -1
app/login/[social]/route.ts
··· 1 1 import { cookies } from "next/headers"; 2 2 import { redirect } from "next/navigation"; 3 3 4 - import { defaultCookieOptions } from "../route"; 4 + import { defaultCookieOptions } from "@/lib/cookies"; 5 + 5 6 import { connect, disconnect, getAuthorizeUrl } from "./api"; 6 7 7 8 const SOCIALS = ["spotify", "bluesky"];
+2 -13
app/login/route.ts
··· 2 2 import { cookies } from "next/headers"; 3 3 import { redirect } from "next/navigation"; 4 4 5 - import { getBaseUrl, getCanonicalUrl } from "@/utils/urls"; 5 + import { defaultCookieOptions } from "@/lib/cookies"; 6 + import { getCanonicalUrl } from "@/utils/urls"; 6 7 7 8 import { createSession } from "./api"; 8 - 9 - const domain = getBaseUrl().split("://")[1]; 10 - 11 - export const defaultCookieOptions = { 12 - secure: getBaseUrl().startsWith("https://"), 13 - httpOnly: false, 14 - sameSite: "lax", 15 - domain: "." + (domain.startsWith("dev.") ? domain.replace(/^dev\./, "") : domain), 16 - get expires() { 17 - return new Date(Date.now() + 1000 * 60 * 60 * 24 * 28); 18 - } 19 - } as const; 20 9 21 10 const permissions = [ 22 11 PermissionFlagsBits.AddReactions, // greetings
-278
app/profile/analytics/page.tsx
··· 1 - "use client"; 2 - 3 - import Image from "next/image"; 4 - import { useQuery } from "react-query"; 5 - import { Area, AreaChart, Bar, BarChart, CartesianGrid, Cell, ResponsiveContainer, Tooltip, XAxis, YAxis } from "recharts"; 6 - 7 - import Box from "@/components/box"; 8 - import { StatsBar } from "@/components/counter"; 9 - import { HomeButton, ScreenMessage, SupportButton } from "@/components/screen-message"; 10 - import { cacheOptions, getData } from "@/lib/api"; 11 - import SadWumpusPic from "@/public/sad-wumpus.gif"; 12 - import type { NekosticResponse } from "@/typings"; 13 - import { convertMonthToName } from "@/utils/time"; 14 - 15 - interface CalcUses { 16 - snapshot: string; 17 - uses: number; 18 - users: number; 19 - } 20 - 21 - interface CalcNames { 22 - name: string; 23 - count: number; 24 - } 25 - 26 - export default function Home() { 27 - const url = "" as const; 28 - 29 - const { isLoading, data, error } = useQuery( 30 - ["nekostic", "statistics"], 31 - () => getData<NekosticResponse[]>(url, process.env.NEXT_PUBLIC_NEKOSTIC as string), 32 - cacheOptions 33 - ); 34 - 35 - if (error || (data && "message" in data)) { 36 - return ( 37 - <ScreenMessage 38 - title="Something went wrong on this page.." 39 - description={ 40 - (data && "message" in data ? data.message : `${error}`) 41 - || "An unknown error occurred."} 42 - buttons={<> 43 - <HomeButton /> 44 - <SupportButton /> 45 - </>} 46 - > 47 - <Image src={SadWumpusPic} alt="" height={141} width={124} /> 48 - </ScreenMessage> 49 - ); 50 - } 51 - 52 - if (isLoading || !data) return <></>; 53 - 54 - data.sort((a, b) => 55 - new Date(a.snapshot).getTime() - new Date(b.snapshot).getTime() 56 - ); 57 - 58 - const now = new Date(); 59 - const yesterday = new Date(); 60 - yesterday.setDate(now.getDate() - 1); 61 - 62 - return ( 63 - <div className="flex flex-col gap-2"> 64 - 65 - <StatsBar 66 - items={[ 67 - { 68 - name: "All time Unique Users", 69 - number: data.map((enty) => enty.users).reduce((prev, curr) => prev + curr), 70 - gained: data.filter((entry) => entry.snapshot === `${yesterday.getFullYear()}-${(yesterday.getMonth() + 1).toString().padStart(2, "0")}-${yesterday.getDate().toString().padStart(2, "0")}`).map((enty) => enty.users).reduce((prev, curr) => prev + curr, 0), 71 - append: "yesterday" 72 - }, 73 - { 74 - name: "All time Command Uses", 75 - number: data.map((enty) => enty.uses).reduce((prev, curr) => prev + curr), 76 - gained: data.filter((entry) => entry.snapshot === `${yesterday.getFullYear()}-${(yesterday.getMonth() + 1).toString().padStart(2, "0")}-${yesterday.getDate().toString().padStart(2, "0")}`).map((enty) => enty.uses).reduce((prev, curr) => prev + curr, 0), 77 - append: "yesterday" 78 - } 79 - ]} 80 - /> 81 - 82 - <span className="h-2" /> 83 - 84 - <ChartArea name="Command Usage" data={data} dataKey="uses" /> 85 - <ChartArea name="Command Users" data={data} dataKey="users" /> 86 - 87 - <ChartBar name="Commands Used" data={data} dataKey="count" /> 88 - 89 - </div> 90 - ); 91 - } 92 - 93 - function ChartArea(options: { name: string; data: NekosticResponse[]; dataKey: keyof NekosticResponse; }) { 94 - return ( 95 - <Box none className="dark:bg-wamellow bg-wamellow-100 w-full rounded-md"> 96 - 97 - <div className="flex mx-10 mt-5 "> 98 - <span className="text-sm">{options.name}</span> 99 - </div> 100 - 101 - <ResponsiveContainer 102 - width="100%" 103 - height={300} 104 - > 105 - <AreaChart 106 - data={calcUses(options.data)} 107 - margin={{ 108 - top: 25, 109 - right: 40, 110 - bottom: 5 111 - }} 112 - > 113 - <XAxis 114 - axisLine={false} 115 - dataKey="snapshot" 116 - tick={<CustomXAxisTick />} 117 - tickFormatter={(str: string) => `${str.split("-")[1]}/${str.split("-")[2]}`} 118 - /> 119 - <YAxis 120 - style={{ fontSize: 12, fontWeight: 600 }} 121 - axisLine={false} 122 - tickLine={false} 123 - /> 124 - <Tooltip 125 - contentStyle={{ borderRadius: "8px", fontSize: 14, paddingInline: "8px", paddingBlock: "6px" }} 126 - labelStyle={{ marginBottom: ~4, color: "#000000", fontWeight: 400 }} 127 - itemStyle={{ marginBottom: ~4 }} 128 - labelFormatter={(label: string) => `${convertMonthToName(new Date(label).getMonth())} ${label.split("-")[2]}`} 129 - /> 130 - <CartesianGrid 131 - strokeDasharray="3 3" 132 - opacity={0.1} 133 - vertical={false} 134 - /> 135 - <Area 136 - type="monotone" 137 - dataKey={options.dataKey} 138 - strokeWidth={2} 139 - stroke="rgb(124 58 237)" 140 - fill="rgb(139 92 246)" 141 - style={{ opacity: 0.9 }} 142 - /> 143 - </AreaChart> 144 - </ResponsiveContainer> 145 - 146 - </Box> 147 - ); 148 - } 149 - 150 - function ChartBar(options: { name: string; data: NekosticResponse[]; dataKey: keyof CalcNames; }) { 151 - const data = calcNameOccurrences(options.data) 152 - .filter((entry) => 153 - entry.name !== "eval" && 154 - entry.name !== "shell" && 155 - entry.name !== "deploycommands" && 156 - entry.name !== "emotes" && 157 - entry.name !== "giveaway" 158 - ); 159 - 160 - return ( 161 - <Box none className="dark:bg-wamellow bg-wamellow-100 w-full rounded-md"> 162 - 163 - <div className="flex mx-10 mt-5 "> 164 - <span className="text-sm">{options.name}</span> 165 - </div> 166 - 167 - <ResponsiveContainer 168 - width="100%" 169 - height={300} 170 - > 171 - <BarChart 172 - data={data} 173 - margin={{ 174 - top: 25, 175 - right: 40, 176 - bottom: 5 177 - }} 178 - > 179 - <XAxis 180 - axisLine={false} 181 - dataKey="name" 182 - tick={<CustomXAxisTick />} 183 - /> 184 - <YAxis 185 - style={{ fontSize: 12, fontWeight: 600 }} 186 - axisLine={false} 187 - tickLine={false} 188 - /> 189 - <Tooltip 190 - contentStyle={{ borderRadius: "8px", fontSize: 14, paddingInline: "8px", paddingBlock: "6px" }} 191 - labelStyle={{ marginBottom: ~4, color: "#000000", fontWeight: 400 }} 192 - itemStyle={{ marginBottom: ~4 }} 193 - cursor={false} 194 - /> 195 - <CartesianGrid 196 - strokeDasharray="3 3" 197 - opacity={0.1} 198 - vertical={false} 199 - /> 200 - <Bar 201 - dataKey={options.dataKey} 202 - fill="rgb(86, 61, 146)" 203 - radius={[5, 5, 0, 0]} 204 - > 205 - {data.map((_, index) => 206 - <Cell 207 - key={"cell-" + index} 208 - /> 209 - )} 210 - </Bar> 211 - </BarChart> 212 - </ResponsiveContainer> 213 - 214 - </Box> 215 - ); 216 - } 217 - 218 - // eslint-disable-next-line @typescript-eslint/no-explicit-any 219 - function CustomXAxisTick(props: any) { 220 - const { x, y, payload } = props; 221 - 222 - return ( 223 - <g transform={`translate(${x},${y})`}> 224 - <text 225 - x={0} 226 - y={0} 227 - dy={16} 228 - textAnchor="end" 229 - fill="#666" 230 - transform="rotate(-35)" 231 - className="text-[11px] font-semibold" 232 - > 233 - {payload.value} 234 - </text> 235 - </g> 236 - ); 237 - } 238 - 239 - type SnapshotData = Record<string, { 240 - uses: number; 241 - users: number; 242 - }>; 243 - 244 - function calcUses(data: NekosticResponse[]): CalcUses[] { 245 - const snapshotData: SnapshotData = {}; 246 - 247 - for (const item of data) { 248 - const { snapshot, uses, users } = item; 249 - if (!snapshotData[snapshot]) { 250 - snapshotData[snapshot] = { uses: 0, users: 0 }; 251 - } 252 - snapshotData[snapshot].uses += uses; 253 - snapshotData[snapshot].users += users; 254 - } 255 - 256 - return Object 257 - .entries(snapshotData) 258 - .map(([snapshot, data]) => ({ 259 - snapshot, 260 - ...data 261 - })); 262 - } 263 - 264 - function calcNameOccurrences(data: NekosticResponse[]): CalcNames[] { 265 - const nameOccurrences: Record<string, number> = {}; 266 - 267 - for (const item of data) { 268 - if (nameOccurrences[item.name]) nameOccurrences[item.name] += item.uses; 269 - else nameOccurrences[item.name] = item.uses; 270 - } 271 - 272 - return Object 273 - .entries(nameOccurrences) 274 - .map(([name, count]) => ({ 275 - name, 276 - count 277 - })); 278 - }
+333
app/profile/billing/page.tsx
··· 1 + "use client"; 2 + 3 + import { Turnstile, type TurnstileInstance } from "@marsidev/react-turnstile"; 4 + import { Link } from "@nextui-org/react"; 5 + import { useRef, useState } from "react"; 6 + import { GrAmex } from "react-icons/gr"; 7 + import { HiCreditCard, HiLightningBolt } from "react-icons/hi"; 8 + import { SiDinersclub, SiDiscover, SiJcb, SiMastercard, SiStripe, SiVisa } from "react-icons/si"; 9 + 10 + import { DonationSelect } from "@/app/(home)/premium/subscribe.component"; 11 + import { userStore } from "@/common/user"; 12 + import Box from "@/components/box"; 13 + import ImageReduceMotion from "@/components/image-reduce-motion"; 14 + import MultiSelectMenu from "@/components/inputs/multi-select-menu"; 15 + import InputSwitch from "@/components/inputs/switch"; 16 + import Modal from "@/components/modal"; 17 + import Notice from "@/components/notice"; 18 + import { OverviewLink } from "@/components/overview-link"; 19 + import { Button } from "@/components/ui/button"; 20 + import { Separator } from "@/components/ui/separator"; 21 + import { Skeleton } from "@/components/ui/skeleton"; 22 + import { type ApiEdit, useApi } from "@/lib/api/hook"; 23 + import type { ApiV1UsersMeBillingGetRequest, ApiV1UsersMeGuildsGetResponse } from "@/typings"; 24 + 25 + export default function Home() { 26 + const user = userStore((u) => u); 27 + const [changeDonationModalOpen, setChangeDonationModalOpen] = useState(false); 28 + 29 + const { data, isLoading, error, edit } = useApi<ApiV1UsersMeBillingGetRequest>("/users/@me/billing"); 30 + 31 + if ((isLoading && !user?.premium) || (!isLoading && !data) || (data && data.status !== "active")) { 32 + return (<> 33 + {(error && error !== "Not Found") && <Notice message={error} />} 34 + 35 + <OverviewLink 36 + title="Upgrade to Premium" 37 + message="Get access to premium features, higher limits, and more — such as supporting the project!" 38 + url="/premium" 39 + icon={<HiLightningBolt />} 40 + /> 41 + 42 + {data?.status && ( 43 + <Button asChild> 44 + <Link 45 + href={data?.portalUrl} 46 + target="_blank" 47 + > 48 + Billing Portal 49 + </Link> 50 + </Button> 51 + )} 52 + </>); 53 + } 54 + 55 + return ( 56 + <div className="space-y-2"> 57 + <Box 58 + className="flex justify-between" 59 + small 60 + > 61 + <div className="flex flex-col"> 62 + <h2 className="font-bold text-3xl bg-gradient-to-r bg-clip-text text-transparent from-violet-400/80 to-indigo-400/80">Wamellow Premium</h2> 63 + <p className="text-muted-foreground">You have all premium features for <span className="font-semibold text-neutral-300">US${(4 + (data?.donationQuantity || 0)).toFixed(2)} / {data?.priceId.startsWith("monthly_") ? "Month" : "Year"}</span>!</p> 64 + </div> 65 + <div className="flex gap-1"> 66 + {isLoading 67 + ? <Skeleton className="h-10 w-20" /> 68 + : <PortalButton data={data!} /> 69 + } 70 + </div> 71 + </Box> 72 + 73 + <div className="flex gap-4 pt-1"> 74 + <Box 75 + className="w-1/2 text-sm" 76 + small 77 + > 78 + <h2 className="font-semibold text-xl text-neutral-300 relative bottom-2">Billing Cycle</h2> 79 + {isLoading 80 + ? <Skeleton className="h-12 w-full" /> 81 + : (data?.cancelAtPeriodEnd 82 + ? <p> 83 + Your subscription will expire on <span className="font-semibold text-neutral-300">{new Date(data!.currentPeriodEnd * 1000).toLocaleDateString()}</span> and you will not be charged again. 84 + </p> 85 + : <p> 86 + Your subscription will be automatically renewed on <span className="font-semibold text-neutral-300">{new Date(data!.currentPeriodEnd * 1000).toLocaleDateString()}</span> and you{"'"}ll be charged <span className="font-semibold text-neutral-300">US${(4 + (data!.donationQuantity || 0)).toFixed(2)}</span>. 87 + 88 + You{"'"}re paying <span className="font-semibold text-neutral-300">US${(4).toFixed(2)} — Premium</span> and <span className="font-semibold text-neutral-300">US${(data!.donationQuantity || 0).toFixed(2)} — Donation{data!.donationQuantity ? "s" : ""}</span> 89 + {" "} 90 + (<Button 91 + className="text-sm p-0 m-0 h-3 text-violet-400" 92 + onClick={() => setChangeDonationModalOpen(true)} 93 + variant="link" 94 + size="sm" 95 + > 96 + change 97 + </Button>). 98 + </p> 99 + ) 100 + } 101 + </Box> 102 + <Box 103 + className="w-1/2" 104 + small 105 + > 106 + <h2 className="font-semibold text-xl text-neutral-300 relative bottom-2">Payment Method</h2> 107 + {isLoading 108 + ? <Skeleton className="h-12 w-full" /> 109 + : 110 + <div className="flex gap-2 items-center bg-wamellow-100 px-4 py-1 rounded-lg"> 111 + <PaymentMethodIcon method={data!.paymentMethod} /> 112 + {typeof data?.paymentMethod === "string" ? data?.paymentMethod : "**** **** **** " + data?.paymentMethod?.last4} 113 + <Button 114 + asChild 115 + className="ml-auto" 116 + variant="link" 117 + > 118 + <Link href={data?.portalUrl}> 119 + Change 120 + </Link> 121 + </Button> 122 + </div> 123 + } 124 + </Box> 125 + </div> 126 + 127 + <div className="pt-4"> 128 + <PremiumGuildSelect 129 + isParentLoading={isLoading} 130 + guildIds={data?.guildIds || []} 131 + /> 132 + </div> 133 + 134 + {data && ( 135 + <ChangeDonationAmountModal 136 + open={changeDonationModalOpen} 137 + setOpen={setChangeDonationModalOpen} 138 + donationQuantity={data?.donationQuantity || 0} 139 + edit={edit} 140 + /> 141 + )} 142 + </div> 143 + ); 144 + } 145 + 146 + function PortalButton({ data }: { data: ApiV1UsersMeBillingGetRequest; }) { 147 + const path = getPortalPath(data); 148 + 149 + return ( 150 + <Button asChild> 151 + <Link href={data.portalUrl + "/" + path}> 152 + {path?.split("/").pop()?.replace(/^\w/, (char) => char.toUpperCase()) || "Manage"} 153 + </Link> 154 + </Button> 155 + ); 156 + } 157 + 158 + function getPortalPath(data: ApiV1UsersMeBillingGetRequest) { 159 + if (data.cancelAtPeriodEnd) return "subscriptions/" + data.subscriptionId + "/reactivate"; 160 + return "subscriptions/" + data.subscriptionId + "/cancel"; 161 + } 162 + 163 + function PaymentMethodIcon({ method }: { method: ApiV1UsersMeBillingGetRequest["paymentMethod"]; }) { 164 + if (typeof method === "string") { 165 + return <HiCreditCard className="size-6" />; 166 + } 167 + 168 + switch (method?.brand) { 169 + case "amex": return <GrAmex className="size-6" />; 170 + case "diners": return <SiDinersclub className="size-6" />; 171 + case "discover": return <SiDiscover className="size-6" />; 172 + case "jcb": return <SiJcb className="size-6" />; 173 + case "link": return <SiStripe className="size-6" />; 174 + case "mastercard": return <SiMastercard className="size-6" />; 175 + case "visa": return <SiVisa className="size-6"/>; 176 + } 177 + 178 + return <HiCreditCard className="size-6" />; 179 + } 180 + 181 + function PremiumGuildSelect({ 182 + isParentLoading, 183 + guildIds 184 + }: { 185 + isParentLoading: boolean; 186 + guildIds: string[]; 187 + }) { 188 + const { isLoading, data, error } = useApi<ApiV1UsersMeGuildsGetResponse[]>("/users/@me/guilds"); 189 + 190 + if (isLoading || isParentLoading) { 191 + return ( 192 + <div className="w-full md:w-1/3 flex flex-col"> 193 + <Skeleton className="w-32 h-5 rounded-lg mt-1.5" /> 194 + <Skeleton className="w-full h-12 mt-1.5" /> 195 + <Skeleton className="w-96 h-5 rounded-lg mt-1.5" /> 196 + </div> 197 + ); 198 + } 199 + 200 + if (error) { 201 + return <Notice message={error} />; 202 + } 203 + 204 + return ( 205 + <MultiSelectMenu 206 + className="w-full md:w-1/3" 207 + name="Premium Guilds" 208 + url="/users/@me/billing/premium-guilds" 209 + dataName="guildIds" 210 + items={data 211 + ?.filter((guild) => guild.bot) 212 + .map((guild) => ({ 213 + icon: ( 214 + <ImageReduceMotion 215 + alt={guild.name} 216 + className="rounded-md size-6 relative right-2" 217 + url={`https://cdn.discordapp.com/icons/${guild.id}/${guild.icon}`} 218 + size={32} 219 + /> 220 + ), 221 + name: guild.name, 222 + value: guild.id 223 + })) 224 + } 225 + description="Select guilds where you want to enable premium features." 226 + defaultState={guildIds} 227 + /> 228 + ); 229 + } 230 + 231 + function ChangeDonationAmountModal({ 232 + open, 233 + setOpen, 234 + donationQuantity: defaultDonationQuantity, 235 + edit 236 + }: { 237 + open: boolean; 238 + setOpen: (open: boolean) => void; 239 + donationQuantity: number; 240 + edit: ApiEdit<ApiV1UsersMeBillingGetRequest>; 241 + }) { 242 + const [donation, setDonation] = useState(defaultDonationQuantity); 243 + const [terms, setTerms] = useState(false); 244 + const captcha = useRef<TurnstileInstance>(null); 245 + 246 + const dueToday = donation - defaultDonationQuantity; 247 + 248 + return ( 249 + <Modal 250 + title="Change Donation Amount" 251 + isOpen={open} 252 + onClose={() => setOpen(false)} 253 + onSubmit={() => { 254 + return fetch(`${process.env.NEXT_PUBLIC_API}/users/@me/billing`, { 255 + method: "PATCH", 256 + credentials: "include", 257 + headers: { 258 + "Content-Type": "application/json", 259 + captcha: captcha.current!.getResponse()! 260 + }, 261 + body: JSON.stringify({ 262 + donationQuantity: donation, 263 + terms 264 + }) 265 + }); 266 + }} 267 + onSuccess={() => { 268 + edit("donationQuantity", donation); 269 + }} 270 + onError={() => { 271 + captcha.current?.reset(); 272 + }} 273 + isDisabled={donation === defaultDonationQuantity || !terms} 274 + > 275 + <p className="text-sm mb-4"> 276 + Change how much you want to donate on top of the monthly premium subscription. 277 + Please do not feel pressured to donate more than you can afford. 278 + I appreciate any additional support you can provide 💜 279 + </p> 280 + 281 + <DonationSelect 282 + className="w-full" 283 + donation={donation} 284 + setDonation={setDonation} 285 + /> 286 + 287 + <p className="text-sm mt-8 mb-6"> 288 + <Separator className="my-4" /> 289 + 290 + {dueToday > 0 && ( 291 + <div className="flex justify-between items-center mb-4"> 292 + <div> 293 + <h2 className="text-lg font-medium text-neutral-100">Due Today</h2> 294 + <p className="text-sm text-neutral-500">You{"'"}ll recieve an invoice via email.</p> 295 + </div> 296 + 297 + <span className="text-xl font-medium text-neutral-100">${dueToday.toFixed(2)}</span> 298 + </div> 299 + )} 300 + 301 + <div className="flex justify-between items-center"> 302 + <div> 303 + <h2 className="text-lg font-medium text-neutral-100">Monthly Total</h2> 304 + <p className="text-sm text-neutral-500">The total amount you will be charged monthly.</p> 305 + </div> 306 + 307 + <span className="text-xl font-medium text-neutral-100">${(donation + 4).toFixed(2)}</span> 308 + </div> 309 + </p> 310 + 311 + <Separator className="my-4" /> 312 + 313 + <InputSwitch 314 + label="I agree to the terms and conditions" 315 + description="I waive my right of withdrawal." 316 + link="/terms" 317 + defaultState={terms} 318 + onSave={setTerms} 319 + isTickbox 320 + /> 321 + 322 + <Turnstile 323 + className="mt-10" 324 + siteKey={process.env.NEXT_PUBLIC_TURNSTILE_KEY!} 325 + options={{ 326 + size: "flexible", 327 + theme: "dark" 328 + }} 329 + ref={captcha} 330 + /> 331 + </Modal> 332 + ); 333 + }
+4 -11
app/profile/connections/page.tsx
··· 6 6 import { BsSpotify } from "react-icons/bs"; 7 7 import { HiFingerPrint, HiTrash } from "react-icons/hi"; 8 8 import { SiBluesky } from "react-icons/si"; 9 - import { useQuery } from "react-query"; 10 9 11 10 import DumbTextInput from "@/components/inputs/dumb-text-input"; 12 11 import Modal from "@/components/modal"; 13 12 import Notice, { NoticeType } from "@/components/notice"; 14 13 import { HomeButton, ScreenMessage, SupportButton } from "@/components/screen-message"; 15 14 import { Button } from "@/components/ui/button"; 16 - import { cacheOptions, getData } from "@/lib/api"; 15 + import { useApi } from "@/lib/api/hook"; 17 16 import SadWumpusPic from "@/public/sad-wumpus.gif"; 18 17 import { type ApiV1UsersMeConnectionsGetResponse, ConnectionType } from "@/typings"; 19 18 import { cn } from "@/utils/cn"; ··· 25 24 export default function Home() { 26 25 const url = "/users/@me/connections" as const; 27 26 28 - const { isLoading, data, error } = useQuery( 29 - url, 30 - () => getData<ApiV1UsersMeConnectionsGetResponse[]>(url), 31 - cacheOptions 32 - ); 27 + const { isLoading, data, error } = useApi<ApiV1UsersMeConnectionsGetResponse[]>(url); 33 28 34 - if (error || (data && "message" in data)) { 29 + if (error) { 35 30 return ( 36 31 <ScreenMessage 37 32 title="Something went wrong on this page.." 38 - description={ 39 - (data && "message" in data ? data.message : `${error}`) 40 - || "An unknown error occurred."} 33 + description={error} 41 34 buttons={<> 42 35 <HomeButton /> 43 36 <SupportButton />
+6 -12
app/profile/layout.tsx
··· 7 7 import { useCookies } from "next-client-cookies"; 8 8 import { Suspense } from "react"; 9 9 import CountUp from "react-countup"; 10 - import { HiChartPie, HiCubeTransparent, HiFire, HiHome, HiPhotograph, HiTranslate } from "react-icons/hi"; 10 + import { HiCreditCard, HiCubeTransparent, HiFire, HiHome, HiPhotograph, HiTranslate } from "react-icons/hi"; 11 11 import { useQuery } from "react-query"; 12 12 13 13 import { userStore } from "@/common/user"; ··· 148 148 value: "/connections", 149 149 icon: <HiCubeTransparent /> 150 150 }, 151 - ...(user?.HELLO_AND_WELCOME_TO_THE_DEV_TOOLS__PLEASE_GO_AWAY ? 152 - [ 153 - { 154 - name: "Analytics", 155 - value: "/analytics", 156 - icon: <HiChartPie /> 157 - } 158 - ] 159 - : 160 - [] 161 - ) 151 + { 152 + name: "Billing", 153 + value: "/billing", 154 + icon: <HiCreditCard /> 155 + } 162 156 ]} 163 157 url="/profile" 164 158 />
+1 -1
app/profile/rank/card-style.component.tsx
··· 101 101 } 102 102 103 103 const mimetypes = ["image/jpg", "image/jpeg", "image/png", "image/webp"]; 104 - if (user?.isPremium) mimetypes.push("image/gif"); 104 + // if (user?.premium) mimetypes.push("image/gif"); 105 105 106 106 return ( 107 107 <div>
+90 -108
bun.lock
··· 6 6 "dependencies": { 7 7 "@discordjs/collection": "^2.1.1", 8 8 "@discordjs/rest": "^2.5.1", 9 + "@marsidev/react-turnstile": "^1.1.0", 9 10 "@nextui-org/react": "^2.6.11", 10 11 "@odiffey/discord-markdown": "^3.3.0", 12 + "@radix-ui/primitive": "1.1.2", 11 13 "@radix-ui/react-avatar": "^1.1.10", 12 14 "@radix-ui/react-checkbox": "^1.3.2", 15 + "@radix-ui/react-compose-refs": "1.1.2", 13 16 "@radix-ui/react-popover": "^1.1.14", 17 + "@radix-ui/react-primitive": "2.1.2", 14 18 "@radix-ui/react-separator": "^1.1.7", 15 19 "@radix-ui/react-slot": "^1.2.3", 16 20 "@radix-ui/react-switch": "^1.2.5", ··· 18 22 "autoprefixer": "^10.4.21", 19 23 "class-variance-authority": "^0.7.1", 20 24 "clsx": "^2.1.1", 21 - "discord-api-types": "^0.38.15", 25 + "discord-api-types": "^0.38.16", 22 26 "framer-motion": "12.16.0", 23 27 "lucide-react": "^0.513.0", 24 - "next": "^15.3.5", 28 + "next": "^15.4.1", 25 29 "next-client-cookies": "^2.1.0", 26 30 "postcss": "^8.5.6", 27 31 "react": "19.1.0", ··· 42 46 "zustand": "^5.0.6", 43 47 }, 44 48 "devDependencies": { 45 - "@next/eslint-plugin-next": "^15.3.5", 49 + "@next/eslint-plugin-next": "^15.4.1", 46 50 "@octokit/types": "^14.1.0", 47 51 "@stylistic/eslint-plugin": "^4.4.1", 48 - "@types/node": "^22.16.3", 52 + "@types/node": "^22.16.4", 49 53 "@types/react": "^19.1.8", 50 54 "@types/react-dom": "^19.1.6", 51 55 "eslint": "^9.31.0", 52 - "eslint-config-next": "^15.3.5", 56 + "eslint-config-next": "^15.4.1", 53 57 "eslint-plugin-path-alias": "^2.1.0", 54 58 "eslint-plugin-react": "^7.37.5", 55 59 "eslint-plugin-react-compiler": "19.1.0-rc.2", 56 60 "eslint-plugin-react-hooks": "^5.2.0", 57 61 "eslint-plugin-simple-import-sort": "^12.1.1", 58 62 "eslint-plugin-unused-imports": "^4.1.4", 59 - "typescript-eslint": "^8.36.0", 63 + "typescript-eslint": "^8.37.0", 60 64 }, 61 65 }, 62 66 }, ··· 237 241 238 242 "@khanacademy/simple-markdown": ["@khanacademy/simple-markdown@0.12.1", "", { "dependencies": { "@khanacademy/perseus-core": "1.5.0" }, "peerDependencies": { "react": "16.14.0", "react-dom": "16.14.0" } }, "sha512-GnrK+mxULyO58pWjPQSU1bVUd892teNIzf7stdBB9mucFDXk2TiplPD9BJDUZ10uGfliyDVKlvwV3BIjHPhL5g=="], 239 243 244 + "@marsidev/react-turnstile": ["@marsidev/react-turnstile@1.1.0", "", { "peerDependencies": { "react": "^17.0.2 || ^18.0.0 || ^19.0", "react-dom": "^17.0.2 || ^18.0.0 || ^19.0" } }, "sha512-X7bP9ZYutDd+E+klPYF+/BJHqEyyVkN4KKmZcNRr84zs3DcMoftlMAuoKqNSnqg0HE7NQ1844+TLFSJoztCdSA=="], 245 + 240 246 "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.7", "", { "dependencies": { "@emnapi/core": "^1.3.1", "@emnapi/runtime": "^1.3.1", "@tybys/wasm-util": "^0.9.0" } }, "sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw=="], 241 247 242 - "@next/env": ["@next/env@15.3.5", "", {}, "sha512-7g06v8BUVtN2njAX/r8gheoVffhiKFVt4nx74Tt6G4Hqw9HCLYQVx/GkH2qHvPtAHZaUNZ0VXAa0pQP6v1wk7g=="], 248 + "@next/env": ["@next/env@15.4.1", "", {}, "sha512-DXQwFGAE2VH+f2TJsKepRXpODPU+scf5fDbKOME8MMyeyswe4XwgRdiiIYmBfkXU+2ssliLYznajTrOQdnLR5A=="], 243 249 244 - "@next/eslint-plugin-next": ["@next/eslint-plugin-next@15.3.5", "", { "dependencies": { "fast-glob": "3.3.1" } }, "sha512-BZwWPGfp9po/rAnJcwUBaM+yT/+yTWIkWdyDwc74G9jcfTrNrmsHe+hXHljV066YNdVs8cxROxX5IgMQGX190w=="], 250 + "@next/eslint-plugin-next": ["@next/eslint-plugin-next@15.4.1", "", { "dependencies": { "fast-glob": "3.3.1" } }, "sha512-lQnHUxN7mMksK7IxgKDIXNMWFOBmksVrjamMEURXiYfo7zgsc30lnU8u4y/MJktSh+nB80ktTQeQbWdQO6c8Ow=="], 245 251 246 - "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.3.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-lM/8tilIsqBq+2nq9kbTW19vfwFve0NR7MxfkuSUbRSgXlMQoJYg+31+++XwKVSXk4uT23G2eF/7BRIKdn8t8w=="], 252 + "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.4.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-L+81yMsiHq82VRXS2RVq6OgDwjvA4kDksGU8hfiDHEXP+ncKIUhUsadAVB+MRIp2FErs/5hpXR0u2eluWPAhig=="], 247 253 248 - "@next/swc-darwin-x64": ["@next/swc-darwin-x64@15.3.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-WhwegPQJ5IfoUNZUVsI9TRAlKpjGVK0tpJTL6KeiC4cux9774NYE9Wu/iCfIkL/5J8rPAkqZpG7n+EfiAfidXA=="], 254 + "@next/swc-darwin-x64": ["@next/swc-darwin-x64@15.4.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-jfz1RXu6SzL14lFl05/MNkcN35lTLMJWPbqt7Xaj35+ZWAX342aePIJrN6xBdGeKl6jPXJm0Yqo3Xvh3Gpo3Uw=="], 249 255 250 - "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@15.3.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-LVD6uMOZ7XePg3KWYdGuzuvVboxujGjbcuP2jsPAN3MnLdLoZUXKRc6ixxfs03RH7qBdEHCZjyLP/jBdCJVRJQ=="], 256 + "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@15.4.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-k0tOFn3dsnkaGfs6iQz8Ms6f1CyQe4GacXF979sL8PNQxjYS1swx9VsOyUQYaPoGV8nAZ7OX8cYaeiXGq9ahPQ=="], 251 257 252 - "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@15.3.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-k8aVScYZ++BnS2P69ClK7v4nOu702jcF9AIHKu6llhHEtBSmM2zkPGl9yoqbSU/657IIIb0QHpdxEr0iW9z53A=="], 258 + "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@15.4.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-4ogGQ/3qDzbbK3IwV88ltihHFbQVq6Qr+uEapzXHXBH1KsVBZOB50sn6BWHPcFjwSoMX2Tj9eH/fZvQnSIgc3g=="], 253 259 254 - "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@15.3.5", "", { "os": "linux", "cpu": "x64" }, "sha512-2xYU0DI9DGN/bAHzVwADid22ba5d/xrbrQlr2U+/Q5WkFUzeL0TDR963BdrtLS/4bMmKZGptLeg6282H/S2i8A=="], 260 + "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@15.4.1", "", { "os": "linux", "cpu": "x64" }, "sha512-Jj0Rfw3wIgp+eahMz/tOGwlcYYEFjlBPKU7NqoOkTX0LY45i5W0WcDpgiDWSLrN8KFQq/LW7fZq46gxGCiOYlQ=="], 255 261 256 - "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@15.3.5", "", { "os": "linux", "cpu": "x64" }, "sha512-TRYIqAGf1KCbuAB0gjhdn5Ytd8fV+wJSM2Nh2is/xEqR8PZHxfQuaiNhoF50XfY90sNpaRMaGhF6E+qjV1b9Tg=="], 262 + "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@15.4.1", "", { "os": "linux", "cpu": "x64" }, "sha512-9WlEZfnw1vFqkWsTMzZDgNL7AUI1aiBHi0S2m8jvycPyCq/fbZjtE/nDkhJRYbSjXbtRHYLDBlmP95kpjEmJbw=="], 257 263 258 - "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@15.3.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-h04/7iMEUSMY6fDGCvdanKqlO1qYvzNxntZlCzfE8i5P0uqzVQWQquU1TIhlz0VqGQGXLrFDuTJVONpqGqjGKQ=="], 264 + "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@15.4.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-WodRbZ9g6CQLRZsG3gtrA9w7Qfa9BwDzhFVdlI6sV0OCPq9JrOrJSp9/ioLsezbV8w9RCJ8v55uzJuJ5RgWLZg=="], 259 265 260 - "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.3.5", "", { "os": "win32", "cpu": "x64" }, "sha512-5fhH6fccXxnX2KhllnGhkYMndhOiLOLEiVGYjP2nizqeGWkN10sA9taATlXwake2E2XMvYZjjz0Uj7T0y+z1yw=="], 266 + "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.4.1", "", { "os": "win32", "cpu": "x64" }, "sha512-y+wTBxelk2xiNofmDOVU7O5WxTHcvOoL3srOM0kxTzKDjQ57kPU0tpnPJ/BWrRnsOwXEv0+3QSbGR7hY4n9LkQ=="], 261 267 262 268 "@nextui-org/accordion": ["@nextui-org/accordion@2.2.7", "", { "dependencies": { "@nextui-org/aria-utils": "2.2.7", "@nextui-org/divider": "2.2.5", "@nextui-org/dom-animation": "2.1.1", "@nextui-org/framer-utils": "2.1.6", "@nextui-org/react-utils": "2.1.3", "@nextui-org/shared-icons": "2.1.1", "@nextui-org/shared-utils": "2.1.2", "@nextui-org/use-aria-accordion": "2.2.2", "@react-aria/button": "3.11.0", "@react-aria/focus": "3.19.0", "@react-aria/interactions": "3.22.5", "@react-aria/utils": "3.26.0", "@react-stately/tree": "3.8.6", "@react-types/accordion": "3.0.0-alpha.25", "@react-types/shared": "3.26.0" }, "peerDependencies": { "@nextui-org/system": ">=2.4.0", "@nextui-org/theme": ">=2.4.0", "framer-motion": ">=11.5.6 || >=12.0.0-alpha.1", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "sha512-jdobOwUxSi617m+LpxHFzg64UhDuOfDJI2CMk3MP+b2WBJ7SNW4hmN2NW5Scx5JiY+kyBGmlxJ4Y++jZpZgQjQ=="], 263 269 ··· 453 459 454 460 "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA=="], 455 461 456 - "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], 462 + "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.2", "", { "dependencies": { "@radix-ui/react-slot": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-uHa+l/lKfxuDD2zjN/0peM/RhhSmRjr5YWdk/37EnSv1nJ88uvG85DPexSm8HdFQROd2VdERJ6ynXbkCFi+APw=="], 457 463 458 464 "@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA=="], 459 465 ··· 653 659 654 660 "@stylistic/eslint-plugin": ["@stylistic/eslint-plugin@4.4.1", "", { "dependencies": { "@typescript-eslint/utils": "^8.32.1", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "estraverse": "^5.3.0", "picomatch": "^4.0.2" }, "peerDependencies": { "eslint": ">=9.0.0" } }, "sha512-CEigAk7eOLyHvdgmpZsKFwtiqS2wFwI1fn4j09IU9GmD4euFM4jEBAViWeCqaNLlbX2k2+A/Fq9cje4HQBXuJQ=="], 655 661 656 - "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], 657 - 658 662 "@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="], 659 663 660 664 "@tanstack/react-virtual": ["@tanstack/react-virtual@3.11.2", "", { "dependencies": { "@tanstack/virtual-core": "3.11.2" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-OuFzMXPF4+xZgx8UzJha0AieuMihhhaWG0tCqpp6tDzlFwOmNBPYMuLOtMJ1Tr4pXLHmgjcWhG6RlknY2oNTdQ=="], ··· 701 705 702 706 "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], 703 707 704 - "@types/node": ["@types/node@22.16.3", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-sr4Xz74KOUeYadexo1r8imhRtlVXcs+j3XK3TcoiYk7B1t3YRVJgtaD3cwX73NYb71pmVuMLNRhJ9XKdoDB74g=="], 708 + "@types/node": ["@types/node@22.16.4", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-PYRhNtZdm2wH/NT2k/oAJ6/f2VD2N2Dag0lGlx2vWgMSJXGNmlce5MiTQzoWAiIJtso30mjnfQCOKVH+kAQC/g=="], 705 709 706 710 "@types/react": ["@types/react@19.1.8", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g=="], 707 711 ··· 709 713 710 714 "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], 711 715 712 - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.36.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.36.0", "@typescript-eslint/type-utils": "8.36.0", "@typescript-eslint/utils": "8.36.0", "@typescript-eslint/visitor-keys": "8.36.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.36.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-lZNihHUVB6ZZiPBNgOQGSxUASI7UJWhT8nHyUGCnaQ28XFCw98IfrMCG3rUl1uwUWoAvodJQby2KTs79UTcrAg=="], 716 + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.37.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.37.0", "@typescript-eslint/type-utils": "8.37.0", "@typescript-eslint/utils": "8.37.0", "@typescript-eslint/visitor-keys": "8.37.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.37.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-jsuVWeIkb6ggzB+wPCsR4e6loj+rM72ohW6IBn2C+5NCvfUVY8s33iFPySSVXqtm5Hu29Ne/9bnA0JmyLmgenA=="], 713 717 714 - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.36.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.36.0", "@typescript-eslint/types": "8.36.0", "@typescript-eslint/typescript-estree": "8.36.0", "@typescript-eslint/visitor-keys": "8.36.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-FuYgkHwZLuPbZjQHzJXrtXreJdFMKl16BFYyRrLxDhWr6Qr7Kbcu2s1Yhu8tsiMXw1S0W1pjfFfYEt+R604s+Q=="], 718 + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.37.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.37.0", "@typescript-eslint/types": "8.37.0", "@typescript-eslint/typescript-estree": "8.37.0", "@typescript-eslint/visitor-keys": "8.37.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-kVIaQE9vrN9RLCQMQ3iyRlVJpTiDUY6woHGb30JDkfJErqrQEmtdWH3gV0PBAfGZgQXoqzXOO0T3K6ioApbbAA=="], 715 719 716 - "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.33.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.33.1", "@typescript-eslint/types": "^8.33.1", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw=="], 720 + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.37.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.37.0", "@typescript-eslint/types": "^8.37.0", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-BIUXYsbkl5A1aJDdYJCBAo8rCEbAvdquQ8AnLb6z5Lp1u3x5PNgSSx9A/zqYc++Xnr/0DVpls8iQ2cJs/izTXA=="], 717 721 718 722 "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.33.1", "", { "dependencies": { "@typescript-eslint/types": "8.33.1", "@typescript-eslint/visitor-keys": "8.33.1" } }, "sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA=="], 719 723 720 - "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.33.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g=="], 724 + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.37.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg=="], 721 725 722 - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.36.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.36.0", "@typescript-eslint/utils": "8.36.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-5aaGYG8cVDd6cxfk/ynpYzxBRZJk7w/ymto6uiyUFtdCozQIsQWh7M28/6r57Fwkbweng8qAzoMCPwSJfWlmsg=="], 726 + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.37.0", "", { "dependencies": { "@typescript-eslint/types": "8.37.0", "@typescript-eslint/typescript-estree": "8.37.0", "@typescript-eslint/utils": "8.37.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-SPkXWIkVZxhgwSwVq9rqj/4VFo7MnWwVaRNznfQDc/xPYHjXnPfLWn+4L6FF1cAz6e7dsqBeMawgl7QjUMj4Ow=="], 723 727 724 728 "@typescript-eslint/types": ["@typescript-eslint/types@8.33.1", "", {}, "sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg=="], 725 729 726 - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.33.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.33.1", "@typescript-eslint/tsconfig-utils": "8.33.1", "@typescript-eslint/types": "8.33.1", "@typescript-eslint/visitor-keys": "8.33.1", "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.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA=="], 730 + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.37.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.37.0", "@typescript-eslint/tsconfig-utils": "8.37.0", "@typescript-eslint/types": "8.37.0", "@typescript-eslint/visitor-keys": "8.37.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.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg=="], 727 731 728 732 "@typescript-eslint/utils": ["@typescript-eslint/utils@8.33.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.33.1", "@typescript-eslint/types": "8.33.1", "@typescript-eslint/typescript-estree": "8.33.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ=="], 729 733 730 - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.36.0", "", { "dependencies": { "@typescript-eslint/types": "8.36.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-vZrhV2lRPWDuGoxcmrzRZyxAggPL+qp3WzUrlZD+slFueDiYHxeBa34dUXPuC0RmGKzl4lS5kFJYvKCq9cnNDA=="], 734 + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.37.0", "", { "dependencies": { "@typescript-eslint/types": "8.37.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w=="], 731 735 732 736 "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], 733 737 ··· 832 836 "broadcast-channel": ["broadcast-channel@3.7.0", "", { "dependencies": { "@babel/runtime": "^7.7.2", "detect-node": "^2.1.0", "js-sha3": "0.8.0", "microseconds": "0.2.0", "nano-time": "1.0.0", "oblivious-set": "1.0.0", "rimraf": "3.0.2", "unload": "2.2.0" } }, "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg=="], 833 837 834 838 "browserslist": ["browserslist@4.24.4", "", { "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" } }, "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A=="], 835 - 836 - "busboy": ["busboy@1.6.0", "", { "dependencies": { "streamsearch": "^1.1.0" } }, "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA=="], 837 839 838 840 "cache-base": ["cache-base@1.0.1", "", { "dependencies": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", "get-value": "^2.0.6", "has-value": "^1.0.0", "isobject": "^3.0.1", "set-value": "^2.0.0", "to-object-path": "^0.3.0", "union-value": "^1.0.0", "unset-value": "^1.0.0" } }, "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ=="], 839 841 ··· 967 969 968 970 "didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="], 969 971 970 - "discord-api-types": ["discord-api-types@0.38.15", "", {}, "sha512-RX3skyRH7p6BlHOW62ztdnIc87+wv4TEJEURMir5k5BbRJ10wK1MCqFEO6USHTol3gkiHLE6wWoHhNQ2pqB4AA=="], 972 + "discord-api-types": ["discord-api-types@0.38.16", "", {}, "sha512-Cz42dC5WqJD17Yk0bRy7YLTJmh3NKo4FGpxZuA8MHqT0RPxKSrll5YhlODZ2z5DiEV/gpHMeTSrTFTWpSXjT1Q=="], 971 973 972 974 "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="], 973 975 ··· 1007 1009 1008 1010 "eslint": ["eslint@9.31.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.3.0", "@eslint/core": "^0.15.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.31.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ=="], 1009 1011 1010 - "eslint-config-next": ["eslint-config-next@15.3.5", "", { "dependencies": { "@next/eslint-plugin-next": "15.3.5", "@rushstack/eslint-patch": "^1.10.3", "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.37.0", "eslint-plugin-react-hooks": "^5.0.0" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", "typescript": ">=3.3.1" }, "optionalPeers": ["typescript"] }, "sha512-oQdvnIgP68wh2RlR3MdQpvaJ94R6qEFl+lnu8ZKxPj5fsAHrSF/HlAOZcsimLw3DT6bnEQIUdbZC2Ab6sWyptg=="], 1012 + "eslint-config-next": ["eslint-config-next@15.4.1", "", { "dependencies": { "@next/eslint-plugin-next": "15.4.1", "@rushstack/eslint-patch": "^1.10.3", "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.37.0", "eslint-plugin-react-hooks": "^5.0.0" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", "typescript": ">=3.3.1" }, "optionalPeers": ["typescript"] }, "sha512-XIIN+lq8XuSwXUrcv+0uHMDFGJFPxLAw04/a4muFZYygSvStvVa15nY7kh4Il6yOVJyxdMUyVdQ9ApGedaeupw=="], 1011 1013 1012 1014 "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="], 1013 1015 ··· 1441 1443 1442 1444 "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], 1443 1445 1444 - "next": ["next@15.3.5", "", { "dependencies": { "@next/env": "15.3.5", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.3.5", "@next/swc-darwin-x64": "15.3.5", "@next/swc-linux-arm64-gnu": "15.3.5", "@next/swc-linux-arm64-musl": "15.3.5", "@next/swc-linux-x64-gnu": "15.3.5", "@next/swc-linux-x64-musl": "15.3.5", "@next/swc-win32-arm64-msvc": "15.3.5", "@next/swc-win32-x64-msvc": "15.3.5", "sharp": "^0.34.1" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-RkazLBMMDJSJ4XZQ81kolSpwiCt907l0xcgcpF4xC2Vml6QVcPNXW0NQRwQ80FFtSn7UM52XN0anaw8TEJXaiw=="], 1446 + "next": ["next@15.4.1", "", { "dependencies": { "@next/env": "15.4.1", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.4.1", "@next/swc-darwin-x64": "15.4.1", "@next/swc-linux-arm64-gnu": "15.4.1", "@next/swc-linux-arm64-musl": "15.4.1", "@next/swc-linux-x64-gnu": "15.4.1", "@next/swc-linux-x64-musl": "15.4.1", "@next/swc-win32-arm64-msvc": "15.4.1", "@next/swc-win32-x64-msvc": "15.4.1", "sharp": "^0.34.3" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-eNKB1q8C7o9zXF8+jgJs2CzSLIU3T6bQtX6DcTnCq1sIR1CJ0GlSyRs1BubQi3/JgCnr9Vr+rS5mOMI38FFyQw=="], 1445 1447 1446 1448 "next-client-cookies": ["next-client-cookies@2.1.0", "", { "dependencies": { "js-cookie": "^3.0.5" }, "peerDependencies": { "next": ">= 15.0.0", "react": ">= 16.8.0" } }, "sha512-kC4xPjPi4H+n2qhMNfArG++FTg0fPe7eykJ2o15hbVudHMvMpXMmZYvnqHaCnisTZuRl1DqZPlwwercO1r5jDA=="], 1447 1449 ··· 1673 1675 1674 1676 "static-extend": ["static-extend@0.1.2", "", { "dependencies": { "define-property": "^0.2.5", "object-copy": "^0.1.0" } }, "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g=="], 1675 1677 1676 - "streamsearch": ["streamsearch@1.1.0", "", {}, "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="], 1677 - 1678 1678 "string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], 1679 1679 1680 1680 "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], ··· 1759 1759 1760 1760 "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], 1761 1761 1762 - "typescript-eslint": ["typescript-eslint@8.36.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.36.0", "@typescript-eslint/parser": "8.36.0", "@typescript-eslint/utils": "8.36.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-fTCqxthY+h9QbEgSIBfL9iV6CvKDFuoxg6bHPNpJ9HIUzS+jy2lCEyCmGyZRWEBSaykqcDPf1SJ+BfCI8DRopA=="], 1762 + "typescript-eslint": ["typescript-eslint@8.37.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.37.0", "@typescript-eslint/parser": "8.37.0", "@typescript-eslint/typescript-estree": "8.37.0", "@typescript-eslint/utils": "8.37.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-TnbEjzkE9EmcO0Q2zM+GE8NQLItNAJpMmED1BdgoBMYNdqMhzlbqfdSwiRlAzEK2pA9UzVW0gzaaIzXWg2BjfA=="], 1763 1763 1764 1764 "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], 1765 1765 ··· 1853 1853 1854 1854 "@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], 1855 1855 1856 + "@discordjs/rest/discord-api-types": ["discord-api-types@0.38.15", "", {}, "sha512-RX3skyRH7p6BlHOW62ztdnIc87+wv4TEJEURMir5k5BbRJ10wK1MCqFEO6USHTol3gkiHLE6wWoHhNQ2pqB4AA=="], 1857 + 1856 1858 "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], 1857 1859 1858 1860 "@eslint/plugin-kit/@eslint/core": ["@eslint/core@0.14.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg=="], ··· 1869 1871 1870 1872 "@nextui-org/use-aria-multiselect/@react-aria/label": ["@react-aria/label@3.7.13", "", { "dependencies": { "@react-aria/utils": "^3.26.0", "@react-types/shared": "^3.26.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-brSAXZVTey5RG/Ex6mTrV/9IhGSQFU4Al34qmjEDho+Z2qT4oPwf8k7TRXWWqzOU0ugYxekYbsLd2zlN3XvWcg=="], 1871 1873 1874 + "@radix-ui/react-arrow/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], 1875 + 1876 + "@radix-ui/react-avatar/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], 1877 + 1878 + "@radix-ui/react-checkbox/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], 1879 + 1872 1880 "@radix-ui/react-dialog/@radix-ui/primitive": ["@radix-ui/primitive@1.1.1", "", {}, "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA=="], 1873 1881 1874 1882 "@radix-ui/react-dialog/@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw=="], ··· 1892 1900 "@radix-ui/react-dialog/@radix-ui/react-slot": ["@radix-ui/react-slot@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ=="], 1893 1901 1894 1902 "@radix-ui/react-dialog/@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.1.0", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw=="], 1903 + 1904 + "@radix-ui/react-dismissable-layer/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], 1905 + 1906 + "@radix-ui/react-focus-scope/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], 1907 + 1908 + "@radix-ui/react-popover/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], 1909 + 1910 + "@radix-ui/react-popper/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], 1911 + 1912 + "@radix-ui/react-portal/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], 1913 + 1914 + "@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-y7TBO4xN4Y94FvcWIOIh18fM4R1A8S4q1jhoz4PNzOoHsFcN8pogcFmZrTYAm4F9VRUrWP/Mw7xSKybIeRI+CQ=="], 1915 + 1916 + "@radix-ui/react-separator/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], 1917 + 1918 + "@radix-ui/react-switch/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], 1919 + 1920 + "@radix-ui/react-tooltip/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], 1921 + 1922 + "@radix-ui/react-visually-hidden/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], 1895 1923 1896 1924 "@react-aria/calendar/@internationalized/date": ["@internationalized/date@3.7.0", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-VJ5WS3fcVx0bejE/YHfbDKR/yawZgKqn/if+oEeLqNwBtPzVB06olkfcnojTmEMX+gTpH+FlQ69SHNitJ8/erQ=="], 1897 1925 ··· 2059 2087 2060 2088 "@react-types/switch/@react-types/shared": ["@react-types/shared@3.28.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-9oMEYIDc3sk0G5rysnYvdNrkSg7B04yTKl50HHSZVbokeHpnU0yRmsDaWb9B/5RprcKj8XszEk5guBO8Sa/Q+Q=="], 2061 2089 2062 - "@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.36.0", "", { "dependencies": { "@typescript-eslint/types": "8.36.0", "@typescript-eslint/visitor-keys": "8.36.0" } }, "sha512-wCnapIKnDkN62fYtTGv2+RY8FlnBYA3tNm0fm91kc2BjPhV2vIjwwozJ7LToaLAyb1ca8BxrS7vT+Pvvf7RvqA=="], 2090 + "@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.37.0", "", { "dependencies": { "@typescript-eslint/types": "8.37.0", "@typescript-eslint/visitor-keys": "8.37.0" } }, "sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA=="], 2063 2091 2064 - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@8.36.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.36.0", "@typescript-eslint/types": "8.36.0", "@typescript-eslint/typescript-estree": "8.36.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-VOqmHu42aEMT+P2qYjylw6zP/3E/HvptRwdn/PZxyV27KhZg2IOszXod4NcXisWzPAGSS4trE/g4moNj6XmH2g=="], 2092 + "@typescript-eslint/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@8.37.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.37.0", "@typescript-eslint/types": "8.37.0", "@typescript-eslint/typescript-estree": "8.37.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A=="], 2065 2093 2066 2094 "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], 2067 2095 2068 - "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.36.0", "", { "dependencies": { "@typescript-eslint/types": "8.36.0", "@typescript-eslint/visitor-keys": "8.36.0" } }, "sha512-wCnapIKnDkN62fYtTGv2+RY8FlnBYA3tNm0fm91kc2BjPhV2vIjwwozJ7LToaLAyb1ca8BxrS7vT+Pvvf7RvqA=="], 2096 + "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.37.0", "", { "dependencies": { "@typescript-eslint/types": "8.37.0", "@typescript-eslint/visitor-keys": "8.37.0" } }, "sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA=="], 2069 2097 2070 - "@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@8.36.0", "", {}, "sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ=="], 2098 + "@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@8.37.0", "", {}, "sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ=="], 2071 2099 2072 - "@typescript-eslint/parser/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.36.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.36.0", "@typescript-eslint/tsconfig-utils": "8.36.0", "@typescript-eslint/types": "8.36.0", "@typescript-eslint/visitor-keys": "8.36.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.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-JaS8bDVrfVJX4av0jLpe4ye0BpAaUW7+tnS4Y4ETa3q7NoZgzYbN9zDQTJ8kPb5fQ4n0hliAt9tA4Pfs2zA2Hg=="], 2100 + "@typescript-eslint/project-service/@typescript-eslint/types": ["@typescript-eslint/types@8.37.0", "", {}, "sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ=="], 2073 2101 2074 2102 "@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.33.1", "", { "dependencies": { "@typescript-eslint/types": "8.33.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ=="], 2075 2103 2076 - "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.36.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.36.0", "@typescript-eslint/tsconfig-utils": "8.36.0", "@typescript-eslint/types": "8.36.0", "@typescript-eslint/visitor-keys": "8.36.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.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-JaS8bDVrfVJX4av0jLpe4ye0BpAaUW7+tnS4Y4ETa3q7NoZgzYbN9zDQTJ8kPb5fQ4n0hliAt9tA4Pfs2zA2Hg=="], 2104 + "@typescript-eslint/type-utils/@typescript-eslint/types": ["@typescript-eslint/types@8.37.0", "", {}, "sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ=="], 2077 2105 2078 - "@typescript-eslint/type-utils/@typescript-eslint/utils": ["@typescript-eslint/utils@8.36.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.36.0", "@typescript-eslint/types": "8.36.0", "@typescript-eslint/typescript-estree": "8.36.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-VOqmHu42aEMT+P2qYjylw6zP/3E/HvptRwdn/PZxyV27KhZg2IOszXod4NcXisWzPAGSS4trE/g4moNj6XmH2g=="], 2106 + "@typescript-eslint/type-utils/@typescript-eslint/utils": ["@typescript-eslint/utils@8.37.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.37.0", "@typescript-eslint/types": "8.37.0", "@typescript-eslint/typescript-estree": "8.37.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A=="], 2079 2107 2080 - "@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.33.1", "", { "dependencies": { "@typescript-eslint/types": "8.33.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ=="], 2108 + "@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@8.37.0", "", {}, "sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ=="], 2081 2109 2082 2110 "@typescript-eslint/typescript-estree/fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], 2083 2111 ··· 2085 2113 2086 2114 "@typescript-eslint/typescript-estree/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], 2087 2115 2088 - "@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@8.36.0", "", {}, "sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ=="], 2116 + "@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.33.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.33.1", "@typescript-eslint/tsconfig-utils": "8.33.1", "@typescript-eslint/types": "8.33.1", "@typescript-eslint/visitor-keys": "8.33.1", "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.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA=="], 2117 + 2118 + "@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@8.37.0", "", {}, "sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ=="], 2089 2119 2090 2120 "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], 2091 2121 ··· 2175 2205 2176 2206 "tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], 2177 2207 2178 - "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@8.36.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.36.0", "@typescript-eslint/types": "8.36.0", "@typescript-eslint/typescript-estree": "8.36.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-VOqmHu42aEMT+P2qYjylw6zP/3E/HvptRwdn/PZxyV27KhZg2IOszXod4NcXisWzPAGSS4trE/g4moNj6XmH2g=="], 2208 + "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@8.37.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.37.0", "@typescript-eslint/types": "8.37.0", "@typescript-eslint/typescript-estree": "8.37.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A=="], 2179 2209 2180 2210 "union-value/is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], 2181 2211 ··· 2287 2317 2288 2318 "@react-types/datepicker/@react-types/calendar/@react-types/shared": ["@react-types/shared@3.28.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-9oMEYIDc3sk0G5rysnYvdNrkSg7B04yTKl50HHSZVbokeHpnU0yRmsDaWb9B/5RprcKj8XszEk5guBO8Sa/Q+Q=="], 2289 2319 2290 - "@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@8.36.0", "", {}, "sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ=="], 2291 - 2292 - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.36.0", "", {}, "sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ=="], 2293 - 2294 - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.36.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.36.0", "@typescript-eslint/tsconfig-utils": "8.36.0", "@typescript-eslint/types": "8.36.0", "@typescript-eslint/visitor-keys": "8.36.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.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-JaS8bDVrfVJX4av0jLpe4ye0BpAaUW7+tnS4Y4ETa3q7NoZgzYbN9zDQTJ8kPb5fQ4n0hliAt9tA4Pfs2zA2Hg=="], 2320 + "@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@8.37.0", "", {}, "sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ=="], 2295 2321 2296 - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.36.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.36.0", "@typescript-eslint/types": "^8.36.0", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-JAhQFIABkWccQYeLMrHadu/fhpzmSQ1F1KXkpzqiVxA/iYI6UnRt2trqXHt1sYEcw1mxLnB9rKMsOxXPxowN/g=="], 2322 + "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.37.0", "", {}, "sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ=="], 2297 2323 2298 - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.36.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-Nhh3TIEgN18mNbdXpd5Q8mSCBnrZQeY9V7Ca3dqYvNDStNIGRmJA6dmrIPMJ0kow3C7gcQbpsG2rPzy1Ks/AnA=="], 2324 + "@typescript-eslint/type-utils/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.37.0", "", { "dependencies": { "@typescript-eslint/types": "8.37.0", "@typescript-eslint/visitor-keys": "8.37.0" } }, "sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA=="], 2299 2325 2300 - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], 2326 + "@typescript-eslint/typescript-estree/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], 2301 2327 2302 - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], 2328 + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 2303 2329 2304 - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], 2330 + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.33.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.33.1", "@typescript-eslint/types": "^8.33.1", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw=="], 2305 2331 2306 - "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.36.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.36.0", "@typescript-eslint/types": "^8.36.0", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-JAhQFIABkWccQYeLMrHadu/fhpzmSQ1F1KXkpzqiVxA/iYI6UnRt2trqXHt1sYEcw1mxLnB9rKMsOxXPxowN/g=="], 2307 - 2308 - "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.36.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-Nhh3TIEgN18mNbdXpd5Q8mSCBnrZQeY9V7Ca3dqYvNDStNIGRmJA6dmrIPMJ0kow3C7gcQbpsG2rPzy1Ks/AnA=="], 2332 + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.33.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g=="], 2309 2333 2310 - "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@8.36.0", "", {}, "sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ=="], 2334 + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.33.1", "", { "dependencies": { "@typescript-eslint/types": "8.33.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ=="], 2311 2335 2312 - "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], 2336 + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], 2313 2337 2314 - "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], 2338 + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], 2315 2339 2316 - "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], 2317 - 2318 - "@typescript-eslint/type-utils/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.36.0", "", { "dependencies": { "@typescript-eslint/types": "8.36.0", "@typescript-eslint/visitor-keys": "8.36.0" } }, "sha512-wCnapIKnDkN62fYtTGv2+RY8FlnBYA3tNm0fm91kc2BjPhV2vIjwwozJ7LToaLAyb1ca8BxrS7vT+Pvvf7RvqA=="], 2319 - 2320 - "@typescript-eslint/type-utils/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.36.0", "", {}, "sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ=="], 2321 - 2322 - "@typescript-eslint/typescript-estree/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], 2323 - 2324 - "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 2340 + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], 2325 2341 2326 2342 "class-utils/define-property/is-descriptor": ["is-descriptor@0.1.7", "", { "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" } }, "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg=="], 2327 2343 ··· 2347 2363 2348 2364 "tailwindcss/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], 2349 2365 2350 - "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.36.0", "", { "dependencies": { "@typescript-eslint/types": "8.36.0", "@typescript-eslint/visitor-keys": "8.36.0" } }, "sha512-wCnapIKnDkN62fYtTGv2+RY8FlnBYA3tNm0fm91kc2BjPhV2vIjwwozJ7LToaLAyb1ca8BxrS7vT+Pvvf7RvqA=="], 2351 - 2352 - "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.36.0", "", {}, "sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ=="], 2366 + "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.37.0", "", { "dependencies": { "@typescript-eslint/types": "8.37.0", "@typescript-eslint/visitor-keys": "8.37.0" } }, "sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA=="], 2353 2367 2354 - "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.36.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.36.0", "@typescript-eslint/tsconfig-utils": "8.36.0", "@typescript-eslint/types": "8.36.0", "@typescript-eslint/visitor-keys": "8.36.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.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-JaS8bDVrfVJX4av0jLpe4ye0BpAaUW7+tnS4Y4ETa3q7NoZgzYbN9zDQTJ8kPb5fQ4n0hliAt9tA4Pfs2zA2Hg=="], 2368 + "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.37.0", "", {}, "sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ=="], 2355 2369 2356 2370 "unset-value/has-value/has-values": ["has-values@0.1.4", "", {}, "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ=="], 2357 2371 ··· 2369 2383 2370 2384 "@react-aria/tabs/@react-aria/selection/@react-aria/i18n/@internationalized/date": ["@internationalized/date@3.7.0", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-VJ5WS3fcVx0bejE/YHfbDKR/yawZgKqn/if+oEeLqNwBtPzVB06olkfcnojTmEMX+gTpH+FlQ69SHNitJ8/erQ=="], 2371 2385 2372 - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.36.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.36.0", "@typescript-eslint/types": "^8.36.0", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-JAhQFIABkWccQYeLMrHadu/fhpzmSQ1F1KXkpzqiVxA/iYI6UnRt2trqXHt1sYEcw1mxLnB9rKMsOxXPxowN/g=="], 2373 - 2374 - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.36.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-Nhh3TIEgN18mNbdXpd5Q8mSCBnrZQeY9V7Ca3dqYvNDStNIGRmJA6dmrIPMJ0kow3C7gcQbpsG2rPzy1Ks/AnA=="], 2375 - 2376 - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], 2377 - 2378 - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], 2379 - 2380 - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], 2386 + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], 2381 2387 2382 - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], 2383 - 2384 - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 2385 - 2386 - "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], 2387 - 2388 - "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 2389 - 2390 - "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.36.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.36.0", "@typescript-eslint/types": "^8.36.0", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-JAhQFIABkWccQYeLMrHadu/fhpzmSQ1F1KXkpzqiVxA/iYI6UnRt2trqXHt1sYEcw1mxLnB9rKMsOxXPxowN/g=="], 2391 - 2392 - "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.36.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-Nhh3TIEgN18mNbdXpd5Q8mSCBnrZQeY9V7Ca3dqYvNDStNIGRmJA6dmrIPMJ0kow3C7gcQbpsG2rPzy1Ks/AnA=="], 2393 - 2394 - "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/typescript-estree/fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], 2395 - 2396 - "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], 2397 - 2398 - "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/typescript-estree/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], 2388 + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 2399 2389 2400 2390 "unset-value/has-value/isobject/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], 2401 - 2402 - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], 2403 - 2404 - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 2405 - 2406 - "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/typescript-estree/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], 2407 - 2408 - "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 2409 2391 } 2410 2392 }
+1 -1
common/user.ts
··· 10 10 username: string; 11 11 globalName?: string | null; 12 12 avatar: string | null; 13 - isPremium?: number | null; 13 + premium?: number | null; 14 14 15 15 __fetched: boolean; 16 16
+2 -2
components/inputs/multi-select-menu.tsx
··· 63 63 }, [defaultState, items]); 64 64 65 65 useEffect(() => { 66 - setError(null); 67 - 68 66 if (values.find((v) => !!v.error) || JSON.stringify(values.map((v) => v.value)) === JSON.stringify(defaultvalue)) { 69 67 setState(State.Idle); 70 68 return; 71 69 } 70 + 71 + setError(null); 72 72 73 73 if (!url) { 74 74 if (!onSave) throw new Error("Warning: <MultiSelectMenu.onSave> must be defined when not using <MultiSelectMenu.url>.");
+7 -8
components/inputs/switch.tsx
··· 1 + import Link from "next/link"; 1 2 import { TailSpin } from "react-loading-icons"; 2 3 3 4 import { cn } from "@/utils/cn"; ··· 8 9 import { Switch } from "../ui/switch"; 9 10 10 11 interface Props { 12 + link: string; 11 13 badge: string; 12 14 isTickbox: boolean; 13 15 } ··· 16 18 className, 17 19 18 20 label, 21 + link, 19 22 badge, 20 23 description, 21 24 isTickbox, ··· 46 49 47 50 return ( 48 51 <div className={cn("relative", description && "mb-2", className)}> 49 - <div className={cn("flex items-center gap-2", !isTickbox && "mb-6")}> 52 + <div className={cn("flex items-center justify-between gap-2", !isTickbox && "mb-6")}> 50 53 <div className="flex items-center gap-2"> 51 54 <span 52 - className={cn( 53 - "sm:text-lg font-medium dark:text-neutral-400 text-neutral-600", 54 - value && "dark:text-neutral-300 text-neutral-700" 55 - )} 55 + className="sm:text-lg font-medium text-neutral-100" 56 56 > 57 57 {label} 58 58 </span> ··· 73 73 74 74 {isTickbox ? 75 75 <Checkbox 76 - className="ml-auto" 76 + className={description && "relative top-1"} 77 77 checked={value} 78 78 onCheckedChange={update} 79 79 disabled={disabled} 80 80 /> 81 81 : 82 82 <Switch 83 - className="ml-auto" 84 83 checked={value} 85 84 onCheckedChange={update} 86 85 aria-label={label} ··· 93 92 <div className="absolute top-6 mt-0.5"> 94 93 {description && 95 94 <div className="text-neutral-500 text-sm"> 96 - {description} 95 + {description} {link && <Link href={link} target="_blank" className="text-violet-400 hover:underline">Learn more</Link>} 97 96 </div> 98 97 } 99 98
+11 -6
components/modal.tsx
··· 29 29 onSubmit?: () => Promise<Response> | Error | undefined; 30 30 onSuccess?: (data: T) => void; 31 31 onClose: () => void; 32 + onError?: () => void; 32 33 33 34 isOpen: boolean; 34 35 isDisabled?: boolean; ··· 46 47 onSubmit, 47 48 onClose, 48 49 onSuccess, 50 + onError, 49 51 50 52 isOpen, 51 53 isDisabled, ··· 75 77 if (state === State.Loading) return; 76 78 if (!onSubmit) return onClose(); 77 79 80 + setError(null); 78 81 setState(State.Loading); 79 82 const data = onSubmit?.(); 80 83 81 84 if (!data) return onClose(); 82 85 83 86 if (data instanceof Error) { 84 - setError(data?.message || "Something went wrong.."); 87 + setError(data?.message || "something went wrong.."); 88 + onError?.(); 85 89 setState(State.Idle); 86 90 return; 87 91 } ··· 91 95 92 96 if (res.ok) { 93 97 onClose(); 94 - onSuccess?.(await res.json()); 98 + onSuccess?.(res.status === 204 ? null : await res.json()); 95 99 return; 96 100 } 97 101 98 - setError((await res.json() as ApiError).message || "Unknown server error"); 102 + setError((await res.json() as ApiError).message || "unknown server error"); 103 + onError?.(); 99 104 } 100 105 101 106 function Header() { ··· 106 111 </span> 107 112 108 113 <Button 109 - onClick={() => onClose()} 114 + onClick={() => state !== State.Loading && onClose()} 110 115 className="ml-auto" 111 116 size="icon" 112 117 > ··· 134 139 135 140 {onSubmit && 136 141 <button 137 - onClick={() => onClose()} 142 + onClick={() => state !== State.Loading && onClose()} 138 143 className={cn( 139 144 "ml-auto text-sm font-medium dark:text-neutral-200 text-neutral-800", 140 145 state === State.Idle && "cursort-not-allowed" ··· 154 159 {buttonName} 155 160 </Button> 156 161 157 - {isOpen && <ClickOutside onClose={onClose} />} 162 + {isOpen && state !== State.Loading && <ClickOutside onClose={onClose} />} 158 163 </div>); 159 164 } 160 165
+2 -2
components/ui/button.tsx
··· 13 13 default: "bg-wamellow text-primary-foreground hover:bg-wamellow-200", 14 14 destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90", 15 15 success: "bg-success text-success-foreground hover:bg-success/90", 16 - outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground", 16 + outline: "border border-secondary bg-background hover:bg-primary hover:text-primary-foreground", 17 17 secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80", 18 18 flat: "bg-secondary/60 text-secondary-foreground hover:bg-secondary/50", 19 - ghost: "hover:bg-accent hover:text-accent-foreground", 19 + ghost: "hover:bg-border hover:text-primary-foreground", 20 20 link: "text-primary underline-offset-4 hover:underline", 21 21 blurple: "bg-blurple text-secondary-foreground hover:bg-blurple/80" 22 22 },
+211
components/ui/input-base.tsx
··· 1 + "use client"; 2 + 3 + import { composeEventHandlers } from "@radix-ui/primitive"; 4 + import { useComposedRefs } from "@radix-ui/react-compose-refs"; 5 + import { Primitive } from "@radix-ui/react-primitive"; 6 + import { Slot } from "@radix-ui/react-slot"; 7 + import * as React from "react"; 8 + 9 + import { Button } from "@/components/ui/button"; 10 + import { cn } from "@/utils/cn"; 11 + 12 + export type InputBaseContextProps = Pick< 13 + InputBaseProps, 14 + "autoFocus" | "disabled" 15 + > & { 16 + controlRef: React.RefObject<HTMLElement | null>; 17 + onFocusedChange: (focused: boolean) => void; 18 + }; 19 + 20 + const InputBaseContext = React.createContext<InputBaseContextProps>({ 21 + autoFocus: false, 22 + controlRef: { current: null }, 23 + disabled: false, 24 + onFocusedChange: () => {} 25 + }); 26 + 27 + function useInputBase() { 28 + const context = React.useContext(InputBaseContext); 29 + if (!context) { 30 + throw new Error("useInputBase must be used within a <InputBase />."); 31 + } 32 + 33 + return context; 34 + } 35 + 36 + export interface InputBaseProps 37 + extends React.ComponentProps<typeof Primitive.div> { 38 + autoFocus?: boolean; 39 + disabled?: boolean; 40 + error?: boolean; 41 + } 42 + 43 + function InputBase({ 44 + autoFocus, 45 + disabled, 46 + className, 47 + onClick, 48 + error, 49 + ...props 50 + }: InputBaseProps) { 51 + const [focused, setFocused] = React.useState(false); 52 + const controlRef = React.useRef<HTMLElement>(null); 53 + 54 + return ( 55 + <InputBaseContext.Provider 56 + value={{ 57 + autoFocus, 58 + controlRef, 59 + disabled, 60 + onFocusedChange: setFocused 61 + }} 62 + > 63 + <Primitive.div 64 + data-slot="input-base" 65 + onClick={composeEventHandlers(onClick, (event) => { 66 + if (controlRef.current && event.currentTarget === event.target) { 67 + controlRef.current.focus(); 68 + } 69 + })} 70 + className={cn( 71 + "border-input dark:bg-input/30 flex min-h-9 cursor-text items-center gap-2 rounded-lg border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none md:text-sm", 72 + disabled && "pointer-events-none cursor-not-allowed opacity-50", 73 + focused && "border-ring ring-ring/50 ring-[3px]", 74 + error && 75 + "ring-destructive/20 dark:ring-destructive/40 border-destructive", 76 + className 77 + )} 78 + {...props} 79 + /> 80 + </InputBaseContext.Provider> 81 + ); 82 + } 83 + 84 + function InputBaseFlexWrapper({ 85 + className, 86 + ...props 87 + }: React.ComponentProps<typeof Primitive.div>) { 88 + return ( 89 + <Primitive.div 90 + data-slot="input-base-flex-wrapper" 91 + className={cn("flex flex-1 flex-wrap", className)} 92 + {...props} 93 + /> 94 + ); 95 + } 96 + 97 + function InputBaseControl({ 98 + ref, 99 + onFocus, 100 + onBlur, 101 + ...props 102 + }: React.ComponentProps<typeof Slot>) { 103 + const { controlRef, autoFocus, disabled, onFocusedChange } = useInputBase(); 104 + 105 + const composedRefs = useComposedRefs(controlRef, ref); 106 + 107 + return ( 108 + <Slot 109 + data-slot="input-base-control" 110 + ref={composedRefs} 111 + autoFocus={autoFocus} 112 + onFocus={composeEventHandlers(onFocus, () => onFocusedChange(true))} 113 + onBlur={composeEventHandlers(onBlur, () => onFocusedChange(false))} 114 + {...{ disabled }} 115 + {...props} 116 + /> 117 + ); 118 + } 119 + 120 + export interface InputBaseAdornmentProps extends React.ComponentProps<"div"> { 121 + asChild?: boolean; 122 + } 123 + 124 + function InputBaseAdornment({ 125 + className, 126 + asChild, 127 + children, 128 + ...props 129 + }: InputBaseAdornmentProps) { 130 + const Comp = asChild ? Slot : typeof children === "string" ? "p" : "div"; 131 + 132 + return ( 133 + <Comp 134 + data-slot="input-base-adornment" 135 + className={cn( 136 + "text-muted-foreground flex items-center [&_svg:not([class*='size-'])]:size-4", 137 + "[&:not(:has(button))]:pointer-events-none", 138 + className 139 + )} 140 + {...props} 141 + > 142 + {children} 143 + </Comp> 144 + ); 145 + } 146 + 147 + function InputBaseAdornmentButton({ 148 + type = "button", 149 + variant = "ghost", 150 + size = "icon", 151 + disabled: disabledProp, 152 + className, 153 + ...props 154 + }: React.ComponentProps<typeof Button>) { 155 + const { disabled } = useInputBase(); 156 + 157 + return ( 158 + <Button 159 + data-slot="input-base-adornment-button" 160 + type={type} 161 + variant={variant} 162 + size={size} 163 + disabled={disabled || disabledProp} 164 + className={cn("size-6", className)} 165 + {...props} 166 + /> 167 + ); 168 + } 169 + 170 + function InputBaseInput({ 171 + className, 172 + ...props 173 + }: React.ComponentProps<typeof Primitive.input>) { 174 + return ( 175 + <Primitive.input 176 + data-slot="input-base-input" 177 + className={cn( 178 + "placeholder:text-muted-foreground file:text-foreground w-full flex-1 bg-transparent file:border-0 file:bg-transparent file:text-sm file:font-medium focus:outline-none disabled:pointer-events-none", 179 + className 180 + )} 181 + {...props} 182 + /> 183 + ); 184 + } 185 + 186 + function InputBaseTextarea({ 187 + className, 188 + ...props 189 + }: React.ComponentProps<"textarea">) { 190 + return ( 191 + <textarea 192 + data-slot="input-base-textarea" 193 + className={cn( 194 + "placeholder:text-muted-foreground min-h-16 flex-1 bg-transparent focus:outline-none disabled:pointer-events-none", 195 + className 196 + )} 197 + {...props} 198 + /> 199 + ); 200 + } 201 + 202 + export { 203 + InputBase, 204 + InputBaseAdornment, 205 + InputBaseAdornmentButton, 206 + InputBaseControl, 207 + InputBaseFlexWrapper, 208 + InputBaseInput, 209 + InputBaseTextarea, 210 + useInputBase 211 + };
+21 -3
lib/api/hook.ts
··· 1 - import { useQuery } from "react-query"; 1 + import { useCallback } from "react"; 2 + import { useQuery, useQueryClient } from "react-query"; 2 3 3 4 import { cacheOptions, getData } from "@/lib/api"; 4 5 ··· 6 7 status: number; 7 8 message: string; 8 9 } 10 + 11 + export type ApiEdit<T> = <K extends keyof T>(key: K, value: T[K]) => void; 9 12 10 13 export function useApi<T>(url: string, enabled?: boolean) { 11 14 ··· 18 21 } 19 22 ); 20 23 21 - if (data && typeof data === "object" && "message" in data) return { data: undefined, isLoading, error: data.message }; 24 + const queryClient = useQueryClient(); 25 + 26 + const edit = useCallback( 27 + <K extends keyof T>(key: K, value: T[K]) => { 28 + queryClient.setQueryData<T>(url, () => ({ 29 + ...data, 30 + [key]: value 31 + } as T)); 32 + }, 33 + [data] 34 + ); 35 + 36 + if (data && typeof data === "object" && "message" in data) { 37 + return { data: undefined, isLoading, error: data.message || "unknown error", edit }; 38 + } 22 39 23 40 return { 24 41 data, 25 42 isLoading, 26 - error 43 + error: error ? `${error}` : undefined, 44 + edit 27 45 }; 28 46 }
+2 -2
lib/api/index.ts
··· 15 15 next: { revalidate: 60 * 60 } 16 16 }; 17 17 18 - export async function getData<T>(path: string, domain?: string) { 19 - const response = await fetch(`${domain || process.env.NEXT_PUBLIC_API}${path}`, { 18 + export async function getData<T>(path: string) { 19 + const response = await fetch(`${process.env.NEXT_PUBLIC_API}${path}`, { 20 20 credentials: "include" 21 21 }); 22 22
+13
lib/cookies.ts
··· 1 + import { getBaseUrl } from "@/utils/urls"; 2 + 3 + const domain = getBaseUrl().split("://")[1]; 4 + 5 + export const defaultCookieOptions = { 6 + secure: getBaseUrl().startsWith("https://"), 7 + httpOnly: false, 8 + sameSite: "lax", 9 + domain: "." + (domain.startsWith("dev.") ? domain.replace(/^dev\./, "") : domain), 10 + get expires() { 11 + return new Date(Date.now() + 1000 * 60 * 60 * 24 * 28); 12 + } 13 + } as const;
+10 -6
package.json
··· 15 15 "dependencies": { 16 16 "@discordjs/collection": "^2.1.1", 17 17 "@discordjs/rest": "^2.5.1", 18 + "@marsidev/react-turnstile": "^1.1.0", 18 19 "@nextui-org/react": "^2.6.11", 19 20 "@odiffey/discord-markdown": "^3.3.0", 21 + "@radix-ui/primitive": "1.1.2", 20 22 "@radix-ui/react-avatar": "^1.1.10", 21 23 "@radix-ui/react-checkbox": "^1.3.2", 24 + "@radix-ui/react-compose-refs": "1.1.2", 22 25 "@radix-ui/react-popover": "^1.1.14", 26 + "@radix-ui/react-primitive": "2.1.2", 23 27 "@radix-ui/react-separator": "^1.1.7", 24 28 "@radix-ui/react-slot": "^1.2.3", 25 29 "@radix-ui/react-switch": "^1.2.5", ··· 27 31 "autoprefixer": "^10.4.21", 28 32 "class-variance-authority": "^0.7.1", 29 33 "clsx": "^2.1.1", 30 - "discord-api-types": "^0.38.15", 34 + "discord-api-types": "^0.38.16", 31 35 "framer-motion": "12.16.0", 32 36 "lucide-react": "^0.513.0", 33 - "next": "^15.3.5", 37 + "next": "^15.4.1", 34 38 "next-client-cookies": "^2.1.0", 35 39 "postcss": "^8.5.6", 36 40 "react": "19.1.0", ··· 51 55 "zustand": "^5.0.6" 52 56 }, 53 57 "devDependencies": { 54 - "@next/eslint-plugin-next": "^15.3.5", 58 + "@next/eslint-plugin-next": "^15.4.1", 55 59 "@octokit/types": "^14.1.0", 56 60 "@stylistic/eslint-plugin": "^4.4.1", 57 - "@types/node": "^22.16.3", 61 + "@types/node": "^22.16.4", 58 62 "@types/react": "^19.1.8", 59 63 "@types/react-dom": "^19.1.6", 60 64 "eslint": "^9.31.0", 61 - "eslint-config-next": "^15.3.5", 65 + "eslint-config-next": "^15.4.1", 62 66 "eslint-plugin-path-alias": "^2.1.0", 63 67 "eslint-plugin-react": "^7.37.5", 64 68 "eslint-plugin-react-compiler": "19.1.0-rc.2", 65 69 "eslint-plugin-react-hooks": "^5.2.0", 66 70 "eslint-plugin-simple-import-sort": "^12.1.1", 67 71 "eslint-plugin-unused-imports": "^4.1.4", 68 - "typescript-eslint": "^8.36.0" 72 + "typescript-eslint": "^8.37.0" 69 73 } 70 74 }
+32 -2
typings.ts
··· 272 272 alsoFailIf: ("disposableEmailAddress")[] 273 273 } 274 274 275 + export enum UserFlags { 276 + Premium = 1 << 0, 277 + VoteReminderNotifications = 1 << 1, 278 + VoteReminderNotificationSent = 1 << 2, 279 + IgnoreChatToSpeech = 1 << 3, 280 + LeaderboardAlternateStyle = 1 << 4 281 + } 282 + 275 283 export interface ApiV1UsersMeGetResponse { 276 284 voteCount?: number; 277 285 ··· 288 296 }; 289 297 tts?: { 290 298 defaultVoice?: keyof typeof actor; 291 - defaultFiletype?: "ogg" | "wav" | "mp3"; 292 - commandUses?: number; 293 299 }; 294 300 activity?: { 295 301 messages: number; ··· 308 314 username: string; 309 315 avatar: string | null; 310 316 type: ConnectionType; 317 + } 318 + 319 + export interface ApiV1UsersMeBillingGetRequest { 320 + subscriptionId: string; 321 + status: 'active' 322 + | 'canceled' 323 + | 'incomplete' 324 + | 'incomplete_expired' 325 + | 'past_due' 326 + | 'paused' 327 + | 'trialing' 328 + | 'unpaid'; 329 + priceId: string; 330 + created: number; 331 + currentPeriodEnd: number; 332 + currentPeriodStart: number; 333 + cancelAtPeriodEnd: boolean; 334 + donationQuantity: number; 335 + paymentMethod: { 336 + brand: string | null; 337 + last4: string | null; 338 + } | string | null; 339 + portalUrl: string; 340 + guildIds: string[] 311 341 } 312 342 313 343 export interface ApiV1GuildsModulesTagsGetResponse {