+2
-3
app/(dynamic-assets)/bluesky-client-metadata.json/route.ts
+2
-3
app/(dynamic-assets)/bluesky-client-metadata.json/route.ts
···
1
-
import { createPublicKey } from "crypto";
2
-
3
1
import { getBaseUrl, getCanonicalUrl } from "@/utils/urls";
2
+
import { createPublicKey } from "node:crypto";
4
3
5
-
export const revalidate = 691200; // 8 days
4
+
export const revalidate = 691_200; // 8 days
6
5
7
6
const PUB_KEY = "-----BEGIN PUBLIC KEY-----\n" + process.env.BLUESKY_PUBLIC_KEY + "\n-----END PUBLIC KEY-----";
8
7
+1
-1
app/(dynamic-assets)/bluesky/route.ts
+1
-1
app/(dynamic-assets)/bluesky/route.ts
+2
-3
app/(dynamic-assets)/favicon.ico/route.ts
+2
-3
app/(dynamic-assets)/favicon.ico/route.ts
···
1
+
import { getUser } from "@/lib/discord/user";
1
2
import sharp from "sharp";
2
3
3
-
import { getUser } from "@/lib/discord/user";
4
-
5
-
export const revalidate = 691200; // 8 days
4
+
export const revalidate = 691_200; // 8 days
6
5
7
6
export async function GET() {
8
7
const user = await getUser(process.env.NEXT_PUBLIC_CLIENT_ID as string);
+1
-1
app/(dynamic-assets)/luna.webp/route.ts
+1
-1
app/(dynamic-assets)/luna.webp/route.ts
+1
-1
app/(dynamic-assets)/sitemap.xml/route.ts
+1
-1
app/(dynamic-assets)/sitemap.xml/route.ts
+1
-1
app/(dynamic-assets)/waya-v3.webp/route.ts
+1
-1
app/(dynamic-assets)/waya-v3.webp/route.ts
+1
-2
app/(home)/commands.component.tsx
+1
-2
app/(home)/commands.component.tsx
···
1
-
import { HiFire, HiInformationCircle } from "react-icons/hi";
2
-
3
1
import Box from "@/components/box";
4
2
import { Badge } from "@/components/ui/badge";
5
3
import { defaultFetchOptions } from "@/lib/api";
6
4
import { intl } from "@/utils/numbers";
5
+
import { HiFire, HiInformationCircle } from "react-icons/hi";
7
6
8
7
interface Commands {
9
8
name: string;
+3
-4
app/(home)/debug/page.tsx
+3
-4
app/(home)/debug/page.tsx
···
1
+
import { Shiggy } from "@/components/shiggy";
2
+
import { Button } from "@/components/ui/button";
3
+
import { getBaseUrl, getCanonicalUrl } from "@/utils/urls";
1
4
import type { Metadata } from "next";
2
5
import { cookies, headers } from "next/headers";
3
6
import { HiTrash } from "react-icons/hi";
4
-
5
-
import { Shiggy } from "@/components/shiggy";
6
-
import { Button } from "@/components/ui/button";
7
-
import { getBaseUrl, getCanonicalUrl } from "@/utils/urls";
8
7
9
8
import Panel from "./panel.component";
10
9
+2
-3
app/(home)/faq.component.tsx
+2
-3
app/(home)/faq.component.tsx
···
1
1
"use client";
2
2
3
+
import LinkTag from "@/components/link-tag";
4
+
import { Section } from "@/components/section";
3
5
import { Accordion, AccordionItem, Code } from "@nextui-org/react";
4
6
import { useCookies } from "next-client-cookies";
5
7
import { HiBell, HiCash, HiChat, HiLockClosed, HiUserAdd } from "react-icons/hi";
6
-
7
-
import LinkTag from "@/components/link-tag";
8
-
import { Section } from "@/components/section";
9
8
10
9
const data = [
11
10
{
+3
-4
app/(home)/impressum/page.tsx
+3
-4
app/(home)/impressum/page.tsx
···
1
-
import type { Metadata } from "next";
2
-
import Link from "next/link";
3
-
import { HiExternalLink } from "react-icons/hi";
4
-
5
1
import { Section } from "@/components/section";
6
2
import { Separator } from "@/components/ui/separator";
7
3
import { cn } from "@/utils/cn";
8
4
import { getBaseUrl, getCanonicalUrl } from "@/utils/urls";
5
+
import type { Metadata } from "next";
6
+
import Link from "next/link";
7
+
import { HiExternalLink } from "react-icons/hi";
9
8
10
9
export const revalidate = false;
11
10
+2
-3
app/(home)/layout.tsx
+2
-3
app/(home)/layout.tsx
+17
-18
app/(home)/page.tsx
+17
-18
app/(home)/page.tsx
···
1
-
import { Code } from "@nextui-org/react";
2
-
import { Montserrat, Patrick_Hand } from "next/font/google";
3
-
import { headers } from "next/headers";
4
-
import Image from "next/image";
5
-
import Link from "next/link";
6
-
import { Suspense } from "react";
7
-
import { BsYoutube } from "react-icons/bs";
8
-
import { HiArrowNarrowRight, HiArrowRight, HiCash, HiCheck, HiFire, HiLockOpen, HiUserAdd } from "react-icons/hi";
9
-
10
1
import Box from "@/components/box";
11
2
import Comment from "@/components/comment";
12
3
import DiscordAppBadge from "@/components/discord/app-badge";
···
34
25
import { toFixedArrayLength } from "@/utils/fixed-array-length";
35
26
import { actor } from "@/utils/tts";
36
27
import { getCanonicalUrl } from "@/utils/urls";
28
+
import { Code } from "@nextui-org/react";
29
+
import { Montserrat, Patrick_Hand } from "next/font/google";
30
+
import { headers } from "next/headers";
31
+
import Image from "next/image";
32
+
import Link from "next/link";
33
+
import { Suspense } from "react";
34
+
import { BsYoutube } from "react-icons/bs";
35
+
import { HiArrowNarrowRight, HiArrowRight, HiCash, HiCheck, HiFire, HiLockOpen, HiUserAdd } from "react-icons/hi";
37
36
38
37
import { Commands } from "./commands.component";
39
38
import { Faq } from "./faq.component";
···
42
41
const montserrat = Montserrat({ subsets: ["latin"] });
43
42
const handwritten = Patrick_Hand({ subsets: ["latin"], weight: "400" });
44
43
45
-
export const revalidate = 43200;
44
+
export const revalidate = 43_200;
46
45
47
46
const styles = {
48
47
h2: cn(montserrat.className, "lg:text-5xl text-4xl bg-gradient-to-b bg-clip-text text-transparent from-neutral-200 from-40% to-neutral-300 font-bold mb-4"),
···
356
355
<DiscordMessageEmbed
357
356
mode="DARK"
358
357
title="My wife insisted I do this for her"
359
-
color={0x8a57ff}
358
+
color={0x8A_57_FF}
360
359
>
361
360
<Image
362
361
alt=""
···
467
466
<Image
468
467
alt="example leaderboard card"
469
468
src={LeaderboardPic}
470
-
height={1024 / 4}
469
+
height={1_024 / 4}
471
470
itemProp="image"
472
471
loading="lazy"
473
-
width={2048 / 4}
472
+
width={2_048 / 4}
474
473
/>
475
474
</DiscordMessage>
476
475
</div>
···
515
514
<DiscordMessage {...messageProps()}>
516
515
<DiscordMessageEmbed
517
516
mode={"DARK"}
518
-
color={0xbd7fd6}
517
+
color={0xBD_7F_D6}
519
518
author={{
520
519
text: "@mwlica",
521
520
icon_url: "/luna.webp"
···
579
578
height={(256 + 16) / 2}
580
579
itemProp="image"
581
580
loading="lazy"
582
-
width={1024 / 2}
581
+
width={1_024 / 2}
583
582
/>
584
583
</DiscordMessage>
585
584
</div>
···
634
633
alt="anime captcha verification example"
635
634
className="max-w-56"
636
635
src={CaptchaPic}
637
-
height={1530 / 5}
636
+
height={1_530 / 5}
638
637
itemProp="image"
639
638
loading="lazy"
640
-
width={1070 / 5}
639
+
width={1_070 / 5}
641
640
/>
642
641
</div>
643
642
</Box>
···
700
699
>
701
700
<DiscordMessageEmbed
702
701
mode={"DARK"}
703
-
color={0xbc7ed4}
702
+
color={0xBC_7E_D4}
704
703
>
705
704
<DiscordMarkdown mode={"DARK"} text="To create a custom command, go to [your server's dashboard](/dashboard?to=custom-commands), click on `Create`, fill in the response **content**, **embed title**, **embed description**, **embed color**, **embed images**, command **permissions** and more. When you're done you can start using the command 🎉" />
706
705
</DiscordMessageEmbed>
+2
-3
app/(home)/privacy/page.tsx
+2
-3
app/(home)/privacy/page.tsx
···
1
+
import BeautifyMarkdown from "@/components/markdown";
2
+
import { getBaseUrl, getCanonicalUrl } from "@/utils/urls";
1
3
import { readFile } from "fs/promises";
2
4
import type { Metadata } from "next";
3
-
4
-
import BeautifyMarkdown from "@/components/markdown";
5
-
import { getBaseUrl, getCanonicalUrl } from "@/utils/urls";
6
5
7
6
export const revalidate = false;
8
7
+4
-5
app/(home)/ratings.component.tsx
+4
-5
app/(home)/ratings.component.tsx
···
1
-
import Image from "next/image";
2
-
import Link from "next/link";
3
-
4
1
import StarIcon from "@/components/icons/star";
5
2
import { getReviews } from "@/lib/topgg";
6
3
import TopggIcon from "@/public/icons/topgg.webp";
4
+
import Image from "next/image";
5
+
import Link from "next/link";
7
6
8
7
export async function Ratings() {
9
8
const reviews = await getReviews();
···
18
17
<div className="flex gap-1">
19
18
{reviews.averageScore ?
20
19
<div className="flex gap-1">
21
-
{new Array(reviews.averageScore).fill(0).map((_, i) =>
20
+
{Array.from({ length: reviews.averageScore }).fill(0).map((_, i) =>
22
21
<StarIcon key={i} className="w-6 h-6 stroke-violet-500 fill-violet-400/20" />
23
22
)}
24
23
</div>
···
27
26
}
28
27
{5 - reviews.averageScore ?
29
28
<div className="flex gap-1">
30
-
{new Array(Math.max(5 - reviews.averageScore, 0)).fill(0).map((_, i) =>
29
+
{Array.from({ length: Math.max(5 - reviews.averageScore, 0) }).fill(0).map((_, i) =>
31
30
<StarIcon key={i} className="w-6 h-6 stroke-violet-500 fill-transparent opacity-40" />
32
31
)}
33
32
</div>
+3
-5
app/(home)/status/cluster.component.tsx
+3
-5
app/(home)/status/cluster.component.tsx
···
1
+
import { Badge } from "@/components/ui/badge";
2
+
import { cn } from "@/utils/cn";
3
+
import { intl } from "@/utils/numbers";
1
4
import Image from "next/image";
2
5
import type { ReactNode } from "react";
3
6
import { HiLightningBolt } from "react-icons/hi";
4
-
5
-
import { Badge } from "@/components/ui/badge";
6
-
import { cn } from "@/utils/cn";
7
-
import { intl } from "@/utils/numbers";
8
7
9
8
import type { ApiCluster } from "./api";
10
9
···
69
68
/>
70
69
);
71
70
}
72
-
73
71
74
72
function Row({ name, children, className }: { name: string; children: ReactNode; className?: string; }) {
75
73
return (
+3
-4
app/(home)/status/layout.tsx
+3
-4
app/(home)/status/layout.tsx
···
1
+
import { Section } from "@/components/section";
2
+
import { cn } from "@/utils/cn";
3
+
import { getBaseUrl, getCanonicalUrl } from "@/utils/urls";
1
4
import type { Metadata } from "next";
2
5
import { Montserrat } from "next/font/google";
3
6
import type { ReactNode } from "react";
4
-
5
-
import { Section } from "@/components/section";
6
-
import { cn } from "@/utils/cn";
7
-
import { getBaseUrl, getCanonicalUrl } from "@/utils/urls";
8
7
9
8
import { Commands } from "../commands.component";
10
9
+3
-4
app/(home)/status/side.component.tsx
+3
-4
app/(home)/status/side.component.tsx
···
1
1
"use client";
2
2
3
+
import DumbTextInput from "@/components/inputs/dumb-text-input";
4
+
import { Badge } from "@/components/ui/badge";
5
+
import { intl } from "@/utils/numbers";
3
6
import { Accordion, AccordionItem } from "@nextui-org/react";
4
7
import { useCookies } from "next-client-cookies";
5
8
import { type ReactNode, useEffect, useMemo, useState } from "react";
6
-
7
-
import DumbTextInput from "@/components/inputs/dumb-text-input";
8
-
import { Badge } from "@/components/ui/badge";
9
-
import { intl } from "@/utils/numbers";
10
9
11
10
import type { ApiV1StatusGetResponse } from "./api";
12
11
+3
-4
app/(home)/team/discord.component.tsx
+3
-4
app/(home)/team/discord.component.tsx
···
1
+
import { getGuild } from "@/lib/discord/guild";
2
+
import { cn } from "@/utils/cn";
3
+
import { intl } from "@/utils/numbers";
1
4
import Image from "next/image";
2
5
import Link from "next/link";
3
6
import { HiExternalLink } from "react-icons/hi";
4
-
5
-
import { getGuild } from "@/lib/discord/guild";
6
-
import { cn } from "@/utils/cn";
7
-
import { intl } from "@/utils/numbers";
8
7
9
8
export async function DiscordServer({
10
9
guildId
+3
-4
app/(home)/team/page.tsx
+3
-4
app/(home)/team/page.tsx
···
1
+
import { filterDuplicates } from "@/utils/filter-duplicates";
2
+
import { getBaseUrl, getCanonicalUrl } from "@/utils/urls";
1
3
import type { Metadata } from "next";
2
4
import { BsDiscord, BsGithub } from "react-icons/bs";
3
-
4
-
import { filterDuplicates } from "@/utils/filter-duplicates";
5
-
import { getBaseUrl, getCanonicalUrl } from "@/utils/urls";
6
5
7
6
import { members, repos } from "./constants";
8
7
import { DiscordServer } from "./discord.component";
9
8
import { Person } from "./person.component";
10
9
import { Repository } from "./repository.component";
11
10
12
-
export const revalidate = 3600;
11
+
export const revalidate = 3_600;
13
12
14
13
export const generateMetadata = (): Metadata => {
15
14
const title = "Team";
+3
-4
app/(home)/team/person.component.tsx
+3
-4
app/(home)/team/person.component.tsx
···
1
+
import { getUser } from "@/lib/discord/user";
2
+
import { cn } from "@/utils/cn";
1
3
import Image from "next/image";
2
4
import Link from "next/link";
3
5
import type { AnchorHTMLAttributes, DetailedHTMLProps, HTMLAttributes } from "react";
4
-
5
-
import { getUser } from "@/lib/discord/user";
6
-
import { cn } from "@/utils/cn";
7
6
8
7
type DivProps = DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>;
9
8
type LinkProps = DetailedHTMLProps<AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement>;
···
46
45
}
47
46
48
47
function isLinkProps(props: DivProps | LinkProps): props is LinkProps {
49
-
return "href" in props && !!props.href;
48
+
return "href" in props && Boolean(props.href);
50
49
}
51
50
52
51
function Component(props: DivProps | LinkProps) {
+2
-3
app/(home)/team/repository.component.tsx
+2
-3
app/(home)/team/repository.component.tsx
···
1
-
import Link from "next/link";
2
-
import { HiBeaker, HiExternalLink, HiStar } from "react-icons/hi";
3
-
4
1
import { Badge } from "@/components/ui/badge";
5
2
import { getRepository } from "@/lib/github";
6
3
import { cn } from "@/utils/cn";
4
+
import Link from "next/link";
5
+
import { HiBeaker, HiExternalLink, HiStar } from "react-icons/hi";
7
6
8
7
export async function Repository({
9
8
fullname
+2
-3
app/(home)/terms/page.tsx
+2
-3
app/(home)/terms/page.tsx
···
1
+
import BeautifyMarkdown from "@/components/markdown";
2
+
import { getBaseUrl, getCanonicalUrl } from "@/utils/urls";
1
3
import { readFile } from "fs/promises";
2
4
import type { Metadata } from "next";
3
-
4
-
import BeautifyMarkdown from "@/components/markdown";
5
-
import { getBaseUrl, getCanonicalUrl } from "@/utils/urls";
6
5
7
6
export const revalidate = false;
8
7
+2
-3
app/(home)/terms/payment/page.tsx
+2
-3
app/(home)/terms/payment/page.tsx
···
1
+
import BeautifyMarkdown from "@/components/markdown";
2
+
import { getBaseUrl, getCanonicalUrl } from "@/utils/urls";
1
3
import { readFile } from "fs/promises";
2
4
import type { Metadata } from "next";
3
-
4
-
import BeautifyMarkdown from "@/components/markdown";
5
-
import { getBaseUrl, getCanonicalUrl } from "@/utils/urls";
6
5
7
6
export const revalidate = false;
8
7
+2
-3
app/dashboard/[guildId]/custom-commands/create.component.tsx
+2
-3
app/dashboard/[guildId]/custom-commands/create.component.tsx
···
1
1
"use client";
2
2
3
-
import { useState } from "react";
4
-
import { HiPencil } from "react-icons/hi";
5
-
6
3
import DumbTextInput from "@/components/inputs/dumb-text-input";
7
4
import Modal from "@/components/modal";
8
5
import { Button } from "@/components/ui/button";
9
6
import type { ApiV1GuildsModulesTagsGetResponse } from "@/typings";
7
+
import { useState } from "react";
8
+
import { HiPencil } from "react-icons/hi";
10
9
11
10
export enum Style {
12
11
Compact = 1,
+2
-3
app/dashboard/[guildId]/custom-commands/delete.component.tsx
+2
-3
app/dashboard/[guildId]/custom-commands/delete.component.tsx
···
1
1
"use client";
2
2
3
-
import { useState } from "react";
4
-
import { HiTrash } from "react-icons/hi";
5
-
6
3
import Modal from "@/components/modal";
7
4
import { Button } from "@/components/ui/button";
8
5
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
6
+
import { useState } from "react";
7
+
import { HiTrash } from "react-icons/hi";
9
8
10
9
interface Props {
11
10
guildId: string;
+10
-12
app/dashboard/[guildId]/custom-commands/page.tsx
+10
-12
app/dashboard/[guildId]/custom-commands/page.tsx
···
1
1
"use client";
2
2
3
-
import { useParams, usePathname, useRouter, useSearchParams } from "next/navigation";
4
-
import { useCallback, useEffect } from "react";
5
-
import { HiViewGridAdd } from "react-icons/hi";
6
-
import { useQuery, useQueryClient } from "react-query";
7
-
8
3
import { guildStore } from "@/common/guilds";
9
4
import { StatsBar } from "@/components/counter";
10
5
import MessageCreatorEmbed from "@/components/embed-creator";
···
16
11
import { cacheOptions, getData } from "@/lib/api";
17
12
import { Permissions } from "@/lib/discord/enum/permissions";
18
13
import type { ApiV1GuildsModulesTagsGetResponse } from "@/typings";
14
+
import { useParams, usePathname, useRouter, useSearchParams } from "next/navigation";
15
+
import { useCallback, useEffect } from "react";
16
+
import { HiViewGridAdd } from "react-icons/hi";
17
+
import { useQuery, useQueryClient } from "react-query";
19
18
20
19
import { CreateTag, Style } from "./create.component";
21
20
import { DeleteTag } from "./delete.component";
···
34
33
url,
35
34
() => getData<ApiV1GuildsModulesTagsGetResponse[]>(url),
36
35
{
37
-
enabled: !!params.guildId,
36
+
enabled: Boolean(params.guildId),
38
37
...cacheOptions
39
38
}
40
39
);
···
98
97
};
99
98
100
99
return (<>
101
-
102
100
<div className="flex flex-wrap items-center gap-2 -mt-2 mb-5">
103
101
{data
104
102
.sort((a, b) => a.name.localeCompare(b.name))
···
157
155
},
158
156
{
159
157
name: "All time Command Uses",
160
-
number: 69420,
158
+
number: 69_420,
161
159
gained: 42,
162
160
append: "yesterday"
163
161
}
···
180
178
description="The name of the custom command."
181
179
defaultState={tag.name}
182
180
resetState={tag.name}
183
-
onSave={(value) => editTag("name", value as string)}
181
+
onSave={(value) => editTag("name", value)}
184
182
/>
185
183
</div>
186
184
···
197
195
dataName="permission"
198
196
description="The permissions needed to execute this tag."
199
197
defaultState={tag.permission}
200
-
onSave={(option) => editTag("permission", option.value as string)}
198
+
onSave={(option) => editTag("permission", option.value)}
201
199
showClear
202
200
/>
203
201
</div>
···
209
207
url={url + "/" + tag.id}
210
208
dataName="message"
211
209
defaultMessage={tag.message}
212
-
onSave={(value) => editTag("message", value as string)}
210
+
onSave={(value) => editTag("message", value)}
213
211
/>
214
-
</> }
212
+
</>}
215
213
216
214
{!data.length &&
217
215
<div
+4
-5
app/dashboard/[guildId]/dailyposts/create.component.tsx
+4
-5
app/dashboard/[guildId]/dailyposts/create.component.tsx
···
1
1
"use client";
2
2
3
-
import { useMemo, useState } from "react";
4
-
import { HiPencil } from "react-icons/hi";
5
-
6
3
import { guildStore } from "@/common/guilds";
7
4
import MultiSelectMenu from "@/components/inputs/multi-select-menu";
8
5
import SelectMenu from "@/components/inputs/select-menu";
···
10
7
import { Button } from "@/components/ui/button";
11
8
import { type ApiV1GuildsModulesDailypostsGetResponse, DailypostType } from "@/typings";
12
9
import { createSelectableItems } from "@/utils/create-selectable-items";
10
+
import { useMemo, useState } from "react";
11
+
import { HiPencil } from "react-icons/hi";
13
12
14
13
import { generateHourArray, typeToName } from "./util";
15
14
···
105
104
items={hoursArray}
106
105
description="Select one or multiple hours when posts should be made."
107
106
onSave={(o) => {
108
-
setHours(o.map((i) => i.value as number));
107
+
setHours(o.map((i) => i.value));
109
108
}}
110
109
/>
111
110
···
115
114
items={
116
115
Object.entries(DailypostType)
117
116
.filter(([key]) => key.length > 2)
118
-
.map(([, value]) => ({ name: typeToName(parseInt(value as string)), value }))
117
+
.map(([, value]) => ({ name: typeToName(Number.parseInt(value as string, 10)), value }))
119
118
}
120
119
description="Select what type of content should be posted daily."
121
120
onSave={(o) => {
+2
-3
app/dashboard/[guildId]/dailyposts/delete.component.tsx
+2
-3
app/dashboard/[guildId]/dailyposts/delete.component.tsx
···
1
1
"use client";
2
2
3
-
import { useState } from "react";
4
-
import { HiTrash } from "react-icons/hi";
5
-
6
3
import { guildStore } from "@/common/guilds";
7
4
import Modal from "@/components/modal";
8
5
import { Button } from "@/components/ui/button";
9
6
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
7
+
import { useState } from "react";
8
+
import { HiTrash } from "react-icons/hi";
10
9
11
10
interface Props {
12
11
id: string | null;
+4
-5
app/dashboard/[guildId]/dailyposts/page.tsx
+4
-5
app/dashboard/[guildId]/dailyposts/page.tsx
···
1
1
"use client";
2
2
3
-
import Image from "next/image";
4
-
import { useParams } from "next/navigation";
5
-
import { useMemo } from "react";
6
-
import { HiViewGridAdd } from "react-icons/hi";
7
-
8
3
import { guildStore } from "@/common/guilds";
9
4
import { CreateSplash } from "@/components/dashboard/lists/create-splash";
10
5
import { useList } from "@/components/dashboard/lists/hook";
···
15
10
import { ScreenMessage } from "@/components/screen-message";
16
11
import type { ApiV1GuildsModulesDailypostsGetResponse } from "@/typings";
17
12
import { createSelectableItems } from "@/utils/create-selectable-items";
13
+
import Image from "next/image";
14
+
import { useParams } from "next/navigation";
15
+
import { useMemo } from "react";
16
+
import { HiViewGridAdd } from "react-icons/hi";
18
17
19
18
import { CreateDailypost, Style } from "./create.component";
20
19
import { DeleteDailypost } from "./delete.component";
+6
-7
app/dashboard/[guildId]/greeting/farewell/page.tsx
+6
-7
app/dashboard/[guildId]/greeting/farewell/page.tsx
···
1
1
"use client";
2
-
import Image from "next/image";
3
-
import Link from "next/link";
4
-
import { useParams } from "next/navigation";
5
-
import { HiArrowLeft, HiChat, HiExternalLink } from "react-icons/hi";
6
-
7
2
import { guildStore } from "@/common/guilds";
8
3
import { userStore } from "@/common/user";
9
4
import Fetch from "@/components/button-fetch";
···
18
13
import type { ApiV1GuildsModulesByeGetResponse } from "@/typings";
19
14
import { cn } from "@/utils/cn";
20
15
import { createSelectableItems } from "@/utils/create-selectable-items";
16
+
import Image from "next/image";
17
+
import Link from "next/link";
18
+
import { useParams } from "next/navigation";
19
+
import { HiArrowLeft, HiChat, HiExternalLink } from "react-icons/hi";
21
20
22
21
export default function Home() {
23
22
const guild = guildStore((g) => g);
···
111
110
defaultMessage={data.message}
112
111
messageAttachmentComponent={data.card.enabled && (
113
112
<Image
114
-
src={`https://image-api.wamellow.com/?type=leave&username=${encodeURIComponent(user?.username as string)}&members=1090&hash=${encodeURIComponent(user?.id as string)}/${encodeURIComponent(user?.avatar as string)}${data.card.background ? `&background=${encodeURIComponent(data.card.background)}` : ""}`}
115
-
width={1024 / 2}
113
+
src={`https://image-api.wamellow.com/?type=leave&username=${encodeURIComponent(user!.username)}&members=1090&hash=${encodeURIComponent(user!.id)}/${encodeURIComponent(user!.avatar!)}${data.card.background ? `&background=${encodeURIComponent(data.card.background)}` : ""}`}
114
+
width={1_024 / 2}
116
115
height={(256 + 16) / 2}
117
116
loading="lazy"
118
117
alt=""
+1
-2
app/dashboard/[guildId]/greeting/page.tsx
+1
-2
app/dashboard/[guildId]/greeting/page.tsx
+4
-5
app/dashboard/[guildId]/greeting/passport/complete-setup.tsx
+4
-5
app/dashboard/[guildId]/greeting/passport/complete-setup.tsx
···
1
-
import { useEffect, useState } from "react";
2
-
3
1
import type { Guild } from "@/common/guilds";
4
2
import SelectMenu from "@/components/inputs/select-menu";
5
3
import Modal from "@/components/modal";
6
4
import type { ApiEdit } from "@/lib/api/hook";
7
5
import type { ApiV1GuildsModulesPassportGetResponse } from "@/typings";
8
6
import { createSelectableItems } from "@/utils/create-selectable-items";
7
+
import { useEffect, useState } from "react";
9
8
10
9
enum ModalType {
11
10
None = 0,
···
38
37
39
38
if (data.punishment === 2 && !data.punishmentRoleId) {
40
39
setModal(ModalType.PunishmentRole);
41
-
return;
40
+
42
41
}
43
42
}, [data]);
44
43
···
46
45
<Modal
47
46
title="Verified role"
48
47
className="!overflow-visible"
49
-
isOpen={!!guild && modal === ModalType.VerifiedRole}
48
+
isOpen={Boolean(guild) && modal === ModalType.VerifiedRole}
50
49
onClose={() => setModal(ModalType.None)}
51
50
onSubmit={() => {
52
51
return fetch(`${process.env.NEXT_PUBLIC_API}/guilds/${guild?.id}/modules/passport`, {
···
74
73
<Modal
75
74
title="Punishment role"
76
75
className="!overflow-visible"
77
-
isOpen={!!guild && modal === ModalType.PunishmentRole}
76
+
isOpen={Boolean(guild) && modal === ModalType.PunishmentRole}
78
77
onClose={() => setModal(ModalType.None)}
79
78
onSubmit={() => {
80
79
return fetch(`${process.env.NEXT_PUBLIC_API}/guilds/${guild?.id}/modules/passport`, {
+7
-9
app/dashboard/[guildId]/greeting/passport/page.tsx
+7
-9
app/dashboard/[guildId]/greeting/passport/page.tsx
···
1
1
"use client";
2
-
import Link from "next/link";
3
-
import { useParams } from "next/navigation";
4
-
import { HiArrowLeft, HiExternalLink, HiFingerPrint } from "react-icons/hi";
5
-
6
2
import { guildStore } from "@/common/guilds";
7
3
import { CopyToClipboardButton } from "@/components/copy-to-clipboard";
8
4
import SelectInput from "@/components/inputs/select-menu";
···
14
10
import type { ApiV1GuildsModulesPassportGetResponse } from "@/typings";
15
11
import { createSelectableItems } from "@/utils/create-selectable-items";
16
12
import { getCanonicalUrl } from "@/utils/urls";
13
+
import Link from "next/link";
14
+
import { useParams } from "next/navigation";
15
+
import { HiArrowLeft, HiExternalLink, HiFingerPrint } from "react-icons/hi";
17
16
18
17
import CompleteSetup from "./complete-setup";
19
18
···
61
60
return (<>
62
61
<Head />
63
62
64
-
{data.enabled && data.punishment === 2 && !data.punishmentRoleId &&
63
+
{data.enabled && data.punishment === 2 && !data.punishmentRoleId && (
65
64
<Notice message="A punishment role must be set when using 'Assign role to member'." />
66
-
}
65
+
)}
67
66
68
-
{data.enabled && !data.successRoleId &&
67
+
{data.enabled && !data.successRoleId && (
69
68
<Notice message="A verified role must be set for passport to work." />
70
-
}
69
+
)}
71
70
72
71
<CompleteSetup
73
72
guild={guild}
···
176
175
<div className="w-fit">
177
176
<CopyToClipboardButton title="Copy link to passport" text={getCanonicalUrl("passport", guild?.id as string)} />
178
177
</div>
179
-
180
178
</>);
181
179
}
+4
-5
app/dashboard/[guildId]/greeting/welcome/page.tsx
+4
-5
app/dashboard/[guildId]/greeting/welcome/page.tsx
···
1
1
"use client";
2
-
import Image from "next/image";
3
-
import Link from "next/link";
4
-
import { useParams } from "next/navigation";
5
-
import { HiArrowLeft, HiChat, HiExternalLink } from "react-icons/hi";
6
-
7
2
import { guildStore } from "@/common/guilds";
8
3
import { userStore } from "@/common/user";
9
4
import Fetch from "@/components/button-fetch";
···
20
15
import type { ApiV1GuildsModulesWelcomeGetResponse } from "@/typings";
21
16
import { cn } from "@/utils/cn";
22
17
import { createSelectableEmojiItems, createSelectableItems } from "@/utils/create-selectable-items";
18
+
import Image from "next/image";
19
+
import Link from "next/link";
20
+
import { useParams } from "next/navigation";
21
+
import { HiArrowLeft, HiChat, HiExternalLink } from "react-icons/hi";
23
22
24
23
export default function Home() {
25
24
const guild = guildStore((g) => g);
+10
-11
app/dashboard/[guildId]/layout.tsx
+10
-11
app/dashboard/[guildId]/layout.tsx
···
1
1
"use client";
2
2
3
-
import Head from "next/head";
4
-
import Link from "next/link";
5
-
import { redirect, useParams } from "next/navigation";
6
-
import { useCookies } from "next-client-cookies";
7
-
import { Suspense, useEffect, useMemo, useState } from "react";
8
-
import { HiArrowNarrowLeft, HiBell, HiChartBar, HiCode, HiEye, HiHome, HiPaperAirplane, HiStar, HiUserAdd, HiUsers, HiViewGridAdd } from "react-icons/hi";
9
-
import { useQuery } from "react-query";
10
-
11
3
import { guildStore } from "@/common/guilds";
12
4
import ImageReduceMotion from "@/components/image-reduce-motion";
13
5
import { ListTab } from "@/components/list";
···
17
9
import { cacheOptions, getData } from "@/lib/api";
18
10
import type { ApiV1GuildsChannelsGetResponse, ApiV1GuildsEmojisGetResponse, ApiV1GuildsGetResponse, ApiV1GuildsRolesGetResponse } from "@/typings";
19
11
import { intl } from "@/utils/numbers";
12
+
import Head from "next/head";
13
+
import Link from "next/link";
14
+
import { redirect, useParams } from "next/navigation";
15
+
import { useCookies } from "next-client-cookies";
16
+
import { Suspense, useEffect, useMemo, useState } from "react";
17
+
import { HiArrowNarrowLeft, HiBell, HiChartBar, HiCode, HiEye, HiHome, HiPaperAirplane, HiStar, HiUserAdd, HiUsers, HiViewGridAdd } from "react-icons/hi";
18
+
import { useQuery } from "react-query";
20
19
21
20
function useGuildData<T extends unknown[]>(
22
21
url: string,
···
26
25
url,
27
26
() => getData<T>(url),
28
27
{
29
-
enabled: !!guildStore((g) => g)?.id,
28
+
enabled: Boolean(guildStore((g) => g)?.id),
30
29
onSettled: (data) => {
31
30
const isError = !data || "message" in data;
32
31
onLoad(isError ? [] as unknown as T : data, isError);
···
59
58
url,
60
59
() => getData<ApiV1GuildsGetResponse>(url),
61
60
{
62
-
enabled: !!params.guildId,
61
+
enabled: Boolean(params.guildId),
63
62
...cacheOptions,
64
63
refetchOnMount: true
65
64
}
···
191
190
}
192
191
]}
193
192
url={`/dashboard/${params.guildId}`}
194
-
disabled={!guild || !!error}
193
+
disabled={!guild || Boolean(error)}
195
194
/>
196
195
</Suspense>
197
196
+4
-7
app/dashboard/[guildId]/leaderboards/page.tsx
+4
-7
app/dashboard/[guildId]/leaderboards/page.tsx
···
1
1
"use client";
2
2
3
-
import { ChannelType } from "discord-api-types/v10";
4
-
import { useParams } from "next/navigation";
5
-
import { HiChartBar, HiViewGridAdd } from "react-icons/hi";
6
-
7
3
import { type Guild, guildStore } from "@/common/guilds";
8
4
import ImageUrlInput from "@/components/inputs/image-url-input";
9
5
import MultiSelectMenu from "@/components/inputs/multi-select-menu";
···
12
8
import { useApi } from "@/lib/api/hook";
13
9
import type { ApiV1GuildsModulesLeaderboardGetResponse } from "@/typings";
14
10
import { createSelectableItems } from "@/utils/create-selectable-items";
11
+
import { ChannelType } from "discord-api-types/v10";
12
+
import { useParams } from "next/navigation";
13
+
import { HiChartBar, HiViewGridAdd } from "react-icons/hi";
15
14
16
-
import { OverviewLink } from "../../../../components/overview-link";
17
15
import Permissions from "./permissions.component";
18
16
import ResetLeaderboard from "./reset.component";
19
17
import UpdatingLeaderboardCard from "./updating.component";
20
18
import DiscordWidget from "./widget.component";
19
+
import { OverviewLink } from "../../../../components/overview-link";
21
20
22
21
export default function Home() {
23
22
const guild = guildStore((g) => g);
···
39
38
/>
40
39
);
41
40
}
42
-
43
41
44
42
return (<>
45
43
<div className="flex flex-col-reverse md:flex-row gap-6">
···
121
119
<UpdatingLeaderboardCard guild={guild as Guild} lb={data.updating.find((lb) => lb.type === "voiceminutes")} type="voiceminutes" />
122
120
<UpdatingLeaderboardCard guild={guild as Guild} lb={data.updating.find((lb) => lb.type === "invites")} type="invites" />
123
121
</div>
124
-
125
122
126
123
<Section
127
124
title="Privacy"
+3
-4
app/dashboard/[guildId]/leaderboards/permissions.component.tsx
+3
-4
app/dashboard/[guildId]/leaderboards/permissions.component.tsx
···
1
-
import { PermissionFlagsBits } from "discord-api-types/v10";
2
-
import { useMemo } from "react";
3
-
import { HiExclamation } from "react-icons/hi";
4
-
5
1
import type { Guild } from "@/common/guilds";
6
2
import DiscordChannel from "@/components/discord/channel";
7
3
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
8
4
import type { ApiV1GuildsChannelsGetResponse } from "@/typings";
9
5
import { cn } from "@/utils/cn";
6
+
import { PermissionFlagsBits } from "discord-api-types/v10";
7
+
import { useMemo } from "react";
8
+
import { HiExclamation } from "react-icons/hi";
10
9
11
10
interface Props {
12
11
className: string;
+2
-3
app/dashboard/[guildId]/leaderboards/reset.component.tsx
+2
-3
app/dashboard/[guildId]/leaderboards/reset.component.tsx
···
1
-
import { useState } from "react";
2
-
import { HiTrash, HiUsers } from "react-icons/hi";
3
-
4
1
import type { Guild } from "@/common/guilds";
5
2
import ImageReduceMotion from "@/components/image-reduce-motion";
6
3
import Modal from "@/components/modal";
7
4
import Notice, { NoticeType } from "@/components/notice";
8
5
import { Button } from "@/components/ui/button";
9
6
import { intl } from "@/utils/numbers";
7
+
import { useState } from "react";
8
+
import { HiTrash, HiUsers } from "react-icons/hi";
10
9
11
10
interface Props {
12
11
guild: Guild;
+14
-15
app/dashboard/[guildId]/leaderboards/updating.component.tsx
+14
-15
app/dashboard/[guildId]/leaderboards/updating.component.tsx
···
1
1
"use client";
2
2
3
-
import { Tab, Tabs } from "@nextui-org/react";
4
-
import Link from "next/link";
5
-
import { useCookies } from "next-client-cookies";
6
-
import { useState } from "react";
7
-
import { HiExternalLink, HiPencil, HiTrash } from "react-icons/hi";
8
-
9
3
import type { Guild } from "@/common/guilds";
10
4
import SelectInput from "@/components/inputs/select-menu";
11
5
import Switch from "@/components/inputs/switch";
···
13
7
import Modal from "@/components/modal";
14
8
import type { ApiV1GuildsModulesLeaderboardUpdatingPostResponse } from "@/typings";
15
9
import { createSelectableEmojiItems, createSelectableItems } from "@/utils/create-selectable-items";
10
+
import { Tab, Tabs } from "@nextui-org/react";
11
+
import Link from "next/link";
12
+
import { useCookies } from "next-client-cookies";
13
+
import { useState } from "react";
14
+
import { HiExternalLink, HiPencil, HiTrash } from "react-icons/hi";
16
15
17
16
interface Props {
18
17
guild: Guild;
···
111
110
<Modal
112
111
className="flex flex-col gap-3"
113
112
title={`${type.replace(/^\w/, (match) => match.toUpperCase())} leaderboard`}
114
-
isOpen={modal === ModalType.CreateAndEdit && !!guild}
113
+
isOpen={modal === ModalType.CreateAndEdit && Boolean(guild)}
115
114
isDisabled={!channelId}
116
115
onClose={() => {
117
116
setModal(undefined);
···
141
140
...leaderboard,
142
141
type,
143
142
// @ts-expect-error it works
144
-
channelId, structure, emoji,
143
+
channelId,
144
+
structure,
145
+
emoji: emoji || null,
145
146
display,
146
147
styles
147
148
});
···
169
170
name="Channel"
170
171
items={createSelectableItems(guild.channels, ["ViewChannel", "SendMessages", "EmbedLinks", "AttachFiles"])}
171
172
description="Select a channel where the leaderboard should be send into."
172
-
defaultState={leaderboard?.channelId || undefined}
173
-
onSave={(o) => {
174
-
setChannelId(o.value as string);
175
-
}}
173
+
defaultState={leaderboard?.channelId}
174
+
onSave={(o) => setChannelId(o.value as string)}
176
175
/>
177
176
178
177
<div className="mb-3">
···
183
182
color="secondary"
184
183
variant="bordered"
185
184
defaultSelectedKey={structure?.toString()}
186
-
onSelectionChange={(i) => setStructure(parseInt(i as string))}
185
+
onSelectionChange={(i) => setStructure(Number.parseInt(i as string, 10))}
187
186
fullWidth
188
187
>
189
188
<Tab
···
218
217
<TextInput
219
218
name="Title"
220
219
description="The title of the embed"
221
-
defaultState={"☕ " + `${type.replace(/^\w/, (match) => match.toUpperCase())} leaderboard`}
220
+
defaultState={`☕ ${type.replace(/^\w/, (match) => match.toUpperCase())} leaderboard`}
222
221
max={256}
223
222
onSave={(v) => {
224
223
setEmbed({
···
299
298
buttonName="Delete"
300
299
variant="destructive"
301
300
title={`Delete ${type.replace(/^\w/, (match) => match.toUpperCase())} leaderboard`}
302
-
isOpen={modal === ModalType.Delete && !!guild}
301
+
isOpen={modal === ModalType.Delete && Boolean(guild)}
303
302
onClose={() => {
304
303
setModal(undefined);
305
304
}}
+6
-7
app/dashboard/[guildId]/leaderboards/widget.component.tsx
+6
-7
app/dashboard/[guildId]/leaderboards/widget.component.tsx
···
1
-
import type { RESTError, RESTGetAPIGuildWidgetJSONResult } from "discord-api-types/v10";
2
-
import { useState } from "react";
3
-
import { HiEmojiHappy, HiLockClosed } from "react-icons/hi";
4
-
import { useQuery } from "react-query";
5
-
6
1
import type { Guild } from "@/common/guilds";
7
2
import Notice from "@/components/notice";
8
3
import { Skeleton } from "@/components/ui/skeleton";
9
4
import { cacheOptions } from "@/lib/api";
10
5
import { cn } from "@/utils/cn";
6
+
import type { RESTError, RESTGetAPIGuildWidgetJSONResult } from "discord-api-types/v10";
7
+
import { useState } from "react";
8
+
import { HiEmojiHappy, HiLockClosed } from "react-icons/hi";
9
+
import { useQuery } from "react-query";
11
10
12
11
import DiscordWidgetButton from "./widget-button.component";
13
12
···
24
23
url,
25
24
() => fetch(url).then((res) => res.json()) as Promise<RESTGetAPIGuildWidgetJSONResult | RESTError>,
26
25
{
27
-
enabled: !!guild.id,
26
+
enabled: Boolean(guild.id),
28
27
...cacheOptions,
29
28
onSuccess: (data) => setEnabled(!("code" in data)),
30
29
refetchOnMount: true
31
30
}
32
31
);
33
32
34
-
if (error || (data && "message" in data && data.code !== 50004)) {
33
+
if (error || (data && "message" in data && data.code !== 50_004)) {
35
34
return (
36
35
<div className="md:w-1/2">
37
36
<Notice
+5
-6
app/dashboard/[guildId]/moderation/page.tsx
+5
-6
app/dashboard/[guildId]/moderation/page.tsx
···
1
1
"use client";
2
2
3
-
import { ChannelType } from "discord-api-types/v10";
4
-
import { useParams } from "next/navigation";
5
-
6
3
import { guildStore } from "@/common/guilds";
7
4
import MultiSelectMenu from "@/components/inputs/multi-select-menu";
8
5
import Switch from "@/components/inputs/switch";
···
11
8
import { useApi } from "@/lib/api/hook";
12
9
import { type ApiV1GuildsModulesAutomodGetResponse, AutomodType } from "@/typings";
13
10
import { createSelectableItems } from "@/utils/create-selectable-items";
11
+
import { ChannelType } from "discord-api-types/v10";
12
+
import { useParams } from "next/navigation";
14
13
15
14
const AUTOMOD_TYPES = Object
16
15
.values(AutomodType)
···
61
60
max={50}
62
61
disabled={!enabled}
63
62
onSave={(value) => {
64
-
edit("whitelistChannelIds", value.map((entry) => entry.value as string));
63
+
edit("whitelistChannelIds", value.map((entry) => entry.value));
65
64
}}
66
65
/>
67
66
</div>
···
76
75
max={20}
77
76
disabled={!enabled}
78
77
onSave={(value) => {
79
-
edit("whitelistRoleIds", value.map((entry) => entry.value as string));
78
+
edit("whitelistRoleIds", value.map((entry) => entry.value));
80
79
}}
81
80
/>
82
81
</div>
···
90
89
defaultState={data.keywordFilter.join(", ")}
91
90
max={Infinity}
92
91
onSave={(value) => {
93
-
edit("keywordFilter", (value as string | null)?.split(/,|\n/).map((word) => word.trim()) || []);
92
+
edit("keywordFilter", (value)?.split(/,|\n/).map((word) => word.trim()) || []);
94
93
}}
95
94
/>
96
95
</>);
+1
-1
app/dashboard/[guildId]/notifications/api.ts
+1
-1
app/dashboard/[guildId]/notifications/api.ts
+9
-10
app/dashboard/[guildId]/notifications/create-bluesky.component.tsx
+9
-10
app/dashboard/[guildId]/notifications/create-bluesky.component.tsx
···
1
1
"use client";
2
2
3
-
import { useState } from "react";
4
-
5
3
import { guildStore } from "@/common/guilds";
6
4
import DumbTextInput from "@/components/inputs/dumb-text-input";
7
5
import SelectMenu from "@/components/inputs/select-menu";
···
9
7
import { Section } from "@/components/section";
10
8
import { type ApiV1GuildsModulesNotificationsGetResponse, NotificationType } from "@/typings";
11
9
import { createSelectableItems } from "@/utils/create-selectable-items";
10
+
import { useState } from "react";
12
11
13
-
const URL_CHANNEL_REGEX = /^https?:\/\/((www|m)\.)?bsky\.app\/profile\/did:plc:[a-z0-9]{20,30}$/;
14
-
const URL_HANDLE_REGEX = /^https?:\/\/((www|m)\.)?bsky\.app\/profile\/[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)+$/;
15
-
const CHANNEL_ID = /^did:plc:[a-z0-9]{20,30}$/;
16
-
const CHANNE_HANDLE = /^@?[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)+$/;
12
+
const URL_CHANNEL_REGEX = /^https?:\/\/((www|m)\.)?bsky\.app\/profile\/did:plc:[\da-z]{20,30}$/;
13
+
const URL_HANDLE_REGEX = /^https?:\/\/((www|m)\.)?bsky\.app\/profile\/[\dA-Za-z-]+(\.[\dA-Za-z-]+)+$/;
14
+
const CHANNEL_ID = /^did:plc:[\da-z]{20,30}$/;
15
+
const CHANNE_HANDLE = /^@?[\dA-Za-z-]+(\.[\dA-Za-z-]+)+$/;
17
16
18
17
function validateAccount(input: string) {
19
-
if (URL_CHANNEL_REGEX.exec(input)) return input.split("/profile/")[1];
20
-
if (URL_HANDLE_REGEX.exec(input)) return input.split("/profile/")[1];
18
+
if (URL_CHANNEL_REGEX.test(input)) return input.split("/profile/")[1];
19
+
if (URL_HANDLE_REGEX.test(input)) return input.split("/profile/")[1];
21
20
22
-
if (CHANNEL_ID.exec(input)) return input;
23
-
if (CHANNE_HANDLE.exec(input)) return input.replace("@", "");
21
+
if (CHANNEL_ID.test(input)) return input;
22
+
if (CHANNE_HANDLE.test(input)) return input.replace("@", "");
24
23
25
24
return null;
26
25
}
+5
-6
app/dashboard/[guildId]/notifications/create-reddit.component.tsx
+5
-6
app/dashboard/[guildId]/notifications/create-reddit.component.tsx
···
1
1
"use client";
2
2
3
-
import { useState } from "react";
4
-
5
3
import { guildStore } from "@/common/guilds";
6
4
import DumbTextInput from "@/components/inputs/dumb-text-input";
7
5
import SelectMenu from "@/components/inputs/select-menu";
···
9
7
import { Section } from "@/components/section";
10
8
import { type ApiV1GuildsModulesNotificationsGetResponse, NotificationType } from "@/typings";
11
9
import { createSelectableItems } from "@/utils/create-selectable-items";
10
+
import { useState } from "react";
12
11
13
-
const URL_CHANNEL_REGEX = /^https?:\/\/((www|m|old|oauth)\.)?reddit\.com\/r\/(?=.{3,21}$)[A-Za-z][A-Za-z0-9_]*\/?$/;
14
-
const CHANNE_HANDLE = /^((\/)?r\/)?(?=.{3,21}$)[A-Za-z][A-Za-z0-9_]*$/;
12
+
const URL_CHANNEL_REGEX = /^https?:\/\/((www|m|old|oauth)\.)?reddit\.com\/r\/(?=.{3,21}$)[A-Za-z]\w*\/?$/;
13
+
const CHANNE_HANDLE = /^((\/)?r\/)?(?=.{3,21}$)[A-Za-z]\w*$/;
15
14
16
15
function validateAccount(input: string) {
17
-
if (URL_CHANNEL_REGEX.exec(input)) return input.split("/r/")[1].replace(/\/$/, "");
18
-
if (CHANNE_HANDLE.exec(input)) return input.replace(/^(\/)?r\//, "");
16
+
if (URL_CHANNEL_REGEX.test(input)) return input.split("/r/")[1].replace(/\/$/, "");
17
+
if (CHANNE_HANDLE.test(input)) return input.replace(/^(\/)?r\//, "");
19
18
return null;
20
19
}
21
20
+6
-7
app/dashboard/[guildId]/notifications/create-twitch.component.tsx
+6
-7
app/dashboard/[guildId]/notifications/create-twitch.component.tsx
···
1
1
"use client";
2
2
3
-
import Image from "next/image";
4
-
import { useState } from "react";
5
-
6
3
import { guildStore } from "@/common/guilds";
7
4
import DumbTextInput from "@/components/inputs/dumb-text-input";
8
5
import SelectMenu from "@/components/inputs/select-menu";
···
11
8
import TutorialPic from "@/public/docs-assets/notifications-channel-urls.webp";
12
9
import { type ApiV1GuildsModulesNotificationsGetResponse, NotificationType } from "@/typings";
13
10
import { createSelectableItems } from "@/utils/create-selectable-items";
11
+
import Image from "next/image";
12
+
import { useState } from "react";
14
13
15
-
const URL_CHANNEL_REGEX = /^https?:\/\/((www|m)\.)?twitch\.tv\/([a-zA-Z0-9_-]{1,32})$/;
16
-
const CHANNE_HANDLE = /^@?[a-zA-Z0-9._-]{1,32}$/;
14
+
const URL_CHANNEL_REGEX = /^https?:\/\/((www|m)\.)?twitch\.tv\/([\w-]{1,32})$/;
15
+
const CHANNE_HANDLE = /^@?[\w.-]{1,32}$/;
17
16
18
17
function validateAccount(input: string) {
19
-
if (URL_CHANNEL_REGEX.exec(input)) return input.split(".tv/")[1];
20
-
if (CHANNE_HANDLE.exec(input)) return input.replace("@", "");
18
+
if (URL_CHANNEL_REGEX.test(input)) return input.split(".tv/")[1];
19
+
if (CHANNE_HANDLE.test(input)) return input.replace("@", "");
21
20
return null;
22
21
}
23
22
+10
-11
app/dashboard/[guildId]/notifications/create-youtube.component.tsx
+10
-11
app/dashboard/[guildId]/notifications/create-youtube.component.tsx
···
1
1
"use client";
2
2
3
-
import Image from "next/image";
4
-
import { useState } from "react";
5
-
6
3
import { guildStore } from "@/common/guilds";
7
4
import DumbTextInput from "@/components/inputs/dumb-text-input";
8
5
import SelectMenu from "@/components/inputs/select-menu";
···
11
8
import TutorialPic from "@/public/docs-assets/notifications-channel-urls.webp";
12
9
import { type ApiV1GuildsModulesNotificationsGetResponse, NotificationType } from "@/typings";
13
10
import { createSelectableItems } from "@/utils/create-selectable-items";
11
+
import Image from "next/image";
12
+
import { useState } from "react";
14
13
15
-
const URL_CHANNEL_REGEX = /^https?:\/\/((www|m)\.)?youtube\.com\/channel\/UC([a-zA-Z0-9_-]{16,32})$/;
16
-
const URL_HANDLE_REGEX = /^https?:\/\/((www|m)\.)?youtube\.com\/@([a-zA-Z0-9._-]{3,30})$/;
17
-
const CHANNEL_ID = /^UC[a-zA-Z0-9_-]{16,32}$/;
18
-
const CHANNE_HANDLE = /^@?[a-zA-Z0-9._-]{3,30}$/;
14
+
const URL_CHANNEL_REGEX = /^https?:\/\/((www|m)\.)?youtube\.com\/channel\/UC([\w-]{16,32})$/;
15
+
const URL_HANDLE_REGEX = /^https?:\/\/((www|m)\.)?youtube\.com\/@([\w.-]{3,30})$/;
16
+
const CHANNEL_ID = /^UC[\w-]{16,32}$/;
17
+
const CHANNE_HANDLE = /^@?[\w.-]{3,30}$/;
19
18
20
19
function validateAccount(input: string) {
21
-
if (URL_CHANNEL_REGEX.exec(input)) return input.split("/channel/")[1];
22
-
if (URL_HANDLE_REGEX.exec(input)) return input.split("/@")[1];
20
+
if (URL_CHANNEL_REGEX.test(input)) return input.split("/channel/")[1];
21
+
if (URL_HANDLE_REGEX.test(input)) return input.split("/@")[1];
23
22
24
-
if (CHANNEL_ID.exec(input)) return input;
25
-
if (CHANNE_HANDLE.exec(input)) return input.replace("@", "");
23
+
if (CHANNEL_ID.test(input)) return input;
24
+
if (CHANNE_HANDLE.test(input)) return input.replace("@", "");
26
25
27
26
return null;
28
27
}
+2
-4
app/dashboard/[guildId]/notifications/delete.component.tsx
+2
-4
app/dashboard/[guildId]/notifications/delete.component.tsx
···
1
1
"use client";
2
2
3
-
4
-
import { useState } from "react";
5
-
import { HiTrash } from "react-icons/hi";
6
-
7
3
import { guildStore } from "@/common/guilds";
8
4
import Modal from "@/components/modal";
9
5
import { Button } from "@/components/ui/button";
10
6
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
7
+
import { useState } from "react";
8
+
import { HiTrash } from "react-icons/hi";
11
9
12
10
interface Props {
13
11
id: string | null;
+6
-7
app/dashboard/[guildId]/notifications/page.tsx
+6
-7
app/dashboard/[guildId]/notifications/page.tsx
···
1
1
"use client";
2
2
3
-
import { LoaderCircleIcon } from "lucide-react";
4
-
import Image from "next/image";
5
-
import { useParams } from "next/navigation";
6
-
import { type ReactNode, useMemo } from "react";
7
-
import { HiChat, HiViewGridAdd } from "react-icons/hi";
8
-
import { useQuery } from "react-query";
9
-
10
3
import { guildStore } from "@/common/guilds";
11
4
import Fetch from "@/components/button-fetch";
12
5
import { ClientBadge } from "@/components/client";
···
25
18
import { BitfieldManager, bitfieldToArray } from "@/utils/bitfields";
26
19
import { createSelectableItems } from "@/utils/create-selectable-items";
27
20
import { getCanonicalUrl } from "@/utils/urls";
21
+
import { LoaderCircleIcon } from "lucide-react";
22
+
import Image from "next/image";
23
+
import { useParams } from "next/navigation";
24
+
import { type ReactNode, useMemo } from "react";
25
+
import { HiChat, HiViewGridAdd } from "react-icons/hi";
26
+
import { useQuery } from "react-query";
28
27
29
28
import { hasBlueskyPost } from "./api";
30
29
import { DeleteNotification } from "./delete.component";
+4
-5
app/dashboard/[guildId]/notifications/select.component.tsx
+4
-5
app/dashboard/[guildId]/notifications/select.component.tsx
···
1
-
import { PopoverClose } from "@radix-ui/react-popover";
2
-
import React, { useState } from "react";
3
-
import { BsReddit, BsTwitch, BsYoutube } from "react-icons/bs";
4
-
import { FaBluesky } from "react-icons/fa6";
5
-
6
1
import { badgeVariants } from "@/components/ui/badge";
7
2
import { Button } from "@/components/ui/button";
8
3
import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover";
9
4
import { type ApiV1GuildsModulesNotificationsGetResponse, NotificationType } from "@/typings";
10
5
import { cn } from "@/utils/cn";
6
+
import { PopoverClose } from "@radix-ui/react-popover";
7
+
import React, { useState } from "react";
8
+
import { BsReddit, BsTwitch, BsYoutube } from "react-icons/bs";
9
+
import { FaBluesky } from "react-icons/fa6";
11
10
12
11
import { BlueskyNotificationModal } from "./create-bluesky.component";
13
12
import { RedditNotificationModal } from "./create-reddit.component";
+5
-7
app/dashboard/[guildId]/notifications/style.component.tsx
+5
-7
app/dashboard/[guildId]/notifications/style.component.tsx
···
1
1
"use client";
2
-
import Link from "next/link";
3
-
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
-
import { HiOutlineUpload, HiPencil, HiSparkles, HiX } from "react-icons/hi";
5
-
6
2
import { guildStore } from "@/common/guilds";
7
3
import { DiscordMarkdown } from "@/components/discord/markdown";
8
4
import DiscordMessage from "@/components/discord/message";
···
14
10
import type { ApiError, ApiV1GuildsModulesNotificationsGetResponse, ApiV1GuildsModulesNotificationStylePatchResponse } from "@/typings";
15
11
import { State } from "@/utils/captcha";
16
12
import { cn } from "@/utils/cn";
13
+
import Link from "next/link";
14
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
15
+
import { HiOutlineUpload, HiPencil, HiSparkles, HiX } from "react-icons/hi";
17
16
18
17
const ALLOWED_FILE_TYPES = ["image/png", "image/jpeg", "image/webp"];
19
-
const MAX_FILE_SIZE = 8 * 1024 * 1024;
18
+
const MAX_FILE_SIZE = 8 * 1_024 * 1_024;
20
19
21
20
export function NotificationStyle({
22
21
item,
···
224
223
}
225
224
226
225
if (file.size > MAX_FILE_SIZE) {
227
-
setError(`File size must be less than ${MAX_FILE_SIZE / 1024 / 1024}MiB`);
226
+
setError(`File size must be less than ${MAX_FILE_SIZE / 1_024 / 1_024}MiB`);
228
227
return;
229
228
}
230
-
231
229
232
230
file.arrayBuffer().then((buffer) => {
233
231
setAvatar(buffer);
+3
-4
app/dashboard/[guildId]/page.tsx
+3
-4
app/dashboard/[guildId]/page.tsx
···
1
1
"use client";
2
2
3
-
import { useParams } from "next/navigation";
4
-
import { HiChartBar } from "react-icons/hi";
5
-
6
3
import { guildStore } from "@/common/guilds";
7
4
import Switch from "@/components/inputs/switch";
8
5
import { Section } from "@/components/section";
6
+
import { useParams } from "next/navigation";
7
+
import { HiChartBar } from "react-icons/hi";
9
8
10
-
import { OverviewLink } from "../../../components/overview-link";
11
9
import { BotStyle } from "./style.component";
12
10
import { TTSSettings } from "./tts.component";
13
11
import FollowUpdates from "./updates.component";
12
+
import { OverviewLink } from "../../../components/overview-link";
14
13
15
14
export default function Home() {
16
15
const guild = guildStore((g) => g);
+1
-2
app/dashboard/[guildId]/starboard/hooks.ts
+1
-2
app/dashboard/[guildId]/starboard/hooks.ts
+6
-7
app/dashboard/[guildId]/starboard/page.tsx
+6
-7
app/dashboard/[guildId]/starboard/page.tsx
···
1
1
"use client";
2
2
3
-
import Image from "next/image";
4
-
import Link from "next/link";
5
-
import { useParams } from "next/navigation";
6
-
import { HiExternalLink } from "react-icons/hi";
7
-
8
3
import { guildStore } from "@/common/guilds";
9
4
import { DiscordMarkdown } from "@/components/discord/markdown";
10
5
import DiscordMessage from "@/components/discord/message";
···
19
14
import { useApi } from "@/lib/api/hook";
20
15
import { type ApiV1GuildsModulesStarboardGetResponse, StarboardStyle } from "@/typings";
21
16
import { createSelectableItems } from "@/utils/create-selectable-items";
17
+
import Image from "next/image";
18
+
import Link from "next/link";
19
+
import { useParams } from "next/navigation";
20
+
import { HiExternalLink } from "react-icons/hi";
22
21
23
22
import { useExample } from "./hooks";
24
23
···
222
221
defaultState={data.blacklistChannelIds || []}
223
222
max={500}
224
223
disabled={!data.enabled}
225
-
onSave={(o) => edit("blacklistChannelIds", o.map(({ value }) => value as string))}
224
+
onSave={(o) => edit("blacklistChannelIds", o.map(({ value }) => value))}
226
225
/>
227
226
</div>
228
227
<div className="lg:w-1/2">
···
235
234
defaultState={data.blacklistRoleIds || []}
236
235
max={500}
237
236
disabled={!data.enabled}
238
-
onSave={(o) => edit("blacklistChannelIds", o.map(({ value }) => value as string))}
237
+
onSave={(o) => edit("blacklistChannelIds", o.map(({ value }) => value))}
239
238
/>
240
239
</div>
241
240
</div>
+7
-9
app/dashboard/[guildId]/style.component.tsx
+7
-9
app/dashboard/[guildId]/style.component.tsx
···
1
1
"use client";
2
-
import Image from "next/image";
3
-
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
-
import { HiOutlineUpload, HiPencil, HiX } from "react-icons/hi";
5
-
6
2
import { guildStore } from "@/common/guilds";
7
3
import DiscordMessage from "@/components/discord/message";
8
4
import DumbTextInput from "@/components/inputs/dumb-text-input";
···
13
9
import { type ApiError, type ApiV1GuildsGetResponse, type ApiV1GuildsStylePatchResponse, GuildFlags } from "@/typings";
14
10
import { State } from "@/utils/captcha";
15
11
import { cn } from "@/utils/cn";
12
+
import Image from "next/image";
13
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
14
+
import { HiOutlineUpload, HiPencil, HiX } from "react-icons/hi";
16
15
17
16
const ALLOWED_FILE_TYPES = ["image/jpg", "image/jpeg", "image/png", "image/webp", "image/gif", "image/apng"];
18
-
const MAX_FILE_SIZE = 8 * 1024 * 1024;
17
+
const MAX_FILE_SIZE = 8 * 1_024 * 1_024;
19
18
20
19
export function BotStyle() {
21
20
const guild = guildStore((g) => g!);
···
40
39
41
40
<div className="space-y-2">
42
41
<span className="text-3xl font-medium text-primary-foreground">
43
-
{guild.style.username ? guild.style.username : "Wamellow"}
42
+
{guild.style.username || "Wamellow"}
44
43
</span>
45
44
<div className="flex">
46
45
<Button onClick={() => setOpen(true)}>
···
186
185
if (!name || !valid) return new Error("Invalid name");
187
186
188
187
const formData = new FormData();
189
-
formData.append("json_payload", JSON.stringify({ username: name, bio: bio }));
188
+
formData.append("json_payload", JSON.stringify({ username: name, bio }));
190
189
if (avatar && typeof avatar !== "string") formData.append("file[0]", new Blob([avatar]), "avatar");
191
190
if (banner && typeof banner !== "string") formData.append("file[1]", new Blob([banner]), "banner");
192
191
···
293
292
}
294
293
295
294
if (file.size > MAX_FILE_SIZE) {
296
-
setError(`File size must be less than ${MAX_FILE_SIZE / 1024 / 1024}MiB`);
295
+
setError(`File size must be less than ${MAX_FILE_SIZE / 1_024 / 1_024}MiB`);
297
296
return;
298
297
}
299
-
300
298
301
299
file.arrayBuffer().then((buffer) => {
302
300
setBuf(buffer);
+5
-6
app/dashboard/[guildId]/tts.component.tsx
+5
-6
app/dashboard/[guildId]/tts.component.tsx
···
1
-
import { ChannelType } from "discord-api-types/v10";
2
-
import { useParams } from "next/navigation";
3
-
import { useCallback } from "react";
4
-
5
1
import { type Guild, guildStore } from "@/common/guilds";
6
2
import NumberInput from "@/components/inputs/number-input";
7
3
import SelectMenu from "@/components/inputs/select-menu";
8
4
import Switch from "@/components/inputs/switch";
9
5
import { TTSFaq } from "@/components/tts-faq";
10
6
import { createSelectableItems } from "@/utils/create-selectable-items";
7
+
import { ChannelType } from "discord-api-types/v10";
8
+
import { useParams } from "next/navigation";
9
+
import { useCallback } from "react";
11
10
12
11
export function TTSSettings() {
13
12
const guild = guildStore((g) => g);
···
89
88
description="The maximum length of a message that can be spoken."
90
89
url={`/guilds/${params.guildId}`}
91
90
dataName="tts.maxLength"
92
-
defaultState={guild?.tts.maxLength || 4000}
93
-
max={4000}
91
+
defaultState={guild?.tts.maxLength || 4_000}
92
+
max={4_000}
94
93
onSave={(value) => edit("maxLength", value)}
95
94
/>
96
95
</div>
+4
-5
app/dashboard/[guildId]/updates.component.tsx
+4
-5
app/dashboard/[guildId]/updates.component.tsx
···
1
1
"use client";
2
2
3
-
import { useState } from "react";
4
-
import { HiMail } from "react-icons/hi";
5
-
6
3
import { guildStore } from "@/common/guilds";
7
4
import SelectMenu from "@/components/inputs/select-menu";
8
5
import Modal from "@/components/modal";
9
6
import { createSelectableItems } from "@/utils/create-selectable-items";
7
+
import { useState } from "react";
8
+
import { HiMail } from "react-icons/hi";
10
9
11
10
export default function FollowUpdates() {
12
11
const guild = guildStore((g) => g);
···
44
43
<Modal
45
44
title="Wamellow updates"
46
45
className="!overflow-visible"
47
-
isOpen={open && !!guild}
46
+
isOpen={open && Boolean(guild)}
48
47
onClose={() => setOpen(false)}
49
48
onSubmit={() => {
50
49
return fetch(`${process.env.NEXT_PUBLIC_API}/guilds/${guild?.id}/follow-updates`, {
···
63
62
if (!g) return g;
64
63
65
64
g.follownewsChannel = {
66
-
name: g!.channels!.find((c) => c.id === channelId)!.name,
65
+
name: g.channels!.find((c) => c.id === channelId)!.name,
67
66
id: channelId!
68
67
};
69
68
+2
-2
app/dashboard/page.tsx
+2
-2
app/dashboard/page.tsx
···
13
13
14
14
const params = new URLSearchParams();
15
15
16
-
Object.keys(obj).forEach((key) => {
16
+
for (const key of Object.keys(obj)) {
17
17
const value = obj[key];
18
18
if (value !== null && value !== undefined) {
19
19
params.append(key, value.toString());
20
20
}
21
-
});
21
+
}
22
22
23
23
return params.toString();
24
24
}
+6
-7
app/docs/[...pathname]/layout.tsx
+6
-7
app/docs/[...pathname]/layout.tsx
···
1
-
import type { Metadata } from "next";
2
-
import Link from "next/link";
3
-
import { BsDiscord, BsGithub } from "react-icons/bs";
4
-
import { HiUserAdd, HiViewGridAdd } from "react-icons/hi";
5
-
6
1
import { Footer } from "@/components/footer";
7
2
import { LinkButton } from "@/components/ui/button";
8
3
import { Separator } from "@/components/ui/separator";
9
4
import metadata from "@/public/docs/meta.json";
10
5
import { getBaseUrl, getCanonicalUrl } from "@/utils/urls";
6
+
import type { Metadata } from "next";
7
+
import Link from "next/link";
8
+
import { BsDiscord, BsGithub } from "react-icons/bs";
9
+
import { HiUserAdd, HiViewGridAdd } from "react-icons/hi";
11
10
12
11
interface Props {
13
12
params: Promise<{ pathname: string[]; }>;
···
26
25
const images = {
27
26
url: meta?.image || `${getBaseUrl()}/waya-v3.webp?v=2`,
28
27
alt: meta?.description,
29
-
heigth: 1008,
30
-
width: 1935
28
+
heigth: 1_008,
29
+
width: 1_935
31
30
};
32
31
33
32
return {
+1
-2
app/docs/[...pathname]/page.tsx
+1
-2
app/docs/[...pathname]/page.tsx
···
1
-
import { readFile } from "fs/promises";
2
-
3
1
import { Faq } from "@/app/(home)/faq.component";
4
2
import BeautifyMarkdown from "@/components/markdown";
5
3
import Notice, { NoticeType } from "@/components/notice";
6
4
import { ScreenMessage } from "@/components/screen-message";
7
5
import { Badge } from "@/components/ui/badge";
8
6
import metadata from "@/public/docs/meta.json";
7
+
import { readFile } from "fs/promises";
9
8
10
9
interface Props {
11
10
params: Promise<{ pathname: string[]; }>;
+6
-8
app/layout.tsx
+6
-8
app/layout.tsx
···
1
1
import "./globals.css";
2
-
2
+
import { Header } from "@/components/header";
3
+
import { LoginButton } from "@/components/login-button";
4
+
import { Button } from "@/components/ui/button";
5
+
import { Separator } from "@/components/ui/separator";
6
+
import { cn } from "@/utils/cn";
7
+
import { getBaseUrl } from "@/utils/urls";
3
8
import type { Metadata, Viewport } from "next";
4
9
import { Lexend, Noto_Sans_JP, Outfit } from "next/font/google";
5
10
import { cookies } from "next/headers";
···
7
12
import Link from "next/link";
8
13
import Script from "next/script";
9
14
import { CookiesProvider } from "next-client-cookies/server";
10
-
11
-
import { Header } from "@/components/header";
12
-
import { LoginButton } from "@/components/login-button";
13
-
import { Button } from "@/components/ui/button";
14
-
import { Separator } from "@/components/ui/separator";
15
-
import { cn } from "@/utils/cn";
16
-
import { getBaseUrl } from "@/utils/urls";
17
15
18
16
import { Provider } from "./provider";
19
17
+1
-2
app/leaderboard/[guildId]/icon.component.tsx
+1
-2
app/leaderboard/[guildId]/icon.component.tsx
···
1
-
import type { SVGProps } from "react";
2
-
3
1
import InvitesIcon from "@/components/icons/invites";
4
2
import MessagesIcon from "@/components/icons/messages";
5
3
import VoiceIcon from "@/components/icons/voice";
6
4
import { cn } from "@/utils/cn";
5
+
import type { SVGProps } from "react";
7
6
8
7
type Props = SVGProps<SVGSVGElement> & {
9
8
type: "messages" | "voiceminutes" | "invites";
+7
-8
app/leaderboard/[guildId]/layout.tsx
+7
-8
app/leaderboard/[guildId]/layout.tsx
···
1
-
import type { Metadata } from "next";
2
-
import Image from "next/image";
3
-
import { HiAnnotation, HiLink, HiUsers, HiVolumeUp } from "react-icons/hi";
4
-
5
1
import { ClientImageWall } from "@/components/client";
6
2
import ImageReduceMotion from "@/components/image-reduce-motion";
7
3
import { ListTab } from "@/components/list";
···
9
5
import paintPic from "@/public/paint.webp";
10
6
import { intl } from "@/utils/numbers";
11
7
import { getCanonicalUrl } from "@/utils/urls";
8
+
import type { Metadata } from "next";
9
+
import Image from "next/image";
10
+
import { HiAnnotation, HiLink, HiUsers, HiVolumeUp } from "react-icons/hi";
12
11
13
12
import { getDesign, getPagination } from "./api";
14
13
import Side from "./side.component";
···
18
17
children: React.ReactNode;
19
18
}
20
19
21
-
export const revalidate = 3600;
20
+
export const revalidate = 3_600;
22
21
23
22
export const generateMetadata = async ({ params }: Props): Promise<Metadata> => {
24
23
const { guildId } = await params;
···
46
45
type: "profile",
47
46
images: {
48
47
url: getCanonicalUrl("leaderboard", guildId, `open-graph.png?ca=${cacheQuery}`),
49
-
width: 1200,
48
+
width: 1_200,
50
49
height: 630,
51
50
type: "image/png"
52
51
}
···
85
84
classNames={{ img: "!h-36 md:!h-64", blurredImg: "!h-40 md:!h-72 -top-5" }}
86
85
isBlurred
87
86
src={design && "bannerUrl" in design && design.bannerUrl ? design.bannerUrl : paintPic.src}
88
-
width={3840 / 2}
89
-
height={2160 / 2}
87
+
width={3_840 / 2}
88
+
height={2_160 / 2}
90
89
/>
91
90
92
91
<div
+1
-1
app/leaderboard/[guildId]/loading.tsx
+1
-1
app/leaderboard/[guildId]/loading.tsx
···
1
1
import { Skeleton } from "@/components/ui/skeleton";
2
2
3
3
export default function Loading() {
4
-
return new Array(20).fill(null).map((_, i) => (
4
+
return Array.from({ length: 20 }).fill(null).map((_, i) => (
5
5
<div
6
6
key={"leaderboard-loading-" + i}
7
7
className="mb-4 rounded-md p-3 flex items-center dark:bg-wamellow bg-wamellow-100 w-full"
+9
-10
app/leaderboard/[guildId]/member.component.tsx
+9
-10
app/leaderboard/[guildId]/member.component.tsx
···
1
-
import { cookies } from "next/headers";
2
-
import Image from "next/image";
3
-
import Link from "next/link";
4
-
import { HiBadgeCheck } from "react-icons/hi";
5
-
6
1
import { ClientBadge, ClientCircularProgress } from "@/components/client";
7
2
import DiscordAppBadge from "@/components/discord/app-badge";
8
3
import ImageReduceMotion from "@/components/image-reduce-motion";
···
11
6
import getAverageColor from "@/utils/average-color";
12
7
import { cn } from "@/utils/cn";
13
8
import { intl } from "@/utils/numbers";
9
+
import { cookies } from "next/headers";
10
+
import Image from "next/image";
11
+
import Link from "next/link";
12
+
import { HiBadgeCheck } from "react-icons/hi";
14
13
15
14
import Icon from "./icon.component";
16
15
···
42
41
43
42
jar.set(
44
43
"lbc",
45
-
currentCircular !== "server"
46
-
? "server"
47
-
: "next"
44
+
currentCircular === "server"
45
+
? "next"
46
+
: "server"
48
47
);
49
48
}
50
49
···
108
107
{member.emoji &&
109
108
<div className="w-full hidden sm:block relative mr-6 -ml-48 md:-ml-6 lg:ml-6">
110
109
<div className="grid grid-cols-2 sm:grid-cols-4 md:grid-cols-3 lg:grid-cols-6 w-full gap-2 absolute -bottom-9 rotate-1">
111
-
{new Array(12).fill(0).map((_, i) =>
110
+
{Array.from({ length: 12 }).fill(0).map((_, i) =>
112
111
<Emoji
113
112
key={"emoji-" + member.id + i}
114
113
index={i}
···
148
147
value={
149
148
currentCircular === "next"
150
149
? (member.activity[type] * 100) / (members[index - 1]?.activity[type] || 1)
151
-
: (member.activity[type] * 100) / parseInt(pagination[type].total.toString())
150
+
: (member.activity[type] * 100) / Number.parseInt(pagination[type].total.toString(), 10)
152
151
|| 100
153
152
}
154
153
showValueLabel={true}
+5
-6
app/leaderboard/[guildId]/open-graph.png/route.tsx
+5
-6
app/leaderboard/[guildId]/open-graph.png/route.tsx
···
1
1
/* eslint-disable react/no-unknown-property */
2
2
/* eslint-disable @next/next/no-img-element */
3
3
4
-
import { readFile } from "fs/promises";
5
-
import { ImageResponse } from "next/og";
6
-
import type { NextRequest } from "next/server";
7
-
8
4
import { getGuild } from "@/lib/api";
9
5
import { intl } from "@/utils/numbers";
10
6
import { truncate } from "@/utils/truncate";
11
7
import { getCanonicalUrl } from "@/utils/urls";
8
+
import { readFile } from "fs/promises";
9
+
import { ImageResponse } from "next/og";
10
+
import type { NextRequest } from "next/server";
12
11
13
12
import { getTopMembers } from "../api";
14
13
import Icon from "../icon.component";
···
17
16
params: Promise<{ guildId: string; }>;
18
17
}
19
18
20
-
export const revalidate = 3600; // 1 hour
19
+
export const revalidate = 3_600; // 1 hour
21
20
22
21
export async function GET(request: NextRequest, { params }: Props) {
23
22
const { guildId } = await params;
···
88
87
</div>
89
88
),
90
89
{
91
-
width: 1200,
90
+
width: 1_200,
92
91
height: 630,
93
92
fonts: [
94
93
{
+4
-5
app/leaderboard/[guildId]/page.tsx
+4
-5
app/leaderboard/[guildId]/page.tsx
···
1
+
import { ScreenMessage } from "@/components/screen-message";
2
+
import { getGuild } from "@/lib/api";
1
3
import { cookies } from "next/headers";
2
4
import { redirect } from "next/navigation";
3
5
4
-
import { ScreenMessage } from "@/components/screen-message";
5
-
import { getGuild } from "@/lib/api";
6
-
7
6
import { getPagination, getTopMembers } from "./api";
8
7
import Member from "./member.component";
9
8
import Pagination from "./pagination.component";
10
9
11
-
export const revalidate = 3600;
10
+
export const revalidate = 3_600;
12
11
13
12
interface Props {
14
13
params: Promise<{ guildId: string; }>;
···
25
24
const jar = await cookies();
26
25
27
26
const type = search.type || "messages";
28
-
const page = parseInt(search.page || "1");
27
+
const page = Number.parseInt(search.page || "1", 10);
29
28
30
29
if (page !== 1 && !jar.get("session")) {
31
30
redirect(`/login?callback=/leaderboard/${guildId}%3Ftype%3Dmessages%3Fpage=${page}`);
+2
-3
app/leaderboard/[guildId]/pagination.component.tsx
+2
-3
app/leaderboard/[guildId]/pagination.component.tsx
···
1
1
"use client";
2
2
3
+
import { LoginButton } from "@/components/login-button";
3
4
import { Pagination as UiPagination } from "@nextui-org/react";
4
5
import { useRouter } from "next/navigation";
5
6
import { useCookies } from "next-client-cookies";
6
-
7
-
import { LoginButton } from "@/components/login-button";
8
7
9
8
interface Props {
10
9
searchParams: {
···
30
29
showControls
31
30
total={pages}
32
31
size="lg"
33
-
page={parseInt(searchParams.page || "0")}
32
+
page={Number.parseInt(searchParams.page || "0", 10)}
34
33
onChange={(now) => {
35
34
const params = new URLSearchParams(searchParams);
36
35
params.delete("page");
+11
-12
app/leaderboard/[guildId]/side.component.tsx
+11
-12
app/leaderboard/[guildId]/side.component.tsx
···
1
1
"use client";
2
2
3
-
import { Accordion, AccordionItem, Code } from "@nextui-org/react";
4
-
import Link from "next/link";
5
-
import { useRouter } from "next/navigation";
6
-
import { useCookies } from "next-client-cookies";
7
-
import { useState } from "react";
8
-
import { BsDiscord } from "react-icons/bs";
9
-
import { HiAnnotation, HiLink, HiTrash, HiViewGridAdd, HiVolumeUp } from "react-icons/hi";
10
-
11
3
import Ad from "@/components/ad";
12
4
import Modal from "@/components/modal";
13
5
import Notice, { NoticeType } from "@/components/notice";
···
16
8
import type { ApiError, ApiV1GuildsGetResponse, ApiV1GuildsTopmembersPaginationGetResponse } from "@/typings";
17
9
import { intl } from "@/utils/numbers";
18
10
import { getCanonicalUrl } from "@/utils/urls";
11
+
import { Accordion, AccordionItem, Code } from "@nextui-org/react";
12
+
import Link from "next/link";
13
+
import { useRouter } from "next/navigation";
14
+
import { useCookies } from "next-client-cookies";
15
+
import { useState } from "react";
16
+
import { BsDiscord } from "react-icons/bs";
17
+
import { HiAnnotation, HiLink, HiTrash, HiViewGridAdd, HiVolumeUp } from "react-icons/hi";
19
18
20
19
export default function Side({
21
20
guild,
···
83
82
className="w-full justify-start mt-2"
84
83
>
85
84
<Link
86
-
href={getCanonicalUrl("dashboard", guild.id as string)}
85
+
href={getCanonicalUrl("dashboard", guild.id)}
87
86
>
88
87
<HiViewGridAdd />
89
88
Dashboard
···
133
132
<br />
134
133
<br />
135
134
The percentage {
136
-
cookies.get("lbc") !== "server"
137
-
? "indicates the gap in messages needed to surpass the next user"
138
-
: "reflects the contribution of server activity from that user"
135
+
cookies.get("lbc") === "server"
136
+
? "reflects the contribution of server activity from that user"
137
+
: "indicates the gap in messages needed to surpass the next user"
139
138
}.
140
139
</AccordionItem>
141
140
+2
-3
app/login/open-graph/page.tsx
+2
-3
app/login/open-graph/page.tsx
···
1
+
import { getCanonicalUrl } from "@/utils/urls";
1
2
import type { Metadata } from "next";
2
3
import { headers } from "next/headers";
3
4
import { redirect } from "next/navigation";
4
-
5
-
import { getCanonicalUrl } from "@/utils/urls";
6
5
7
6
export const generateMetadata = (): Metadata => {
8
7
const title = "Login with Discord";
···
22
21
type: "website",
23
22
images: {
24
23
url,
25
-
width: 1200,
24
+
width: 1_200,
26
25
height: 630,
27
26
type: "image/png"
28
27
}
+2
-3
app/login/route.ts
+2
-3
app/login/route.ts
···
1
+
import { defaultCookieOptions } from "@/lib/cookies";
2
+
import { getCanonicalUrl } from "@/utils/urls";
1
3
import { PermissionFlagsBits } from "discord-api-types/v10";
2
4
import { cookies } from "next/headers";
3
5
import { redirect } from "next/navigation";
4
-
5
-
import { defaultCookieOptions } from "@/lib/cookies";
6
-
import { getCanonicalUrl } from "@/utils/urls";
7
6
8
7
import { createSession } from "./api";
9
8
+10
-11
app/passport/[guildId]/page.tsx
+10
-11
app/passport/[guildId]/page.tsx
···
1
-
import type { Metadata } from "next";
2
-
import { cookies } from "next/headers";
3
-
import Image from "next/image";
4
-
import Link from "next/link";
5
-
import { BsDiscord } from "react-icons/bs";
6
-
import { HiChartBar, HiCheck, HiLightningBolt, HiLockClosed, HiStar, HiUsers, HiX } from "react-icons/hi";
7
-
8
1
import { ClientButton } from "@/components/client";
9
2
import ImageReduceMotion from "@/components/image-reduce-motion";
10
3
import { ListFeature } from "@/components/list";
···
14
7
import paintPic from "@/public/paint.webp";
15
8
import { intl } from "@/utils/numbers";
16
9
import { getCanonicalUrl } from "@/utils/urls";
10
+
import type { Metadata } from "next";
11
+
import { cookies } from "next/headers";
12
+
import Image from "next/image";
13
+
import Link from "next/link";
14
+
import { BsDiscord } from "react-icons/bs";
15
+
import { HiChartBar, HiCheck, HiLightningBolt, HiLockClosed, HiStar, HiUsers, HiX } from "react-icons/hi";
17
16
18
17
import { getPassport } from "./api";
19
18
import { Verify } from "./verify.component";
···
165
164
<div className="mb-4 text-neutral-100 font-semibold text-xl">Modern, Simple, Wamellow 👋</div>
166
165
<ListFeature
167
166
items={[
168
-
{ icon: <HiLockClosed />, title: "Secure", description: "Wamellow does not store your IP, Geolocation or similar, nothing is kept, no logs.", color: 0xa84b56 },
169
-
{ icon: <BsDiscord />, title: "Integration", description: "Unparalleled Discord integration, setting us apart from the rest.", color: 0x4752c4 },
170
-
{ icon: <HiStar />, title: "Easy", description: "The most user-friendly and visually appealing verification process.", color: 0x7f43d8 },
171
-
{ icon: <HiLightningBolt />, title: "Fast", description: "Welcome new members easily with the fastest verification method available.", color: 0xff9156 }
167
+
{ icon: <HiLockClosed />, title: "Secure", description: "Wamellow does not store your IP, Geolocation or similar, nothing is kept, no logs.", color: 0xA8_4B_56 },
168
+
{ icon: <BsDiscord />, title: "Integration", description: "Unparalleled Discord integration, setting us apart from the rest.", color: 0x47_52_C4 },
169
+
{ icon: <HiStar />, title: "Easy", description: "The most user-friendly and visually appealing verification process.", color: 0x7F_43_D8 },
170
+
{ icon: <HiLightningBolt />, title: "Fast", description: "Welcome new members easily with the fastest verification method available.", color: 0xFF_91_56 }
172
171
]}
173
172
/>
174
173
</div>
+5
-6
app/passport/[guildId]/verify.component.tsx
+5
-6
app/passport/[guildId]/verify.component.tsx
···
1
1
"use client";
2
2
3
-
import Link from "next/link";
4
-
import { BsDiscord } from "react-icons/bs";
5
-
import { HiExclamation, HiFingerPrint, HiLockClosed } from "react-icons/hi";
6
-
import { TailSpin } from "react-loading-icons";
7
-
8
3
import { userStore } from "@/common/user";
9
4
import ImageReduceMotion from "@/components/image-reduce-motion";
10
5
import { Badge } from "@/components/ui/badge";
···
12
7
import type { ApiV1GuildsGetResponse } from "@/typings";
13
8
import { State, useCaptcha } from "@/utils/captcha";
14
9
import { cn } from "@/utils/cn";
10
+
import Link from "next/link";
11
+
import { BsDiscord } from "react-icons/bs";
12
+
import { HiExclamation, HiFingerPrint, HiLockClosed } from "react-icons/hi";
13
+
import { TailSpin } from "react-loading-icons";
15
14
16
15
interface Props {
17
16
guild: ApiV1GuildsGetResponse;
···
51
50
ref={button}
52
51
variant={state === State.Success ? "success" : "secondary"}
53
52
className={cn(error && "cursor-not-allowed", state === State.Success && "cursor-not-allowed", "font-medium w-full")}
54
-
disabled={!!error || state === State.Success}
53
+
disabled={Boolean(error) || state === State.Success}
55
54
>
56
55
{state === State.Loading
57
56
? <TailSpin stroke="#d4d4d4" strokeWidth={8} className="relative h-3 w-3 overflow-visible" />
+11
-13
app/profile/billing/page.tsx
+11
-13
app/profile/billing/page.tsx
···
1
1
"use client";
2
2
3
-
import { Turnstile, type TurnstileInstance } from "@marsidev/react-turnstile";
4
-
import Link from "next/link";
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
3
import { DonationSelect } from "@/app/(home)/premium/subscribe.component";
11
4
import { userStore } from "@/common/user";
12
5
import Box from "@/components/box";
···
22
15
import { Skeleton } from "@/components/ui/skeleton";
23
16
import { type ApiEdit, useApi } from "@/lib/api/hook";
24
17
import type { ApiV1UsersMeBillingGetResponse, ApiV1UsersMeGuildsGetResponse } from "@/typings";
25
-
18
+
import { Turnstile, type TurnstileInstance } from "@marsidev/react-turnstile";
19
+
import Link from "next/link";
20
+
import { useRef, useState } from "react";
21
+
import { GrAmex } from "react-icons/gr";
22
+
import { HiCreditCard, HiLightningBolt } from "react-icons/hi";
23
+
import { SiDinersclub, SiDiscover, SiJcb, SiMastercard, SiStripe, SiVisa } from "react-icons/si";
26
24
27
25
function isActive(status: ApiV1UsersMeBillingGetResponse["status"]): status is "active" | "trialing" | "past_due" {
28
26
return status === "active" || status === "trialing" || status === "past_due";
···
58
56
</>);
59
57
}
60
58
61
-
const periodEndsInDays = Math.floor((((data?.currentPeriodEnd || 0) - Date.now() / 1000) / (60 * 60 * 24)));
59
+
const periodEndsInDays = Math.floor((((data?.currentPeriodEnd || 0) - Date.now() / 1_000) / (60 * 60 * 24)));
62
60
const periodEndsInStr = `${periodEndsInDays > 1 ? "in " : ""}${periodEndsInDays === 0 ? "Today" : periodEndsInDays === 1 ? "Tomorrow" : periodEndsInDays} ${periodEndsInDays > 1 ? "days" : ""}`;
63
61
64
62
return (
···
102
100
? <Skeleton className="h-12 w-full" />
103
101
: (data?.cancelAtPeriodEnd
104
102
? <p>
105
-
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.
103
+
Your subscription will expire on <span className="font-semibold text-neutral-300">{new Date(data.currentPeriodEnd * 1_000).toLocaleDateString()}</span> and you will not be charged again.
106
104
</p>
107
105
: <p>
108
-
Your subscription will renew on <span className="font-semibold text-neutral-300">{new Date(data!.currentPeriodEnd * 1000).toLocaleDateString()}</span>, for a total of <span className="font-semibold text-neutral-300">EUR {(4 + (data!.donationQuantity || 0)).toFixed(2)}</span>.
106
+
Your subscription will renew on <span className="font-semibold text-neutral-300">{new Date(data!.currentPeriodEnd * 1_000).toLocaleDateString()}</span>, for a total of <span className="font-semibold text-neutral-300">EUR {(4 + (data!.donationQuantity || 0)).toFixed(2)}</span>.
109
107
110
108
You{"'"}re paying <span className="font-semibold text-neutral-300">EUR {(4).toFixed(2)} Premium</span> and <span className="font-semibold text-neutral-300">EUR {(data!.donationQuantity || 0).toFixed(2)} Donation{data!.donationQuantity ? "s" : ""}</span>
111
109
{" "}
···
233
231
name="Premium Guilds"
234
232
url="/users/@me/billing/premium-guilds"
235
233
dataName="guildIds"
236
-
items={data
237
-
?.filter((guild) => guild.bot)
234
+
items={(data || [])
235
+
.filter((guild) => guild.bot)
238
236
.map((guild) => ({
239
237
icon: (
240
238
<ImageReduceMotion
+6
-7
app/profile/connections/page.tsx
+6
-7
app/profile/connections/page.tsx
···
1
1
"use client";
2
2
3
-
import Image from "next/image";
4
-
import { useRouter } from "next/navigation";
5
-
import { useState } from "react";
6
-
import { BsSpotify } from "react-icons/bs";
7
-
import { HiFingerPrint, HiTrash } from "react-icons/hi";
8
-
import { SiBluesky } from "react-icons/si";
9
-
10
3
import DumbTextInput from "@/components/inputs/dumb-text-input";
11
4
import Modal from "@/components/modal";
12
5
import Notice, { NoticeType } from "@/components/notice";
···
15
8
import { useApi } from "@/lib/api/hook";
16
9
import { type ApiV1UsersMeConnectionsGetResponse, ConnectionType } from "@/typings";
17
10
import { cn } from "@/utils/cn";
11
+
import Image from "next/image";
12
+
import { useRouter } from "next/navigation";
13
+
import { useState } from "react";
14
+
import { BsSpotify } from "react-icons/bs";
15
+
import { HiFingerPrint, HiTrash } from "react-icons/hi";
16
+
import { SiBluesky } from "react-icons/si";
18
17
19
18
const CONNECTION_TYPES = Object
20
19
.entries(ConnectionType)
+14
-15
app/profile/layout.tsx
+14
-15
app/profile/layout.tsx
···
1
1
"use client";
2
2
3
-
import Link from "next/link";
4
-
import { redirect } from "next/navigation";
5
-
import { useCookies } from "next-client-cookies";
6
-
import { Suspense } from "react";
7
-
import CountUp from "react-countup";
8
-
import { HiCreditCard, HiCubeTransparent, HiFire, HiHome, HiPhotograph, HiTranslate } from "react-icons/hi";
9
-
import { useQuery } from "react-query";
10
-
11
3
import { userStore } from "@/common/user";
12
4
import ImageReduceMotion from "@/components/image-reduce-motion";
13
5
import { ListTab } from "@/components/list";
···
17
9
import { Skeleton } from "@/components/ui/skeleton";
18
10
import { cacheOptions, getData } from "@/lib/api";
19
11
import type { ApiV1UsersMeGetResponse } from "@/typings";
12
+
import Link from "next/link";
13
+
import { redirect } from "next/navigation";
14
+
import { useCookies } from "next-client-cookies";
15
+
import { Suspense } from "react";
16
+
import CountUp from "react-countup";
17
+
import { HiCreditCard, HiCubeTransparent, HiFire, HiHome, HiPhotograph, HiTranslate } from "react-icons/hi";
18
+
import { useQuery } from "react-query";
20
19
21
20
export default function RootLayout({
22
21
children
···
36
35
url,
37
36
() => getData<ApiV1UsersMeGetResponse>(url),
38
37
{
39
-
enabled: !!user?.id,
38
+
enabled: Boolean(user?.id),
40
39
onSuccess: (d) => userStore.setState({
41
40
...user,
42
41
extended: "status" in d ? {} : d
···
76
75
/>
77
76
</Skeleton>
78
77
79
-
{!user?.id ?
80
-
<div className="flex flex-col mt-2">
81
-
<Skeleton className="rounded-xl w-32 h-5 mb-2" />
82
-
<Skeleton className="rounded-md w-[90px] h-7" />
83
-
</div>
84
-
:
78
+
{user?.id ?
85
79
<div className="flex flex-col gap-1">
86
80
<div className="text-2xl dark:text-neutral-200 text-neutral-800 font-medium">
87
81
{user.globalName || user.username}
···
98
92
{user.extended?.voteCount} VOTE{user.extended?.voteCount === 1 ? "" : "S"}
99
93
</Badge>
100
94
</Link>
95
+
</div>
96
+
:
97
+
<div className="flex flex-col mt-2">
98
+
<Skeleton className="rounded-xl w-32 h-5 mb-2" />
99
+
<Skeleton className="rounded-md w-[90px] h-7" />
101
100
</div>
102
101
}
103
102
</div>
+7
-8
app/profile/page.tsx
+7
-8
app/profile/page.tsx
···
1
1
"use client";
2
2
3
-
import { motion } from "framer-motion";
4
-
import Link from "next/link";
5
-
import { useSearchParams } from "next/navigation";
6
-
import { useCookies } from "next-client-cookies";
7
-
import { useMemo, useState } from "react";
8
-
import { HiChartBar, HiRefresh, HiUserAdd, HiViewGridAdd } from "react-icons/hi";
9
-
10
3
import ImageReduceMotion from "@/components/image-reduce-motion";
11
4
import DumbTextInput from "@/components/inputs/dumb-text-input";
12
5
import { ScreenMessage } from "@/components/screen-message";
···
14
7
import { useApi } from "@/lib/api/hook";
15
8
import type { ApiV1UsersMeGuildsGetResponse } from "@/typings";
16
9
import { cn } from "@/utils/cn";
10
+
import { motion } from "framer-motion";
11
+
import Link from "next/link";
12
+
import { useSearchParams } from "next/navigation";
13
+
import { useCookies } from "next-client-cookies";
14
+
import { useMemo, useState } from "react";
15
+
import { HiChartBar, HiRefresh, HiUserAdd, HiViewGridAdd } from "react-icons/hi";
17
16
18
17
const MAX_GUILDS = 50 as const;
19
18
···
126
125
{isHuge && (
127
126
<ScreenMessage
128
127
title="There are too many servers.."
129
-
description={`To save some performance, use the search to find a guild. Showing ${MAX_GUILDS} out of ~${guilds.length < 1000 ? length : Math.round(length / 1000) * 1000}.`}
128
+
description={`To save some performance, use the search to find a guild. Showing ${MAX_GUILDS} out of ~${guilds.length < 1_000 ? length : Math.round(length / 1_000) * 1_000}.`}
130
129
/>
131
130
)}
132
131
</div>);
+6
-7
app/profile/rank/card-style.component.tsx
+6
-7
app/profile/rank/card-style.component.tsx
···
1
-
import type { ApiError } from "next/dist/server/api-utils";
2
-
import Image from "next/image";
3
-
import { type ChangeEvent, useRef, useState } from "react";
4
-
import { HiUpload } from "react-icons/hi";
5
-
6
1
import { type User, userStore } from "@/common/user";
7
2
import Box from "@/components/box";
8
3
import { Shiggy } from "@/components/shiggy";
···
11
6
import { cn } from "@/utils/cn";
12
7
import { deepMerge } from "@/utils/deepMerge";
13
8
import sleep from "@/utils/sleep";
9
+
import type { ApiError } from "next/dist/server/api-utils";
10
+
import Image from "next/image";
11
+
import { type ChangeEvent, useRef, useState } from "react";
12
+
import { HiUpload } from "react-icons/hi";
14
13
15
14
enum State {
16
15
Idle = 0,
···
60
59
return;
61
60
}
62
61
63
-
await sleep(1000 * 3);
62
+
await sleep(1_000 * 3);
64
63
setState(State.Success);
65
64
66
65
userStore.setState({
···
145
144
</div>
146
145
147
146
<div className="absolute blur-sm gap-4 grid grid-cols-6 left-4 lg:grid-cols-6 md:blur-none md:bottom-4 md:left-0 md:opacity-100 md:relative md:scale-100 md:top-0 md:w-1/2 opacity-45 rotate-1 scale-105 top-6 w-full">
148
-
{new Array(18).fill(0).map((_, i) =>
147
+
{Array.from({ length: 18 }).fill(0).map((_, i) =>
149
148
<Emoji
150
149
key={"emoji-" + i}
151
150
index={i}
+12
-13
app/profile/rank/leaderboard-style.component.tsx
+12
-13
app/profile/rank/leaderboard-style.component.tsx
···
1
-
import { useState } from "react";
2
-
3
1
import { type User, userStore } from "@/common/user";
4
2
import type { ApiError, ApiV1UsersMeGetResponse } from "@/typings";
5
3
import { cn } from "@/utils/cn";
6
4
import { deepMerge } from "@/utils/deepMerge";
5
+
import { useState } from "react";
7
6
8
7
export default function LeaderboardStyle() {
9
8
const user = userStore((s) => s);
···
58
57
: "dark:border-violet-400/60 dark:hover:border-violet-400 border-violet-600/60 hover:border-violet-600"
59
58
)}
60
59
>
61
-
{new Array(10).fill("").map((_, i) =>
60
+
{Array.from({ length: 10 }).fill("").map((_, i) =>
62
61
<div key={i} className="flex gap-2">
63
62
<div
64
63
className={cn(
···
89
88
<div
90
89
className={cn(
91
90
"border-2 duration-200 rounded-md p-4 mt-1 flex flex-col gap-2 group",
92
-
!user?.extended?.rank?.useLeaderboardList
93
-
? "dark:border-neutral-700 hover:border-neutral-500 border-neutral-300 "
94
-
: "dark:border-violet-400/60 dark:hover:border-violet-400 border-violet-600/60 hover:border-violet-600"
91
+
user?.extended?.rank?.useLeaderboardList
92
+
? "dark:border-violet-400/60 dark:hover:border-violet-400 border-violet-600/60 hover:border-violet-600"
93
+
: "dark:border-neutral-700 hover:border-neutral-500 border-neutral-300 "
95
94
)}
96
95
>
97
-
{new Array(8).fill("").map((_, i) =>
96
+
{Array.from({ length: 8 }).fill("").map((_, i) =>
98
97
<div key={i} className="flex gap-2">
99
98
<div
100
99
className={cn(
101
100
"duration-200 h-4 w-4 aspect-square rounded-full",
102
-
!user?.extended?.rank?.useLeaderboardList
103
-
? "dark:bg-neutral-700/90 dark:group-hover:bg-neutral-400/60 bg-neutral-300/90 group-hover:bg-neutral-600/60"
104
-
: "dark:bg-violet-400/50 dark:group-hover:bg-violet-400/70 bg-violet-600/50 group-hover:bg-violet-600/70"
101
+
user?.extended?.rank?.useLeaderboardList
102
+
? "dark:bg-violet-400/50 dark:group-hover:bg-violet-400/70 bg-violet-600/50 group-hover:bg-violet-600/70"
103
+
: "dark:bg-neutral-700/90 dark:group-hover:bg-neutral-400/60 bg-neutral-300/90 group-hover:bg-neutral-600/60"
105
104
)}
106
105
/>
107
106
<div
108
107
className={cn(
109
108
"duration-200 h-4 rounded-full",
110
-
!user?.extended?.rank?.useLeaderboardList
111
-
? "dark:bg-neutral-700/80 dark:group-hover:bg-neutral-400/50 bg-neutral-300/80 group-hover:bg-neutral-600/50"
112
-
: "dark:bg-violet-400/40 dark:group-hover:bg-violet-400/60 bg-violet-600/40 group-hover:bg-violet-600/60"
109
+
user?.extended?.rank?.useLeaderboardList
110
+
? "dark:bg-violet-400/40 dark:group-hover:bg-violet-400/60 bg-violet-600/40 group-hover:bg-violet-600/60"
111
+
: "dark:bg-neutral-700/80 dark:group-hover:bg-neutral-400/50 bg-neutral-300/80 group-hover:bg-neutral-600/50"
113
112
)}
114
113
style={{ width: `${30 + ((i % 1.7) + (i % 3) + (i % 2)) * 10}%` }}
115
114
/>
+3
-4
app/provider.tsx
+3
-4
app/provider.tsx
···
1
1
"use client";
2
2
3
+
import { guildStore } from "@/common/guilds";
4
+
import { TooltipProvider } from "@/components/ui/tooltip";
5
+
import { cn } from "@/utils/cn";
3
6
import { NextUIProvider } from "@nextui-org/react";
4
7
import { usePathname } from "next/navigation";
5
8
import { useCookies } from "next-client-cookies";
6
9
import { useEffect } from "react";
7
10
import { QueryClient, QueryClientProvider } from "react-query";
8
-
9
-
import { guildStore } from "@/common/guilds";
10
-
import { TooltipProvider } from "@/components/ui/tooltip";
11
-
import { cn } from "@/utils/cn";
12
11
13
12
const queryClient = new QueryClient();
14
13
+114
-176
bun.lock
+114
-176
bun.lock
···
56
56
"@types/react-dom": "^19.1.9",
57
57
"eslint": "^9.36.0",
58
58
"eslint-config-next": "^15.5.4",
59
-
"eslint-plugin-path-alias": "^2.1.0",
59
+
"eslint-plugin-import-x": "^4.16.1",
60
60
"eslint-plugin-react": "^7.37.5",
61
61
"eslint-plugin-react-compiler": "19.1.0-rc.2",
62
62
"eslint-plugin-react-hooks": "^5.2.0",
63
63
"eslint-plugin-simple-import-sort": "^12.1.1",
64
-
"eslint-plugin-unused-imports": "^4.2.0",
64
+
"eslint-plugin-unicorn": "^61.0.2",
65
65
"typescript-eslint": "^8.44.1",
66
66
},
67
67
},
···
101
101
102
102
"@babel/helper-string-parser": ["@babel/helper-string-parser@7.25.9", "", {}, "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="],
103
103
104
-
"@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="],
104
+
"@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="],
105
105
106
106
"@babel/helper-validator-option": ["@babel/helper-validator-option@7.25.9", "", {}, "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw=="],
107
107
···
125
125
126
126
"@discordjs/util": ["@discordjs/util@1.1.1", "", {}, "sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g=="],
127
127
128
-
"@emnapi/core": ["@emnapi/core@1.3.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.1", "tslib": "^2.4.0" } }, "sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog=="],
128
+
"@emnapi/core": ["@emnapi/core@1.5.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg=="],
129
129
130
130
"@emnapi/runtime": ["@emnapi/runtime@1.5.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ=="],
131
131
132
-
"@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw=="],
132
+
"@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="],
133
133
134
134
"@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="],
135
135
···
247
247
248
248
"@marsidev/react-turnstile": ["@marsidev/react-turnstile@1.3.1", "", { "peerDependencies": { "react": "^17.0.2 || ^18.0.0 || ^19.0", "react-dom": "^17.0.2 || ^18.0.0 || ^19.0" } }, "sha512-h2THG/75k4Y049hgjSGPIcajxXnh+IZAiXVbryQyVmagkboN7pJtBgR16g8akjwUBSfRrg6jw6KvPDjscQflog=="],
249
249
250
-
"@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=="],
250
+
"@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" } }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="],
251
251
252
252
"@next/env": ["@next/env@15.5.4", "", {}, "sha512-27SQhYp5QryzIT5uO8hq99C69eLQ7qkzkDPsk3N+GuS2XgOgoYEeOav7Pf8Tn4drECOVDsDg8oj+/DVy8qQL2A=="],
253
253
···
675
675
676
676
"@tanstack/virtual-core": ["@tanstack/virtual-core@3.11.2", "", {}, "sha512-vTtpNt7mKCiZ1pwU9hfKPhpdVO2sVzFQsxoVBGtOSHxlrRRzYr8iQ2TlwbAcRYCcEiZ9ECAM8kBzH0v2+VzfKw=="],
677
677
678
-
"@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="],
678
+
"@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
679
679
680
680
"@types/d3-array": ["@types/d3-array@3.2.1", "", {}, "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg=="],
681
681
···
747
747
748
748
"@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="],
749
749
750
+
"@unrs/resolver-binding-android-arm-eabi": ["@unrs/resolver-binding-android-arm-eabi@1.11.1", "", { "os": "android", "cpu": "arm" }, "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw=="],
751
+
752
+
"@unrs/resolver-binding-android-arm64": ["@unrs/resolver-binding-android-arm64@1.11.1", "", { "os": "android", "cpu": "arm64" }, "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g=="],
753
+
754
+
"@unrs/resolver-binding-darwin-arm64": ["@unrs/resolver-binding-darwin-arm64@1.11.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g=="],
755
+
756
+
"@unrs/resolver-binding-darwin-x64": ["@unrs/resolver-binding-darwin-x64@1.11.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ=="],
757
+
758
+
"@unrs/resolver-binding-freebsd-x64": ["@unrs/resolver-binding-freebsd-x64@1.11.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw=="],
759
+
760
+
"@unrs/resolver-binding-linux-arm-gnueabihf": ["@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1", "", { "os": "linux", "cpu": "arm" }, "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw=="],
761
+
762
+
"@unrs/resolver-binding-linux-arm-musleabihf": ["@unrs/resolver-binding-linux-arm-musleabihf@1.11.1", "", { "os": "linux", "cpu": "arm" }, "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw=="],
763
+
764
+
"@unrs/resolver-binding-linux-arm64-gnu": ["@unrs/resolver-binding-linux-arm64-gnu@1.11.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ=="],
765
+
766
+
"@unrs/resolver-binding-linux-arm64-musl": ["@unrs/resolver-binding-linux-arm64-musl@1.11.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w=="],
767
+
768
+
"@unrs/resolver-binding-linux-ppc64-gnu": ["@unrs/resolver-binding-linux-ppc64-gnu@1.11.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA=="],
769
+
770
+
"@unrs/resolver-binding-linux-riscv64-gnu": ["@unrs/resolver-binding-linux-riscv64-gnu@1.11.1", "", { "os": "linux", "cpu": "none" }, "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ=="],
771
+
772
+
"@unrs/resolver-binding-linux-riscv64-musl": ["@unrs/resolver-binding-linux-riscv64-musl@1.11.1", "", { "os": "linux", "cpu": "none" }, "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew=="],
773
+
774
+
"@unrs/resolver-binding-linux-s390x-gnu": ["@unrs/resolver-binding-linux-s390x-gnu@1.11.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg=="],
775
+
776
+
"@unrs/resolver-binding-linux-x64-gnu": ["@unrs/resolver-binding-linux-x64-gnu@1.11.1", "", { "os": "linux", "cpu": "x64" }, "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w=="],
777
+
778
+
"@unrs/resolver-binding-linux-x64-musl": ["@unrs/resolver-binding-linux-x64-musl@1.11.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA=="],
779
+
780
+
"@unrs/resolver-binding-wasm32-wasi": ["@unrs/resolver-binding-wasm32-wasi@1.11.1", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.11" }, "cpu": "none" }, "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ=="],
781
+
782
+
"@unrs/resolver-binding-win32-arm64-msvc": ["@unrs/resolver-binding-win32-arm64-msvc@1.11.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw=="],
783
+
784
+
"@unrs/resolver-binding-win32-ia32-msvc": ["@unrs/resolver-binding-win32-ia32-msvc@1.11.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ=="],
785
+
786
+
"@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.11.1", "", { "os": "win32", "cpu": "x64" }, "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g=="],
787
+
750
788
"@unrs/rspack-resolver-binding-darwin-arm64": ["@unrs/rspack-resolver-binding-darwin-arm64@1.1.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-myn6gHyM77Y6XXGls9Wkfuu+yexGkmhPBDmBUkThrbkXtHq38vsr7o1Dyzruiqtt/okSs0tFF9P77kI6wWF9iQ=="],
751
789
752
790
"@unrs/rspack-resolver-binding-darwin-x64": ["@unrs/rspack-resolver-binding-darwin-x64@1.1.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-A/5xK8zb8lJlom+mznrp9YA8lYzHjD2QcUdQ3PkWha8x996fPjSns4ilNYHW+eGXFcEAnfVwf78q9vYf59JJmA=="],
···
793
831
794
832
"aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="],
795
833
796
-
"arr-diff": ["arr-diff@4.0.0", "", {}, "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA=="],
797
-
798
-
"arr-union": ["arr-union@3.1.0", "", {}, "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q=="],
799
-
800
834
"array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="],
801
835
802
836
"array-includes": ["array-includes@3.1.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" } }, "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ=="],
803
-
804
-
"array-unique": ["array-unique@0.3.2", "", {}, "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ=="],
805
837
806
838
"array.prototype.findlast": ["array.prototype.findlast@1.2.5", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ=="],
807
839
···
814
846
"array.prototype.tosorted": ["array.prototype.tosorted@1.1.4", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA=="],
815
847
816
848
"arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="],
817
-
818
-
"assign-symbols": ["assign-symbols@1.0.0", "", {}, "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw=="],
819
849
820
850
"ast-types-flow": ["ast-types-flow@0.0.8", "", {}, "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ=="],
821
851
822
852
"async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="],
823
853
824
-
"atob": ["atob@2.1.2", "", { "bin": { "atob": "bin/atob.js" } }, "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="],
825
-
826
854
"autoprefixer": ["autoprefixer@10.4.21", "", { "dependencies": { "browserslist": "^4.24.4", "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ=="],
827
855
828
856
"available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="],
···
835
863
836
864
"balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
837
865
838
-
"base": ["base@0.11.2", "", { "dependencies": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", "component-emitter": "^1.2.1", "define-property": "^1.0.0", "isobject": "^3.0.1", "mixin-deep": "^1.2.0", "pascalcase": "^0.1.1" } }, "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg=="],
866
+
"baseline-browser-mapping": ["baseline-browser-mapping@2.8.9", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-hY/u2lxLrbecMEWSB0IpGzGyDyeoMFQhCvZd2jGFSE5I17Fh01sYUBPCJtkWERw7zrac9+cIghxm/ytJa2X8iA=="],
839
867
840
868
"big-integer": ["big-integer@1.6.52", "", {}, "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg=="],
841
869
···
849
877
850
878
"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=="],
851
879
852
-
"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=="],
880
+
"builtin-modules": ["builtin-modules@5.0.0", "", {}, "sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg=="],
853
881
854
882
"call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="],
855
883
···
867
895
868
896
"chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
869
897
898
+
"change-case": ["change-case@5.4.4", "", {}, "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w=="],
899
+
870
900
"character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="],
871
901
872
902
"character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="],
···
877
907
878
908
"chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="],
879
909
880
-
"class-utils": ["class-utils@0.3.6", "", { "dependencies": { "arr-union": "^3.1.0", "define-property": "^0.2.5", "isobject": "^3.0.0", "static-extend": "^0.1.1" } }, "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg=="],
910
+
"ci-info": ["ci-info@4.3.0", "", {}, "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ=="],
881
911
882
912
"class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="],
913
+
914
+
"clean-regexp": ["clean-regexp@1.0.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw=="],
883
915
884
916
"client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="],
885
917
886
918
"clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
887
919
888
-
"collection-visit": ["collection-visit@1.0.0", "", { "dependencies": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" } }, "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw=="],
889
-
890
920
"color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="],
891
921
892
922
"color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
···
901
931
902
932
"commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="],
903
933
904
-
"component-emitter": ["component-emitter@1.3.1", "", {}, "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ=="],
934
+
"comment-parser": ["comment-parser@1.4.1", "", {}, "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg=="],
905
935
906
936
"compute-scroll-into-view": ["compute-scroll-into-view@3.1.1", "", {}, "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw=="],
907
937
···
909
939
910
940
"convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="],
911
941
912
-
"copy-descriptor": ["copy-descriptor@0.1.1", "", {}, "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw=="],
942
+
"core-js-compat": ["core-js-compat@3.45.1", "", { "dependencies": { "browserslist": "^4.25.3" } }, "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA=="],
913
943
914
944
"countup.js": ["countup.js@2.8.0", "", {}, "sha512-f7xEhX0awl4NOElHulrl4XRfKoNH3rB+qfNSZZyjSZhaAoUk6elvhH+MNxMmlmuUJ2/QNTWPSA7U4mNtIAKljQ=="],
915
945
···
957
987
958
988
"decode-named-character-reference": ["decode-named-character-reference@1.1.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w=="],
959
989
960
-
"decode-uri-component": ["decode-uri-component@0.2.2", "", {}, "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ=="],
961
-
962
990
"deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="],
963
991
964
992
"deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="],
···
966
994
"define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="],
967
995
968
996
"define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="],
969
-
970
-
"define-property": ["define-property@2.0.2", "", { "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" } }, "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ=="],
971
997
972
998
"dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
973
999
···
1023
1049
1024
1050
"eslint-config-next": ["eslint-config-next@15.5.4", "", { "dependencies": { "@next/eslint-plugin-next": "15.5.4", "@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-BzgVVuT3kfJes8i2GHenC1SRJ+W3BTML11lAOYFOOPzrk2xp66jBOAGEFRw+3LkYCln5UzvFsLhojrshb5Zfaw=="],
1025
1051
1052
+
"eslint-import-context": ["eslint-import-context@0.1.9", "", { "dependencies": { "get-tsconfig": "^4.10.1", "stable-hash-x": "^0.2.0" }, "peerDependencies": { "unrs-resolver": "^1.0.0" }, "optionalPeers": ["unrs-resolver"] }, "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg=="],
1053
+
1026
1054
"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=="],
1027
1055
1028
1056
"eslint-import-resolver-typescript": ["eslint-import-resolver-typescript@3.9.1", "", { "dependencies": { "@nolyfill/is-core-module": "1.0.39", "debug": "^4.4.0", "get-tsconfig": "^4.10.0", "is-bun-module": "^1.3.0", "rspack-resolver": "^1.1.0", "stable-hash": "^0.0.5", "tinyglobby": "^0.2.12" }, "peerDependencies": { "eslint": "*", "eslint-plugin-import": "*", "eslint-plugin-import-x": "*" }, "optionalPeers": ["eslint-plugin-import", "eslint-plugin-import-x"] }, "sha512-euxa5rTGqHeqVxmOHT25hpk58PxkQ4mNoX6Yun4ooGaCHAxOCojJYNvjmyeOQxj/LyW+3fulH0+xtk+p2kPPTw=="],
···
1031
1059
1032
1060
"eslint-plugin-import": ["eslint-plugin-import@2.31.0", "", { "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.8", "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.0", "hasown": "^2.0.2", "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.0", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A=="],
1033
1061
1062
+
"eslint-plugin-import-x": ["eslint-plugin-import-x@4.16.1", "", { "dependencies": { "@typescript-eslint/types": "^8.35.0", "comment-parser": "^1.4.1", "debug": "^4.4.1", "eslint-import-context": "^0.1.9", "is-glob": "^4.0.3", "minimatch": "^9.0.3 || ^10.0.1", "semver": "^7.7.2", "stable-hash-x": "^0.2.0", "unrs-resolver": "^1.9.2" }, "peerDependencies": { "@typescript-eslint/utils": "^8.0.0", "eslint": "^8.57.0 || ^9.0.0", "eslint-import-resolver-node": "*" }, "optionalPeers": ["@typescript-eslint/utils", "eslint-import-resolver-node"] }, "sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ=="],
1063
+
1034
1064
"eslint-plugin-jsx-a11y": ["eslint-plugin-jsx-a11y@6.10.2", "", { "dependencies": { "aria-query": "^5.3.2", "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", "axe-core": "^4.10.0", "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "safe-regex-test": "^1.0.3", "string.prototype.includes": "^2.0.1" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q=="],
1035
1065
1036
-
"eslint-plugin-path-alias": ["eslint-plugin-path-alias@2.1.0", "", { "dependencies": { "find-pkg": "^2.0.0", "get-tsconfig": "^4.7.5", "nanomatch": "^1.2.13" }, "peerDependencies": { "eslint": "^8.0.0" } }, "sha512-suHrHK2MmTDsmQhrZs+hvrNI2PBKAnZ4ir7y3oJLXJsjOFBfOJoQd+URqZC7ICHyNqesoZdcA0BxEG8z5p/mPw=="],
1037
-
1038
1066
"eslint-plugin-react": ["eslint-plugin-react@7.37.5", "", { "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA=="],
1039
1067
1040
1068
"eslint-plugin-react-compiler": ["eslint-plugin-react-compiler@19.1.0-rc.2", "", { "dependencies": { "@babel/core": "^7.24.4", "@babel/parser": "^7.24.4", "@babel/plugin-proposal-private-methods": "^7.18.6", "hermes-parser": "^0.25.1", "zod": "^3.22.4", "zod-validation-error": "^3.0.3" }, "peerDependencies": { "eslint": ">=7" } }, "sha512-oKalwDGcD+RX9mf3NEO4zOoUMeLvjSvcbbEOpquzmzqEEM2MQdp7/FY/Hx9NzmUwFzH1W9SKTz5fihfMldpEYw=="],
···
1043
1071
1044
1072
"eslint-plugin-simple-import-sort": ["eslint-plugin-simple-import-sort@12.1.1", "", { "peerDependencies": { "eslint": ">=5.0.0" } }, "sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA=="],
1045
1073
1046
-
"eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.2.0", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-hLbJ2/wnjKq4kGA9AUaExVFIbNzyxYdVo49QZmKCnhk5pc9wcYRbfgLHvWJ8tnsdcseGhoUAddm9gn/lt+d74w=="],
1074
+
"eslint-plugin-unicorn": ["eslint-plugin-unicorn@61.0.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "@eslint-community/eslint-utils": "^4.7.0", "@eslint/plugin-kit": "^0.3.3", "change-case": "^5.4.4", "ci-info": "^4.3.0", "clean-regexp": "^1.0.0", "core-js-compat": "^3.44.0", "esquery": "^1.6.0", "find-up-simple": "^1.0.1", "globals": "^16.3.0", "indent-string": "^5.0.0", "is-builtin-module": "^5.0.0", "jsesc": "^3.1.0", "pluralize": "^8.0.0", "regexp-tree": "^0.1.27", "regjsparser": "^0.12.0", "semver": "^7.7.2", "strip-indent": "^4.0.0" }, "peerDependencies": { "eslint": ">=9.29.0" } }, "sha512-zLihukvneYT7f74GNbVJXfWIiNQmkc/a9vYBTE4qPkQZswolWNdu+Wsp9sIXno1JOzdn6OUwLPd19ekXVkahRA=="],
1047
1075
1048
1076
"eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="],
1049
1077
···
1063
1091
1064
1092
"eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="],
1065
1093
1066
-
"expand-tilde": ["expand-tilde@2.0.2", "", { "dependencies": { "homedir-polyfill": "^1.0.1" } }, "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw=="],
1067
-
1068
1094
"extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="],
1069
-
1070
-
"extend-shallow": ["extend-shallow@3.0.2", "", { "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" } }, "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q=="],
1071
1095
1072
1096
"fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
1073
1097
···
1085
1109
1086
1110
"fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
1087
1111
1088
-
"find-file-up": ["find-file-up@2.0.1", "", { "dependencies": { "resolve-dir": "^1.0.1" } }, "sha512-qVdaUhYO39zmh28/JLQM5CoYN9byEOKEH4qfa8K1eNV17W0UUMJ9WgbR/hHFH+t5rcl+6RTb5UC7ck/I+uRkpQ=="],
1089
-
1090
-
"find-pkg": ["find-pkg@2.0.0", "", { "dependencies": { "find-file-up": "^2.0.1" } }, "sha512-WgZ+nKbELDa6N3i/9nrHeNznm+lY3z4YfhDDWgW+5P0pdmMj26bxaxU11ookgY3NyP9GC7HvZ9etp0jRFqGEeQ=="],
1112
+
"find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
1091
1113
1092
-
"find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
1114
+
"find-up-simple": ["find-up-simple@1.0.1", "", {}, "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ=="],
1093
1115
1094
1116
"flat": ["flat@5.0.2", "", { "bin": { "flat": "cli.js" } }, "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ=="],
1095
1117
···
1099
1121
1100
1122
"for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="],
1101
1123
1102
-
"for-in": ["for-in@1.0.2", "", {}, "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ=="],
1103
-
1104
1124
"foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="],
1105
1125
1106
1126
"fraction.js": ["fraction.js@4.3.7", "", {}, "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew=="],
1107
-
1108
-
"fragment-cache": ["fragment-cache@0.2.1", "", { "dependencies": { "map-cache": "^0.2.2" } }, "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA=="],
1109
1127
1110
1128
"framer-motion": ["framer-motion@12.23.22", "", { "dependencies": { "motion-dom": "^12.23.21", "motion-utils": "^12.23.6", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-ZgGvdxXCw55ZYvhoZChTlG6pUuehecgvEAJz0BHoC5pQKW1EC5xf1Mul1ej5+ai+pVY0pylyFfdl45qnM1/GsA=="],
1111
1129
···
1131
1149
1132
1150
"get-tsconfig": ["get-tsconfig@4.10.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A=="],
1133
1151
1134
-
"get-value": ["get-value@2.0.6", "", {}, "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA=="],
1135
-
1136
1152
"glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="],
1137
1153
1138
1154
"glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
1139
1155
1140
-
"global-modules": ["global-modules@1.0.0", "", { "dependencies": { "global-prefix": "^1.0.1", "is-windows": "^1.0.1", "resolve-dir": "^1.0.0" } }, "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg=="],
1141
-
1142
-
"global-prefix": ["global-prefix@1.0.2", "", { "dependencies": { "expand-tilde": "^2.0.2", "homedir-polyfill": "^1.0.1", "ini": "^1.3.4", "is-windows": "^1.0.1", "which": "^1.2.14" } }, "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg=="],
1143
-
1144
-
"globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],
1156
+
"globals": ["globals@16.4.0", "", {}, "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw=="],
1145
1157
1146
1158
"globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="],
1147
1159
···
1161
1173
1162
1174
"has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="],
1163
1175
1164
-
"has-value": ["has-value@1.0.0", "", { "dependencies": { "get-value": "^2.0.6", "has-values": "^1.0.0", "isobject": "^3.0.0" } }, "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw=="],
1165
-
1166
-
"has-values": ["has-values@1.0.0", "", { "dependencies": { "is-number": "^3.0.0", "kind-of": "^4.0.0" } }, "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ=="],
1167
-
1168
1176
"hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
1169
1177
1170
1178
"hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="],
···
1186
1194
"hermes-parser": ["hermes-parser@0.25.1", "", { "dependencies": { "hermes-estree": "0.25.1" } }, "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA=="],
1187
1195
1188
1196
"highlight.js": ["highlight.js@11.11.1", "", {}, "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w=="],
1189
-
1190
-
"homedir-polyfill": ["homedir-polyfill@1.0.3", "", { "dependencies": { "parse-passwd": "^1.0.0" } }, "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA=="],
1191
1197
1192
1198
"html-url-attributes": ["html-url-attributes@3.0.1", "", {}, "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ=="],
1193
1199
···
1201
1207
1202
1208
"imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
1203
1209
1210
+
"indent-string": ["indent-string@5.0.0", "", {}, "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg=="],
1211
+
1204
1212
"inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="],
1205
1213
1206
1214
"inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
1207
-
1208
-
"ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="],
1209
1215
1210
1216
"inline-style-parser": ["inline-style-parser@0.2.4", "", {}, "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q=="],
1211
1217
···
1217
1223
1218
1224
"intl-messageformat": ["intl-messageformat@10.7.15", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.3", "@formatjs/fast-memoize": "2.2.6", "@formatjs/icu-messageformat-parser": "2.11.1", "tslib": "2" } }, "sha512-LRyExsEsefQSBjU2p47oAheoKz+EOJxSLDdjOaEjdriajfHsMXOmV/EhMvYSg9bAgCUHasuAC+mcUBe/95PfIg=="],
1219
1225
1220
-
"is-accessor-descriptor": ["is-accessor-descriptor@1.0.1", "", { "dependencies": { "hasown": "^2.0.0" } }, "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA=="],
1221
-
1222
1226
"is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="],
1223
1227
1224
1228
"is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="],
···
1235
1239
1236
1240
"is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="],
1237
1241
1238
-
"is-buffer": ["is-buffer@1.1.6", "", {}, "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="],
1242
+
"is-builtin-module": ["is-builtin-module@5.0.0", "", { "dependencies": { "builtin-modules": "^5.0.0" } }, "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA=="],
1239
1243
1240
1244
"is-bun-module": ["is-bun-module@1.3.0", "", { "dependencies": { "semver": "^7.6.3" } }, "sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA=="],
1241
1245
···
1243
1247
1244
1248
"is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="],
1245
1249
1246
-
"is-data-descriptor": ["is-data-descriptor@1.0.1", "", { "dependencies": { "hasown": "^2.0.0" } }, "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw=="],
1247
-
1248
1250
"is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="],
1249
1251
1250
1252
"is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="],
1251
1253
1252
1254
"is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="],
1253
-
1254
-
"is-descriptor": ["is-descriptor@1.0.3", "", { "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" } }, "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw=="],
1255
-
1256
-
"is-extendable": ["is-extendable@1.0.1", "", { "dependencies": { "is-plain-object": "^2.0.4" } }, "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA=="],
1257
1255
1258
1256
"is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
1259
1257
···
1275
1273
1276
1274
"is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="],
1277
1275
1278
-
"is-plain-object": ["is-plain-object@2.0.4", "", { "dependencies": { "isobject": "^3.0.1" } }, "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og=="],
1279
-
1280
1276
"is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="],
1281
1277
1282
1278
"is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="],
···
1294
1290
"is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="],
1295
1291
1296
1292
"is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="],
1297
-
1298
-
"is-windows": ["is-windows@1.0.2", "", {}, "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="],
1299
1293
1300
1294
"isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="],
1301
1295
1302
1296
"isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
1303
1297
1304
-
"isobject": ["isobject@3.0.1", "", {}, "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg=="],
1305
-
1306
1298
"iterator.prototype": ["iterator.prototype@1.1.5", "", { "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "get-proto": "^1.0.0", "has-symbols": "^1.1.0", "set-function-name": "^2.0.2" } }, "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g=="],
1307
1299
1308
1300
"jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="],
···
1330
1322
"jsx-ast-utils": ["jsx-ast-utils@3.3.5", "", { "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="],
1331
1323
1332
1324
"keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="],
1333
-
1334
-
"kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="],
1335
1325
1336
1326
"language-subtag-registry": ["language-subtag-registry@0.3.23", "", {}, "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ=="],
1337
1327
···
1356
1346
"lucide-react": ["lucide-react@0.544.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-t5tS44bqd825zAW45UQxpG2CvcC4urOwn2TrwSH8u+MjeE+1NnWl6QqeQ/6NdjMqdOygyiT9p3Ev0p1NJykxjw=="],
1357
1347
1358
1348
"magic-bytes.js": ["magic-bytes.js@1.10.0", "", {}, "sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ=="],
1359
-
1360
-
"map-cache": ["map-cache@0.2.2", "", {}, "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg=="],
1361
-
1362
-
"map-visit": ["map-visit@1.0.0", "", { "dependencies": { "object-visit": "^1.0.0" } }, "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w=="],
1363
1349
1364
1350
"match-sorter": ["match-sorter@6.4.0", "", { "dependencies": { "@babel/runtime": "^7.23.8", "remove-accents": "0.5.0" } }, "sha512-d4664ahzdL1QTTvmK1iI0JsrxWeJ6gn33qkYtnPg3mcn+naBLtXSgSPOe+X2vUgtgGwaAk3eiaj7gwKjjMAq+Q=="],
1365
1351
···
1435
1421
1436
1422
"minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
1437
1423
1438
-
"mixin-deep": ["mixin-deep@1.3.2", "", { "dependencies": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" } }, "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA=="],
1439
-
1440
1424
"motion-dom": ["motion-dom@12.23.21", "", { "dependencies": { "motion-utils": "^12.23.6" } }, "sha512-5xDXx/AbhrfgsQmSE7YESMn4Dpo6x5/DTZ4Iyy4xqDvVHWvFVoV+V2Ri2S/ksx+D40wrZ7gPYiMWshkdoqNgNQ=="],
1441
1425
1442
1426
"motion-utils": ["motion-utils@12.23.6", "", {}, "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ=="],
···
1449
1433
1450
1434
"nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
1451
1435
1452
-
"nanomatch": ["nanomatch@1.2.13", "", { "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "fragment-cache": "^0.2.1", "is-windows": "^1.0.2", "kind-of": "^6.0.2", "object.pick": "^1.3.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" } }, "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA=="],
1436
+
"napi-postinstall": ["napi-postinstall@0.3.3", "", { "bin": { "napi-postinstall": "lib/cli.js" } }, "sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow=="],
1453
1437
1454
1438
"natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="],
1455
1439
···
1464
1448
"normalize-range": ["normalize-range@0.1.2", "", {}, "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="],
1465
1449
1466
1450
"object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
1467
-
1468
-
"object-copy": ["object-copy@0.1.0", "", { "dependencies": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", "kind-of": "^3.0.3" } }, "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ=="],
1469
1451
1470
1452
"object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="],
1471
1453
···
1473
1455
1474
1456
"object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="],
1475
1457
1476
-
"object-visit": ["object-visit@1.0.1", "", { "dependencies": { "isobject": "^3.0.0" } }, "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA=="],
1477
-
1478
1458
"object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="],
1479
1459
1480
1460
"object.entries": ["object.entries@1.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-object-atoms": "^1.1.1" } }, "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw=="],
···
1482
1462
"object.fromentries": ["object.fromentries@2.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="],
1483
1463
1484
1464
"object.groupby": ["object.groupby@1.0.3", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" } }, "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ=="],
1485
-
1486
-
"object.pick": ["object.pick@1.3.0", "", { "dependencies": { "isobject": "^3.0.1" } }, "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ=="],
1487
1465
1488
1466
"object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="],
1489
1467
···
1505
1483
1506
1484
"parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="],
1507
1485
1508
-
"parse-passwd": ["parse-passwd@1.0.0", "", {}, "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q=="],
1509
-
1510
1486
"parse5": ["parse5@7.2.1", "", { "dependencies": { "entities": "^4.5.0" } }, "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ=="],
1511
-
1512
-
"pascalcase": ["pascalcase@0.1.1", "", {}, "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw=="],
1513
1487
1514
1488
"path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
1515
1489
···
1528
1502
"pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="],
1529
1503
1530
1504
"pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="],
1505
+
1506
+
"pluralize": ["pluralize@8.0.0", "", {}, "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA=="],
1531
1507
1532
1508
"possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="],
1533
1509
···
1595
1571
1596
1572
"regenerator-runtime": ["regenerator-runtime@0.14.1", "", {}, "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="],
1597
1573
1598
-
"regex-not": ["regex-not@1.0.2", "", { "dependencies": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" } }, "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A=="],
1574
+
"regexp-tree": ["regexp-tree@0.1.27", "", { "bin": { "regexp-tree": "bin/regexp-tree" } }, "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA=="],
1599
1575
1600
1576
"regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="],
1577
+
1578
+
"regjsparser": ["regjsparser@0.12.0", "", { "dependencies": { "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ=="],
1601
1579
1602
1580
"rehype-raw": ["rehype-raw@7.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", "vfile": "^6.0.0" } }, "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww=="],
1603
1581
···
1611
1589
1612
1590
"resolve": ["resolve@2.0.0-next.5", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA=="],
1613
1591
1614
-
"resolve-dir": ["resolve-dir@1.0.1", "", { "dependencies": { "expand-tilde": "^2.0.0", "global-modules": "^1.0.0" } }, "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg=="],
1615
-
1616
1592
"resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
1617
1593
1618
1594
"resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="],
1619
1595
1620
-
"resolve-url": ["resolve-url@0.2.1", "", {}, "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg=="],
1621
-
1622
-
"ret": ["ret@0.1.15", "", {}, "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="],
1623
-
1624
1596
"reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
1625
1597
1626
1598
"rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="],
···
1633
1605
1634
1606
"safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="],
1635
1607
1636
-
"safe-regex": ["safe-regex@1.1.0", "", { "dependencies": { "ret": "~0.1.10" } }, "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg=="],
1637
-
1638
1608
"safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="],
1639
1609
1640
1610
"scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="],
1641
1611
1642
1612
"scroll-into-view-if-needed": ["scroll-into-view-if-needed@3.0.10", "", { "dependencies": { "compute-scroll-into-view": "^3.0.2" } }, "sha512-t44QCeDKAPf1mtQH3fYpWz8IM/DyvHLjs8wUvvwMYxk5moOqCzrMSxK6HQVD0QVmVjXFavoFIPRVrMuJPKAvtg=="],
1643
1613
1644
-
"semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
1614
+
"semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
1645
1615
1646
1616
"set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="],
1647
1617
1648
1618
"set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="],
1649
1619
1650
1620
"set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="],
1651
-
1652
-
"set-value": ["set-value@2.0.1", "", { "dependencies": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", "is-plain-object": "^2.0.3", "split-string": "^3.0.1" } }, "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw=="],
1653
1621
1654
1622
"sharp": ["sharp@0.34.4", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.0", "semver": "^7.7.2" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.4", "@img/sharp-darwin-x64": "0.34.4", "@img/sharp-libvips-darwin-arm64": "1.2.3", "@img/sharp-libvips-darwin-x64": "1.2.3", "@img/sharp-libvips-linux-arm": "1.2.3", "@img/sharp-libvips-linux-arm64": "1.2.3", "@img/sharp-libvips-linux-ppc64": "1.2.3", "@img/sharp-libvips-linux-s390x": "1.2.3", "@img/sharp-libvips-linux-x64": "1.2.3", "@img/sharp-libvips-linuxmusl-arm64": "1.2.3", "@img/sharp-libvips-linuxmusl-x64": "1.2.3", "@img/sharp-linux-arm": "0.34.4", "@img/sharp-linux-arm64": "0.34.4", "@img/sharp-linux-ppc64": "0.34.4", "@img/sharp-linux-s390x": "0.34.4", "@img/sharp-linux-x64": "0.34.4", "@img/sharp-linuxmusl-arm64": "0.34.4", "@img/sharp-linuxmusl-x64": "0.34.4", "@img/sharp-wasm32": "0.34.4", "@img/sharp-win32-arm64": "0.34.4", "@img/sharp-win32-ia32": "0.34.4", "@img/sharp-win32-x64": "0.34.4" } }, "sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA=="],
1655
1623
···
1669
1637
1670
1638
"simple-swizzle": ["simple-swizzle@0.2.2", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="],
1671
1639
1672
-
"snapdragon": ["snapdragon@0.8.2", "", { "dependencies": { "base": "^0.11.1", "debug": "^2.2.0", "define-property": "^0.2.5", "extend-shallow": "^2.0.1", "map-cache": "^0.2.2", "source-map": "^0.5.6", "source-map-resolve": "^0.5.0", "use": "^3.1.0" } }, "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg=="],
1673
-
1674
-
"source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="],
1675
-
1676
1640
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
1677
1641
1678
-
"source-map-resolve": ["source-map-resolve@0.5.3", "", { "dependencies": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", "urix": "^0.1.0" } }, "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw=="],
1679
-
1680
-
"source-map-url": ["source-map-url@0.4.1", "", {}, "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw=="],
1681
-
1682
1642
"space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="],
1683
1643
1684
-
"split-string": ["split-string@3.1.0", "", { "dependencies": { "extend-shallow": "^3.0.0" } }, "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw=="],
1685
-
1686
1644
"stable-hash": ["stable-hash@0.0.5", "", {}, "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA=="],
1687
1645
1688
-
"static-extend": ["static-extend@0.1.2", "", { "dependencies": { "define-property": "^0.2.5", "object-copy": "^0.1.0" } }, "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g=="],
1646
+
"stable-hash-x": ["stable-hash-x@0.2.0", "", {}, "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ=="],
1689
1647
1690
1648
"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=="],
1691
1649
···
1710
1668
"strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
1711
1669
1712
1670
"strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="],
1671
+
1672
+
"strip-indent": ["strip-indent@4.1.0", "", {}, "sha512-OA95x+JPmL7kc7zCu+e+TeYxEiaIyndRx0OrBcK2QPPH09oAndr2ALvymxWA+Lx1PYYvFUm4O63pRkdJAaW96w=="],
1713
1673
1714
1674
"strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="],
1715
1675
···
1741
1701
1742
1702
"tinyglobby": ["tinyglobby@0.2.12", "", { "dependencies": { "fdir": "^6.4.3", "picomatch": "^4.0.2" } }, "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww=="],
1743
1703
1744
-
"to-object-path": ["to-object-path@0.3.0", "", { "dependencies": { "kind-of": "^3.0.2" } }, "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg=="],
1745
-
1746
-
"to-regex": ["to-regex@3.0.2", "", { "dependencies": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "regex-not": "^1.0.2", "safe-regex": "^1.1.0" } }, "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw=="],
1747
-
1748
1704
"to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
1749
1705
1750
1706
"trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="],
···
1781
1737
1782
1738
"unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="],
1783
1739
1784
-
"union-value": ["union-value@1.0.1", "", { "dependencies": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^2.0.1" } }, "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg=="],
1785
-
1786
1740
"unist-util-is": ["unist-util-is@6.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw=="],
1787
1741
1788
1742
"unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="],
···
1795
1749
1796
1750
"unload": ["unload@2.2.0", "", { "dependencies": { "@babel/runtime": "^7.6.2", "detect-node": "^2.0.4" } }, "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA=="],
1797
1751
1798
-
"unset-value": ["unset-value@1.0.0", "", { "dependencies": { "has-value": "^0.3.1", "isobject": "^3.0.0" } }, "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ=="],
1752
+
"unrs-resolver": ["unrs-resolver@1.11.1", "", { "dependencies": { "napi-postinstall": "^0.3.0" }, "optionalDependencies": { "@unrs/resolver-binding-android-arm-eabi": "1.11.1", "@unrs/resolver-binding-android-arm64": "1.11.1", "@unrs/resolver-binding-darwin-arm64": "1.11.1", "@unrs/resolver-binding-darwin-x64": "1.11.1", "@unrs/resolver-binding-freebsd-x64": "1.11.1", "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", "@unrs/resolver-binding-linux-x64-musl": "1.11.1", "@unrs/resolver-binding-wasm32-wasi": "1.11.1", "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" } }, "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg=="],
1799
1753
1800
1754
"update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="],
1801
1755
1802
1756
"uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
1803
1757
1804
-
"urix": ["urix@0.1.0", "", {}, "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg=="],
1805
-
1806
-
"use": ["use@3.1.1", "", {}, "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="],
1807
-
1808
1758
"use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="],
1809
1759
1810
1760
"use-composed-ref": ["use-composed-ref@1.4.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w=="],
···
1863
1813
1864
1814
"zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="],
1865
1815
1816
+
"@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="],
1817
+
1818
+
"@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
1819
+
1820
+
"@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
1821
+
1822
+
"@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
1823
+
1824
+
"@babel/helper-module-transforms/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="],
1825
+
1866
1826
"@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="],
1827
+
1828
+
"@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="],
1867
1829
1868
1830
"@discordjs/rest/discord-api-types": ["discord-api-types@0.38.21", "", {}, "sha512-E6KtXUNjZVIYP1GMjmeRdAC1xRql9xtSahRwJYpP74/hJ6Q2i2oTp6ZbFG/FUN0WqtdW2igHDsJyF2u9hV8pHQ=="],
1869
1831
···
1871
1833
1872
1834
"@eslint/eslintrc/espree": ["espree@10.3.0", "", { "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.0" } }, "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg=="],
1873
1835
1874
-
"@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="],
1836
+
"@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],
1875
1837
1876
-
"@napi-rs/wasm-runtime/@emnapi/runtime": ["@emnapi/runtime@1.3.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw=="],
1838
+
"@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="],
1877
1839
1878
1840
"@nextui-org/system-rsc/clsx": ["clsx@1.2.1", "", {}, "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg=="],
1879
1841
···
2055
2017
2056
2018
"@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
2057
2019
2058
-
"@typescript-eslint/typescript-estree/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
2020
+
"@unrs/rspack-resolver-binding-wasm32-wasi/@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=="],
2059
2021
2060
2022
"anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
2061
2023
2062
2024
"autoprefixer/caniuse-lite": ["caniuse-lite@1.0.30001705", "", {}, "sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg=="],
2063
2025
2064
-
"base/define-property": ["define-property@1.0.0", "", { "dependencies": { "is-descriptor": "^1.0.0" } }, "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA=="],
2065
-
2066
2026
"browserslist/caniuse-lite": ["caniuse-lite@1.0.30001705", "", {}, "sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg=="],
2067
2027
2068
2028
"chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
2069
2029
2070
-
"class-utils/define-property": ["define-property@0.2.5", "", { "dependencies": { "is-descriptor": "^0.1.0" } }, "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA=="],
2030
+
"clean-regexp/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="],
2031
+
2032
+
"core-js-compat/browserslist": ["browserslist@4.26.2", "", { "dependencies": { "baseline-browser-mapping": "^2.8.3", "caniuse-lite": "^1.0.30001741", "electron-to-chromium": "^1.5.218", "node-releases": "^2.0.21", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A=="],
2033
+
2034
+
"eslint-import-context/get-tsconfig": ["get-tsconfig@4.10.1", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ=="],
2071
2035
2072
2036
"eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="],
2073
2037
···
2077
2041
2078
2042
"eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="],
2079
2043
2080
-
"fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
2044
+
"eslint-plugin-import/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
2081
2045
2082
-
"glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
2046
+
"eslint-plugin-import-x/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
2083
2047
2084
-
"global-prefix/which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="],
2048
+
"eslint-plugin-import-x/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
2085
2049
2086
-
"has-values/is-number": ["is-number@3.0.0", "", { "dependencies": { "kind-of": "^3.0.2" } }, "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg=="],
2050
+
"eslint-plugin-react/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
2087
2051
2088
-
"has-values/kind-of": ["kind-of@4.0.0", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw=="],
2052
+
"fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
2053
+
2054
+
"glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
2089
2055
2090
2056
"hast-util-to-parse5/property-information": ["property-information@6.5.0", "", {}, "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig=="],
2091
2057
···
2095
2061
2096
2062
"next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="],
2097
2063
2098
-
"object-copy/define-property": ["define-property@0.2.5", "", { "dependencies": { "is-descriptor": "^0.1.0" } }, "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA=="],
2099
-
2100
-
"object-copy/kind-of": ["kind-of@3.2.2", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="],
2101
-
2102
2064
"parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
2103
2065
2104
2066
"path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
···
2109
2071
2110
2072
"readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
2111
2073
2112
-
"rimraf/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="],
2113
-
2114
-
"set-value/extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="],
2115
-
2116
-
"set-value/is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="],
2117
-
2118
-
"sharp/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
2119
-
2120
-
"snapdragon/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
2121
-
2122
-
"snapdragon/define-property": ["define-property@0.2.5", "", { "dependencies": { "is-descriptor": "^0.1.0" } }, "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA=="],
2123
-
2124
-
"snapdragon/extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="],
2074
+
"regjsparser/jsesc": ["jsesc@3.0.2", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="],
2125
2075
2126
-
"static-extend/define-property": ["define-property@0.2.5", "", { "dependencies": { "is-descriptor": "^0.1.0" } }, "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA=="],
2076
+
"rimraf/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="],
2127
2077
2128
2078
"string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
2129
2079
···
2139
2089
2140
2090
"tinyglobby/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="],
2141
2091
2142
-
"to-object-path/kind-of": ["kind-of@3.2.2", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="],
2143
-
2144
2092
"tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="],
2145
-
2146
-
"union-value/is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="],
2147
-
2148
-
"unset-value/has-value": ["has-value@0.3.1", "", { "dependencies": { "get-value": "^2.0.3", "has-values": "^0.1.4", "isobject": "^2.0.0" } }, "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q=="],
2149
2093
2150
2094
"vaul/@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-focus-guards": "1.1.1", "@radix-ui/react-focus-scope": "1.1.2", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-slot": "1.1.2", "@radix-ui/react-use-controllable-state": "1.1.0", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.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-/IVhJV5AceX620DUJ4uYVMymzsipdKBzo3edo+omeskCKGm9FRHM0ebIdbPnlQVJqyuHbuBltQUOG2mOTq2IYw=="],
2151
2095
···
2249
2193
2250
2194
"@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
2251
2195
2252
-
"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=="],
2196
+
"@unrs/rspack-resolver-binding-wasm32-wasi/@napi-rs/wasm-runtime/@emnapi/core": ["@emnapi/core@1.3.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.1", "tslib": "^2.4.0" } }, "sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog=="],
2253
2197
2254
-
"glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
2198
+
"@unrs/rspack-resolver-binding-wasm32-wasi/@napi-rs/wasm-runtime/@emnapi/runtime": ["@emnapi/runtime@1.3.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw=="],
2255
2199
2256
-
"has-values/is-number/kind-of": ["kind-of@3.2.2", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="],
2200
+
"@unrs/rspack-resolver-binding-wasm32-wasi/@napi-rs/wasm-runtime/@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="],
2257
2201
2258
-
"next/postcss/nanoid": ["nanoid@3.3.10", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg=="],
2202
+
"core-js-compat/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.227", "", {}, "sha512-ITxuoPfJu3lsNWUi2lBM2PaBPYgH3uqmxut5vmBxgYvyI4AlJ6P3Cai1O76mOrkJCBzq0IxWg/NtqOrpu/0gKA=="],
2259
2203
2260
-
"object-copy/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=="],
2261
-
2262
-
"snapdragon/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
2204
+
"core-js-compat/browserslist/node-releases": ["node-releases@2.0.21", "", {}, "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw=="],
2263
2205
2264
-
"snapdragon/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=="],
2206
+
"eslint-plugin-import-x/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
2265
2207
2266
-
"snapdragon/extend-shallow/is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="],
2208
+
"glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
2267
2209
2268
-
"static-extend/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=="],
2210
+
"next/postcss/nanoid": ["nanoid@3.3.10", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg=="],
2269
2211
2270
2212
"string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
2271
2213
2272
2214
"tailwindcss/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
2273
-
2274
-
"unset-value/has-value/has-values": ["has-values@0.1.4", "", {}, "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ=="],
2275
-
2276
-
"unset-value/has-value/isobject": ["isobject@2.1.0", "", { "dependencies": { "isarray": "1.0.0" } }, "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA=="],
2277
2215
2278
2216
"vaul/@radix-ui/react-dialog/@radix-ui/primitive": ["@radix-ui/primitive@1.1.1", "", {}, "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA=="],
2279
2217
···
2311
2249
2312
2250
"@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=="],
2313
2251
2314
-
"unset-value/has-value/isobject/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="],
2252
+
"@unrs/rspack-resolver-binding-wasm32-wasi/@napi-rs/wasm-runtime/@emnapi/core/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw=="],
2315
2253
2316
2254
"vaul/@radix-ui/react-dialog/@radix-ui/react-dismissable-layer/@radix-ui/react-use-callback-ref": ["@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-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw=="],
2317
2255
+1
-2
common/guilds.ts
+1
-2
common/guilds.ts
···
1
+
import type { ApiV1GuildsChannelsGetResponse, ApiV1GuildsEmojisGetResponse, ApiV1GuildsGetResponse, ApiV1GuildsRolesGetResponse } from "@/typings";
1
2
import { create } from "zustand";
2
-
3
-
import type { ApiV1GuildsChannelsGetResponse, ApiV1GuildsEmojisGetResponse, ApiV1GuildsGetResponse, ApiV1GuildsRolesGetResponse } from "@/typings";
4
3
5
4
export interface Guild extends ApiV1GuildsGetResponse {
6
5
channels?: ApiV1GuildsChannelsGetResponse[];
+1
-2
common/user.ts
+1
-2
common/user.ts
+1
-2
components/ad.tsx
+1
-2
components/ad.tsx
···
1
1
"use client";
2
2
3
+
import { cn } from "@/utils/cn";
3
4
import { Poppins } from "next/font/google";
4
5
import Link from "next/link";
5
6
import type { FunctionComponent } from "react";
6
7
import { HiArrowNarrowRight } from "react-icons/hi";
7
-
8
-
import { cn } from "@/utils/cn";
9
8
10
9
import { Button } from "./ui/button";
11
10
+1
-2
components/box.tsx
+1
-2
components/box.tsx
+1
-2
components/comment.tsx
+1
-2
components/comment.tsx
···
1
+
import { cn } from "@/utils/cn";
1
2
import { Patrick_Hand } from "next/font/google";
2
3
import Image, { type StaticImageData } from "next/image";
3
4
import { HiChevronRight } from "react-icons/hi";
4
-
5
-
import { cn } from "@/utils/cn";
6
5
7
6
const handwritten = Patrick_Hand({ subsets: ["latin"], weight: "400" });
8
7
+1
-1
components/copy-to-clipboard.tsx
+1
-1
components/copy-to-clipboard.tsx
+1
-1
components/counter.tsx
+1
-1
components/counter.tsx
···
51
51
const ref = useRef<NodeJS.Timeout | null>(null);
52
52
53
53
useEffect(() => {
54
-
ref.current = setInterval(() => setWidth(window.innerWidth), 1000);
54
+
ref.current = setInterval(() => setWidth(window.innerWidth), 1_000);
55
55
return () => {
56
56
if (ref.current) clearInterval(ref.current);
57
57
};
+2
-3
components/dashboard/lists/hook.ts
+2
-3
components/dashboard/lists/hook.ts
···
1
+
import { cacheOptions, getData } from "@/lib/api";
1
2
import { useParams, usePathname, useRouter, useSearchParams } from "next/navigation";
2
3
import { useCallback } from "react";
3
4
import { useQuery, useQueryClient } from "react-query";
4
-
5
-
import { cacheOptions, getData } from "@/lib/api";
6
5
7
6
interface UseDataQueryOptions {
8
7
url: string;
···
20
19
url,
21
20
() => getData<T[]>(url),
22
21
{
23
-
enabled: !!params.guildId,
22
+
enabled: Boolean(params.guildId),
24
23
...cacheOptions
25
24
}
26
25
);
+2
-3
components/dashboard/lists/selector.tsx
+2
-3
components/dashboard/lists/selector.tsx
···
1
1
"use client";
2
2
3
-
import Link from "next/link";
4
-
import { HiExternalLink, HiPencil } from "react-icons/hi";
5
-
6
3
import { type Guild, guildStore } from "@/common/guilds";
7
4
import { Button } from "@/components/ui/button";
8
5
import { cn } from "@/utils/cn";
6
+
import Link from "next/link";
7
+
import { HiExternalLink, HiPencil } from "react-icons/hi";
9
8
10
9
interface TBase {
11
10
id: string;
+1
-2
components/discord/app-badge.tsx
+1
-2
components/discord/app-badge.tsx
+1
-2
components/discord/channel.tsx
+1
-2
components/discord/channel.tsx
+1
-3
components/discord/markdown.tsx
+1
-3
components/discord/markdown.tsx
+1
-2
components/discord/message-embed.tsx
+1
-2
components/discord/message-embed.tsx
+4
-5
components/discord/message.tsx
+4
-5
components/discord/message.tsx
···
1
1
"use client";
2
2
3
+
import { cn } from "@/utils/cn";
3
4
import React from "react";
4
5
5
-
import { cn } from "@/utils/cn";
6
-
6
+
import DiscordAppBadge from "./app-badge";
7
7
import { UserAvatar } from "../ui/avatar";
8
-
import DiscordAppBadge from "./app-badge";
9
8
10
9
interface Props {
11
10
children: React.ReactNode;
···
82
81
}
83
82
<time
84
83
className="mt-[2px] text-xs opacity-50 truncate"
85
-
dateTime={new Date(1019060317).toISOString()}
84
+
dateTime={new Date(1_019_060_317).toISOString()}
86
85
>
87
-
{formatTime(new Date(1019060317))}
86
+
{formatTime(new Date(1_019_060_317))}
88
87
</time>
89
88
</div>
90
89
+1
-1
components/discord/user.tsx
+1
-1
components/discord/user.tsx
+5
-6
components/embed-creator.tsx
+5
-6
components/embed-creator.tsx
···
1
+
import type { GuildEmbed } from "@/typings";
2
+
import { cn } from "@/utils/cn";
1
3
import React, { useState } from "react";
2
4
import { BiMoon, BiSun } from "react-icons/bi";
3
5
import { FaFloppyDisk } from "react-icons/fa6";
4
6
import { HiChevronDown, HiChevronUp } from "react-icons/hi";
5
-
6
-
import type { GuildEmbed } from "@/typings";
7
-
import { cn } from "@/utils/cn";
8
7
9
8
import { DiscordMarkdown } from "./discord/markdown";
10
9
import DiscordMessage from "./discord/message";
···
39
38
};
40
39
41
40
disabled?: boolean;
42
-
onSave?: (state: { content?: string | null; embed?: GuildEmbed; }) => void;
41
+
onSave?: (state: { content: string; embed: GuildEmbed; }) => void;
43
42
}
44
43
45
44
export default function MessageCreatorEmbed({
···
188
187
189
188
<div className="lg:w-3/6 m-1">
190
189
191
-
<DumbTextInput placeholder="Content" value={content} setValue={setContent} max={2000} disabled={disabled} />
190
+
<DumbTextInput placeholder="Content" value={content} setValue={setContent} max={2_000} disabled={disabled} />
192
191
<DumbTextInput placeholder="Embed Title" value={embed} setValue={setEmbed} max={256} dataName="title" disabled={disabled} />
193
-
<DumbTextInput placeholder="Embed Description" value={embed} setValue={setEmbed} max={4096} dataName="description" disabled={disabled} />
192
+
<DumbTextInput placeholder="Embed Description" value={embed} setValue={setEmbed} max={4_096} dataName="description" disabled={disabled} />
194
193
<div className="flex gap-2">
195
194
<DumbColorInput placeholder="Embed Color" value={embed} setValue={setEmbed} dataName="color" disabled={disabled} />
196
195
<DumbTextInput placeholder="Embed Thumbnail" value={embed} setValue={setEmbed} max={256} dataName="thumbnail" disabled={disabled} />
+21
-16
components/header.tsx
+21
-16
components/header.tsx
···
1
1
"use client";
2
2
3
+
import { userStore } from "@/common/user";
4
+
import { webStore } from "@/common/webstore";
5
+
import { LoginButton } from "@/components/login-button";
6
+
import { authorize } from "@/utils/authorize-user";
7
+
import { cn } from "@/utils/cn";
3
8
import { AnimatePresence, motion, MotionConfig } from "framer-motion";
4
9
import Link from "next/link";
5
10
import { useRouter } from "next/navigation";
6
11
import { useCookies } from "next-client-cookies";
7
12
import { useCallback, useEffect, useMemo, useState } from "react";
8
13
import { HiAdjustments, HiBeaker, HiChartPie, HiChevronDown, HiEyeOff, HiFire, HiIdentification, HiLogout, HiTrendingUp, HiViewGridAdd } from "react-icons/hi";
9
-
10
-
import { userStore } from "@/common/user";
11
-
import { webStore } from "@/common/webstore";
12
-
import { LoginButton } from "@/components/login-button";
13
-
import { authorize } from "@/utils/authorize-user";
14
-
import { cn } from "@/utils/cn";
15
14
16
15
import ImageReduceMotion from "./image-reduce-motion";
17
16
import { Button } from "./ui/button";
···
68
67
icon: <HiEyeOff />,
69
68
value: reduceMotions,
70
69
onChange: () => {
71
-
if (!reduceMotions) cookies.set("reduceMotions", "true", { expires: 365 });
72
-
else cookies.remove("reduceMotions");
70
+
if (reduceMotions) {
71
+
cookies.remove("reduceMotions");
72
+
} else {
73
+
cookies.set("reduceMotions", "true", { expires: 365 });
74
+
}
73
75
router.refresh();
74
76
}
75
77
},
···
101
103
icon: <HiBeaker />,
102
104
value: devTools,
103
105
onChange: () => {
104
-
if (!devTools) cookies.set("devTools", "true", { expires: 365 });
105
-
else cookies.remove("devTools");
106
+
if (devTools) {
107
+
cookies.remove("devTools");
108
+
} else {
109
+
cookies.set("devTools", "true", { expires: 365 });
110
+
}
106
111
router.refresh();
107
112
}
108
113
}
···
120
125
)}
121
126
onClick={() => setMenu(!menu)}
122
127
>
123
-
{!user?.id ?
124
-
<>
125
-
<Skeleton className="rounded-full mr-2 size-[30p]" />
126
-
<Skeleton className="rounded-xl w-20 h-4" />
127
-
</>
128
-
:
128
+
{user?.id ?
129
129
<>
130
130
<ImageReduceMotion
131
131
alt="your avatar"
···
136
136
137
137
<p className="mr-1 relative bottom-[1px] truncate block text-primary-foreground font-medium tracking-tight">{user.globalName || user.username}</p>
138
138
<HiChevronDown />
139
+
</>
140
+
:
141
+
<>
142
+
<Skeleton className="rounded-full mr-2 size-[30p]" />
143
+
<Skeleton className="rounded-xl w-20 h-4" />
139
144
</>
140
145
}
141
146
</button>
+1
-2
components/image-grid.tsx
+1
-2
components/image-grid.tsx
-1
components/image-reduce-motion.tsx
-1
components/image-reduce-motion.tsx
+7
-9
components/inputs/color-input.tsx
+7
-9
components/inputs/color-input.tsx
···
1
+
import type { ApiError } from "@/typings";
1
2
import { useEffect, useState } from "react";
2
3
import { TailSpin } from "react-loading-icons";
3
4
4
-
import type { ApiError } from "@/typings";
5
-
6
-
import { useStateDebounced } from "../../utils/useDebounce";
7
5
import DumbColorInput from "./dumb-color-input";
6
+
import { useStateDebounced } from "../../utils/useDebounce";
8
7
9
8
enum State {
10
9
Idle = 0,
···
26
25
onSave?: (value: string | number) => void;
27
26
}
28
27
29
-
30
28
export default function ColorInput({
31
29
name,
32
30
url,
···
41
39
const [state, setState] = useState<State>(State.Idle);
42
40
const [error, setError] = useState<string | null>(null);
43
41
44
-
const [valuedebounced, setValuedebounced] = useStateDebounced<string | number>("", 1000);
42
+
const [valuedebounced, setValuedebounced] = useStateDebounced<string | number>("", 1_000);
45
43
const [value, setValue] = useState<string | number>("");
46
44
const [defaultStatealue, setdefaultStatealue] = useState<string | number>("");
47
45
···
61
59
headers: {
62
60
"Content-Type": "application/json"
63
61
},
64
-
body: JSON.stringify({ [dataName]: value || 0x000000 })
62
+
body: JSON.stringify({ [dataName]: value || 0x00_00_00 })
65
63
})
66
64
.then(async (res) => {
67
65
const response = await res.json();
···
69
67
70
68
switch (res.status) {
71
69
case 200: {
72
-
setValue(value || 0x000000);
73
-
onSave?.(value || 0x000000);
74
-
setdefaultStatealue(value || 0x000000);
70
+
setValue(value || 0x00_00_00);
71
+
onSave?.(value || 0x00_00_00);
72
+
setdefaultStatealue(value || 0x00_00_00);
75
73
76
74
setState(State.Success);
77
75
setTimeout(() => setState(State.Idle), 1_000 * 8);
+7
-6
components/inputs/dumb-color-input.tsx
+7
-6
components/inputs/dumb-color-input.tsx
···
1
+
import { cn } from "@/utils/cn";
1
2
import { AnimatePresence, motion } from "framer-motion";
2
3
import React, { useEffect, useState } from "react";
3
4
import { AiOutlineEdit } from "react-icons/ai";
4
-
5
-
import { cn } from "@/utils/cn";
6
5
7
6
interface Props {
8
7
name?: string;
9
8
placeholder?: string;
10
9
11
10
// eslint-disable-next-line @typescript-eslint/no-explicit-any
12
-
value: any; setValue: React.Dispatch<React.SetStateAction<any>>;
11
+
value: any;
12
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
13
+
setValue: React.Dispatch<React.SetStateAction<any>>;
13
14
14
15
disabled?: boolean;
15
16
description?: string;
···
38
39
// this cuz there can be multiple color inputs on the same page, so it will bug, so we need to identify them
39
40
const [inputId, setInputId] = useState<string>("");
40
41
useEffect(() => {
41
-
setInputId(Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15));
42
+
setInputId(Math.random().toString(36).slice(2, 15) + Math.random().toString(36).slice(2, 15));
42
43
}, []);
43
44
44
45
const [isHovered, setIsHovered] = useState<boolean>(false);
···
57
58
placeholder={placeholder}
58
59
onChange={(e) => {
59
60
if (dataName) {
60
-
setValue(JSON.stringify(Object.assign(JSON.parse(value), { [dataName]: parseInt(e.target.value.slice(1), 16) })));
61
+
setValue(JSON.stringify(Object.assign(JSON.parse(value), { [dataName]: Number.parseInt(e.target.value.slice(1), 16) })));
61
62
} else {
62
-
setValue(parseInt(e.target.value.slice(1), 16));
63
+
setValue(Number.parseInt(e.target.value.slice(1), 16));
63
64
}
64
65
}}
65
66
value={(dataName ? JSON.parse(value)[dataName] : value) ? `#${(dataName ? JSON.parse(value)[dataName] : value)?.toString(16)}` : "#ffffff"}
+5
-4
components/inputs/dumb-text-input.tsx
+5
-4
components/inputs/dumb-text-input.tsx
···
1
+
import { cn } from "@/utils/cn";
1
2
import React, { useEffect, useState } from "react";
2
-
3
-
import { cn } from "@/utils/cn";
4
3
5
4
interface Props {
6
5
name?: string;
7
6
placeholder?: string;
8
7
9
8
// eslint-disable-next-line @typescript-eslint/no-explicit-any
10
-
value: any; setValue: React.Dispatch<React.SetStateAction<any>>;
9
+
value: any;
10
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
11
+
setValue: React.Dispatch<React.SetStateAction<any>>;
11
12
12
13
disabled?: boolean;
13
14
description?: string;
···
71
72
type="color"
72
73
value={`#${(dataName ? JSON.parse(value)[dataName] : value)?.toString(16)}`}
73
74
onChange={(e) => {
74
-
const color = parseInt(e.target.value.replace(/#/, ""), 16);
75
+
const color = Number.parseInt(e.target.value.replace(/#/, ""), 16);
75
76
76
77
if (dataName) {
77
78
setValue(JSON.stringify(Object.assign(JSON.parse(value), { [dataName]: color || null })));
+2
-3
components/inputs/image-url-input.tsx
+2
-3
components/inputs/image-url-input.tsx
···
1
+
import type { ApiError } from "@/typings";
2
+
import { cn } from "@/utils/cn";
1
3
import { useEffect, useState } from "react";
2
4
import { TailSpin } from "react-loading-icons";
3
-
4
-
import type { ApiError } from "@/typings";
5
-
import { cn } from "@/utils/cn";
6
5
7
6
import DumbTextInput from "./dumb-text-input";
8
7
+4
-5
components/inputs/number-input.tsx
+4
-5
components/inputs/number-input.tsx
···
1
+
import { webStore } from "@/common/webstore";
2
+
import type { ApiError } from "@/typings";
3
+
import { cn } from "@/utils/cn";
1
4
import { Button } from "@nextui-org/react";
2
5
import { useEffect, useRef, useState } from "react";
3
6
import { HiMinus, HiPlus } from "react-icons/hi";
4
7
import { TailSpin } from "react-loading-icons";
5
-
6
-
import { webStore } from "@/common/webstore";
7
-
import type { ApiError } from "@/typings";
8
-
import { cn } from "@/utils/cn";
9
8
10
9
enum State {
11
10
Idle = 0,
···
206
205
(state === State.Loading || disabled) ? "cursor-not-allowed" : "cursor-text"
207
206
)}
208
207
onChange={(e) => {
209
-
if (/^[0-9]+$/.test(e.target.value) || !e.target.value) setValue(e.target.value ? parseInt(e.target.value) : undefined);
208
+
if (/^\d+$/.test(e.target.value) || !e.target.value) setValue(e.target.value ? Number.parseInt(e.target.value, 10) : undefined);
210
209
}}
211
210
value={value}
212
211
disabled={state === State.Loading || disabled}
+2
-4
components/inputs/switch.tsx
+2
-4
components/inputs/switch.tsx
···
1
+
import { cn } from "@/utils/cn";
2
+
import { type InputProps, InputState, useInput } from "@/utils/input";
1
3
import Link from "next/link";
2
4
import { TailSpin } from "react-loading-icons";
3
-
4
-
import { cn } from "@/utils/cn";
5
-
import { type InputProps, InputState, useInput } from "@/utils/input";
6
5
7
6
import { Badge } from "../ui/badge";
8
7
import { Checkbox } from "../ui/checkbox";
···
87
86
/>
88
87
}
89
88
</div>
90
-
91
89
92
90
<div className="absolute top-6 mt-0.5">
93
91
{description &&
+19
-19
components/inputs/text-input.tsx
+19
-19
components/inputs/text-input.tsx
···
1
1
"use client";
2
2
3
+
import type { ApiError } from "@/typings";
4
+
import { cn } from "@/utils/cn";
3
5
import { useEffect, useState } from "react";
4
6
import { TailSpin } from "react-loading-icons";
5
7
6
-
import type { ApiError } from "@/typings";
7
-
import { cn } from "@/utils/cn";
8
-
9
-
import { useStateDebounced } from "../../utils/useDebounce";
10
8
import DumbTextInput from "./dumb-text-input";
9
+
import { useStateDebounced } from "../../utils/useDebounce";
10
+
11
+
type Type<T extends "text" | "color"> = T extends "text" ? string : number;
11
12
12
13
enum State {
13
14
Idle = 0,
···
15
16
Success = 2
16
17
}
17
18
18
-
interface Props {
19
+
interface Props<T extends "text" | "color"> {
19
20
className?: string;
20
21
21
22
name?: string;
···
23
24
dataName?: string;
24
25
disabled?: boolean;
25
26
description?: string;
26
-
defaultState: string | number;
27
-
resetState?: string | number;
27
+
defaultState: Type<T>;
28
+
resetState?: Type<T>;
28
29
29
-
type?: string;
30
+
type?: T;
30
31
max?: number;
31
32
placeholder?: string;
32
33
33
-
onSave?: (value: string | number | null) => void;
34
+
onSave?: (value: Type<T> | null) => void;
34
35
}
35
36
36
-
export default function TextInput({
37
+
export default function TextInput<T extends "text" | "color" = "text">({
37
38
className,
38
39
name,
39
40
url,
···
42
43
description,
43
44
defaultState,
44
45
resetState,
45
-
type,
46
+
type = "text" as T,
46
47
max,
47
48
placeholder,
48
49
onSave
49
-
}: Props) {
50
+
}: Props<T>) {
50
51
const [state, setState] = useState<State>(State.Idle);
51
52
const [error, setError] = useState<string | null>(null);
52
53
53
-
const [valuedebounced, setValueDebounced] = useStateDebounced<string | number>("", 1000);
54
-
const [value, setValue] = useState<string | number>("");
55
-
const [defaultStateValue, setdefaultStateValue] = useState<string | number>("");
54
+
const [valuedebounced, setValueDebounced] = useStateDebounced<T extends "text" ? string : number>((type === "text" ? "" : 0) as Type<T>, 1_000);
55
+
const [value, setValue] = useState<T extends "text" ? string : number>((type === "text" ? "" : 0) as Type<T>);
56
+
const [defaultStateValue, setdefaultStateValue] = useState<T extends "text" ? string : number>((type === "text" ? "" : 0) as Type<T>);
56
57
57
58
useEffect(() => {
58
59
if (!defaultStateValue) setdefaultStateValue(defaultState);
···
93
94
94
95
switch (res.status) {
95
96
case 200: {
96
-
setValue(value || def || "");
97
-
onSave?.(value || def);
98
-
setdefaultStateValue(value || def || "");
97
+
setValue(value || def || (type === "text" ? "" : 0) as Type<T>);
98
+
onSave?.(value || def || (type === "text" ? "" : 0) as Type<T>);
99
+
setdefaultStateValue(value || def || (type === "text" ? "" : 0) as Type<T>);
99
100
100
101
setState(State.Success);
101
102
setTimeout(() => setState(State.Idle), 1_000 * 8);
···
151
152
type={type}
152
153
description={description}
153
154
/>
154
-
155
155
156
156
<div className="flex absolute right-0 bottom-0">
157
157
{error &&
+1
-2
components/link-tag.tsx
+1
-2
components/link-tag.tsx
+1
-2
components/list.tsx
+1
-2
components/list.tsx
···
1
1
"use client";
2
2
3
+
import decimalToRgb from "@/utils/decimalToRgb";
3
4
import { Tab, Tabs } from "@nextui-org/react";
4
5
import { usePathname, useRouter, useSearchParams } from "next/navigation";
5
6
import React, { useEffect, useRef, useState } from "react";
6
7
import { HiChevronLeft, HiChevronRight } from "react-icons/hi";
7
-
8
-
import decimalToRgb from "@/utils/decimalToRgb";
9
8
10
9
interface ListProps {
11
10
tabs: {
+1
-2
components/loading-circle.tsx
+1
-2
components/loading-circle.tsx
+18
-21
components/markdown/index.tsx
+18
-21
components/markdown/index.tsx
···
1
1
/* eslint-disable @typescript-eslint/no-unused-vars */
2
2
3
+
import { getUser } from "@/lib/discord/user";
4
+
import { cn } from "@/utils/cn";
5
+
import { filterDuplicates } from "@/utils/filter-duplicates";
6
+
import { getBaseUrl } from "@/utils/urls";
3
7
import { Code } from "@nextui-org/react";
4
8
import Link from "next/link";
5
9
import type { ReactNode } from "react";
···
7
11
import ReactMarkdown from "react-markdown";
8
12
import rehypeRaw from "rehype-raw";
9
13
10
-
import { getUser } from "@/lib/discord/user";
11
-
import { cn } from "@/utils/cn";
12
-
import { filterDuplicates } from "@/utils/filter-duplicates";
13
-
import { getBaseUrl } from "@/utils/urls";
14
-
15
-
import Notice, { NoticeType } from "../notice";
16
-
import { Separator } from "../ui/separator";
17
14
import Channel from "./channel";
18
15
import Emoji from "./emoji";
19
16
import Timestamp from "./timestamp";
20
17
import User from "./user";
18
+
import Notice, { NoticeType } from "../notice";
19
+
import { Separator } from "../ui/separator";
21
20
22
21
const ALLOWED_IFRAMES = [
23
22
"https://www.youtube.com/embed/",
···
37
36
async function parseDiscordMarkdown(content: string) {
38
37
const users = await Promise.all(
39
38
filterDuplicates(content.match(/<@!?\d{15,21}>/g) || [])
40
-
.map((match) => match.replace(/<|!|>|@/g, ""))
39
+
.map((match) => match.replace(/[!<>@]/g, ""))
41
40
.map((userId) => getUser(userId))
42
41
);
43
42
···
49
48
return renderToString(<Emoji emojiId={emojiId} />);
50
49
})
51
50
.replace(/<(@!?)\d{15,21}>/g, (match) => {
52
-
const userId = match.replace(/<|!|>|@/g, "");
51
+
const userId = match.replace(/[!<>@]/g, "");
53
52
const username = users.find((user) => user?.id === userId)?.username || "user";
54
53
55
54
return renderToString(<User username={username} />);
···
66
65
67
66
return renderToString(
68
67
<Timestamp
69
-
unix={parseInt(timestamp)}
68
+
unix={Number.parseInt(timestamp, 10)}
70
69
format={format.slice(1, -1)}
71
70
/>
72
71
);
73
72
});
74
73
}
75
74
76
-
function createHId(text: ReactNode) {
77
-
return text
78
-
?.toString()
79
-
.toLowerCase()
80
-
.replace("[object object],[object object],", "")
81
-
.replace(EMOJI_REGEX, "")
82
-
.trim()
83
-
.replace(/ +/g, "-");
84
-
}
85
-
86
75
return (
87
76
<ReactMarkdown
88
77
rehypePlugins={[rehypeRaw]}
···
121
110
del: (props) => <span className="line-through" {...props} />,
122
111
ins: (props) => <span className="underline" {...props} />,
123
112
124
-
// eslint-disable-next-line unused-imports/no-unused-vars
125
113
code: ({ ref, color, ...props }) => {
126
114
return <Code color="secondary" {...props} />;
127
115
},
···
194
182
{await parseDiscordMarkdown(markdown)}
195
183
</ReactMarkdown>
196
184
);
185
+
}
197
186
187
+
function createHId(text: ReactNode) {
188
+
return text
189
+
?.toString()
190
+
.toLowerCase()
191
+
.replace("[object object],[object object],", "")
192
+
.replace(EMOJI_REGEX, "")
193
+
.trim()
194
+
.replace(/ +/g, "-");
198
195
}
+1
-1
components/markdown/timestamp.tsx
+1
-1
components/markdown/timestamp.tsx
+10
-5
components/modal.tsx
+10
-5
components/modal.tsx
···
1
1
"use client";
2
2
3
+
import type { ApiError } from "@/typings";
4
+
import { cn } from "@/utils/cn";
3
5
import Link from "next/link";
4
6
import { useEffect, useState } from "react";
5
7
import { HiFire } from "react-icons/hi";
6
-
7
-
import type { ApiError } from "@/typings";
8
-
import { cn } from "@/utils/cn";
9
8
10
9
import Notice, { NoticeType } from "./notice";
11
10
import { Badge } from "./ui/badge";
···
64
63
65
64
async function submit() {
66
65
if (state === State.Loading) return;
67
-
if (!onSubmit) return onClose();
66
+
if (!onSubmit) {
67
+
onClose();
68
+
return;
69
+
}
68
70
69
71
setError(null);
70
72
setState(State.Loading);
71
73
const data = onSubmit?.();
72
74
73
-
if (!data) return onClose();
75
+
if (!data) {
76
+
onClose();
77
+
return;
78
+
}
74
79
75
80
if (data instanceof Error) {
76
81
setError(data?.message || "something went wrong..");
+2
-3
components/screen-message.tsx
+2
-3
components/screen-message.tsx
···
1
+
import SadWumpusPic from "@/public/sad-wumpus.gif";
2
+
import { cn } from "@/utils/cn";
1
3
import Image from "next/image";
2
4
import Link from "next/link";
3
5
import { BsDiscord } from "react-icons/bs";
4
6
import { HiHome } from "react-icons/hi";
5
-
6
-
import SadWumpusPic from "@/public/sad-wumpus.gif";
7
-
import { cn } from "@/utils/cn";
8
7
9
8
import { Button } from "./ui/button";
10
9
+2
-2
components/time.tsx
+2
-2
components/time.tsx
···
15
15
return `Today at ${dateFormatter.format(date)}`;
16
16
} else if (date.toDateString() === yesterday.toDateString()) {
17
17
return `Yesterday at ${dateFormatter.format(date)}`;
18
-
} else {
19
-
return date.toLocaleDateString(userLanguage);
20
18
}
19
+
return date.toLocaleDateString(userLanguage);
20
+
21
21
}
+1
-2
components/ui/alert.tsx
+1
-2
components/ui/alert.tsx
···
1
+
import { cn } from "@/utils/cn";
1
2
import { cva, type VariantProps } from "class-variance-authority";
2
3
import * as React from "react";
3
-
4
-
import { cn } from "@/utils/cn";
5
4
6
5
const alertVariants = cva(
7
6
"relative w-full rounded-lg p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-2px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-[17px] [&>svg]:text-foreground",
+1
-2
components/ui/avatar.tsx
+1
-2
components/ui/avatar.tsx
+1
-2
components/ui/badge.tsx
+1
-2
components/ui/badge.tsx
···
1
+
import { cn } from "@/utils/cn";
1
2
import { cva, type VariantProps } from "class-variance-authority";
2
3
import * as React from "react";
3
-
4
-
import { cn } from "@/utils/cn";
5
4
6
5
const badgeVariants = cva(
7
6
"w-fit inline-flex items-center border font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 [&>svg]:relative [&>svg]:right-1",
+1
-2
components/ui/checkbox.tsx
+1
-2
components/ui/checkbox.tsx
···
1
1
"use client";
2
2
3
+
import { cn } from "@/utils/cn";
3
4
import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
4
5
import { Check } from "lucide-react";
5
6
import * as React from "react";
6
-
7
-
import { cn } from "@/utils/cn";
8
7
9
8
const Checkbox = React.forwardRef<
10
9
React.ElementRef<typeof CheckboxPrimitive.Root>,
+1
-2
components/ui/dialog.tsx
+1
-2
components/ui/dialog.tsx
+2
-3
components/ui/input-base.tsx
+2
-3
components/ui/input-base.tsx
···
1
1
"use client";
2
2
3
+
import { Button } from "@/components/ui/button";
4
+
import { cn } from "@/utils/cn";
3
5
import { composeEventHandlers } from "@radix-ui/primitive";
4
6
import { useComposedRefs } from "@radix-ui/react-compose-refs";
5
7
import { Primitive } from "@radix-ui/react-primitive";
6
8
import { Slot } from "@radix-ui/react-slot";
7
9
import * as React from "react";
8
-
9
-
import { Button } from "@/components/ui/button";
10
-
import { cn } from "@/utils/cn";
11
10
12
11
export type InputBaseContextProps = Pick<
13
12
InputBaseProps,
+1
-2
components/ui/popover.tsx
+1
-2
components/ui/popover.tsx
+1
-2
components/ui/separator.tsx
+1
-2
components/ui/separator.tsx
···
1
1
"use client";
2
2
3
+
import { cn } from "@/utils/cn";
3
4
import * as SeparatorPrimitive from "@radix-ui/react-separator";
4
5
import * as React from "react";
5
-
6
-
import { cn } from "@/utils/cn";
7
6
8
7
interface SeparatorProps extends React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root> {
9
8
loading?: boolean;
+1
-2
components/ui/switch.tsx
+1
-2
components/ui/switch.tsx
+1
-2
components/ui/tooltip.tsx
+1
-2
components/ui/tooltip.tsx
+144
-17
eslint.config.mjs
+144
-17
eslint.config.mjs
···
1
1
import next from "@next/eslint-plugin-next";
2
2
import stylistic from "@stylistic/eslint-plugin";
3
-
import pathAlias from "eslint-plugin-path-alias";
3
+
import eslintPluginImport from "eslint-plugin-import-x";
4
4
import react from "eslint-plugin-react";
5
5
import reactCompiler from "eslint-plugin-react-compiler";
6
6
import reactHooks from "eslint-plugin-react-hooks";
7
7
import simpleImportSort from "eslint-plugin-simple-import-sort";
8
-
import unusedImports from "eslint-plugin-unused-imports";
8
+
import eslintPluginUnicorn from "eslint-plugin-unicorn";
9
9
import tseslint from "typescript-eslint";
10
10
11
11
export default tseslint.config(
···
26
26
"react-hooks": reactHooks,
27
27
"@next/next": next,
28
28
"react-compiler": reactCompiler,
29
-
"path-alias": pathAlias,
29
+
30
+
"@stylistic": stylistic,
31
+
"@typescript-eslint": tseslint.plugin,
32
+
import: eslintPluginImport,
30
33
"simple-import-sort": simpleImportSort,
31
-
"unused-imports": unusedImports,
32
-
"@stylistic": stylistic,
34
+
unicorn: eslintPluginUnicorn
33
35
},
34
36
rules: {
35
37
...react.configs.recommended.rules,
···
65
67
"@stylistic/no-extra-semi": "error",
66
68
"@stylistic/no-floating-decimal": "error",
67
69
"@stylistic/no-multi-spaces": "error",
68
-
"@stylistic/no-multiple-empty-lines": ["error", { max: 2, maxBOF: 0, maxEOF: 0 }],
70
+
"@stylistic/no-multiple-empty-lines": ["error", { max: 1, maxBOF: 0, maxEOF: 0 }],
69
71
"@stylistic/no-trailing-spaces": "error",
70
72
"@stylistic/no-whitespace-before-property": "error",
71
73
"@stylistic/object-curly-newline": "error",
···
88
90
"@stylistic/type-annotation-spacing": "error",
89
91
"@stylistic/type-generic-spacing": "error",
90
92
"@stylistic/type-named-tuple-spacing": "error",
93
+
"@stylistic/max-statements-per-line": ["error", { max: 1 }],
94
+
"@stylistic/multiline-comment-style": ["error", "separate-lines"],
95
+
"@stylistic/no-mixed-spaces-and-tabs": "error",
96
+
"@stylistic/no-tabs": "error",
97
+
"@stylistic/object-property-newline": ["error", { allowAllPropertiesOnSameLine: true }],
98
+
"@stylistic/one-var-declaration-per-line": "error",
99
+
"@stylistic/wrap-iife": ["error", "inside"],
100
+
// "@typescript-eslint/no-floating-promises": "error",
91
101
"@typescript-eslint/no-explicit-any": "error",
92
102
"@typescript-eslint/adjacent-overload-signatures": "error",
93
103
"@typescript-eslint/array-type": "error",
···
112
122
// order: "alphabetically-case-insensitive"
113
123
// }
114
124
// }],
125
+
"@typescript-eslint/consistent-type-imports": "error",
115
126
"@typescript-eslint/method-signature-style": "error",
116
127
"@typescript-eslint/naming-convention": ["error", { selector: "typeLike", format: ["PascalCase"] }],
117
128
"@typescript-eslint/no-duplicate-enum-values": "error",
···
142
153
"@typescript-eslint/no-unused-expressions": "error",
143
154
"@typescript-eslint/require-await": "error",
144
155
"@typescript-eslint/no-non-null-asserted-nullish-coalescing": "error",
145
-
146
-
// Import Sorting Rules
147
-
"simple-import-sort/imports": "error",
156
+
"@typescript-eslint/array-type": "error",
157
+
"@typescript-eslint/prefer-as-const": "error",
158
+
"@typescript-eslint/prefer-find": "error",
159
+
"@typescript-eslint/prefer-for-of": "error",
160
+
"@typescript-eslint/prefer-includes": "error",
161
+
"@typescript-eslint/prefer-reduce-type-parameter": "error",
162
+
"@typescript-eslint/prefer-return-this-type": "error",
163
+
"@typescript-eslint/prefer-string-starts-ends-with": "error",
164
+
"@typescript-eslint/prefer-ts-expect-error": "error",
165
+
"@typescript-eslint/restrict-plus-operands": "error",
166
+
"@typescript-eslint/no-confusing-void-expression": ["error", { ignoreArrowShorthand: true }],
167
+
"@typescript-eslint/no-meaningless-void-operator": "error",
168
+
"@typescript-eslint/no-mixed-enums": "error",
169
+
"@typescript-eslint/no-unnecessary-boolean-literal-compare": "error",
170
+
"@typescript-eslint/no-unnecessary-type-assertion": "error",
171
+
"@typescript-eslint/unbound-method": "error",
172
+
"import/extensions": "off", // changed
173
+
"import/first": "error",
174
+
"import/newline-after-import": ["error", { considerComments: true }],
175
+
"import/no-absolute-path": "error",
176
+
"import/no-duplicates": "error",
177
+
"import/no-empty-named-blocks": "error",
178
+
"import/no-extraneous-dependencies": "error",
179
+
"import/no-relative-packages": "error",
180
+
"import/no-unused-modules": "error",
181
+
"import/no-self-import": "error",
182
+
"import/no-useless-path-segments": "error",
183
+
"import/no-cycle": ["error", { maxDepth: Infinity }],
148
184
"simple-import-sort/exports": "error",
149
-
150
-
// Unused Imports Rules
151
-
"unused-imports/no-unused-imports": "error",
152
-
"unused-imports/no-unused-vars": [
153
-
"warn",
154
-
{ vars: "all", varsIgnorePattern: "^_", args: "after-used", argsIgnorePattern: "^_" },
155
-
],
185
+
"simple-import-sort/imports": ["error", { groups: [["^\\u0000", "^[^~./]"], ["^~"], ["^\\./", "^\\.\\./"]] }],
186
+
"unicorn/escape-case": "error",
187
+
// "unicorn/filename-case": ["error", { cases: { pascalCase: true, snakeCase: true, kebabCase: true } }],
188
+
"unicorn/no-hex-escape": "error",
189
+
"unicorn/no-zero-fractions": "error",
190
+
"unicorn/number-literal-case": "error",
191
+
"unicorn/numeric-separators-style": ["error", { number: { minimumDigits: 0 } }],
192
+
"unicorn/prefer-export-from": "error",
193
+
"unicorn/better-regex": "error",
194
+
"unicorn/catch-error-name": "error",
195
+
"unicorn/consistent-function-scoping": ["error", { checkArrowFunctions: false }],
196
+
"unicorn/empty-brace-spaces": "error",
197
+
"unicorn/error-message": "error",
198
+
"unicorn/new-for-builtins": "error",
199
+
"unicorn/no-array-callback-reference": "error",
200
+
"unicorn/no-array-for-each": "error",
201
+
"unicorn/no-array-push-push": "error",
202
+
"unicorn/no-console-spaces": "error",
203
+
"unicorn/no-for-loop": "error",
204
+
"unicorn/no-instanceof-array": "error",
205
+
"unicorn/no-negated-condition": "error",
206
+
"unicorn/no-new-array": "error",
207
+
"unicorn/no-new-buffer": "error",
208
+
"unicorn/no-object-as-default-parameter": "error",
209
+
"unicorn/no-static-only-class": "error",
210
+
"unicorn/no-thenable": "error",
211
+
"unicorn/no-this-assignment": "error",
212
+
"unicorn/no-unnecessary-await": "error",
213
+
"unicorn/no-unreadable-array-destructuring": "error",
214
+
"unicorn/no-unreadable-iife": "error",
215
+
"unicorn/no-useless-length-check": "error",
216
+
"unicorn/no-useless-promise-resolve-reject": "error",
217
+
"unicorn/no-useless-spread": "error",
218
+
"unicorn/no-useless-switch-case": "error",
219
+
"unicorn/prefer-array-find": "error",
220
+
"unicorn/prefer-array-flat": "error",
221
+
"unicorn/prefer-array-flat-map": "error",
222
+
"unicorn/prefer-array-index-of": "error",
223
+
"unicorn/prefer-array-some": "error",
224
+
"unicorn/prefer-at": "error",
225
+
"unicorn/prefer-date-now": "error",
226
+
"unicorn/prefer-default-parameters": "error",
227
+
"unicorn/prefer-includes": "error",
228
+
"unicorn/prefer-logical-operator-over-ternary": "error",
229
+
"unicorn/prefer-modern-math-apis": "error",
230
+
"unicorn/prefer-negative-index": "error",
231
+
"unicorn/prefer-number-properties": "error",
232
+
"unicorn/prefer-object-from-entries": "error",
233
+
"unicorn/prefer-optional-catch-binding": "error",
234
+
"unicorn/prefer-prototype-methods": "error",
235
+
"unicorn/prefer-regexp-test": "error",
236
+
"unicorn/prefer-set-has": "error",
237
+
"unicorn/prefer-spread": "error",
238
+
"unicorn/prefer-string-slice": "error",
239
+
"unicorn/prefer-string-starts-ends-with": "error",
240
+
"unicorn/prefer-string-trim-start-end": "error",
241
+
"unicorn/prefer-switch": "error",
242
+
"unicorn/prefer-type-error": "error",
243
+
"unicorn/require-number-to-fixed-digits-argument": "error",
244
+
"unicorn/throw-new-error": "error",
245
+
"no-dupe-else-if": "error",
246
+
"no-template-curly-in-string": "error",
247
+
"no-unexpected-multiline": "error",
248
+
"no-unreachable": "error",
249
+
"no-unreachable-loop": "error",
250
+
"default-case-last": "error",
251
+
"dot-notation": "error",
252
+
eqeqeq: "error",
253
+
// "new-cap": "error",
254
+
// "no-console": "error",
255
+
"no-empty": "error",
256
+
// "no-nested-ternary": "error",
257
+
"no-unneeded-ternary": "error",
258
+
"no-var": "error",
259
+
"for-direction": "error",
260
+
"no-constant-condition": "error",
261
+
"no-constructor-return": "error",
262
+
"no-duplicate-case": "error",
263
+
"no-else-return": "error",
264
+
"no-implicit-coercion": "error",
265
+
"no-lonely-if": "error",
266
+
"no-return-assign": "error",
267
+
"no-self-compare": "error",
268
+
"no-throw-literal": "error",
269
+
"no-undef-init": "error",
270
+
"no-unused-expressions": "off",
271
+
"no-useless-concat": "error",
272
+
"no-useless-return": "error",
273
+
"object-shorthand": "error",
274
+
"one-var": ["error", "never"],
275
+
"prefer-arrow-callback": "error",
276
+
"prefer-const": "error",
277
+
"prefer-destructuring": ["error", { object: true, array: false }],
278
+
"prefer-object-spread": "error",
279
+
"prefer-rest-params": "error",
280
+
"prefer-spread": "error",
281
+
radix: "error",
282
+
yoda: "error"
156
283
},
157
284
settings: {
158
285
react: {
···
161
288
}
162
289
},
163
290
{
164
-
ignores: ["node_modules", ".next", "**/gt4.ts", "next-env.d.ts", "typings.ts"]
291
+
ignores: ["node_modules", ".next", "**/gt4.ts", "next-env.d.ts"]
165
292
}
166
293
)
+1
-1
lib/analytics.ts
+1
-1
lib/analytics.ts
···
19
19
};
20
20
21
21
const res = await fetch(`${process.env.PLAUSIBLE_API}/v1/stats/breakdown?${objectToQueryString(params)}`, {
22
-
headers: { Authorization: "Bearer " + process.env.PLAUSIBLE_API_KEY as string },
22
+
headers: { Authorization: "Bearer " + process.env.PLAUSIBLE_API_KEY },
23
23
next: { revalidate: 60 }
24
24
});
25
25
+1
-2
lib/api/hook.ts
+1
-2
lib/api/hook.ts
···
1
+
import { cacheOptions, getData } from "@/lib/api";
1
2
import { useCallback } from "react";
2
3
import { useQuery, useQueryClient } from "react-query";
3
-
4
-
import { cacheOptions, getData } from "@/lib/api";
5
4
6
5
export type ApiEdit<T> = <K extends keyof T>(key: K, value: T[K]) => void;
7
6
+1
-1
lib/api/index.ts
+1
-1
lib/api/index.ts
+1
-1
lib/gt4.ts
+1
-1
lib/gt4.ts
+2
-2
package.json
+2
-2
package.json
···
65
65
"@types/react-dom": "^19.1.9",
66
66
"eslint": "^9.36.0",
67
67
"eslint-config-next": "^15.5.4",
68
-
"eslint-plugin-path-alias": "^2.1.0",
68
+
"eslint-plugin-import-x": "^4.16.1",
69
69
"eslint-plugin-react": "^7.37.5",
70
70
"eslint-plugin-react-compiler": "19.1.0-rc.2",
71
71
"eslint-plugin-react-hooks": "^5.2.0",
72
72
"eslint-plugin-simple-import-sort": "^12.1.1",
73
-
"eslint-plugin-unused-imports": "^4.2.0",
73
+
"eslint-plugin-unicorn": "^61.0.2",
74
74
"typescript-eslint": "^8.44.1"
75
75
}
76
76
}
+1
-1
public/docs/notifications.md
+1
-1
public/docs/notifications.md
···
69
69
The flags used for string matching are `gi`, only the YouTube and Twitch titles, Bluesky post bodies, and Reddit flairs are checked.
70
70
71
71
### 🕵️♀️ Styles (whitelabel / webhook)
72
-
Notification styles allow you to customise (or whitelabel) the username and avatar of the author (i.e. the sender of the message) separately for each notification. Wamellow will automatically manage the webhooks for you.
72
+
Notification styles allow you to customize (or whitelabel) the username and avatar of the author (i.e. the sender of the message) separately for each notification. Wamellow will automatically manage the webhooks for you.
73
73
<br />
74
74
<br />
75
75
+67
-38
tsconfig.json
+67
-38
tsconfig.json
···
1
1
{
2
-
"compilerOptions": {
3
-
"target": "es6",
4
-
"lib": [
5
-
"dom",
6
-
"dom.iterable",
7
-
"esnext"
8
-
],
9
-
"allowJs": true,
10
-
"skipLibCheck": true,
11
-
"strict": true,
12
-
"forceConsistentCasingInFileNames": true,
13
-
"noEmit": true,
14
-
"esModuleInterop": true,
15
-
"module": "esnext",
16
-
"moduleResolution": "node",
17
-
"resolveJsonModule": true,
18
-
"isolatedModules": true,
19
-
"jsx": "preserve",
20
-
"incremental": true,
21
-
"plugins": [
22
-
{
23
-
"name": "next"
24
-
}
2
+
"compilerOptions": {
3
+
/* Basic Options */
4
+
"incremental": true,
5
+
"module": "ESNext",
6
+
"target": "ES2024",
7
+
"lib": [
8
+
"dom",
9
+
"dom.iterable",
10
+
"esnext"
11
+
],
12
+
13
+
/* Strict Type-Checking Options */
14
+
"strict": true,
15
+
"noImplicitAny": true,
16
+
"strictNullChecks": true,
17
+
"strictFunctionTypes": true,
18
+
"strictBindCallApply": true,
19
+
"strictPropertyInitialization": true,
20
+
"noImplicitThis": true,
21
+
"alwaysStrict": true,
22
+
23
+
/* Additional Checks */
24
+
"noUnusedLocals": true,
25
+
"noUnusedParameters": true,
26
+
"noImplicitReturns": false,
27
+
"noFallthroughCasesInSwitch": true,
28
+
29
+
/* Module Resolution Options */
30
+
"moduleResolution": "node",
31
+
"esModuleInterop": true,
32
+
"baseUrl": ".",
33
+
34
+
"declaration": true,
35
+
"skipLibCheck": true,
36
+
"resolveJsonModule": true,
37
+
"noUncheckedIndexedAccess": false,
38
+
39
+
/* Experimental Options */
40
+
"experimentalDecorators": false,
41
+
42
+
/* Advanced Options */
43
+
"forceConsistentCasingInFileNames": true,
44
+
45
+
/* Other Options */
46
+
"allowJs": true,
47
+
"noEmit": true,
48
+
"isolatedModules": true,
49
+
"jsx": "preserve",
50
+
"plugins": [
51
+
{
52
+
"name": "next"
53
+
}
54
+
],
55
+
"paths": {
56
+
"@/*": [
57
+
"./*"
58
+
]
59
+
}
60
+
},
61
+
"include": [
62
+
"next-env.d.ts",
63
+
"**/*.ts",
64
+
"**/*.tsx",
65
+
".next/types/**/*.ts"
25
66
],
26
-
"paths": {
27
-
"@/*": [
28
-
"./*"
29
-
]
30
-
}
31
-
},
32
-
"include": [
33
-
"next-env.d.ts",
34
-
"**/*.ts",
35
-
"**/*.tsx",
36
-
".next/types/**/*.ts"
37
-
],
38
-
"exclude": [
39
-
"node_modules"
40
-
]
67
+
"exclude": [
68
+
"node_modules"
69
+
]
41
70
}
+78
-77
typings.ts
+78
-77
typings.ts
···
1
-
import { ChannelType } from "discord-api-types/v10";
2
-
import { actor } from "./utils/tts";
1
+
import type { ChannelType } from "discord-api-types/v10";
2
+
3
+
import type { actor } from "./utils/tts";
3
4
4
5
export interface ApiError {
5
6
status: number;
···
24
25
}
25
26
26
27
export enum GuildFlags {
27
-
Premium = 1 << 0,
28
+
Premium = 1 << 0
28
29
}
29
30
30
31
export interface ApiV1GuildsGetResponse {
···
55
56
username: string | null;
56
57
avatar: string | null;
57
58
banner: string | null;
58
-
}
59
+
};
59
60
}
60
61
61
62
export interface ApiV1GuildsStylePatchResponse {
···
72
73
avatar: string | null;
73
74
bot: true;
74
75
emoji: string | null;
75
-
activity: ApiV1UsersMeGetResponse["activity"] & { formattedVoicetime: string };
76
+
activity: ApiV1UsersMeGetResponse["activity"] & { formattedVoicetime: string; };
76
77
}
77
78
78
79
export interface ApiV1GuildsTopmembersPaginationGetResponse {
···
128
129
footer: {
129
130
text: string | null;
130
131
icon_url: string | null;
131
-
}
132
+
};
132
133
}
133
134
134
135
export interface ApiV1GuildsModulesWelcomeGetResponse {
···
137
138
138
139
message: {
139
140
content?: string;
140
-
embed?: GuildEmbed
141
+
embed?: GuildEmbed;
141
142
};
142
143
143
144
roleIds: string[];
···
155
156
};
156
157
157
158
reactions: {
158
-
welcomeMessageEmojis: string[],
159
-
firstMessageEmojis: string[],
159
+
welcomeMessageEmojis: string[];
160
+
firstMessageEmojis: string[];
160
161
};
161
162
162
163
card: {
···
183
184
184
185
message: {
185
186
content?: string;
186
-
embed?: GuildEmbed
187
+
embed?: GuildEmbed;
187
188
};
188
189
189
190
deleteAfter?: number;
···
243
244
rank: "**" | "__" | "*" | "`" | null;
244
245
number: "**" | "__" | "*" | "`" | null;
245
246
user: "**" | "__" | "*" | "`" | null;
246
-
}
247
+
};
247
248
248
249
range: "daily" | "weekly" | "monthly" | "alltime";
249
250
display: "mention" | "username" | "nickname" | "id";
···
270
271
271
272
export interface ApiV1GuildsModulesPassportGetResponse {
272
273
enabled: boolean;
273
-
channelId?: string;
274
+
channelId: string | null;
274
275
/**
275
276
* We're currently on free tier
276
277
*/
···
281
282
* 2 - Assign role
282
283
*/
283
284
punishment: 0 | 1 | 2;
284
-
punishmentRoleId?: string;
285
+
punishmentRoleId: string | null;
285
286
286
-
successRoleId?: string;
287
-
unverifiedRoleId?: string;
287
+
successRoleId: string | null;
288
+
unverifiedRoleId: string | null;
288
289
289
290
sendFailedDm: boolean;
290
-
alsoFailIf: ("disposableEmailAddress")[]
291
+
alsoFailIf: ("disposableEmailAddress")[];
291
292
}
292
293
293
294
export enum UserFlags {
···
308
309
barColor?: number;
309
310
useLeaderboardList?: boolean;
310
311
subText?: {
311
-
type: 0 | 1 | 2 | 3 // 0: off, 1: date, 2: relative, 3: custom
312
+
type: 0 | 1 | 2 | 3; // 0: off, 1: date, 2: relative, 3: custom
312
313
content?: string;
313
314
};
314
315
};
···
336
337
337
338
export interface ApiV1UsersMeBillingGetResponse {
338
339
subscriptionId: string;
339
-
status: 'active'
340
-
| 'canceled'
341
-
| 'incomplete'
342
-
| 'incomplete_expired'
343
-
| 'past_due'
344
-
| 'paused'
345
-
| 'trialing'
346
-
| 'unpaid';
340
+
status: "active"
341
+
| "canceled"
342
+
| "incomplete"
343
+
| "incomplete_expired"
344
+
| "past_due"
345
+
| "paused"
346
+
| "trialing"
347
+
| "unpaid";
347
348
priceId: string;
348
349
created: number;
349
350
currentPeriodEnd: number;
···
355
356
last4: string | null;
356
357
} | string | null;
357
358
portalUrl: string;
358
-
guildIds: string[]
359
+
guildIds: string[];
359
360
}
360
361
361
362
export interface ApiV1GuildsModulesTagsGetResponse {
···
410
411
pagination: {
411
412
total: number;
412
413
pages: number;
413
-
}
414
+
};
414
415
}
415
416
416
417
export interface ApiV1UploadGetResponse extends Upload {
···
529
530
export interface NekosticResponse {
530
531
event: string;
531
532
name: string;
532
-
uses: number
533
+
uses: number;
533
534
users: number;
534
535
snapshot: string;
535
536
}
536
537
537
538
export enum PermissionFlagsBits {
538
-
CreateInstantInvite = 0x0000000000000001,
539
-
KickMembers = 0x0000000000000002,
540
-
BanMembers = 0x0000000000000004,
541
-
Administrator = 0x0000000000000008,
542
-
ManageChannels = 0x0000000000000010,
543
-
ManageGuild = 0x0000000000000020,
544
-
AddReactions = 0x0000000000000040,
545
-
ViewAuditLog = 0x0000000000000080,
546
-
PrioritySpeaker = 0x0000000000000100,
547
-
Stream = 0x0000000000000200,
548
-
ViewChannel = 0x0000000000000400,
549
-
SendMessages = 0x0000000000000800,
550
-
SendTtsMessages = 0x0000000000001000,
551
-
ManageMessages = 0x0000000000002000,
552
-
EmbedLinks = 0x0000000000004000,
553
-
AttachFiles = 0x0000000000008000,
554
-
ReadMessageHistory = 0x0000000000010000,
555
-
MentionEveryone = 0x0000000000020000,
556
-
UseExternalEmojis = 0x0000000000040000,
557
-
ViewGuildInsights = 0x0000000000080000,
558
-
Connect = 0x0000000000100000,
559
-
Speak = 0x0000000000200000,
560
-
MuteMembers = 0x0000000000400000,
561
-
DeafenMembers = 0x0000000000800000,
562
-
MoveMembers = 0x0000000001000000,
563
-
UseVad = 0x0000000002000000,
564
-
ChangeNickname = 0x0000000004000000,
565
-
ManageNicknames = 0x0000000008000000,
566
-
ManageRoles = 0x0000000010000000,
567
-
ManageWebhooks = 0x0000000020000000,
568
-
ManageGuildExpressions = 0x0000000040000000,
569
-
UseApplicationCommands = 0x0000000080000000,
570
-
RequestToSpeak = 0x0000000100000000,
571
-
ManageEvents = 0x0000000200000000,
572
-
ManageThreads = 0x0000000400000000,
573
-
CreatePublicThreads = 0x0000000800000000,
574
-
CreatePrivateThreads = 0x0000001000000000,
575
-
UseExternalStickers = 0x0000002000000000,
576
-
SendMessagesInThreads = 0x0000004000000000,
577
-
UseEmbeddedActivities = 0x0000008000000000,
578
-
ModerateMembers = 0x0000010000000000,
579
-
ViewCreatorMonetizationAnalytics = 0x0000020000000000,
580
-
UseSoundboard = 0x0000040000000000,
581
-
CreateGuildExpressions = 0x0000080000000000,
582
-
CreateEvents = 0x0000100000000000,
583
-
UseExternalSounds = 0x0000200000000000,
584
-
SendVoiceMessages = 0x0000400000000000,
585
-
SendPolls = 0x0002000000000000,
586
-
UseExternalApps = 0x0004000000000000,
539
+
CreateInstantInvite = 0x00_00_00_00_00_00_00_01,
540
+
KickMembers = 0x00_00_00_00_00_00_00_02,
541
+
BanMembers = 0x00_00_00_00_00_00_00_04,
542
+
Administrator = 0x00_00_00_00_00_00_00_08,
543
+
ManageChannels = 0x00_00_00_00_00_00_00_10,
544
+
ManageGuild = 0x00_00_00_00_00_00_00_20,
545
+
AddReactions = 0x00_00_00_00_00_00_00_40,
546
+
ViewAuditLog = 0x00_00_00_00_00_00_00_80,
547
+
PrioritySpeaker = 0x00_00_00_00_00_00_01_00,
548
+
Stream = 0x00_00_00_00_00_00_02_00,
549
+
ViewChannel = 0x00_00_00_00_00_00_04_00,
550
+
SendMessages = 0x00_00_00_00_00_00_08_00,
551
+
SendTtsMessages = 0x00_00_00_00_00_00_10_00,
552
+
ManageMessages = 0x00_00_00_00_00_00_20_00,
553
+
EmbedLinks = 0x00_00_00_00_00_00_40_00,
554
+
AttachFiles = 0x00_00_00_00_00_00_80_00,
555
+
ReadMessageHistory = 0x00_00_00_00_00_01_00_00,
556
+
MentionEveryone = 0x00_00_00_00_00_02_00_00,
557
+
UseExternalEmojis = 0x00_00_00_00_00_04_00_00,
558
+
ViewGuildInsights = 0x00_00_00_00_00_08_00_00,
559
+
Connect = 0x00_00_00_00_00_10_00_00,
560
+
Speak = 0x00_00_00_00_00_20_00_00,
561
+
MuteMembers = 0x00_00_00_00_00_40_00_00,
562
+
DeafenMembers = 0x00_00_00_00_00_80_00_00,
563
+
MoveMembers = 0x00_00_00_00_01_00_00_00,
564
+
UseVad = 0x00_00_00_00_02_00_00_00,
565
+
ChangeNickname = 0x00_00_00_00_04_00_00_00,
566
+
ManageNicknames = 0x00_00_00_00_08_00_00_00,
567
+
ManageRoles = 0x00_00_00_00_10_00_00_00,
568
+
ManageWebhooks = 0x00_00_00_00_20_00_00_00,
569
+
ManageGuildExpressions = 0x00_00_00_00_40_00_00_00,
570
+
UseApplicationCommands = 0x00_00_00_00_80_00_00_00,
571
+
RequestToSpeak = 0x00_00_00_01_00_00_00_00,
572
+
ManageEvents = 0x00_00_00_02_00_00_00_00,
573
+
ManageThreads = 0x00_00_00_04_00_00_00_00,
574
+
CreatePublicThreads = 0x00_00_00_08_00_00_00_00,
575
+
CreatePrivateThreads = 0x00_00_00_10_00_00_00_00,
576
+
UseExternalStickers = 0x00_00_00_20_00_00_00_00,
577
+
SendMessagesInThreads = 0x00_00_00_40_00_00_00_00,
578
+
UseEmbeddedActivities = 0x00_00_00_80_00_00_00_00,
579
+
ModerateMembers = 0x00_00_01_00_00_00_00_00,
580
+
ViewCreatorMonetizationAnalytics = 0x00_00_02_00_00_00_00_00,
581
+
UseSoundboard = 0x00_00_04_00_00_00_00_00,
582
+
CreateGuildExpressions = 0x00_00_08_00_00_00_00_00,
583
+
CreateEvents = 0x00_00_10_00_00_00_00_00,
584
+
UseExternalSounds = 0x00_00_20_00_00_00_00_00,
585
+
SendVoiceMessages = 0x00_00_40_00_00_00_00_00,
586
+
SendPolls = 0x00_02_00_00_00_00_00_00,
587
+
UseExternalApps = 0x00_04_00_00_00_00_00_00
587
588
}
+2
-3
utils/captcha.ts
+2
-3
utils/captcha.ts
···
1
+
import { gt4init } from "@/lib/gt4";
1
2
import { useEffect, useRef, useState } from "react";
2
-
3
-
import { GT4Init } from "@/lib/gt4";
4
3
5
4
export enum State {
6
5
Idle = 0,
···
16
15
17
16
useEffect(() => {
18
17
if (!userId) return;
19
-
const { init } = GT4Init();
18
+
const { init } = gt4init();
20
19
21
20
init(
22
21
{
+2
-3
utils/create-selectable-items.tsx
+2
-3
utils/create-selectable-items.tsx
···
1
+
import { type ApiV1GuildsChannelsGetResponse, type ApiV1GuildsEmojisGetResponse, type ApiV1GuildsRolesGetResponse, PermissionFlagsBits } from "@/typings";
1
2
import { ChannelType } from "discord-api-types/v10";
2
3
import Image from "next/image";
3
4
import { HiAtSymbol, HiHashtag, HiMenuAlt2, HiNewspaper, HiVolumeUp } from "react-icons/hi";
4
-
5
-
import { type ApiV1GuildsChannelsGetResponse, type ApiV1GuildsEmojisGetResponse, type ApiV1GuildsRolesGetResponse, PermissionFlagsBits } from "@/typings";
6
5
7
6
type Item = ApiV1GuildsChannelsGetResponse | ApiV1GuildsRolesGetResponse;
8
7
type PermissionNames = keyof typeof PermissionFlagsBits | "RoleHirachy";
···
12
11
13
12
return required
14
13
.filter((perm) => perm !== "RoleHirachy")
15
-
.map((perm) => (permissions & PermissionFlagsBits[perm as keyof typeof PermissionFlagsBits]) === 0 ? perm : false)
14
+
.map((perm) => (permissions & PermissionFlagsBits[perm]) === 0 ? perm : false)
16
15
.filter(Boolean);
17
16
}
18
17
+3
-3
utils/decimalToRgb.ts
+3
-3
utils/decimalToRgb.ts
+1
-3
utils/input.ts
+1
-3
utils/input.ts
+3
-3
utils/time.ts
+3
-3
utils/time.ts
···
44
44
const now = new Date();
45
45
const diff = now.getTime() - date.getTime();
46
46
47
-
const seconds = Math.floor(diff / 1000);
47
+
const seconds = Math.floor(diff / 1_000);
48
48
const minutes = Math.floor(seconds / 60);
49
49
const hours = Math.floor(minutes / 60);
50
50
const days = Math.floor(hours / 24);
···
61
61
return days === 1 ? "a day ago" : `${days} days ago`;
62
62
} else if (months < 12) {
63
63
return months === 1 ? "a month ago" : `${months} months ago`;
64
-
} else {
65
-
return years === 1 ? "a year ago" : `${years} years ago`;
66
64
}
65
+
return years === 1 ? "a year ago" : `${years} years ago`;
66
+
67
67
}
+1
-1
utils/truncate.ts
+1
-1
utils/truncate.ts
+1
-1
utils/useDebounce.ts
+1
-1
utils/useDebounce.ts
···
1
1
import { useMemo, useState } from "react";
2
2
3
3
const debounce = <T>(fn: (...args: T[]) => void, delay: number) => {
4
-
let timeout: NodeJS.Timeout | undefined = undefined;
4
+
let timeout: NodeJS.Timeout | undefined;
5
5
return (...args: T[]) => {
6
6
if (timeout !== undefined) {
7
7
clearTimeout(timeout);