+4
-1
app/[pathname]/page.tsx
+4
-1
app/[pathname]/page.tsx
···
22
22
case "disable-commands": return redirect("https://youtube.com/watch?v=ehc0_whydu8");
23
23
case "youtube": return redirect("https://www.youtube.com/channel/UClWBeVcz5LUmcCN1gHG_GCg");
24
24
case "translate": return redirect("https://crowdin.com/project/wamellow");
25
-
case "ref": return redirect("https://datalix.eu/a/luna" + utm);
25
+
case "ref":
26
+
case "server":
27
+
case "kvm":
28
+
case "vps": return redirect("https://datalix.eu/a/luna" + utm);
26
29
case "deref": return redirect("https://datalix.de/a/luna" + utm);
27
30
}
28
31
+61
-63
app/dashboard/[guildId]/greeting/farewell/page.tsx
+61
-63
app/dashboard/[guildId]/greeting/farewell/page.tsx
···
10
10
import Notice from "@/components/notice";
11
11
import { Button } from "@/components/ui/button";
12
12
import { useApi } from "@/lib/api/hook";
13
-
import type { ApiV1GuildsModulesByeGetResponse } from "@/typings";
13
+
import { type ApiV1GuildsModulesByeGetResponse, GuildFlags } from "@/typings";
14
+
import { transformer } from "@/utils/bitfields";
14
15
import { cn } from "@/utils/cn";
15
16
import { createSelectableItems } from "@/utils/create-selectable-items";
16
17
import Image from "next/image";
···
25
26
const params = useParams();
26
27
const { data, isLoading, error, edit } = useApi<ApiV1GuildsModulesByeGetResponse>(`/guilds/${params.guildId}/modules/bye`);
27
28
28
-
const Head = () => (
29
-
<div className="flex justify-between relative bottom-2 mb-3">
30
-
<Button
31
-
asChild
32
-
size="sm"
33
-
>
34
-
<Link href={`/dashboard/${guild?.id}/greeting`}>
35
-
<HiArrowLeft />
36
-
Back
37
-
</Link>
38
-
</Button>
39
-
<Button
40
-
asChild
41
-
size="sm"
42
-
>
43
-
<Link
44
-
href="/docs/greetings"
45
-
target="_blank"
46
-
>
47
-
<HiExternalLink />
48
-
Read docs & view placeholders
49
-
</Link>
50
-
</Button>
51
-
</div>
52
-
);
29
+
const enabled = (guild!.flags & GuildFlags.FarewellEnabled) !== 0;
53
30
54
31
if (isLoading) return <></>;
55
32
56
33
if (!data || error) return (
57
34
<div>
58
-
<Head />
35
+
<Head guildId={params.guildId as string} />
59
36
{error && <Notice message={error} />}
60
37
</div>
61
38
);
62
39
63
40
return (<>
64
-
<Head />
41
+
<Head guildId={params.guildId as string} />
65
42
66
43
<Switch
67
-
label="Farewell module enabled"
68
-
endpoint={`/guilds/${guild?.id}/modules/bye`}
69
-
k="enabled"
70
-
defaultState={data.enabled || false}
71
-
onSave={(s) => edit("enabled", s)}
44
+
label="Enable Farewell"
45
+
endpoint={`/guilds/${guild?.id}`}
46
+
k="flags"
47
+
defaultState={enabled}
48
+
transform={(value) => transformer(value, guild!.flags, GuildFlags.FarewellEnabled)}
49
+
onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.FarewellEnabled) })}
72
50
/>
73
51
74
52
<NumberInput
···
77
55
url={`/guilds/${guild?.id}/modules/bye`}
78
56
dataName="deleteAfter"
79
57
defaultState={data.deleteAfter ?? 0}
80
-
disabled={!data.enabled}
58
+
disabled={!enabled}
81
59
onSave={(n) => edit("deleteAfter", n)}
82
60
/>
83
61
···
89
67
items={createSelectableItems(guild?.channels)}
90
68
description="Select the channel where the farewell message should be send into"
91
69
defaultState={data.channelId}
92
-
disabled={!data.enabled}
70
+
disabled={!enabled}
93
71
onSave={(o) => edit("channelId", o.value)}
94
72
/>
95
73
···
108
86
url={`/guilds/${guild?.id}/modules/bye`}
109
87
dataName="message"
110
88
defaultMessage={data.message}
111
-
messageAttachmentComponent={data.card.enabled && (
89
+
messageAttachmentComponent={(guild!.flags & GuildFlags.FarewellCard) !== 0 && (
112
90
<Image
113
91
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
92
width={1_024 / 2}
···
117
95
alt=""
118
96
/>
119
97
)}
120
-
showMessageAttachmentComponentInEmbed={data.card.inEmbed}
121
-
disabled={!data.enabled}
98
+
showMessageAttachmentComponentInEmbed={(guild!.flags & GuildFlags.FarewellCardInEmbed) !== 0}
99
+
disabled={!enabled}
122
100
onSave={(message) => edit("message", message)}
123
101
>
124
102
125
-
<div className={cn("mt-2 mb-4 border-2 dark:border-wamellow border-wamellow-100 rounded-xl p-6", !data.card.enabled && "pb-0")}>
103
+
<div className={cn("mt-2 mb-4 border-2 dark:border-wamellow border-wamellow-100 rounded-xl p-6", (guild!.flags & GuildFlags.FarewellCard) === 0 && "pb-0")}>
126
104
<Switch
127
105
label="Show image card"
128
-
endpoint={`/guilds/${guild?.id}/modules/bye`}
129
-
k="card.enabled"
130
-
defaultState={data.card.enabled}
131
-
disabled={!data.enabled}
132
-
onSave={(s) => {
133
-
edit("card", {
134
-
...data.card,
135
-
enabled: s
136
-
});
137
-
}}
106
+
endpoint={`/guilds/${guild?.id}`}
107
+
k="flags"
108
+
defaultState={(guild!.flags & GuildFlags.FarewellCard) !== 0}
109
+
disabled={!enabled}
110
+
transform={(value) => transformer(value, guild!.flags, GuildFlags.FarewellCard)}
111
+
onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.FarewellCard) })}
138
112
/>
139
113
140
-
{data.card.enabled && <>
114
+
{(guild!.flags & GuildFlags.FarewellCard) !== 0 && (<>
141
115
<Switch
142
116
label="Set image inside embed"
143
-
endpoint={`/guilds/${guild?.id}/modules/bye`}
144
-
k="card.inEmbed"
145
-
defaultState={data.card.inEmbed || false}
146
-
disabled={!data.card.enabled || !data.enabled}
147
-
onSave={(s) => {
148
-
edit("card", {
149
-
...data.card,
150
-
inEmbed: s
151
-
});
152
-
}}
117
+
endpoint={`/guilds/${guild?.id}`}
118
+
k="flags"
119
+
defaultState={(guild!.flags & GuildFlags.FarewellCardInEmbed) !== 0}
120
+
disabled={!enabled || (guild!.flags & GuildFlags.FarewellCard) === 0}
121
+
transform={(value) => transformer(value, guild!.flags, GuildFlags.FarewellCardInEmbed)}
122
+
onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.FarewellCardInEmbed) })}
153
123
/>
154
124
155
125
<ImageUrlInput
···
157
127
url={`/guilds/${guild?.id}/modules/bye`}
158
128
ratio="aspect-4/1"
159
129
dataName="card.background"
160
-
description="Enter a url which should be the background for the image card. The recomended image ration is 4:1 and recommended resolution 1024x256px."
130
+
description="Enter a url which should be the background for the image card. The recommended image ratio is 4:1 and recommended resolution 1024x256px."
161
131
defaultState={data.card.background || ""}
162
-
disabled={!data.card.enabled || !data.enabled}
132
+
disabled={!enabled || (guild!.flags & GuildFlags.FarewellCard) === 0}
163
133
onSave={(s) => {
164
134
edit("card", {
165
135
...data.card,
···
167
137
});
168
138
}}
169
139
/>
170
-
</>}
140
+
</>)}
171
141
</div>
172
142
173
143
</MessageCreatorEmbed>
174
144
</>);
145
+
}
146
+
147
+
function Head({ guildId }: { guildId: string; }) {
148
+
return (
149
+
<div className="flex justify-between relative bottom-2 mb-3">
150
+
<Button
151
+
asChild
152
+
size="sm"
153
+
>
154
+
<Link href={`/dashboard/${guildId}/greeting`}>
155
+
<HiArrowLeft />
156
+
Back
157
+
</Link>
158
+
</Button>
159
+
<Button
160
+
asChild
161
+
size="sm"
162
+
>
163
+
<Link
164
+
href="/docs/greetings"
165
+
target="_blank"
166
+
>
167
+
<HiExternalLink />
168
+
Read docs & view placeholders
169
+
</Link>
170
+
</Button>
171
+
</div>
172
+
);
175
173
}
+4
-4
app/dashboard/[guildId]/greeting/passport/complete-setup.tsx
+4
-4
app/dashboard/[guildId]/greeting/passport/complete-setup.tsx
···
2
2
import SelectMenu from "@/components/inputs/select-menu";
3
3
import Modal from "@/components/modal";
4
4
import type { ApiEdit } from "@/lib/api/hook";
5
-
import type { ApiV1GuildsModulesPassportGetResponse } from "@/typings";
5
+
import { type ApiV1GuildsModulesPassportGetResponse, GuildFlags } from "@/typings";
6
6
import { createSelectableItems } from "@/utils/create-selectable-items";
7
7
import { useEffect, useState } from "react";
8
8
···
24
24
edit
25
25
}: Props) {
26
26
const [modal, setModal] = useState<ModalType>(ModalType.None);
27
+
const [roleId, setRoleId] = useState<string | null>(null);
27
28
28
-
const [roleId, setRoleId] = useState<string | null>(null);
29
+
const enabled = (guild!.flags & GuildFlags.PassportEnabled) !== 0;
29
30
30
31
useEffect(() => {
31
-
if (!data.enabled) return;
32
+
if (!enabled) return;
32
33
33
34
if (!data.successRoleId) {
34
35
setModal(ModalType.VerifiedRole);
···
37
38
38
39
if (data.punishment === 2 && !data.punishmentRoleId) {
39
40
setModal(ModalType.PunishmentRole);
40
-
41
41
}
42
42
}, [data]);
43
43
+60
-54
app/dashboard/[guildId]/greeting/passport/page.tsx
+60
-54
app/dashboard/[guildId]/greeting/passport/page.tsx
···
1
1
"use client";
2
+
2
3
import { guildStore } from "@/common/guilds";
3
4
import { CopyToClipboardButton } from "@/components/copy-to-clipboard";
4
5
import SelectInput from "@/components/inputs/select-menu";
5
6
import Switch from "@/components/inputs/switch";
6
7
import Notice from "@/components/notice";
7
8
import { OverviewLink } from "@/components/overview-link";
9
+
import { Section } from "@/components/section";
8
10
import { Button } from "@/components/ui/button";
9
11
import { useApi } from "@/lib/api/hook";
10
-
import type { ApiV1GuildsModulesPassportGetResponse } from "@/typings";
12
+
import { type ApiV1GuildsModulesPassportGetResponse, GuildFlags } from "@/typings";
13
+
import { transformer } from "@/utils/bitfields";
11
14
import { createSelectableItems } from "@/utils/create-selectable-items";
12
15
import { getCanonicalUrl } from "@/utils/urls";
13
16
import Link from "next/link";
···
22
25
const params = useParams();
23
26
const { data, isLoading, error, edit } = useApi<ApiV1GuildsModulesPassportGetResponse>(`/guilds/${params.guildId}/modules/passport`);
24
27
25
-
const Head = () => (
26
-
<div className="flex justify-between relative bottom-2 mb-3">
27
-
<Button
28
-
asChild
29
-
size="sm"
30
-
>
31
-
<Link href={`/dashboard/${guild?.id}/greeting`}>
32
-
<HiArrowLeft />
33
-
Back
34
-
</Link>
35
-
</Button>
36
-
<Button
37
-
asChild
38
-
size="sm"
39
-
>
40
-
<Link
41
-
href="/docs/passport"
42
-
target="_blank"
43
-
>
44
-
<HiExternalLink />
45
-
Read docs & view placeholders
46
-
</Link>
47
-
</Button>
48
-
</div>
49
-
);
28
+
const enabled = (guild!.flags & GuildFlags.PassportEnabled) !== 0;
50
29
51
30
if (isLoading) return <></>;
52
31
53
32
if (!data || error) return (
54
33
<div>
55
-
<Head />
34
+
<Head guildId={params.guildId as string} />
56
35
{error && <Notice message={error} />}
57
36
</div>
58
37
);
59
38
60
39
return (<>
61
-
<Head />
40
+
<Head guildId={params.guildId as string} />
62
41
63
-
{data.enabled && data.punishment === 2 && !data.punishmentRoleId && (
42
+
{enabled && data.punishment === 2 && !data.punishmentRoleId && (
64
43
<Notice message="A punishment role must be set when using 'Assign role to member'." />
65
44
)}
66
45
67
-
{data.enabled && !data.successRoleId && (
46
+
{enabled && !data.successRoleId && (
68
47
<Notice message="A verified role must be set for passport to work." />
69
48
)}
70
49
···
75
54
/>
76
55
77
56
<Switch
78
-
label="Passport module enabled"
79
-
endpoint={`/guilds/${guild?.id}/modules/passport`}
80
-
k="enabled"
81
-
defaultState={data.enabled}
82
-
disabled={false}
83
-
onSave={(s) => edit("enabled", s)}
84
-
/>
85
-
86
-
<Switch
87
-
label="Send direct message to member on fail"
88
-
endpoint={`/guilds/${guild?.id}/modules/passport`}
89
-
k="sendFailedDm"
90
-
defaultState={data.sendFailedDm}
91
-
disabled={!data.enabled}
92
-
onSave={(s) => edit("sendFailedDm", s)}
57
+
label="Enable Passport"
58
+
endpoint={`/guilds/${guild?.id}`}
59
+
k="flags"
60
+
defaultState={enabled}
61
+
transform={(value) => transformer(value, guild!.flags, GuildFlags.PassportEnabled)}
62
+
onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.PassportEnabled) })}
93
63
/>
94
64
95
65
<SelectInput
···
99
69
items={createSelectableItems(guild?.channels)}
100
70
description="Select the channel where verification logs should be send into."
101
71
defaultState={data.channelId}
102
-
disabled={!data.enabled}
72
+
disabled={!enabled}
103
73
onSave={(o) => edit("channelId", o.value)}
104
74
/>
105
75
···
113
83
description="Select what role members should get when joining."
114
84
defaultState={data.unverifiedRoleId}
115
85
showClear
116
-
disabled={!data.enabled}
86
+
disabled={!enabled}
117
87
onSave={(o) => edit("unverifiedRoleId", o.value)}
118
88
/>
119
89
</div>
···
126
96
items={createSelectableItems(guild?.roles, ["RoleHirachy"])}
127
97
description="Select what role members should get when completing verification."
128
98
defaultState={data.successRoleId}
129
-
disabled={!data.enabled}
99
+
disabled={!enabled}
130
100
onSave={(o) => edit("successRoleId", o.value)}
131
101
/>
132
102
</div>
···
145
115
]}
146
116
description="Choose what should happen if a member failes verification."
147
117
defaultState={data.punishment}
148
-
disabled={!data.enabled}
118
+
disabled={!enabled}
149
119
onSave={(o) => edit("punishment", o.value as ApiV1GuildsModulesPassportGetResponse["punishment"])}
150
120
/>
151
121
</div>
···
158
128
items={createSelectableItems(guild?.roles, ["RoleHirachy"])}
159
129
description="Select what role members should get when failing verification."
160
130
defaultState={data.punishmentRoleId}
161
-
disabled={!data.enabled || data.punishment !== 2}
131
+
disabled={!enabled || data.punishment !== 2}
162
132
onSave={(o) => edit("punishmentRoleId", o.value)}
163
133
/>
164
134
</div>
165
135
</div>
166
136
137
+
<Section
138
+
title="Verification Page"
139
+
>
140
+
Copy and paste the link to your verification page in a publicly accessible channel within your server.
141
+
</Section>
142
+
167
143
<OverviewLink
168
-
className="mt-8"
144
+
className="mt-2"
169
145
title="View Passport"
170
146
message="Easily verify your members with a simple and secure CAPTCHA in the web."
171
147
url={`/passport/${params.guildId}`}
172
148
icon={<HiFingerPrint />}
173
149
/>
174
150
175
-
<div className="w-fit">
176
-
<CopyToClipboardButton title="Copy link to passport" text={getCanonicalUrl("passport", guild?.id as string)} />
151
+
<CopyToClipboardButton
152
+
className="w-fit"
153
+
title="Copy link to passport"
154
+
text={getCanonicalUrl("passport", guild?.id as string)}
155
+
/>
156
+
</>);
157
+
}
158
+
159
+
function Head({ guildId }: { guildId: string; }) {
160
+
return (
161
+
<div className="flex justify-between relative bottom-2 mb-3">
162
+
<Button
163
+
asChild
164
+
size="sm"
165
+
>
166
+
<Link href={`/dashboard/${guildId}/greeting`}>
167
+
<HiArrowLeft />
168
+
Back
169
+
</Link>
170
+
</Button>
171
+
<Button
172
+
asChild
173
+
size="sm"
174
+
>
175
+
<Link
176
+
href="/docs/greetings"
177
+
target="_blank"
178
+
>
179
+
<HiExternalLink />
180
+
Read docs & view placeholders
181
+
</Link>
182
+
</Button>
177
183
</div>
178
-
</>);
184
+
);
179
185
}
+94
-109
app/dashboard/[guildId]/greeting/welcome/page.tsx
+94
-109
app/dashboard/[guildId]/greeting/welcome/page.tsx
···
12
12
import { Section } from "@/components/section";
13
13
import { Button } from "@/components/ui/button";
14
14
import { useApi } from "@/lib/api/hook";
15
-
import type { ApiV1GuildsModulesWelcomeGetResponse } from "@/typings";
15
+
import { type ApiV1GuildsModulesWelcomeGetResponse, GuildFlags } from "@/typings";
16
+
import { transformer } from "@/utils/bitfields";
16
17
import { cn } from "@/utils/cn";
17
18
import { createSelectableEmojiItems, createSelectableItems } from "@/utils/create-selectable-items";
18
19
import Image from "next/image";
···
27
28
const params = useParams();
28
29
const { data, isLoading, error, edit } = useApi<ApiV1GuildsModulesWelcomeGetResponse>(`/guilds/${params.guildId}/modules/welcome`);
29
30
30
-
const Head = () => (
31
-
<div className="flex justify-between relative bottom-2 mb-3">
32
-
<Button
33
-
asChild
34
-
size="sm"
35
-
>
36
-
<Link href={`/dashboard/${guild?.id}/greeting`}>
37
-
<HiArrowLeft />
38
-
Back
39
-
</Link>
40
-
</Button>
41
-
<Button
42
-
asChild
43
-
size="sm"
44
-
>
45
-
<Link
46
-
href="/docs/farewell"
47
-
target="_blank"
48
-
>
49
-
<HiExternalLink />
50
-
Read docs & view placeholders
51
-
</Link>
52
-
</Button>
53
-
</div>
54
-
);
31
+
const enabled = (guild!.flags & GuildFlags.WelcomeEnabled) !== 0;
55
32
56
33
if (isLoading) return <></>;
57
34
58
35
if (!data || error) return (
59
36
<div>
60
-
<Head />
37
+
<Head guildId={params.guildId as string} />
61
38
{error && <Notice message={error} />}
62
39
</div>
63
40
);
64
41
65
42
return (<>
66
-
<Head />
43
+
<Head guildId={params.guildId as string} />
67
44
68
45
<Switch
69
-
label="Welcome module enabled"
70
-
endpoint={`/guilds/${guild?.id}/modules/welcome`}
71
-
k="enabled"
72
-
defaultState={data.enabled || false}
73
-
disabled={false}
74
-
onSave={(s) => edit("enabled", s)}
46
+
label="Enable Welcome"
47
+
endpoint={`/guilds/${guild?.id}`}
48
+
k="flags"
49
+
defaultState={enabled}
50
+
transform={(value) => transformer(value, guild!.flags, GuildFlags.WelcomeEnabled)}
51
+
onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.WelcomeEnabled) })}
75
52
/>
76
53
77
54
<Switch
78
-
label="Restore members roles and nickname on rejoin"
79
-
endpoint={`/guilds/${guild?.id}/modules/welcome`}
80
-
k="restore"
81
-
defaultState={data.restore}
82
-
disabled={!data.enabled}
83
-
onSave={(s) => edit("restore", s)}
55
+
label="Restore roles and nickname on rejoin"
56
+
endpoint={`/guilds/${guild?.id}`}
57
+
k="flags"
58
+
defaultState={(guild!.flags & GuildFlags.WelcomeRestore) !== 0}
59
+
transform={(value) => transformer(value, guild!.flags, GuildFlags.WelcomeRestore)}
60
+
onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.WelcomeRestore) })}
84
61
/>
85
62
86
63
<Switch
···
89
66
endpoint={`/guilds/${guild?.id}/modules/welcome`}
90
67
k="deleteAfterLeave"
91
68
defaultState={data.deleteAfterLeave || false}
92
-
disabled={!data.enabled}
69
+
disabled={!enabled}
93
70
onSave={(s) => edit("deleteAfterLeave", s)}
94
71
/>
95
72
···
99
76
url={`/guilds/${guild?.id}/modules/welcome`}
100
77
dataName="deleteAfter"
101
78
defaultState={data.deleteAfter ?? 0}
102
-
disabled={!data.enabled}
79
+
disabled={!enabled}
103
80
onSave={(n) => edit("deleteAfter", n)}
104
81
/>
105
82
···
112
89
items={createSelectableItems(guild?.channels)}
113
90
description="Select the channel where the welcome message should be send into."
114
91
defaultState={data.channelId}
115
-
disabled={!data.enabled}
92
+
disabled={!enabled}
116
93
showClear
117
94
onSave={(o) => edit("channelId", o.value)}
118
95
/>
···
137
114
description="Select roles which members should get."
138
115
defaultState={data.roleIds}
139
116
max={5}
140
-
disabled={!data.enabled}
117
+
disabled={!enabled}
141
118
onSave={(o) => edit("roleIds", o.map(({ value }) => value))}
142
119
/>
143
120
</div>
···
151
128
description="Select in what channels user should get ghostpinged."
152
129
defaultState={data.pingIds}
153
130
max={5}
154
-
disabled={!data.enabled}
131
+
disabled={!enabled}
155
132
onSave={(o) => edit("pingIds", o.map(({ value }) => value))}
156
133
/>
157
134
</div>
···
167
144
description="Select emotes which will be reacted with on members first message."
168
145
defaultState={data.reactions?.firstMessageEmojis}
169
146
max={2}
170
-
disabled={!data.enabled}
147
+
disabled={!enabled}
171
148
onSave={(o) => {
172
149
edit("reactions", {
173
150
...data.reactions,
···
186
163
description="Select emotes which will be reacted with on welcome messages."
187
164
defaultState={data.reactions?.welcomeMessageEmojis}
188
165
max={2}
189
-
disabled={!data.enabled}
166
+
disabled={!enabled}
190
167
onSave={(o) => {
191
168
edit("reactions", {
192
169
...data.reactions,
···
202
179
url={`/guilds/${guild?.id}/modules/welcome`}
203
180
dataName="message"
204
181
defaultMessage={data.message}
205
-
messageAttachmentComponent={data.card.enabled && (
182
+
messageAttachmentComponent={(guild!.flags & GuildFlags.WelcomeCard) !== 0 && (
206
183
<Image
207
184
src={`https://image-api.wamellow.com/?type=join&username=${encodeURIComponent(user!.username)}&members=1090&hash=${encodeURIComponent(user!.id)}/${encodeURIComponent(user!.avatar!)}${data.card.background ? `&background=${encodeURIComponent(data.card.background)}` : ""}`}
208
185
width={1_024 / 2}
···
211
188
alt=""
212
189
/>
213
190
)}
214
-
showMessageAttachmentComponentInEmbed={data.card.inEmbed}
215
-
disabled={!data.enabled}
191
+
showMessageAttachmentComponentInEmbed={(guild!.flags & GuildFlags.WelcomeCardInEmbed) !== 0}
192
+
disabled={!enabled}
216
193
onSave={(message) => edit("message", message)}
217
194
>
218
195
219
-
<div className={cn("mt-2 mb-4 border-2 dark:border-wamellow border-wamellow-100 rounded-xl p-6", !data.card.enabled && "pb-0")}>
196
+
<div className={cn("mt-2 mb-4 border-2 dark:border-wamellow border-wamellow-100 rounded-xl p-6", (guild!.flags & GuildFlags.WelcomeCard) === 0 && "pb-0")}>
220
197
<Switch
221
198
label="Show image card"
222
-
endpoint={`/guilds/${guild?.id}/modules/welcome`}
223
-
k="card.enabled"
224
-
defaultState={data.card.enabled}
225
-
disabled={!data.enabled}
226
-
onSave={(s) => {
227
-
edit("card", {
228
-
...data.card,
229
-
enabled: s
230
-
});
231
-
}}
199
+
endpoint={`/guilds/${guild?.id}`}
200
+
k="flags"
201
+
defaultState={(guild!.flags & GuildFlags.WelcomeCard) !== 0}
202
+
disabled={!enabled}
203
+
transform={(value) => transformer(value, guild!.flags, GuildFlags.WelcomeCard)}
204
+
onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.WelcomeCard) })}
232
205
/>
233
206
234
-
{data.card.enabled && <>
207
+
{(guild!.flags & GuildFlags.WelcomeCard) !== 0 && (<>
235
208
<Switch
236
209
label="Set image inside embed"
237
-
endpoint={`/guilds/${guild?.id}/modules/welcome`}
238
-
k="card.inEmbed"
239
-
defaultState={data.card.inEmbed || false}
240
-
disabled={!data.card.enabled || !data.enabled}
241
-
onSave={(s) => {
242
-
edit("card", {
243
-
...data.card,
244
-
inEmbed: s
245
-
});
246
-
}}
210
+
endpoint={`/guilds/${guild?.id}`}
211
+
k="flags"
212
+
defaultState={(guild!.flags & GuildFlags.WelcomeCardInEmbed) !== 0}
213
+
disabled={!enabled || (guild!.flags & GuildFlags.WelcomeCard) === 0}
214
+
transform={(value) => transformer(value, guild!.flags, GuildFlags.WelcomeCardInEmbed)}
215
+
onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.WelcomeCardInEmbed) })}
247
216
/>
248
217
249
218
<ImageUrlInput
···
251
220
url={`/guilds/${guild?.id}/modules/welcome`}
252
221
ratio="aspect-4/1"
253
222
dataName="card.background"
254
-
description="Enter a url which should be the background for the image card. The recomended image ration is 4:1 and recommended resolution 1024x256px."
223
+
description="Enter a url which should be the background for the image card. The recommended image ratio is 4:1 and recommended resolution 1024x256px."
255
224
defaultState={data.card.background || ""}
256
-
disabled={!data.card.enabled || !data.enabled}
225
+
disabled={!enabled || (guild!.flags & GuildFlags.WelcomeCard) === 0}
257
226
onSave={(s) => {
258
227
edit("card", {
259
228
...data.card,
···
261
230
});
262
231
}}
263
232
/>
264
-
</>}
233
+
</>)}
265
234
</div>
266
235
267
236
</MessageCreatorEmbed>
···
272
241
dataName="dm.message"
273
242
defaultMessage={data.dm?.message}
274
243
isCollapseable={true}
275
-
disabled={!data.enabled}
244
+
disabled={!enabled}
276
245
onSave={(message) => {
277
246
edit("dm", {
278
247
...data.dm,
···
283
252
284
253
<div className="m-2">
285
254
<Switch
286
-
label="Enabled"
287
-
endpoint={`/guilds/${guild?.id}/modules/welcome`}
288
-
k="dm.enabled"
289
-
defaultState={data.dm?.enabled}
290
-
disabled={!data.enabled}
291
-
onSave={(s) => {
292
-
edit("dm", {
293
-
...data.dm,
294
-
enabled: s
295
-
});
296
-
}}
255
+
label="Enable DM"
256
+
endpoint={`/guilds/${guild?.id}`}
257
+
k="flags"
258
+
defaultState={(guild!.flags & GuildFlags.WelcomeDirectMessage) !== 0}
259
+
disabled={!enabled}
260
+
transform={(value) => transformer(value, guild!.flags, GuildFlags.WelcomeDirectMessage)}
261
+
onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.WelcomeDirectMessage) })}
297
262
/>
298
263
</div>
299
264
···
308
273
309
274
<Switch
310
275
label="Enable button"
311
-
endpoint={`/guilds/${guild?.id}/modules/welcome`}
312
-
k="button.enabled"
313
-
defaultState={data.button?.enabled}
314
-
disabled={!data.enabled}
315
-
onSave={(s) => {
316
-
edit("button", {
317
-
...data.button,
318
-
enabled: s
319
-
});
320
-
}}
276
+
endpoint={`/guilds/${guild?.id}`}
277
+
k="flags"
278
+
defaultState={(guild!.flags & GuildFlags.WelcomeButton) !== 0}
279
+
disabled={!enabled}
280
+
transform={(value) => transformer(value, guild!.flags, GuildFlags.WelcomeButton)}
281
+
onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.WelcomeButton) })}
321
282
/>
322
283
323
284
<Switch
324
285
label="Ping new member"
325
286
description="Whenever the mention in the greet message should ping or not."
326
-
endpoint={`/guilds/${guild?.id}/modules/welcome`}
327
-
k="button.ping"
328
-
defaultState={data.button?.ping || false}
329
-
disabled={!data.enabled || !data.button?.enabled}
330
-
onSave={(s) => {
331
-
edit("button", {
332
-
...data.button,
333
-
ping: s
334
-
});
335
-
}}
287
+
endpoint={`/guilds/${guild?.id}`}
288
+
k="flags"
289
+
defaultState={(guild!.flags & GuildFlags.WelcomeButtonPing) !== 0}
290
+
disabled={!enabled}
291
+
transform={(value) => transformer(value, guild!.flags, GuildFlags.WelcomeButtonPing)}
292
+
onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.WelcomeButtonPing) })}
336
293
/>
337
294
338
295
<div className="lg:flex gap-3 pt-3">
···
356
313
}
357
314
description="Select the color of the button."
358
315
defaultState={data.button?.style || 1}
359
-
disabled={!data.enabled || !data.button?.enabled}
316
+
disabled={!enabled || (guild!.flags & GuildFlags.WelcomeButtonPing) === 0}
360
317
onSave={(o) => {
361
318
edit("button", {
362
319
...data.button,
···
373
330
items={createSelectableEmojiItems(guild?.emojis)}
374
331
description="Select an emoji which will be used in the button."
375
332
defaultState={data.button?.emoji}
376
-
disabled={!data.enabled || !data.button?.enabled}
333
+
disabled={!enabled || (guild!.flags & GuildFlags.WelcomeButtonPing) === 0}
377
334
onSave={(o) => {
378
335
edit("button", {
379
336
...data.button,
···
386
343
387
344
<div className="h-[138px]" />
388
345
</>);
346
+
}
347
+
348
+
function Head({ guildId }: { guildId: string; }) {
349
+
return (
350
+
<div className="flex justify-between relative bottom-2 mb-3">
351
+
<Button
352
+
asChild
353
+
size="sm"
354
+
>
355
+
<Link href={`/dashboard/${guildId}/greeting`}>
356
+
<HiArrowLeft />
357
+
Back
358
+
</Link>
359
+
</Button>
360
+
<Button
361
+
asChild
362
+
size="sm"
363
+
>
364
+
<Link
365
+
href="/docs/greetings"
366
+
target="_blank"
367
+
>
368
+
<HiExternalLink />
369
+
Read docs & view placeholders
370
+
</Link>
371
+
</Button>
372
+
</div>
373
+
);
389
374
}
+13
-2
app/dashboard/[guildId]/leaderboards/page.tsx
+13
-2
app/dashboard/[guildId]/leaderboards/page.tsx
···
3
3
import { type Guild, guildStore } from "@/common/guilds";
4
4
import ImageUrlInput from "@/components/inputs/image-url-input";
5
5
import MultiSelectMenu from "@/components/inputs/multi-select-menu";
6
+
import Switch from "@/components/inputs/switch";
6
7
import { ScreenMessage } from "@/components/screen-message";
7
8
import { Section, SubSection } from "@/components/section";
8
9
import { useApi } from "@/lib/api/hook";
9
-
import type { ApiV1GuildsModulesLeaderboardGetResponse } from "@/typings";
10
+
import { type ApiV1GuildsModulesLeaderboardGetResponse, GuildFlags } from "@/typings";
11
+
import { transformer } from "@/utils/bitfields";
10
12
import { createSelectableItems } from "@/utils/create-selectable-items";
11
13
import { ChannelType } from "discord-api-types/v10";
12
14
import { useParams } from "next/navigation";
···
126
128
Manage the privacy of the leaderboard.
127
129
</Section>
128
130
131
+
<Switch
132
+
label="Hide leaderboard website"
133
+
description="Disable the public website for the leaderboard."
134
+
endpoint={`/guilds/${params.guildId}`}
135
+
k="flags"
136
+
defaultState={(guild!.flags & GuildFlags.PrivateLeaderboard) !== 0}
137
+
transform={(value) => transformer(value, guild!.flags, GuildFlags.PrivateLeaderboard)}
138
+
onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.PrivateLeaderboard) })}
139
+
/>
140
+
129
141
<DiscordWidget guild={guild as Guild} />
130
142
131
143
<SubSection
···
134
146
>
135
147
<ResetLeaderboard guild={guild as Guild} />
136
148
</SubSection>
137
-
138
149
</>);
139
150
}
+4
-3
app/dashboard/[guildId]/leaderboards/widget.component.tsx
+4
-3
app/dashboard/[guildId]/leaderboards/widget.component.tsx
···
12
12
13
13
interface Props {
14
14
guild: Guild;
15
+
disabled?: boolean;
15
16
}
16
17
17
-
export default function DiscordWidget({ guild }: Props) {
18
+
export default function DiscordWidget({ guild, disabled }: Props) {
18
19
const [isEnabled, setEnabled] = useState<boolean>(false);
19
20
20
21
const url = `https://discord.com/api/guilds/${guild.id}/widget.json` as const;
···
23
24
url,
24
25
() => fetch(url).then((res) => res.json()) as Promise<RESTGetAPIGuildWidgetJSONResult | RESTError>,
25
26
{
26
-
enabled: Boolean(guild.id),
27
+
enabled: Boolean(guild.id) && !disabled,
27
28
...cacheOptions,
28
29
onSuccess: (data) => setEnabled(!("code" in data)),
29
30
refetchOnMount: true
30
31
}
31
32
);
32
33
33
-
if (error || (data && "message" in data && data.code !== 50_004)) {
34
+
if ((error || (data && "message" in data && data.code !== 50_004)) && !disabled) {
34
35
return (
35
36
<div className="md:w-1/2">
36
37
<Notice
+15
-10
app/dashboard/[guildId]/page.tsx
+15
-10
app/dashboard/[guildId]/page.tsx
···
3
3
import { guildStore } from "@/common/guilds";
4
4
import Switch from "@/components/inputs/switch";
5
5
import { Section } from "@/components/section";
6
+
import { GuildFlags } from "@/typings";
7
+
import { transformer } from "@/utils/bitfields";
6
8
import { useParams } from "next/navigation";
7
9
import { HiChartBar } from "react-icons/hi";
8
10
···
16
18
const params = useParams();
17
19
18
20
return (<>
19
-
<OverviewLink
20
-
title="View Leaderboard"
21
-
message="Easily access and view the top chatters, voice timers, and inviters from this server in the web."
22
-
url={`/leaderboard/${params.guildId}`}
23
-
icon={<HiChartBar />}
24
-
/>
21
+
{(guild!.flags & GuildFlags.PrivateLeaderboard) !== 0 && (
22
+
<OverviewLink
23
+
title="View Leaderboard"
24
+
message="Easily access and view the top chatters, voice timers, and inviters from this server in the web."
25
+
url={`/leaderboard/${params.guildId}`}
26
+
icon={<HiChartBar />}
27
+
/>
28
+
)}
25
29
26
30
<BotStyle />
27
31
···
43
47
44
48
<Switch
45
49
label="Embed message links"
50
+
description="Reply with the original content of a message if a message link is sent."
46
51
endpoint={`/guilds/${params.guildId}`}
47
-
k="embedLinks"
48
-
description="Reply with the original content of a message if a message link is sent."
49
-
defaultState={guild?.embedLinks || false}
52
+
k="flags"
53
+
defaultState={(guild!.flags & GuildFlags.EmbedDiscordLinks) !== 0}
54
+
transform={(value) => transformer(value, guild!.flags, GuildFlags.EmbedDiscordLinks)}
55
+
onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.EmbedDiscordLinks) })}
50
56
/>
51
-
52
57
</>);
53
58
}
+46
-43
app/dashboard/[guildId]/starboard/page.tsx
+46
-43
app/dashboard/[guildId]/starboard/page.tsx
···
12
12
import Notice from "@/components/notice";
13
13
import { Button } from "@/components/ui/button";
14
14
import { useApi } from "@/lib/api/hook";
15
-
import { type ApiV1GuildsModulesStarboardGetResponse, StarboardStyle } from "@/typings";
15
+
import { type ApiV1GuildsModulesStarboardGetResponse, GuildFlags, StarboardStyle } from "@/typings";
16
+
import { transformer } from "@/utils/bitfields";
16
17
import { createSelectableItems } from "@/utils/create-selectable-items";
17
18
import Image from "next/image";
18
19
import Link from "next/link";
···
27
28
28
29
const url = `/guilds/${params.guildId}/modules/starboard` as const;
29
30
const { data, isLoading, error, edit } = useApi<ApiV1GuildsModulesStarboardGetResponse>(url);
31
+
32
+
const enabled = (guild!.flags & GuildFlags.StarboardEnabled) !== 0;
30
33
31
34
const example = useExample(data && !("message" in data)
32
35
? data.style
···
58
61
</div>
59
62
60
63
<Switch
61
-
label="Starboard module enabled"
62
-
endpoint={url}
63
-
k="enabled"
64
-
defaultState={data.enabled}
65
-
disabled={false}
66
-
onSave={(v) => edit("enabled", v)}
64
+
label="Enable Starboard"
65
+
endpoint={`/guilds/${guild?.id}`}
66
+
k="flags"
67
+
defaultState={enabled}
68
+
transform={(value) => transformer(value, guild!.flags, GuildFlags.StarboardEnabled)}
69
+
onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.StarboardEnabled) })}
67
70
/>
68
71
69
72
<Switch
70
73
label="Allow bots, apps and webhooks"
71
-
endpoint={url}
72
-
k="allowBots"
73
-
defaultState={data.allowBots}
74
-
disabled={!data.enabled}
75
-
onSave={(v) => edit("allowBots", v)}
74
+
endpoint={`/guilds/${guild?.id}`}
75
+
k="flags"
76
+
defaultState={(guild!.flags & GuildFlags.StarboardAllowBots) !== 0}
77
+
transform={(value) => transformer(value, guild!.flags, GuildFlags.StarboardAllowBots)}
78
+
onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.StarboardAllowBots) })}
76
79
/>
77
80
78
81
<Switch
79
82
label="Allow NSFW channels"
80
-
endpoint={url}
81
-
k="allowNSFW"
82
-
defaultState={data.allowNSFW}
83
-
disabled={!data.enabled}
84
-
onSave={(v) => edit("allowNSFW", v)}
83
+
endpoint={`/guilds/${guild?.id}`}
84
+
k="flags"
85
+
defaultState={(guild!.flags & GuildFlags.StarboardAllowNSFW) !== 0}
86
+
transform={(value) => transformer(value, guild!.flags, GuildFlags.StarboardAllowNSFW)}
87
+
onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.StarboardAllowNSFW) })}
85
88
/>
86
89
87
90
<Switch
88
91
label="Allow message edits"
89
92
description="If a message is being edited, update it in the data."
90
-
endpoint={url}
91
-
k="allowEdits"
92
-
defaultState={data.allowEdits}
93
-
disabled={!data.enabled}
94
-
onSave={(v) => edit("allowEdits", v)}
93
+
endpoint={`/guilds/${guild?.id}`}
94
+
k="flags"
95
+
defaultState={(guild!.flags & GuildFlags.StarboardAllowEdits) !== 0}
96
+
transform={(value) => transformer(value, guild!.flags, GuildFlags.StarboardAllowEdits)}
97
+
onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.StarboardAllowEdits) })}
95
98
/>
96
99
97
100
<Switch
98
101
label="Allow author reaction"
99
102
description="Lets the message author star their own messages."
100
-
endpoint={url}
101
-
k="allowSelfReact"
102
-
defaultState={data.allowSelfReact}
103
-
disabled={!data.enabled}
104
-
onSave={(v) => edit("allowSelfReact", v)}
103
+
endpoint={`/guilds/${guild?.id}`}
104
+
k="flags"
105
+
defaultState={(guild!.flags & GuildFlags.StarboardAllowSelf) !== 0}
106
+
transform={(value) => transformer(value, guild!.flags, GuildFlags.StarboardAllowSelf)}
107
+
onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.StarboardAllowSelf) })}
105
108
/>
106
109
107
110
<Switch
108
111
label="Display stared message reference"
109
112
description="Repost the message reply in the data."
110
-
endpoint={url}
111
-
k="displayReference"
112
-
defaultState={data.displayReference}
113
-
disabled={!data.enabled}
114
-
onSave={(v) => edit("displayReference", v)}
113
+
endpoint={`/guilds/${guild?.id}`}
114
+
k="flags"
115
+
defaultState={(guild!.flags & GuildFlags.StarboardDisplayReference) !== 0}
116
+
transform={(value) => transformer(value, guild!.flags, GuildFlags.StarboardDisplayReference)}
117
+
onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.StarboardDisplayReference) })}
115
118
/>
116
119
117
120
<Switch
118
121
label="Delete message from starboard upon losing reactions"
119
122
description="If a message in the starboard looses the required reactions, it gets deleted."
120
-
endpoint={url}
121
-
k="delete"
122
-
defaultState={data.delete}
123
-
disabled={!data.enabled}
124
-
onSave={(v) => edit("delete", v)}
123
+
endpoint={`/guilds/${guild?.id}`}
124
+
k="flags"
125
+
defaultState={(guild!.flags & GuildFlags.StarboardDeleteOnLoss) !== 0}
126
+
transform={(value) => transformer(value, guild!.flags, GuildFlags.StarboardDeleteOnLoss)}
127
+
onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.StarboardDeleteOnLoss) })}
125
128
/>
126
129
127
130
<NumberInput
···
130
133
url={url}
131
134
dataName="requiredEmojis"
132
135
defaultState={data.requiredEmojis ?? 0}
133
-
disabled={!data.enabled}
136
+
disabled={!enabled}
134
137
min={2}
135
138
onSave={(v) => edit("requiredEmojis", v)}
136
139
/>
···
142
145
items={createSelectableItems(guild?.channels)}
143
146
description="Select the channel where the starboard messages should be send into."
144
147
defaultState={data.channelId}
145
-
disabled={!data.enabled}
148
+
disabled={!enabled}
146
149
onSave={(o) => edit("channelId", o.value as string)}
147
150
/>
148
151
···
171
174
]}
172
175
description="Select the emoji that needs to be reacted with."
173
176
defaultState={data.emoji}
174
-
disabled={!data.enabled}
177
+
disabled={!enabled}
175
178
onSave={(o) => edit("emoji", o.value as string)}
176
179
/>
177
180
</div>
···
204
207
]}
205
208
description="The style members profile gets displayed."
206
209
defaultState={data.style}
207
-
disabled={!data.enabled}
210
+
disabled={!enabled}
208
211
onSave={(o) => edit("style", o.value as number)}
209
212
/>
210
213
</div>
···
220
223
description="Select channels which should not be able to get into the starboard."
221
224
defaultState={data.blacklistChannelIds || []}
222
225
max={500}
223
-
disabled={!data.enabled}
226
+
disabled={!enabled}
224
227
onSave={(o) => edit("blacklistChannelIds", o.map(({ value }) => value))}
225
228
/>
226
229
</div>
···
233
236
description="Select roles which should not be able to star or be starred."
234
237
defaultState={data.blacklistRoleIds || []}
235
238
max={500}
236
-
disabled={!data.enabled}
239
+
disabled={!enabled}
237
240
onSave={(o) => edit("blacklistChannelIds", o.map(({ value }) => value))}
238
241
/>
239
242
</div>
+1
-1
app/dashboard/[guildId]/style.component.tsx
+1
-1
app/dashboard/[guildId]/style.component.tsx
+18
-8
app/dashboard/[guildId]/tts.component.tsx
+18
-8
app/dashboard/[guildId]/tts.component.tsx
···
3
3
import SelectMenu from "@/components/inputs/select-menu";
4
4
import Switch from "@/components/inputs/switch";
5
5
import { TTSFaq } from "@/components/tts-faq";
6
+
import { GuildFlags } from "@/typings";
7
+
import { transformer } from "@/utils/bitfields";
6
8
import { createSelectableItems } from "@/utils/create-selectable-items";
7
9
import { ChannelType } from "discord-api-types/v10";
8
10
import { useParams } from "next/navigation";
···
70
72
label="Announce user"
71
73
badge="Experimental"
72
74
endpoint={`/guilds/${params.guildId}`}
73
-
k="tts.announceUser"
74
-
description="If I should say who is currently speaking via tts."
75
-
defaultState={guild?.tts.announceUser || false}
76
-
onSave={(value) => edit("announceUser", value)}
75
+
k="flags"
76
+
defaultState={(guild!.flags & GuildFlags.TextToSpeechAnnounceUsers) !== 0}
77
+
transform={(value) => transformer(value, guild!.flags, GuildFlags.TextToSpeechAnnounceUsers)}
78
+
onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.TextToSpeechAnnounceUsers) })}
77
79
/>
78
80
<Switch
79
81
label="Queue messages"
80
82
endpoint={`/guilds/${params.guildId}`}
81
-
k="tts.queue"
82
-
description="Queue sent messages instead of refusing to speak."
83
-
defaultState={guild?.tts.queue || false}
84
-
onSave={(value) => edit("queue", value)}
83
+
k="flags"
84
+
defaultState={(guild!.flags & GuildFlags.TextToSpeechQueueMessages) !== 0}
85
+
transform={(value) => transformer(value, guild!.flags, GuildFlags.TextToSpeechQueueMessages)}
86
+
onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.TextToSpeechQueueMessages) })}
87
+
/>
88
+
<Switch
89
+
label="Allow bots, apps and webhooks"
90
+
endpoint={`/guilds/${params.guildId}`}
91
+
k="flags"
92
+
defaultState={(guild!.flags & GuildFlags.TextToSpeechAllowBots) !== 0}
93
+
transform={(value) => transformer(value, guild!.flags, GuildFlags.TextToSpeechAllowBots)}
94
+
onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.TextToSpeechAllowBots) })}
85
95
/>
86
96
<NumberInput
87
97
name="Max message length"
+112
-100
app/globals.css
+112
-100
app/globals.css
···
1
1
@import 'tailwindcss';
2
+
@import "tw-animate-css";
2
3
3
4
@custom-variant dark (&:is(.dark *));
4
5
···
8
9
}
9
10
10
11
.dark {
11
-
--wamellow: #ffffff0d;
12
-
--wamellow-100: #ffffff1a;
13
-
--wamellow-200: #ffffff33;
12
+
--wamellow: #ffffff0d;
13
+
--wamellow-100: #ffffff1a;
14
+
--wamellow-200: #ffffff33;
14
15
15
-
--background-rgb: rgb(1, 0, 4);
16
-
--wamellow-rgb: rgba(255, 255, 255, 0.16);
16
+
--background-rgb: rgb(1, 0, 4);
17
+
--wamellow-rgb: rgba(255, 255, 255, 0.16);
17
18
18
-
--foreground: 210 20% 98%;
19
+
--foreground: 210 20% 98%;
19
20
20
-
--card: 224 71.4% 4.1%;
21
-
--card-foreground: 210 20% 98%;
21
+
--card: 224 71.4% 4.1%;
22
+
--card-foreground: 210 20% 98%;
22
23
23
-
--popover: 260 3% 4.1%;
24
-
--popover-foreground: 210 20% 98%;
24
+
--popover: 260 3% 4.1%;
25
+
--popover-foreground: 210 20% 98%;
25
26
26
-
--primary: 0 0% 100%;
27
-
--primary-foreground: 220.9 39.3% 89%;
27
+
--primary: 0 0% 100%;
28
+
--primary-foreground: 220.9 39.3% 89%;
28
29
29
-
--secondary: 258 89% 66%;
30
-
--secondary-foreground: 210 20% 98%;
30
+
--secondary: 258 89% 66%;
31
+
--secondary-foreground: 210 20% 98%;
31
32
32
-
--flat: var(--secondary);
33
-
--flat-foreground: 270 59% 85%;
33
+
--flat: var(--secondary);
34
+
--flat-foreground: 270 59% 85%;
34
35
35
-
--muted: 260 3% 16%;
36
-
--muted-foreground: 217 10% 65%;
36
+
--muted: 260 3% 16%;
37
+
--muted-foreground: 217 10% 65%;
37
38
38
-
--accent: 258 89% 66%;
39
-
--accent-foreground: 210 20% 98%;
39
+
--accent: 258 89% 66%;
40
+
--accent-foreground: 210 20% 98%;
40
41
41
-
--destructive: 0 62.8% 40.6;
42
-
--destructive-foreground: 210 20% 98%;
42
+
--destructive: 0 62.8% 40.6;
43
+
--destructive-foreground: 210 20% 98%;
43
44
44
-
--border: 260 3% 16%;
45
-
--input: 260 3% 16%;
46
-
--ring: 258 89% 66%;
47
-
--separator: 0 0% 100%;
45
+
--border: 260 3% 16%;
46
+
--input: 260 3% 16%;
47
+
--ring: 258 89% 66%;
48
+
--separator: 0 0% 100%;
48
49
49
-
--chart-1: 220 70% 50%;
50
-
--chart-2: 160 60% 45%;
51
-
--chart-3: 30 80% 55%;
52
-
--chart-4: 280 65% 60%;
53
-
--chart-5: 340 75% 55%;
54
-
}
50
+
--chart-1: 220 70% 50%;
51
+
--chart-2: 160 60% 45%;
52
+
--chart-3: 30 80% 55%;
53
+
--chart-4: 280 65% 60%;
54
+
--chart-5: 340 75% 55%;
55
+
}
55
56
56
57
@theme {
57
-
--color-blurple: #5865f2;
58
-
--color-blurple-dark: #454fbf;
59
-
--color-discord-gray: #1c1d23;
60
-
--color-foreground: hsl(var(--foreground));
58
+
--color-blurple: #5865f2;
59
+
--color-blurple-dark: #454fbf;
60
+
--color-discord-gray: #1c1d23;
61
+
--color-foreground: hsl(var(--foreground));
61
62
62
-
--color-wamellow: var(--wamellow);
63
+
--color-wamellow: var(--wamellow);
63
64
64
-
--color-wamellow-100: var(--wamellow-100);
65
+
--color-wamellow-100: var(--wamellow-100);
65
66
66
-
--color-wamellow-200: var(--wamellow-200);
67
+
--color-wamellow-200: var(--wamellow-200);
67
68
68
-
--color-card: hsl(var(--card));
69
-
--color-card-foreground: hsl(var(--card-foreground));
69
+
--color-card: hsl(var(--card));
70
+
--color-card-foreground: hsl(var(--card-foreground));
70
71
71
-
--color-popover: hsl(var(--popover));
72
-
--color-popover-foreground: hsl(var(--popover-foreground));
72
+
--color-popover: hsl(var(--popover));
73
+
--color-popover-foreground: hsl(var(--popover-foreground));
73
74
74
-
--color-primary: hsl(var(--primary));
75
-
--color-primary-foreground: hsl(var(--primary-foreground));
75
+
--color-primary: hsl(var(--primary));
76
+
--color-primary-foreground: hsl(var(--primary-foreground));
76
77
77
-
--color-secondary: hsl(var(--secondary));
78
-
--color-secondary-foreground: hsl(var(--secondary-foreground));
78
+
--color-secondary: hsl(var(--secondary));
79
+
--color-secondary-foreground: hsl(var(--secondary-foreground));
79
80
80
-
--color-flat: hsl(var(--flat));
81
-
--color-flat-foreground: hsl(var(--flat-foreground));
81
+
--color-flat: hsl(var(--flat));
82
+
--color-flat-foreground: hsl(var(--flat-foreground));
82
83
83
-
--color-muted: hsl(var(--muted));
84
-
--color-muted-foreground: hsl(var(--muted-foreground));
84
+
--color-muted: hsl(var(--muted));
85
+
--color-muted-foreground: hsl(var(--muted-foreground));
85
86
86
-
--color-accent: hsl(var(--accent));
87
-
--color-accent-foreground: hsl(var(--accent-foreground));
87
+
--color-accent: hsl(var(--accent));
88
+
--color-accent-foreground: hsl(var(--accent-foreground));
88
89
89
-
--color-destructive: hsl(var(--destructive));
90
-
--color-destructive-foreground: hsl(var(--destructive-foreground));
90
+
--color-destructive: hsl(var(--destructive));
91
+
--color-destructive-foreground: hsl(var(--destructive-foreground));
91
92
92
-
--color-border: hsl(var(--border));
93
-
--color-input: hsl(var(--input));
94
-
--color-ring: hsl(var(--ring));
95
-
--color-separator: hsl(var(--separator));
93
+
--color-border: hsl(var(--border));
94
+
--color-input: hsl(var(--input));
95
+
--color-ring: hsl(var(--ring));
96
+
--color-separator: hsl(var(--separator));
96
97
97
-
--color-chart-1: hsl(var(--chart-1));
98
-
--color-chart-2: hsl(var(--chart-2));
99
-
--color-chart-3: hsl(var(--chart-3));
100
-
--color-chart-4: hsl(var(--chart-4));
101
-
--color-chart-5: hsl(var(--chart-5));
98
+
--color-chart-1: hsl(var(--chart-1));
99
+
--color-chart-2: hsl(var(--chart-2));
100
+
--color-chart-3: hsl(var(--chart-3));
101
+
--color-chart-4: hsl(var(--chart-4));
102
+
--color-chart-5: hsl(var(--chart-5));
102
103
103
-
--width-128: 32rem;
104
-
--width-160: 40rem;
104
+
--width-128: 32rem;
105
+
--width-160: 40rem;
105
106
106
-
--text-xxs: 0.6rem;
107
-
--text-medium: 1rem;
107
+
--text-xxs: 0.6rem;
108
+
--text-medium: 1rem;
108
109
109
-
--leading-medium: 1.5rem;
110
+
--leading-medium: 1.5rem;
110
111
111
-
--animate-progress: progress 1s infinite linear;
112
-
--animate-accordion-down: accordion-down 0.2s ease-out;
113
-
--animate-accordion-up: accordion-up 0.2s ease-out;
112
+
--animate-progress: progress 1s infinite linear;
113
+
--animate-accordion-down: accordion-down 0.2s ease-out;
114
+
--animate-accordion-up: accordion-up 0.2s ease-out;
114
115
115
-
--transform-origin-left-right: 0% 50%;
116
+
--transform-origin-left-right: 0% 50%;
116
117
117
-
@keyframes progress {
118
-
0% {
119
-
transform: translateX(0) scaleX(0);
120
-
}
121
-
40% {
122
-
transform: translateX(0) scaleX(0.4);
123
-
}
124
-
100% {
125
-
transform: translateX(100%) scaleX(0.5);
126
-
}
127
-
}
118
+
@keyframes progress {
119
+
0% {
120
+
transform: translateX(0) scaleX(0);
121
+
}
122
+
123
+
40% {
124
+
transform: translateX(0) scaleX(0.4);
125
+
}
128
126
129
-
@keyframes accordion-down {
130
-
from {
131
-
height: 0;
127
+
100% {
128
+
transform: translateX(100%) scaleX(0.5);
129
+
}
132
130
}
133
-
to {
134
-
height: var(--radix-accordion-content-height);
131
+
132
+
@keyframes accordion-down {
133
+
from {
134
+
height: 0;
135
+
}
136
+
137
+
to {
138
+
height: var(--radix-accordion-content-height);
139
+
}
135
140
}
136
-
}
137
-
@keyframes accordion-up {
138
-
from {
139
-
height: var(--radix-accordion-content-height);
141
+
142
+
@keyframes accordion-up {
143
+
from {
144
+
height: var(--radix-accordion-content-height);
145
+
}
146
+
147
+
to {
148
+
height: 0;
149
+
}
140
150
}
141
-
to {
142
-
height: 0;
143
-
}
144
-
}
145
151
}
146
152
147
153
@layer base {
154
+
148
155
*,
149
156
::after,
150
157
::before,
151
158
::backdrop,
152
159
::file-selector-button {
153
-
border-color: var(--color-gray-200, currentcolor);
160
+
border-color: var(--color-gray-200, currentcolor);
154
161
}
162
+
155
163
* {
156
164
@apply border-border;
157
165
}
166
+
158
167
svg {
159
168
@apply shrink-0;
160
169
}
170
+
161
171
button {
162
172
@apply cursor-pointer
163
173
}
174
+
164
175
html {
165
176
background: var(--background-rgb);
166
177
}
178
+
167
179
body {
168
180
font-family: var(--font-outfit), var(--font-noto-sans-jp), sans-serif;
169
181
scroll-behavior: smooth;
···
316
328
}
317
329
318
330
td:has(audio) {
319
-
padding: 1px!important;
331
+
padding: 1px !important;
320
332
}
321
333
322
334
body[data-scroll-locked] {
323
-
position: static !important;
335
+
position: static !important;
324
336
}
+2
-1
app/leaderboard/[guildId]/page.tsx
+2
-1
app/leaderboard/[guildId]/page.tsx
···
1
1
import { ScreenMessage } from "@/components/screen-message";
2
2
import { getGuild } from "@/lib/api";
3
+
import { GuildFlags } from "@/typings";
3
4
import { cookies } from "next/headers";
4
5
import { redirect } from "next/navigation";
5
6
···
50
51
);
51
52
}
52
53
53
-
if (!Array.isArray(members) || !members.length) {
54
+
if (!Array.isArray(members) || !members.length || ("flags" in guild && (guild.flags & GuildFlags.PrivateLeaderboard))) {
54
55
return (
55
56
<ScreenMessage
56
57
top="14rem"
+10
-8
app/passport/[guildId]/page.tsx
+10
-8
app/passport/[guildId]/page.tsx
···
6
6
import { Button } from "@/components/ui/button";
7
7
import { getGuild } from "@/lib/api";
8
8
import paintPic from "@/public/paint.webp";
9
+
import { GuildFlags } from "@/typings";
9
10
import { intl } from "@/utils/numbers";
10
11
import { getCanonicalUrl } from "@/utils/urls";
11
12
import type { Metadata } from "next";
···
93
94
</Link>
94
95
</Button>
95
96
</Alert>
96
-
) }
97
+
)}
97
98
98
99
<div className="grid md:flex md:gap-6">
99
100
···
178
179
/>
179
180
</div>
180
181
181
-
<OverviewLink
182
-
className="mt-6"
183
-
title="View Leaderboard"
184
-
message="Easily access and view the top chatters, voice timers, and inviters from this server."
185
-
url={`/leaderboard/${guildId}`}
186
-
icon={<HiChartBar />}
187
-
/>
182
+
{guildExists && (guild.flags & GuildFlags.PrivateLeaderboard) !== 0 && (
183
+
<OverviewLink
184
+
title="View Leaderboard"
185
+
message="Easily access and view the top chatters, voice timers, and inviters from this server in the web."
186
+
url={`/leaderboard/${guildId}`}
187
+
icon={<HiChartBar />}
188
+
/>
189
+
)}
188
190
</div>
189
191
190
192
</div>
+2
-2
app/profile/layout.tsx
+2
-2
app/profile/layout.tsx
···
38
38
enabled: Boolean(user?.id),
39
39
onSuccess: (d) => userStore.setState({
40
40
...user,
41
-
extended: "status" in d ? {} : d
41
+
extended: "status" in d ? undefined : d
42
42
}),
43
43
...cacheOptions
44
44
}
···
88
88
className="h-7 font-bold"
89
89
variant="flat"
90
90
>
91
-
<HiFire/>
91
+
<HiFire />
92
92
{user.extended?.voteCount} VOTE{user.extended?.voteCount === 1 ? "" : "S"}
93
93
</Badge>
94
94
</Link>
+26
-20
app/profile/rank/leaderboard-style.component.tsx
+26
-20
app/profile/rank/leaderboard-style.component.tsx
···
1
1
import { type User, userStore } from "@/common/user";
2
-
import type { ApiError, ApiV1UsersMeGetResponse } from "@/typings";
2
+
import { type ApiError, type ApiV1UsersMeGetResponse, UserFlags } from "@/typings";
3
+
import { BitfieldManager } from "@/utils/bitfields";
3
4
import { cn } from "@/utils/cn";
4
5
import { deepMerge } from "@/utils/deepMerge";
5
6
import { useState } from "react";
6
7
7
8
export default function LeaderboardStyle() {
8
9
const user = userStore((s) => s);
10
+
11
+
const flags = new BitfieldManager(user?.extended?.flags || 0);
12
+
const enabled = flags.has(UserFlags.LeaderboardAlternateStyle);
9
13
10
14
const [error, setError] = useState<string | null>(null);
11
15
12
16
if (user?.id && !user.extended) return <></>;
13
17
14
-
async function update(useLeaderboardList: boolean) {
15
-
if (user?.extended?.rank?.useLeaderboardList === useLeaderboardList) return;
18
+
async function update(alternateLeaderboardStyle: boolean) {
16
19
setError(null);
17
20
18
-
const res = await fetch(`${process.env.NEXT_PUBLIC_API}/users/@me/rank`, {
21
+
const flags = new BitfieldManager(user?.extended?.flags || 0);
22
+
if (alternateLeaderboardStyle) flags.add(UserFlags.LeaderboardAlternateStyle);
23
+
else flags.remove(UserFlags.LeaderboardAlternateStyle);
24
+
25
+
const res = await fetch(`${process.env.NEXT_PUBLIC_API}/users/@me`, {
19
26
method: "PATCH",
20
27
credentials: "include",
21
28
headers: {
22
29
"Content-Type": "application/json"
23
30
},
24
-
body: JSON.stringify({ useLeaderboardList })
31
+
body: JSON.stringify({ flags: flags.get() })
25
32
})
26
33
.then((r) => r.json())
27
34
.catch(() => null) as ApiV1UsersMeGetResponse["rank"] | ApiError | null;
28
35
29
36
if (!res || "message" in res) {
30
-
setError(
31
-
res && "message" in res
32
-
? res.message
33
-
: "Failed to update"
37
+
setError(res && "message" in res
38
+
? res.message
39
+
: "Failed to update"
34
40
);
35
41
return;
36
42
}
37
43
38
44
userStore.setState({
39
45
...deepMerge<User>(user, {
40
-
extended: { rank: res }
46
+
extended: { rank: res, flags: flags.get() }
41
47
})
42
48
});
43
49
}
···
47
53
48
54
<button
49
55
className="w-full"
50
-
onClick={() => update(false)}
56
+
onClick={() => enabled && update(false)}
51
57
>
52
58
<div
53
59
className={cn(
54
60
"border-2 duration-200 rounded-md group p-6 mt-1 grid grid-rows-5 grid-cols-2 gap-3",
55
-
user?.extended?.rank?.useLeaderboardList
61
+
enabled
56
62
? "dark:border-neutral-700 hover:border-neutral-500 border-neutral-300 "
57
63
: "dark:border-violet-400/60 dark:hover:border-violet-400 border-violet-600/60 hover:border-violet-600"
58
64
)}
···
62
68
<div
63
69
className={cn(
64
70
"duration-200 h-6 w-6 aspect-square rounded-full",
65
-
user?.extended?.rank?.useLeaderboardList
71
+
enabled
66
72
? "dark:bg-neutral-700/90 dark:group-hover:bg-neutral-400/60 bg-neutral-300/90 group-hover:bg-neutral-600/60"
67
73
: "dark:bg-violet-400/50 dark:group-hover:bg-violet-400/70 bg-violet-600/50 group-hover:bg-violet-600/70"
68
74
)}
···
70
76
<div
71
77
className={cn(
72
78
"duration-200 h-6 rounded-full",
73
-
user?.extended?.rank?.useLeaderboardList
79
+
enabled
74
80
? "dark:bg-neutral-700/80 dark:group-hover:bg-neutral-400/50 bg-neutral-300/80 group-hover:bg-neutral-600/50"
75
81
: "dark:bg-violet-400/40 dark:group-hover:bg-violet-400/60 bg-violet-600/40 group-hover:bg-violet-600/60"
76
82
)}
···
83
89
84
90
<button
85
91
className="w-full"
86
-
onClick={() => update(true)}
92
+
onClick={() => !enabled && update(true)}
87
93
>
88
94
<div
89
95
className={cn(
90
96
"border-2 duration-200 rounded-md p-4 mt-1 flex flex-col gap-2 group",
91
-
user?.extended?.rank?.useLeaderboardList
97
+
enabled
92
98
? "dark:border-violet-400/60 dark:hover:border-violet-400 border-violet-600/60 hover:border-violet-600"
93
99
: "dark:border-neutral-700 hover:border-neutral-500 border-neutral-300 "
94
100
)}
···
98
104
<div
99
105
className={cn(
100
106
"duration-200 h-4 w-4 aspect-square rounded-full",
101
-
user?.extended?.rank?.useLeaderboardList
107
+
enabled
102
108
? "dark:bg-violet-400/50 dark:group-hover:bg-violet-400/70 bg-violet-600/50 group-hover:bg-violet-600/70"
103
109
: "dark:bg-neutral-700/90 dark:group-hover:bg-neutral-400/60 bg-neutral-300/90 group-hover:bg-neutral-600/60"
104
110
)}
···
106
112
<div
107
113
className={cn(
108
114
"duration-200 h-4 rounded-full",
109
-
user?.extended?.rank?.useLeaderboardList
115
+
enabled
110
116
? "dark:bg-violet-400/40 dark:group-hover:bg-violet-400/60 bg-violet-600/40 group-hover:bg-violet-600/60"
111
117
: "dark:bg-neutral-700/80 dark:group-hover:bg-neutral-400/50 bg-neutral-300/80 group-hover:bg-neutral-600/50"
112
118
)}
···
120
126
</div>
121
127
122
128
<div className="flex">
123
-
{error &&
129
+
{error && (
124
130
<div className="ml-auto text-red-500 text-sm">
125
131
{error}
126
132
</div>
127
-
}
133
+
)}
128
134
</div>
129
135
</>);
130
136
}
+20
-6
app/profile/text-to-speech/page.tsx
+20
-6
app/profile/text-to-speech/page.tsx
···
2
2
3
3
import { type User, userStore } from "@/common/user";
4
4
import SelectInput from "@/components/inputs/select-menu";
5
+
import Switch from "@/components/inputs/switch";
5
6
import { TTSFaq } from "@/components/tts-faq";
7
+
import { UserFlags } from "@/typings";
8
+
import { transformer } from "@/utils/bitfields";
6
9
import { deepMerge } from "@/utils/deepMerge";
7
10
import { type actor, getVoices, voices } from "@/utils/tts";
8
11
9
12
export default function Home() {
10
-
const user = userStore((s) => s);
13
+
const user = userStore((s) => s!);
11
14
12
-
if (user?.id && !user.extended) return <></>;
15
+
if (user.id && !user.extended) return <></>;
13
16
14
17
return (
15
18
<div>
···
18
21
<SelectInput
19
22
name="Default Speaker"
20
23
url="/users/@me/text-to-speech"
21
-
dataName="defaultVoice"
24
+
dataName="voice"
22
25
description="This is the default voice for any text to speech conversion."
23
26
items={voices.map((voice) => ({
24
27
name: getVoices(voice)[0],
25
28
value: voice
26
29
}))}
27
-
defaultState={user?.extended?.tts?.defaultVoice}
30
+
defaultState={user?.extended?.voice}
28
31
onSave={(options) => {
29
-
if (!user) return;
30
-
userStore.setState(deepMerge<User>(user, { extended: { tts: { ...user.extended?.tts, defaultVoice: options.value as keyof typeof actor } } }));
32
+
userStore.setState(deepMerge<User>(user, { extended: { voice: options.value as keyof typeof actor } }));
33
+
}}
34
+
/>
35
+
<Switch
36
+
label="Chat to Speech"
37
+
description="Whenever your messages should be spoken aloud in chat to speech channels."
38
+
inverted
39
+
endpoint="/users/@me"
40
+
k="flags"
41
+
defaultState={(user.extended!.flags & UserFlags.ChatToSpeechIgnore) !== 0}
42
+
transform={(value) => transformer(value, user.extended!.flags, UserFlags.ChatToSpeechIgnore)}
43
+
onSave={(value) => {
44
+
userStore.setState(deepMerge<User>(user, { extended: { flags: transformer(value, user.extended!.flags, UserFlags.ChatToSpeechIgnore) } }));
31
45
}}
32
46
/>
33
47
</div>
+1
-1
app/provider.tsx
+1
-1
app/provider.tsx
···
37
37
return (
38
38
<TooltipProvider>
39
39
<QueryClientProvider client={queryClient}>
40
-
<main className={cn("dark:text-neutral-400 text-neutral-700 flex flex-col items-center justify-between md:p-5 p-3 w-full max-w-7xl mt-2 md:mt-10", className)}>
40
+
<main className={cn("text-neutral-400 flex flex-col items-center justify-between md:p-5 p-3 w-full max-w-7xl mt-2 md:mt-10", className)}>
41
41
{children}
42
42
</main>
43
43
</QueryClientProvider>
+52
-182
bun.lock
+52
-182
bun.lock
···
38
38
"react-loading-icons": "latest",
39
39
"react-markdown": "latest",
40
40
"react-query": "latest",
41
-
"recharts": "latest",
42
41
"rehype-raw": "latest",
43
42
"sharp": "latest",
44
43
"tailwind-merge": "latest",
45
44
"tailwindcss": "latest",
46
45
"tailwindcss-animate": "latest",
46
+
"tw-animate-css": "latest",
47
47
"typescript": "latest",
48
48
"vaul": "latest",
49
49
"zustand": "latest",
···
136
136
137
137
"@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="],
138
138
139
-
"@eslint/config-array": ["@eslint/config-array@0.21.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ=="],
139
+
"@eslint/config-array": ["@eslint/config-array@0.21.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA=="],
140
140
141
-
"@eslint/config-helpers": ["@eslint/config-helpers@0.4.0", "", { "dependencies": { "@eslint/core": "^0.16.0" } }, "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog=="],
141
+
"@eslint/config-helpers": ["@eslint/config-helpers@0.4.1", "", { "dependencies": { "@eslint/core": "^0.16.0" } }, "sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw=="],
142
142
143
143
"@eslint/core": ["@eslint/core@0.16.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q=="],
144
144
145
145
"@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="],
146
146
147
-
"@eslint/js": ["@eslint/js@9.37.0", "", {}, "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg=="],
147
+
"@eslint/js": ["@eslint/js@9.38.0", "", {}, "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A=="],
148
148
149
-
"@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="],
149
+
"@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="],
150
150
151
151
"@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.0", "", { "dependencies": { "@eslint/core": "^0.16.0", "levn": "^0.4.1" } }, "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A=="],
152
152
···
234
234
235
235
"@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=="],
236
236
237
-
"@next/env": ["@next/env@15.5.4", "", {}, "sha512-27SQhYp5QryzIT5uO8hq99C69eLQ7qkzkDPsk3N+GuS2XgOgoYEeOav7Pf8Tn4drECOVDsDg8oj+/DVy8qQL2A=="],
237
+
"@next/env": ["@next/env@15.5.6", "", {}, "sha512-3qBGRW+sCGzgbpc5TS1a0p7eNxnOarGVQhZxfvTdnV0gFI61lX7QNtQ4V1TSREctXzYn5NetbUsLvyqwLFJM6Q=="],
238
238
239
-
"@next/eslint-plugin-next": ["@next/eslint-plugin-next@15.5.4", "", { "dependencies": { "fast-glob": "3.3.1" } }, "sha512-SR1vhXNNg16T4zffhJ4TS7Xn7eq4NfKfcOsRwea7RIAHrjRpI9ALYbamqIJqkAhowLlERffiwk0FMvTLNdnVtw=="],
239
+
"@next/eslint-plugin-next": ["@next/eslint-plugin-next@15.5.6", "", { "dependencies": { "fast-glob": "3.3.1" } }, "sha512-YxDvsT2fwy1j5gMqk3ppXlsgDopHnkM4BoxSVASbvvgh5zgsK8lvWerDzPip8k3WVzsTZ1O7A7si1KNfN4OZfQ=="],
240
240
241
-
"@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.5.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-nopqz+Ov6uvorej8ndRX6HlxCYWCO3AHLfKK2TYvxoSB2scETOcfm/HSS3piPqc3A+MUgyHoqE6je4wnkjfrOA=="],
241
+
"@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.5.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ES3nRz7N+L5Umz4KoGfZ4XX6gwHplwPhioVRc25+QNsDa7RtUF/z8wJcbuQ2Tffm5RZwuN2A063eapoJ1u4nPg=="],
242
242
243
-
"@next/swc-darwin-x64": ["@next/swc-darwin-x64@15.5.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-QOTCFq8b09ghfjRJKfb68kU9k2K+2wsC4A67psOiMn849K9ZXgCSRQr0oVHfmKnoqCbEmQWG1f2h1T2vtJJ9mA=="],
243
+
"@next/swc-darwin-x64": ["@next/swc-darwin-x64@15.5.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-JIGcytAyk9LQp2/nuVZPAtj8uaJ/zZhsKOASTjxDug0SPU9LAM3wy6nPU735M1OqacR4U20LHVF5v5Wnl9ptTA=="],
244
244
245
-
"@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@15.5.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-eRD5zkts6jS3VfE/J0Kt1VxdFqTnMc3QgO5lFE5GKN3KDI/uUpSyK3CjQHmfEkYR4wCOl0R0XrsjpxfWEA++XA=="],
245
+
"@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@15.5.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-qvz4SVKQ0P3/Im9zcS2RmfFL/UCQnsJKJwQSkissbngnB/12c6bZTCB0gHTexz1s6d/mD0+egPKXAIRFVS7hQg=="],
246
246
247
-
"@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@15.5.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-TOK7iTxmXFc45UrtKqWdZ1shfxuL4tnVAOuuJK4S88rX3oyVV4ZkLjtMT85wQkfBrOOvU55aLty+MV8xmcJR8A=="],
247
+
"@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@15.5.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-FsbGVw3SJz1hZlvnWD+T6GFgV9/NYDeLTNQB2MXoPN5u9VA9OEDy6fJEfePfsUKAhJufFbZLgp0cPxMuV6SV0w=="],
248
248
249
-
"@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@15.5.4", "", { "os": "linux", "cpu": "x64" }, "sha512-7HKolaj+481FSW/5lL0BcTkA4Ueam9SPYWyN/ib/WGAFZf0DGAN8frNpNZYFHtM4ZstrHZS3LY3vrwlIQfsiMA=="],
249
+
"@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@15.5.6", "", { "os": "linux", "cpu": "x64" }, "sha512-3QnHGFWlnvAgyxFxt2Ny8PTpXtQD7kVEeaFat5oPAHHI192WKYB+VIKZijtHLGdBBvc16tiAkPTDmQNOQ0dyrA=="],
250
250
251
-
"@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@15.5.4", "", { "os": "linux", "cpu": "x64" }, "sha512-nlQQ6nfgN0nCO/KuyEUwwOdwQIGjOs4WNMjEUtpIQJPR2NUfmGpW2wkJln1d4nJ7oUzd1g4GivH5GoEPBgfsdw=="],
251
+
"@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@15.5.6", "", { "os": "linux", "cpu": "x64" }, "sha512-OsGX148sL+TqMK9YFaPFPoIaJKbFJJxFzkXZljIgA9hjMjdruKht6xDCEv1HLtlLNfkx3c5w2GLKhj7veBQizQ=="],
252
252
253
-
"@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@15.5.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-PcR2bN7FlM32XM6eumklmyWLLbu2vs+D7nJX8OAIoWy69Kef8mfiN4e8TUv2KohprwifdpFKPzIP1njuCjD0YA=="],
253
+
"@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@15.5.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-ONOMrqWxdzXDJNh2n60H6gGyKed42Ieu6UTVPZteXpuKbLZTH4G4eBMsr5qWgOBA+s7F+uB4OJbZnrkEDnZ5Fg=="],
254
254
255
-
"@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.5.4", "", { "os": "win32", "cpu": "x64" }, "sha512-1ur2tSHZj8Px/KMAthmuI9FMp/YFusMMGoRNJaRZMOlSkgvLjzosSdQI0cJAKogdHl3qXUQKL9MGaYvKwA7DXg=="],
255
+
"@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.5.6", "", { "os": "win32", "cpu": "x64" }, "sha512-pxK4VIjFRx1MY92UycLOOw7dTdvccWsNETQ0kDHkBlcFH1GrTLUjSiHU1ohrznnux6TqRHgv5oflhfIWZwVROQ=="],
256
256
257
257
"@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
258
258
···
342
342
343
343
"@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="],
344
344
345
-
"@reduxjs/toolkit": ["@reduxjs/toolkit@2.8.2", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@standard-schema/utils": "^0.3.0", "immer": "^10.0.3", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "reselect": "^5.1.0" }, "peerDependencies": { "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" }, "optionalPeers": ["react", "react-redux"] }, "sha512-MYlOhQ0sLdw4ud48FoC5w0dH9VfWQjtCjreKwYTT3l+r427qYC5Y8PihNutepr8XrNaBUDQo9khWUwQxZaqt5A=="],
346
-
347
345
"@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="],
348
346
349
347
"@rushstack/eslint-patch": ["@rushstack/eslint-patch@1.11.0", "", {}, "sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ=="],
···
352
350
353
351
"@sapphire/snowflake": ["@sapphire/snowflake@3.5.5", "", {}, "sha512-xzvBr1Q1c4lCe7i6sRnrofxeO1QTP/LKQ6A6qy0iB4x5yfiSfARMEQEghojzTNALDTcv8En04qYNIco9/K9eZQ=="],
354
352
355
-
"@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="],
356
-
357
-
"@standard-schema/utils": ["@standard-schema/utils@0.3.0", "", {}, "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g=="],
358
-
359
-
"@stylistic/eslint-plugin": ["@stylistic/eslint-plugin@5.4.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.0", "@typescript-eslint/types": "^8.44.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "estraverse": "^5.3.0", "picomatch": "^4.0.3" }, "peerDependencies": { "eslint": ">=9.0.0" } }, "sha512-UG8hdElzuBDzIbjG1QDwnYH0MQ73YLXDFHgZzB4Zh/YJfnw8XNsloVtytqzx0I2Qky9THSdpTmi8Vjn/pf/Lew=="],
353
+
"@stylistic/eslint-plugin": ["@stylistic/eslint-plugin@5.5.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.0", "@typescript-eslint/types": "^8.46.1", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "estraverse": "^5.3.0", "picomatch": "^4.0.3" }, "peerDependencies": { "eslint": ">=9.0.0" } }, "sha512-IeZF+8H0ns6prg4VrkhgL+yrvDXWDH2cKchrbh80ejG9dQgZWp10epHMbgRuQvgchLII/lfh6Xn3lu6+6L86Hw=="],
360
354
361
355
"@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="],
362
356
···
392
386
393
387
"@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
394
388
395
-
"@types/d3-array": ["@types/d3-array@3.2.1", "", {}, "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg=="],
396
-
397
-
"@types/d3-color": ["@types/d3-color@3.1.3", "", {}, "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="],
398
-
399
-
"@types/d3-ease": ["@types/d3-ease@3.0.2", "", {}, "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="],
400
-
401
-
"@types/d3-interpolate": ["@types/d3-interpolate@3.0.4", "", { "dependencies": { "@types/d3-color": "*" } }, "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA=="],
402
-
403
-
"@types/d3-path": ["@types/d3-path@3.1.1", "", {}, "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg=="],
404
-
405
-
"@types/d3-scale": ["@types/d3-scale@4.0.9", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="],
406
-
407
-
"@types/d3-shape": ["@types/d3-shape@3.1.7", "", { "dependencies": { "@types/d3-path": "*" } }, "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg=="],
408
-
409
-
"@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="],
410
-
411
-
"@types/d3-timer": ["@types/d3-timer@3.0.2", "", {}, "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="],
412
-
413
389
"@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="],
414
390
415
391
"@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="],
···
426
402
427
403
"@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="],
428
404
429
-
"@types/node": ["@types/node@24.7.2", "", { "dependencies": { "undici-types": "~7.14.0" } }, "sha512-/NbVmcGTP+lj5oa4yiYxxeBjRivKQ5Ns1eSZeB99ExsEQ6rX5XYU1Zy/gGxY/ilqtD4Etx9mKyrPxZRetiahhA=="],
405
+
"@types/node": ["@types/node@24.8.1", "", { "dependencies": { "undici-types": "~7.14.0" } }, "sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q=="],
430
406
431
407
"@types/react": ["@types/react@19.2.2", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA=="],
432
408
433
-
"@types/react-dom": ["@types/react-dom@19.2.1", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-/EEvYBdT3BflCWvTMO7YkYBHVE9Ci6XdqZciZANQgKpaiDRGOLIlRo91jbTNRQjgPFWVaRxcYc0luVNFitz57A=="],
409
+
"@types/react-dom": ["@types/react-dom@19.2.2", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw=="],
434
410
435
411
"@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
436
412
437
-
"@types/use-sync-external-store": ["@types/use-sync-external-store@0.0.6", "", {}, "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg=="],
413
+
"@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.46.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.46.1", "@typescript-eslint/type-utils": "8.46.1", "@typescript-eslint/utils": "8.46.1", "@typescript-eslint/visitor-keys": "8.46.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.46.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-rUsLh8PXmBjdiPY+Emjz9NX2yHvhS11v0SR6xNJkm5GM1MO9ea/1GoDKlHHZGrOJclL/cZ2i/vRUYVtjRhrHVQ=="],
438
414
439
-
"@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.44.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.44.1", "@typescript-eslint/type-utils": "8.44.1", "@typescript-eslint/utils": "8.44.1", "@typescript-eslint/visitor-keys": "8.44.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.44.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-molgphGqOBT7t4YKCSkbasmu1tb1MgrZ2szGzHbclF7PNmOkSTQVHy+2jXOSnxvR3+Xe1yySHFZoqMpz3TfQsw=="],
415
+
"@typescript-eslint/parser": ["@typescript-eslint/parser@8.46.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.46.1", "@typescript-eslint/types": "8.46.1", "@typescript-eslint/typescript-estree": "8.46.1", "@typescript-eslint/visitor-keys": "8.46.1", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA=="],
440
416
441
-
"@typescript-eslint/parser": ["@typescript-eslint/parser@8.44.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.44.1", "@typescript-eslint/types": "8.44.1", "@typescript-eslint/typescript-estree": "8.44.1", "@typescript-eslint/visitor-keys": "8.44.1", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw=="],
417
+
"@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.46.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.46.1", "@typescript-eslint/types": "^8.46.1", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg=="],
442
418
443
-
"@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.46.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.46.0", "@typescript-eslint/types": "^8.46.0", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ=="],
419
+
"@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.46.1", "", { "dependencies": { "@typescript-eslint/types": "8.46.1", "@typescript-eslint/visitor-keys": "8.46.1" } }, "sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A=="],
444
420
445
-
"@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.44.1", "", { "dependencies": { "@typescript-eslint/types": "8.44.1", "@typescript-eslint/visitor-keys": "8.44.1" } }, "sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg=="],
421
+
"@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.46.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g=="],
446
422
447
-
"@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.46.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw=="],
423
+
"@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.46.1", "", { "dependencies": { "@typescript-eslint/types": "8.46.1", "@typescript-eslint/typescript-estree": "8.46.1", "@typescript-eslint/utils": "8.46.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-+BlmiHIiqufBxkVnOtFwjah/vrkF4MtKKvpXrKSPLCkCtAp8H01/VV43sfqA98Od7nJpDcFnkwgyfQbOG0AMvw=="],
448
424
449
-
"@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.44.1", "", { "dependencies": { "@typescript-eslint/types": "8.44.1", "@typescript-eslint/typescript-estree": "8.44.1", "@typescript-eslint/utils": "8.44.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-KdEerZqHWXsRNKjF9NYswNISnFzXfXNDfPxoTh7tqohU/PRIbwTmsjGK6V9/RTYWau7NZvfo52lgVk+sJh0K3g=="],
450
-
451
-
"@typescript-eslint/types": ["@typescript-eslint/types@8.44.1", "", {}, "sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ=="],
425
+
"@typescript-eslint/types": ["@typescript-eslint/types@8.46.1", "", {}, "sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ=="],
452
426
453
-
"@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.46.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.46.0", "@typescript-eslint/tsconfig-utils": "8.46.0", "@typescript-eslint/types": "8.46.0", "@typescript-eslint/visitor-keys": "8.46.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg=="],
427
+
"@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.46.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.46.1", "@typescript-eslint/tsconfig-utils": "8.46.1", "@typescript-eslint/types": "8.46.1", "@typescript-eslint/visitor-keys": "8.46.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg=="],
454
428
455
429
"@typescript-eslint/utils": ["@typescript-eslint/utils@8.44.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.44.1", "@typescript-eslint/types": "8.44.1", "@typescript-eslint/typescript-estree": "8.44.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg=="],
456
430
457
-
"@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.44.1", "", { "dependencies": { "@typescript-eslint/types": "8.44.1", "eslint-visitor-keys": "^4.2.1" } }, "sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw=="],
431
+
"@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.46.1", "", { "dependencies": { "@typescript-eslint/types": "8.46.1", "eslint-visitor-keys": "^4.2.1" } }, "sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA=="],
458
432
459
433
"@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="],
460
434
···
586
560
587
561
"callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
588
562
589
-
"caniuse-lite": ["caniuse-lite@1.0.30001750", "", {}, "sha512-cuom0g5sdX6rw00qOoLNSFCJ9/mYIsuSOA+yzpDw8eopiFqcVwQvZHqov0vmEighRxX++cfC0Vg1G+1Iy/mSpQ=="],
563
+
"caniuse-lite": ["caniuse-lite@1.0.30001751", "", {}, "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw=="],
590
564
591
565
"ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="],
592
566
···
634
608
635
609
"csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],
636
610
637
-
"d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="],
638
-
639
-
"d3-color": ["d3-color@3.1.0", "", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="],
640
-
641
-
"d3-ease": ["d3-ease@3.0.1", "", {}, "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="],
642
-
643
-
"d3-format": ["d3-format@3.1.0", "", {}, "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA=="],
644
-
645
-
"d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="],
646
-
647
-
"d3-path": ["d3-path@3.1.0", "", {}, "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="],
648
-
649
-
"d3-scale": ["d3-scale@4.0.2", "", { "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", "d3-interpolate": "1.2.0 - 3", "d3-time": "2.1.1 - 3", "d3-time-format": "2 - 4" } }, "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="],
650
-
651
-
"d3-shape": ["d3-shape@3.2.0", "", { "dependencies": { "d3-path": "^3.1.0" } }, "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA=="],
652
-
653
-
"d3-time": ["d3-time@3.1.0", "", { "dependencies": { "d3-array": "2 - 3" } }, "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="],
654
-
655
-
"d3-time-format": ["d3-time-format@4.1.0", "", { "dependencies": { "d3-time": "1 - 3" } }, "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="],
656
-
657
-
"d3-timer": ["d3-timer@3.0.1", "", {}, "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="],
658
-
659
611
"damerau-levenshtein": ["damerau-levenshtein@1.0.8", "", {}, "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA=="],
660
612
661
613
"data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="],
···
665
617
"data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="],
666
618
667
619
"debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
668
-
669
-
"decimal.js-light": ["decimal.js-light@2.5.1", "", {}, "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg=="],
670
620
671
621
"decode-named-character-reference": ["decode-named-character-reference@1.1.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w=="],
672
622
···
686
636
687
637
"devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
688
638
689
-
"discord-api-types": ["discord-api-types@0.38.29", "", {}, "sha512-+5BfrjLJN1hrrcK0MxDQli6NSv5lQH7Y3/qaOfk9+k7itex8RkA/UcevVMMLe8B4IKIawr4ITBTb2fBB2vDORg=="],
639
+
"discord-api-types": ["discord-api-types@0.38.30", "", {}, "sha512-KhAqlBrg+rVK+Ob7INMF5o63yW4/GUzRatG/AjyVsIO8lgcLyR8qCl2HokIVzWwmzkJYG0CEPXsKMOqau3E8NA=="],
690
640
691
641
"doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="],
692
642
···
715
665
"es-shim-unscopables": ["es-shim-unscopables@1.1.0", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw=="],
716
666
717
667
"es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="],
718
-
719
-
"es-toolkit": ["es-toolkit@1.39.7", "", {}, "sha512-ek/wWryKouBrZIjkwW2BFf91CWOIMvoy2AE5YYgUrfWsJQM2Su1LoLtrw8uusEpN9RfqLlV/0FVNjT0WMv8Bxw=="],
720
668
721
669
"escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
722
670
723
671
"escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
724
672
725
-
"eslint": ["eslint@9.37.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.4.0", "@eslint/core": "^0.16.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.37.0", "@eslint/plugin-kit": "^0.4.0", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig=="],
673
+
"eslint": ["eslint@9.38.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.1", "@eslint/config-helpers": "^0.4.1", "@eslint/core": "^0.16.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.38.0", "@eslint/plugin-kit": "^0.4.0", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw=="],
726
674
727
-
"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=="],
675
+
"eslint-config-next": ["eslint-config-next@15.5.6", "", { "dependencies": { "@next/eslint-plugin-next": "15.5.6", "@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-cGr3VQlPsZBEv8rtYp4BpG1KNXDqGvPo9VC1iaCgIA11OfziC/vczng+TnAS3WpRIR3Q5ye/6yl+CRUuZ1fPGg=="],
728
676
729
677
"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=="],
730
678
···
765
713
"estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="],
766
714
767
715
"esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
768
-
769
-
"eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="],
770
716
771
717
"extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="],
772
718
···
888
834
889
835
"internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="],
890
836
891
-
"internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="],
892
-
893
837
"is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="],
894
838
895
839
"is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="],
···
958
902
959
903
"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=="],
960
904
961
-
"jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="],
905
+
"jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="],
962
906
963
907
"js-cookie": ["js-cookie@3.0.5", "", {}, "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw=="],
964
908
···
1020
964
1021
965
"lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
1022
966
1023
-
"lucide-react": ["lucide-react@0.545.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-7r1/yUuflQDSt4f1bpn5ZAocyIxcTyVyBBChSVtBKn5M+392cPmI5YJMWOJKk/HUWGm5wg83chlAZtCcGbEZtw=="],
967
+
"lucide-react": ["lucide-react@0.546.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Z94u6fKT43lKeYHiVyvyR8fT7pwCzDu7RyMPpTvh054+xahSgj4HFQ+NmflvzdXsoAjYGdCguGaFKYuvq0ThCQ=="],
1024
968
1025
969
"magic-bytes.js": ["magic-bytes.js@1.10.0", "", {}, "sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ=="],
1026
970
···
1116
1060
1117
1061
"natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="],
1118
1062
1119
-
"next": ["next@15.5.4", "", { "dependencies": { "@next/env": "15.5.4", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.5.4", "@next/swc-darwin-x64": "15.5.4", "@next/swc-linux-arm64-gnu": "15.5.4", "@next/swc-linux-arm64-musl": "15.5.4", "@next/swc-linux-x64-gnu": "15.5.4", "@next/swc-linux-x64-musl": "15.5.4", "@next/swc-win32-arm64-msvc": "15.5.4", "@next/swc-win32-x64-msvc": "15.5.4", "sharp": "^0.34.3" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-xH4Yjhb82sFYQfY3vbkJfgSDgXvBB6a8xPs9i35k6oZJRoQRihZH+4s9Yo2qsWpzBmZ3lPXaJ2KPXLfkvW4LnA=="],
1063
+
"next": ["next@15.5.6", "", { "dependencies": { "@next/env": "15.5.6", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.5.6", "@next/swc-darwin-x64": "15.5.6", "@next/swc-linux-arm64-gnu": "15.5.6", "@next/swc-linux-arm64-musl": "15.5.6", "@next/swc-linux-x64-gnu": "15.5.6", "@next/swc-linux-x64-musl": "15.5.6", "@next/swc-win32-arm64-msvc": "15.5.6", "@next/swc-win32-x64-msvc": "15.5.6", "sharp": "^0.34.3" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-zTxsnI3LQo3c9HSdSf91O1jMNsEzIXDShXd4wVdg9y5shwLqBXi4ZtUUJyB86KGVSJLZx0PFONvO54aheGX8QQ=="],
1120
1064
1121
1065
"next-client-cookies": ["next-client-cookies@2.1.0", "", { "dependencies": { "js-cookie": "^3.0.5" }, "peerDependencies": { "next": ">= 15.0.0", "react": ">= 16.8.0" } }, "sha512-kC4xPjPi4H+n2qhMNfArG++FTg0fPe7eykJ2o15hbVudHMvMpXMmZYvnqHaCnisTZuRl1DqZPlwwercO1r5jDA=="],
1122
1066
···
1192
1136
1193
1137
"react-icons": ["react-icons@5.5.0", "", { "peerDependencies": { "react": "*" } }, "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw=="],
1194
1138
1195
-
"react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="],
1139
+
"react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="],
1196
1140
1197
1141
"react-loading-icons": ["react-loading-icons@1.1.0", "", {}, "sha512-Y9eZ6HAufmUd8DIQd6rFrx5Bt/oDlTM9Nsjvf8YpajTa3dI8cLNU8jUN5z7KTANU+Yd6/KJuBjxVlrU2dMw33g=="],
1198
1142
···
1200
1144
1201
1145
"react-query": ["react-query@3.39.3", "", { "dependencies": { "@babel/runtime": "^7.5.5", "broadcast-channel": "^3.4.1", "match-sorter": "^6.0.2" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g=="],
1202
1146
1203
-
"react-redux": ["react-redux@9.2.0", "", { "dependencies": { "@types/use-sync-external-store": "^0.0.6", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "@types/react": "^18.2.25 || ^19", "react": "^18.0 || ^19", "redux": "^5.0.0" }, "optionalPeers": ["@types/react", "redux"] }, "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g=="],
1204
-
1205
1147
"react-remove-scroll": ["react-remove-scroll@2.6.3", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ=="],
1206
1148
1207
1149
"react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="],
1208
1150
1209
1151
"react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "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-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="],
1210
1152
1211
-
"recharts": ["recharts@3.2.1", "", { "dependencies": { "@reduxjs/toolkit": "1.x.x || 2.x.x", "clsx": "^2.1.1", "decimal.js-light": "^2.5.1", "es-toolkit": "^1.39.3", "eventemitter3": "^5.0.1", "immer": "^10.1.1", "react-redux": "8.x.x || 9.x.x", "reselect": "5.1.1", "tiny-invariant": "^1.3.3", "use-sync-external-store": "^1.2.2", "victory-vendor": "^37.0.2" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-0JKwHRiFZdmLq/6nmilxEZl3pqb4T+aKkOkOi/ZISRZwfBhVMgInxzlYU9D4KnCH3KINScLy68m/OvMXoYGZUw=="],
1212
-
1213
-
"redux": ["redux@5.0.1", "", {}, "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w=="],
1214
-
1215
-
"redux-thunk": ["redux-thunk@3.1.0", "", { "peerDependencies": { "redux": "^5.0.0" } }, "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw=="],
1216
-
1217
1153
"reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="],
1218
1154
1219
1155
"regenerator-runtime": ["regenerator-runtime@0.14.1", "", {}, "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="],
···
1231
1167
"remark-rehype": ["remark-rehype@11.1.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ=="],
1232
1168
1233
1169
"remove-accents": ["remove-accents@0.5.0", "", {}, "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A=="],
1234
-
1235
-
"reselect": ["reselect@5.1.1", "", {}, "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w=="],
1236
1170
1237
1171
"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=="],
1238
1172
···
1326
1260
1327
1261
"tar": ["tar@7.5.1", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g=="],
1328
1262
1329
-
"tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="],
1330
-
1331
1263
"tinyglobby": ["tinyglobby@0.2.12", "", { "dependencies": { "fdir": "^6.4.3", "picomatch": "^4.0.2" } }, "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww=="],
1332
1264
1333
1265
"to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
···
1341
1273
"tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="],
1342
1274
1343
1275
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
1276
+
1277
+
"tw-animate-css": ["tw-animate-css@1.4.0", "", {}, "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ=="],
1344
1278
1345
1279
"type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
1346
1280
···
1354
1288
1355
1289
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
1356
1290
1357
-
"typescript-eslint": ["typescript-eslint@8.46.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.46.0", "@typescript-eslint/parser": "8.46.0", "@typescript-eslint/typescript-estree": "8.46.0", "@typescript-eslint/utils": "8.46.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-6+ZrB6y2bT2DX3K+Qd9vn7OFOJR+xSLDj+Aw/N3zBwUt27uTw2sw2TE2+UcY1RiyBZkaGbTkVg9SSdPNUG6aUw=="],
1291
+
"typescript-eslint": ["typescript-eslint@8.46.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.46.1", "@typescript-eslint/parser": "8.46.1", "@typescript-eslint/typescript-estree": "8.46.1", "@typescript-eslint/utils": "8.46.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-VHgijW803JafdSsDO8I761r3SHrgk4T00IdyQ+/UsthtgPRsBWQLqoSxOolxTpxRKi1kGXK0bSz4CoAc9ObqJA=="],
1358
1292
1359
1293
"unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="],
1360
1294
···
1395
1329
"vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="],
1396
1330
1397
1331
"vfile-message": ["vfile-message@4.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw=="],
1398
-
1399
-
"victory-vendor": ["victory-vendor@37.3.6", "", { "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", "@types/d3-interpolate": "^3.0.1", "@types/d3-scale": "^4.0.2", "@types/d3-shape": "^3.1.0", "@types/d3-time": "^3.0.0", "@types/d3-timer": "^3.0.0", "d3-array": "^3.1.6", "d3-ease": "^3.0.1", "d3-interpolate": "^3.0.1", "d3-scale": "^4.0.2", "d3-shape": "^3.1.0", "d3-time": "^3.0.0", "d3-timer": "^3.0.1" } }, "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ=="],
1400
1332
1401
1333
"web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="],
1402
1334
···
1450
1382
1451
1383
"@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
1452
1384
1453
-
"@eslint/config-array/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
1454
-
1455
1385
"@eslint/eslintrc/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
1456
1386
1457
1387
"@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=="],
···
1464
1394
1465
1395
"@jridgewell/trace-mapping/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="],
1466
1396
1467
-
"@tailwindcss/node/jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="],
1468
-
1469
1397
"@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.5.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg=="],
1470
1398
1471
1399
"@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.5.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ=="],
···
1478
1406
1479
1407
"@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
1480
1408
1409
+
"@typescript-eslint/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@8.46.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.46.1", "@typescript-eslint/types": "8.46.1", "@typescript-eslint/typescript-estree": "8.46.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ=="],
1410
+
1481
1411
"@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="],
1482
1412
1483
-
"@typescript-eslint/parser/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.44.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.44.1", "@typescript-eslint/tsconfig-utils": "8.44.1", "@typescript-eslint/types": "8.44.1", "@typescript-eslint/visitor-keys": "8.44.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A=="],
1413
+
"@typescript-eslint/type-utils/@typescript-eslint/utils": ["@typescript-eslint/utils@8.46.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.46.1", "@typescript-eslint/types": "8.46.1", "@typescript-eslint/typescript-estree": "8.46.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ=="],
1484
1414
1485
-
"@typescript-eslint/parser/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
1415
+
"@typescript-eslint/typescript-estree/fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
1486
1416
1487
-
"@typescript-eslint/project-service/@typescript-eslint/types": ["@typescript-eslint/types@8.46.0", "", {}, "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA=="],
1417
+
"@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
1488
1418
1489
-
"@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.44.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.44.1", "@typescript-eslint/tsconfig-utils": "8.44.1", "@typescript-eslint/types": "8.44.1", "@typescript-eslint/visitor-keys": "8.44.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A=="],
1419
+
"@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.44.1", "", { "dependencies": { "@typescript-eslint/types": "8.44.1", "@typescript-eslint/visitor-keys": "8.44.1" } }, "sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg=="],
1490
1420
1491
-
"@typescript-eslint/type-utils/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
1492
-
1493
-
"@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@8.46.0", "", {}, "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA=="],
1494
-
1495
-
"@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.46.0", "", { "dependencies": { "@typescript-eslint/types": "8.46.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q=="],
1496
-
1497
-
"@typescript-eslint/typescript-estree/fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
1498
-
1499
-
"@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
1421
+
"@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.44.1", "", {}, "sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ=="],
1500
1422
1501
1423
"@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.44.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.44.1", "@typescript-eslint/tsconfig-utils": "8.44.1", "@typescript-eslint/types": "8.44.1", "@typescript-eslint/visitor-keys": "8.44.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A=="],
1502
1424
···
1522
1444
1523
1445
"eslint-plugin-import/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
1524
1446
1447
+
"eslint-plugin-import-x/@typescript-eslint/types": ["@typescript-eslint/types@8.44.1", "", {}, "sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ=="],
1448
+
1525
1449
"eslint-plugin-import-x/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
1526
1450
1527
1451
"eslint-plugin-react/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
···
1540
1464
1541
1465
"micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
1542
1466
1543
-
"next/caniuse-lite": ["caniuse-lite@1.0.30001745", "", {}, "sha512-ywt6i8FzvdgrrrGbr1jZVObnVv6adj+0if2/omv9cmR2oiZs30zL4DIyaptKcbOrBdOIc74QTMoJvSE2QHh5UQ=="],
1544
-
1545
1467
"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=="],
1546
1468
1547
1469
"parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
1548
1470
1549
-
"prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="],
1550
-
1551
1471
"regjsparser/jsesc": ["jsesc@3.0.2", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="],
1552
1472
1553
1473
"tinyglobby/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="],
1554
1474
1555
1475
"tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="],
1556
1476
1557
-
"typescript-eslint/@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.46.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.46.0", "@typescript-eslint/type-utils": "8.46.0", "@typescript-eslint/utils": "8.46.0", "@typescript-eslint/visitor-keys": "8.46.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.46.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA=="],
1558
-
1559
-
"typescript-eslint/@typescript-eslint/parser": ["@typescript-eslint/parser@8.46.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.46.0", "@typescript-eslint/types": "8.46.0", "@typescript-eslint/typescript-estree": "8.46.0", "@typescript-eslint/visitor-keys": "8.46.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ=="],
1560
-
1561
-
"typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@8.46.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.46.0", "@typescript-eslint/types": "8.46.0", "@typescript-eslint/typescript-estree": "8.46.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g=="],
1477
+
"typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@8.46.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.46.1", "@typescript-eslint/types": "8.46.1", "@typescript-eslint/typescript-estree": "8.46.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ=="],
1562
1478
1563
1479
"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=="],
1564
1480
···
1572
1488
1573
1489
"@eslint/eslintrc/espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.0", "", {}, "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw=="],
1574
1490
1575
-
"@typescript-eslint/parser/@typescript-eslint/typescript-estree/@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.44.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.44.1", "@typescript-eslint/types": "^8.44.1", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA=="],
1576
-
1577
-
"@typescript-eslint/parser/@typescript-eslint/typescript-estree/@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.44.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ=="],
1578
-
1579
-
"@typescript-eslint/parser/@typescript-eslint/typescript-estree/fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
1580
-
1581
-
"@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
1582
-
1583
-
"@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.44.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.44.1", "@typescript-eslint/types": "^8.44.1", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA=="],
1584
-
1585
-
"@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.44.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ=="],
1586
-
1587
-
"@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
1588
-
1589
-
"@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
1590
-
1591
1491
"@typescript-eslint/typescript-estree/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
1592
1492
1593
1493
"@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
1594
1494
1495
+
"@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.44.1", "", { "dependencies": { "@typescript-eslint/types": "8.44.1", "eslint-visitor-keys": "^4.2.1" } }, "sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw=="],
1496
+
1595
1497
"@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.44.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.44.1", "@typescript-eslint/types": "^8.44.1", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA=="],
1596
1498
1597
1499
"@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.44.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ=="],
1500
+
1501
+
"@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.44.1", "", { "dependencies": { "@typescript-eslint/types": "8.44.1", "eslint-visitor-keys": "^4.2.1" } }, "sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw=="],
1598
1502
1599
1503
"@typescript-eslint/utils/@typescript-eslint/typescript-estree/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
1600
1504
···
1614
1518
1615
1519
"next/postcss/nanoid": ["nanoid@3.3.10", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg=="],
1616
1520
1617
-
"typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.46.0", "", { "dependencies": { "@typescript-eslint/types": "8.46.0", "@typescript-eslint/visitor-keys": "8.46.0" } }, "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw=="],
1618
-
1619
-
"typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.46.0", "", { "dependencies": { "@typescript-eslint/types": "8.46.0", "@typescript-eslint/typescript-estree": "8.46.0", "@typescript-eslint/utils": "8.46.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg=="],
1620
-
1621
-
"typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.46.0", "", { "dependencies": { "@typescript-eslint/types": "8.46.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q=="],
1622
-
1623
-
"typescript-eslint/@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="],
1624
-
1625
-
"typescript-eslint/@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.46.0", "", { "dependencies": { "@typescript-eslint/types": "8.46.0", "@typescript-eslint/visitor-keys": "8.46.0" } }, "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw=="],
1626
-
1627
-
"typescript-eslint/@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@8.46.0", "", {}, "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA=="],
1628
-
1629
-
"typescript-eslint/@typescript-eslint/parser/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.46.0", "", { "dependencies": { "@typescript-eslint/types": "8.46.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q=="],
1630
-
1631
-
"typescript-eslint/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.46.0", "", { "dependencies": { "@typescript-eslint/types": "8.46.0", "@typescript-eslint/visitor-keys": "8.46.0" } }, "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw=="],
1632
-
1633
-
"typescript-eslint/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.46.0", "", {}, "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA=="],
1634
-
1635
1521
"vaul/@radix-ui/react-dialog/@radix-ui/primitive": ["@radix-ui/primitive@1.1.1", "", {}, "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA=="],
1636
1522
1637
1523
"vaul/@radix-ui/react-dialog/@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw=="],
···
1656
1542
1657
1543
"vaul/@radix-ui/react-dialog/@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.1.0", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw=="],
1658
1544
1659
-
"@typescript-eslint/parser/@typescript-eslint/typescript-estree/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
1660
-
1661
-
"@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
1662
-
1663
-
"@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
1664
-
1665
-
"@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
1666
-
1667
1545
"@typescript-eslint/utils/@typescript-eslint/typescript-estree/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
1668
1546
1669
1547
"@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
1670
1548
1671
1549
"@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=="],
1672
-
1673
-
"typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@8.46.0", "", {}, "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA=="],
1674
-
1675
-
"typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/types": ["@typescript-eslint/types@8.46.0", "", {}, "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA=="],
1676
-
1677
-
"typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@8.46.0", "", {}, "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA=="],
1678
-
1679
-
"typescript-eslint/@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.46.0", "", { "dependencies": { "@typescript-eslint/types": "8.46.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q=="],
1680
1550
1681
1551
"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=="],
1682
1552
+4
-1
components/copy-to-clipboard.tsx
+4
-1
components/copy-to-clipboard.tsx
···
1
1
"use client";
2
2
3
+
import { cn } from "@/utils/cn";
3
4
import { useRef, useState } from "react";
4
5
5
6
import { Button } from "./ui/button";
6
7
7
8
interface Props {
9
+
className?: string;
8
10
icon?: React.ReactNode;
9
11
text: string;
10
12
title?: string;
···
12
14
}
13
15
14
16
export function CopyToClipboardButton({
17
+
className,
15
18
icon,
16
19
text,
17
20
title
···
30
33
31
34
return (
32
35
<Button
33
-
className="w-full justify-start! truncate"
36
+
className={cn("w-full justify-start! truncate", className)}
34
37
variant={saved
35
38
? "secondary"
36
39
: undefined
+6
-4
components/inputs/switch.tsx
+6
-4
components/inputs/switch.tsx
···
11
11
link: string;
12
12
badge: string;
13
13
isTickbox: boolean;
14
+
inverted: boolean;
14
15
}
15
16
16
17
export default function InputSwitch({
···
21
22
badge,
22
23
description,
23
24
isTickbox,
25
+
inverted,
24
26
disabled,
25
27
26
28
endpoint,
···
73
75
{isTickbox ?
74
76
<Checkbox
75
77
className={description && "relative top-1"}
76
-
checked={value}
77
-
onCheckedChange={update}
78
+
checked={inverted ? !value : value}
79
+
onCheckedChange={(now) => update(inverted ? !now : Boolean(now))}
78
80
disabled={disabled}
79
81
/>
80
82
:
81
83
<Switch
82
-
checked={value}
83
-
onCheckedChange={update}
84
+
checked={inverted ? !value : value}
85
+
onCheckedChange={(now) => update(inverted ? !now : now)}
84
86
aria-label={label}
85
87
disabled={disabled}
86
88
/>
+1
-1
components/modal.tsx
+1
-1
components/modal.tsx
+1
eslint.config.mjs
+1
eslint.config.mjs
+1
-1
next.config.js
+1
-1
next.config.js
+12
-12
package.json
+12
-12
package.json
···
31
31
"@radix-ui/react-tabs": "^1.1.13",
32
32
"@radix-ui/react-tooltip": "^1.2.8",
33
33
"@tailwindcss/postcss": "^4.1.14",
34
-
"caniuse-lite": "^1.0.30001750",
34
+
"caniuse-lite": "^1.0.30001751",
35
35
"class-variance-authority": "^0.7.1",
36
36
"clsx": "^2.1.1",
37
-
"discord-api-types": "^0.38.29",
37
+
"discord-api-types": "^0.38.30",
38
38
"framer-motion": "12.23.24",
39
-
"lucide-react": "^0.545.0",
40
-
"next": "^15.5.4",
39
+
"lucide-react": "^0.546.0",
40
+
"next": "^15.5.6",
41
41
"next-client-cookies": "^2.1.0",
42
42
"postcss": "^8.5.6",
43
43
"react": "19.2.0",
···
47
47
"react-loading-icons": "^1.1.0",
48
48
"react-markdown": "10.1.0",
49
49
"react-query": "^3.39.3",
50
-
"recharts": "^3.2.1",
51
50
"rehype-raw": "^7.0.0",
52
51
"sharp": "^0.34.4",
53
52
"tailwind-merge": "^3.3.1",
54
53
"tailwindcss": "^4.1.14",
55
54
"tailwindcss-animate": "^1.0.7",
55
+
"tw-animate-css": "^1.4.0",
56
56
"typescript": "^5.9.3",
57
57
"vaul": "^1.1.2",
58
58
"zustand": "^5.0.8"
59
59
},
60
60
"devDependencies": {
61
-
"@next/eslint-plugin-next": "^15.5.4",
61
+
"@next/eslint-plugin-next": "^15.5.6",
62
62
"@octokit/types": "^15.0.0",
63
-
"@stylistic/eslint-plugin": "^5.4.0",
64
-
"@types/node": "^24.7.2",
63
+
"@stylistic/eslint-plugin": "^5.5.0",
64
+
"@types/node": "^24.8.1",
65
65
"@types/react": "^19.2.2",
66
-
"@types/react-dom": "^19.2.1",
67
-
"eslint": "^9.37.0",
68
-
"eslint-config-next": "^15.5.4",
66
+
"@types/react-dom": "^19.2.2",
67
+
"eslint": "^9.38.0",
68
+
"eslint-config-next": "^15.5.6",
69
69
"eslint-plugin-import-x": "^4.16.1",
70
70
"eslint-plugin-react": "^7.37.5",
71
71
"eslint-plugin-react-compiler": "19.1.0-rc.2",
72
72
"eslint-plugin-react-hooks": "^7.0.0",
73
73
"eslint-plugin-simple-import-sort": "^12.1.1",
74
74
"eslint-plugin-unicorn": "^61.0.2",
75
-
"typescript-eslint": "^8.46.0"
75
+
"typescript-eslint": "^8.46.1"
76
76
}
77
77
}
+4
-3
public/docs/passport.md
+4
-3
public/docs/passport.md
···
49
49
50
50
**Note:** This requires the failed verification action to be set to "Assign role to member".
51
51
52
-
### 💬 Send direct message to member on fail
53
-
If the member should recieve a DM if they failed verification, along with the following punishment (eg.: a ban).
54
-
55
52
## Permissions
56
53
Here is a quick reference on how permissions should be setup so everything works as expected.
57
54
···
66
63
<br />
67
64
68
65
Once people have failed verification due to any reason, they will not be able to verify again at any time, and manual approval by server moderators or admins is required. Wamellow developers cannot verify or punish members in any server.
66
+
<br />
67
+
<br />
68
+
69
+
The user will be sent a direct message when they fail verification containing the reason for the failure and the punishment taken.
69
70
70
71
## Troubleshooting
71
72
If you joined a server, received a Direct Message (DM) from Wamellow, clicked on "Start Verification", and now receive the error message "**You are not a member of this guild**", please make sure that you are logged in with the same Discord account in your browser as you are in the Discord application. Should you be logged in with the wrong account, click on your username in the top right corner and click the `->` (red logout) button.
+554
-587
typings.ts
+554
-587
typings.ts
···
1
-
import type { ChannelType } from "discord-api-types/v10";
2
-
3
-
import type { actor } from "./utils/tts";
4
-
5
-
export interface ApiError {
6
-
status: number;
7
-
message: string;
8
-
}
9
-
10
-
export interface ApiV1TopguildsGetResponse {
11
-
id: string;
12
-
name: string;
13
-
icon: string | null;
14
-
memberCount: number;
15
-
16
-
verified: boolean;
17
-
partnered: boolean;
18
-
}
19
-
20
-
export interface ApiV1UsersMeGuildsGetResponse {
21
-
id: string;
22
-
name: string;
23
-
icon: string | null;
24
-
bot: boolean;
25
-
}
26
-
27
-
export enum GuildFlags {
28
-
Premium = 1 << 0
29
-
}
30
-
31
-
export interface ApiV1GuildsGetResponse {
32
-
id: string;
33
-
name: string;
34
-
icon: string | null;
35
-
banner: string | null;
36
-
memberCount: number;
37
-
premiumTier: number;
38
-
inviteUrl: string | undefined;
39
-
description: string | null;
40
-
follownewsChannel?: {
41
-
id: string;
42
-
name: string;
43
-
};
44
-
tts: {
45
-
channelId: string | null;
46
-
announceUser: boolean;
47
-
logChannelId: string | null;
48
-
blacklistRoleId: string | null;
49
-
priorityRoleId: string | null;
50
-
maxLength?: number | null;
51
-
queue: boolean | null;
52
-
};
53
-
embedLinks: boolean;
54
-
flags: number;
55
-
style: {
56
-
username: string | null;
57
-
avatar: string | null;
58
-
banner: string | null;
59
-
};
60
-
}
61
-
62
-
export interface ApiV1GuildsStylePatchResponse {
63
-
username: string | null;
64
-
avatar: string | null;
65
-
banner: string | null;
66
-
bio: string | null;
67
-
}
68
-
69
-
export interface ApiV1GuildsTopmembersGetResponse {
70
-
id: string;
71
-
username: string | null;
72
-
globalName: string | null;
73
-
avatar: string | null;
74
-
bot: true;
75
-
emoji: string | null;
76
-
activity: ApiV1UsersMeGetResponse["activity"] & { formattedVoicetime: string; };
77
-
}
78
-
79
-
export interface ApiV1GuildsTopmembersPaginationGetResponse {
80
-
messages: {
81
-
pages: number;
82
-
total: number;
83
-
};
84
-
voiceminutes: {
85
-
pages: number;
86
-
total: string;
87
-
formattedTotal: string;
88
-
};
89
-
invites: {
90
-
pages: number;
91
-
total: number;
92
-
};
93
-
}
94
-
95
-
export interface ApiV1GuildsChannelsGetResponse {
96
-
type: ChannelType;
97
-
name: string;
98
-
id: string;
99
-
/**
100
-
* @description permission bitfield for the bot in the channel
101
-
*/
102
-
permissions: number;
103
-
nsfw: boolean;
104
-
}
105
-
106
-
export interface ApiV1GuildsRolesGetResponse {
107
-
name: string;
108
-
id: string;
109
-
/**
110
-
* @description -1 represents the role being above the bot's highest role
111
-
*/
112
-
permissions: -1 | 0;
113
-
position: number;
114
-
color: number;
115
-
}
116
-
117
-
export interface ApiV1GuildsEmojisGetResponse {
118
-
name: string;
119
-
id: string;
120
-
animated: boolean;
121
-
}
122
-
123
-
export interface GuildEmbed {
124
-
title: string | null;
125
-
description: string | null;
126
-
thumbnail: string | null;
127
-
image: string | null;
128
-
color: number;
129
-
footer: {
130
-
text: string | null;
131
-
icon_url: string | null;
132
-
};
133
-
}
134
-
135
-
export interface ApiV1GuildsModulesWelcomeGetResponse {
136
-
enabled: boolean;
137
-
channelId: string | null;
138
-
139
-
message: {
140
-
content?: string;
141
-
embed?: GuildEmbed;
142
-
};
143
-
144
-
roleIds: string[];
145
-
pingIds: string[];
146
-
deleteAfter?: number;
147
-
deleteAfterLeave?: boolean;
148
-
restore: boolean;
149
-
150
-
dm: {
151
-
enabled: boolean;
152
-
message: {
153
-
content?: string;
154
-
embed?: GuildEmbed;
155
-
};
156
-
};
157
-
158
-
reactions: {
159
-
welcomeMessageEmojis: string[];
160
-
firstMessageEmojis: string[];
161
-
};
162
-
163
-
card: {
164
-
enabled: boolean;
165
-
inEmbed: boolean;
166
-
background?: string;
167
-
textColor?: number;
168
-
};
169
-
170
-
button: {
171
-
enabled: boolean;
172
-
style: 1 | 2 | 3 | 4;
173
-
emoji?: string | null;
174
-
label?: string | null;
175
-
ping?: boolean;
176
-
type: 0;
177
-
};
178
-
}
179
-
180
-
export interface ApiV1GuildsModulesByeGetResponse {
181
-
enabled: boolean;
182
-
channelId: string | null;
183
-
webhookURL?: string;
184
-
185
-
message: {
186
-
content?: string;
187
-
embed?: GuildEmbed;
188
-
};
189
-
190
-
deleteAfter?: number;
191
-
192
-
card: {
193
-
enabled: boolean;
194
-
inEmbed: boolean;
195
-
background?: string;
196
-
textColor?: number;
197
-
};
198
-
}
199
-
200
-
export enum StarboardStyle {
201
-
Username = 0,
202
-
GlobalName = 1,
203
-
Nickname = 2,
204
-
NicknameAndGuildAvatar = 3,
205
-
Anonymous = 4
206
-
}
207
-
208
-
export interface ApiV1GuildsModulesStarboardGetResponse {
209
-
enabled: boolean;
210
-
channelId?: string;
211
-
emoji: string;
212
-
requiredEmojis: number;
213
-
embedColor: number;
214
-
style: StarboardStyle;
215
-
216
-
allowNSFW: boolean;
217
-
allowBots: boolean;
218
-
allowEdits: boolean;
219
-
allowSelfReact: boolean;
220
-
displayReference: boolean;
221
-
222
-
blacklistRoleIds: string[];
223
-
blacklistChannelIds: string[];
224
-
delete: boolean;
225
-
}
226
-
227
-
export interface ApiV1GuildsModulesLeaderboardUpdatingPostResponse {
228
-
leaderboardId: string;
229
-
guildId: string;
230
-
231
-
channelId: string;
232
-
messageId: string;
233
-
234
-
type: "messages" | "voiceminutes" | "invites";
235
-
236
-
/**
237
-
* 0 - text based
238
-
* 1 - image grid
239
-
* 2 - image list
240
-
*/
241
-
structure: number;
242
-
styles: {
243
-
useQuotes: boolean;
244
-
rank: "**" | "__" | "*" | "`" | null;
245
-
number: "**" | "__" | "*" | "`" | null;
246
-
user: "**" | "__" | "*" | "`" | null;
247
-
};
248
-
249
-
range: "daily" | "weekly" | "monthly" | "alltime";
250
-
display: "mention" | "username" | "nickname" | "id";
251
-
252
-
background: string | null;
253
-
emoji: string | null;
254
-
255
-
updatedAt: string;
256
-
createdAt: string;
257
-
}
258
-
259
-
export interface ApiV1GuildsModulesLeaderboardGetResponse {
260
-
bannerUrl: string | null;
261
-
262
-
blacklistChannelIds: string[];
263
-
264
-
roles: {
265
-
messages: string[];
266
-
voiceminutes: string[];
267
-
} | undefined;
268
-
269
-
updating: ApiV1GuildsModulesLeaderboardUpdatingPostResponse[];
270
-
}
271
-
272
-
export interface ApiV1GuildsModulesPassportGetResponse {
273
-
enabled: boolean;
274
-
channelId: string | null;
275
-
/**
276
-
* We're currently on free tier
277
-
*/
278
-
captchaType: "slide" | "word" | "icon" | "match" | "winlinze" | "nine" | "random";
279
-
/**
280
-
* 0 - Ban
281
-
* 1 - Kick
282
-
* 2 - Assign role
283
-
*/
284
-
punishment: 0 | 1 | 2;
285
-
punishmentRoleId: string | null;
286
-
287
-
successRoleId: string | null;
288
-
unverifiedRoleId: string | null;
289
-
290
-
sendFailedDm: boolean;
291
-
alsoFailIf: ("disposableEmailAddress")[];
292
-
}
293
-
294
-
export enum UserFlags {
295
-
Premium = 1 << 0,
296
-
VoteReminderNotifications = 1 << 1,
297
-
VoteReminderNotificationSent = 1 << 2,
298
-
IgnoreChatToSpeech = 1 << 3,
299
-
LeaderboardAlternateStyle = 1 << 4
300
-
}
301
-
302
-
export interface ApiV1UsersMeGetResponse {
303
-
voteCount?: number;
304
-
305
-
rank?: {
306
-
background?: string | null;
307
-
emoji?: string | null;
308
-
textColor?: number;
309
-
barColor?: number;
310
-
useLeaderboardList?: boolean;
311
-
subText?: {
312
-
type: 0 | 1 | 2 | 3; // 0: off, 1: date, 2: relative, 3: custom
313
-
content?: string;
314
-
};
315
-
};
316
-
tts?: {
317
-
defaultVoice?: keyof typeof actor;
318
-
};
319
-
activity?: {
320
-
messages: number;
321
-
voiceminutes: number;
322
-
invites: number;
323
-
formattedVoicetime: string;
324
-
};
325
-
}
326
-
327
-
export enum ConnectionType {
328
-
Spotify = 0,
329
-
Bluesky = 1
330
-
}
331
-
332
-
export interface ApiV1UsersMeConnectionsGetResponse {
333
-
username: string;
334
-
avatar: string | null;
335
-
type: ConnectionType;
336
-
}
337
-
338
-
export interface ApiV1UsersMeBillingGetResponse {
339
-
subscriptionId: string;
340
-
status: "active"
341
-
| "canceled"
342
-
| "incomplete"
343
-
| "incomplete_expired"
344
-
| "past_due"
345
-
| "paused"
346
-
| "trialing"
347
-
| "unpaid";
348
-
priceId: string;
349
-
created: number;
350
-
currentPeriodEnd: number;
351
-
currentPeriodStart: number;
352
-
cancelAtPeriodEnd: boolean;
353
-
donationQuantity: number;
354
-
paymentMethod: {
355
-
brand: string | null;
356
-
last4: string | null;
357
-
} | string | null;
358
-
portalUrl: string;
359
-
guildIds: string[];
360
-
}
361
-
362
-
export interface ApiV1GuildsModulesTagsGetResponse {
363
-
id: string;
364
-
guildId: string;
365
-
applicationCommandId?: string;
366
-
367
-
name: string;
368
-
permission: string | null;
369
-
aliases: string[];
370
-
371
-
message: {
372
-
content: string | null;
373
-
embed?: GuildEmbed;
374
-
};
375
-
376
-
authorId: string;
377
-
378
-
createdAt: Date;
379
-
}
380
-
381
-
export enum AutomodType {
382
-
BlockServerInvites = "server_invites",
383
-
BlockBotInvites = "bot_invites",
384
-
BlockTwitter = "twitter"
385
-
}
386
-
387
-
export interface ApiV1GuildsModulesAutomodGetResponse {
388
-
status: Record<AutomodType, boolean>;
389
-
whitelistChannelIds: string[];
390
-
whitelistRoleIds: string[];
391
-
keywordFilter: string[];
392
-
}
393
-
394
-
export interface Upload {
395
-
id: string;
396
-
guildId?: string | null;
397
-
authorId: string;
398
-
399
-
prompt: string;
400
-
negativePrompt?: string | null;
401
-
model: string;
402
-
403
-
verified: boolean;
404
-
nsfw: boolean;
405
-
406
-
createdAt: string;
407
-
}
408
-
409
-
export interface ApiV1UploadsGetResponse {
410
-
results: Upload[];
411
-
pagination: {
412
-
total: number;
413
-
pages: number;
414
-
};
415
-
}
416
-
417
-
export interface ApiV1UploadGetResponse extends Upload {
418
-
author: {
419
-
username: string;
420
-
globalName: string;
421
-
avatar: string | null;
422
-
bot?: boolean;
423
-
};
424
-
}
425
-
426
-
export interface ApiV1UsersGetResponse {
427
-
id: string;
428
-
username: string;
429
-
globalName: string | null;
430
-
avatar: string | null;
431
-
432
-
bannerUrl: string | null;
433
-
voteCount: number;
434
-
likeCount: number;
435
-
436
-
activity: Required<ApiV1UsersMeGetResponse>["activity"];
437
-
guilds: {
438
-
guildId: string;
439
-
activity: Required<ApiV1UsersMeGetResponse>["activity"];
440
-
}[];
441
-
}
442
-
443
-
export enum NotificationType {
444
-
YouTube = 0,
445
-
Twitch = 1,
446
-
Bluesky = 2,
447
-
Reddit = 3
448
-
}
449
-
450
-
export enum BlueskyNotificationFlags {
451
-
SendReposts = 1 << 0,
452
-
SendReplies = 1 << 1,
453
-
SendQuotes = 1 << 2,
454
-
MustContainImage = 1 << 3
455
-
}
456
-
457
-
export enum YoutubeNotificationFlags {
458
-
SendVideos = 1 << 5,
459
-
SendShorts = 1 << 6
460
-
}
461
-
462
-
export interface ApiV1GuildsModulesNotificationsGetResponse {
463
-
id: string;
464
-
guildId: string;
465
-
channelId: string;
466
-
roleId: string | null;
467
-
468
-
type: NotificationType;
469
-
flags: number;
470
-
regex: string | null;
471
-
472
-
creatorId: string;
473
-
474
-
message: {
475
-
content: string | null;
476
-
embed?: GuildEmbed;
477
-
};
478
-
479
-
createdAt: Date;
480
-
481
-
creator: {
482
-
id: string;
483
-
username: string;
484
-
customUrl: string;
485
-
avatarUrl: string | null;
486
-
};
487
-
488
-
username: string | null;
489
-
avatar: string | null;
490
-
}
491
-
492
-
export interface ApiV1GuildsModulesNotificationStylePatchResponse {
493
-
username: string;
494
-
avatar: string | null;
495
-
}
496
-
497
-
export enum DailypostType {
498
-
Anime = 1,
499
-
Blahaj = 2,
500
-
NekosBest = 3
501
-
}
502
-
503
-
export interface ApiV1GuildsModulesDailypostsGetResponse {
504
-
id: string;
505
-
guildId: string;
506
-
channelId: string;
507
-
roleId: string | null;
508
-
509
-
runtimeHours: `${number}`[];
510
-
511
-
type: DailypostType;
512
-
query: string | null;
513
-
}
514
-
515
-
export interface ApiV1UsersMeRankEmojiPutResponse {
516
-
id: string;
517
-
url: string;
518
-
}
519
-
520
-
export interface ApiV1UsersMeRankEmojiDeleteResponse {
521
-
id: null;
522
-
url: null;
523
-
}
524
-
525
-
export interface PronounsResponse {
526
-
status: number;
527
-
content: string[];
528
-
}
529
-
530
-
export interface NekosticResponse {
531
-
event: string;
532
-
name: string;
533
-
uses: number;
534
-
users: number;
535
-
snapshot: string;
536
-
}
537
-
538
-
export enum PermissionFlagsBits {
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
1
+
import type { ChannelType } from "discord-api-types/v10";
2
+
3
+
import type { actor } from "./utils/tts";
4
+
5
+
export interface ApiError {
6
+
status: number;
7
+
message: string;
8
+
}
9
+
10
+
export interface ApiV1TopguildsGetResponse {
11
+
id: string;
12
+
name: string;
13
+
icon: string | null;
14
+
memberCount: number;
15
+
16
+
verified: boolean;
17
+
partnered: boolean;
18
+
}
19
+
20
+
export interface ApiV1UsersMeGuildsGetResponse {
21
+
id: string;
22
+
name: string;
23
+
icon: string | null;
24
+
bot: boolean;
25
+
}
26
+
27
+
export enum GuildFlags {
28
+
Premium = 1 << 0,
29
+
PrivateLeaderboard = 1 << 1,
30
+
EmbedDiscordLinks = 1 << 2,
31
+
32
+
WelcomeEnabled = 1 << 4,
33
+
FarewellEnabled = 1 << 5,
34
+
StarboardEnabled = 1 << 6,
35
+
PassportEnabled = 1 << 7,
36
+
37
+
TextToSpeechAnnounceUsers = 1 << 8,
38
+
TextToSpeechQueueMessages = 1 << 9,
39
+
TextToSpeechAllowBots = 1 << 10,
40
+
41
+
WelcomeRestore = 1 << 11,
42
+
WelcomeDirectMessage = 1 << 12,
43
+
WelcomeCard = 1 << 13,
44
+
WelcomeCardInEmbed = 1 << 14,
45
+
WelcomeButton = 1 << 15,
46
+
WelcomeButtonPing = 1 << 16,
47
+
48
+
FarewellCard = 1 << 17,
49
+
FarewellCardInEmbed = 1 << 18,
50
+
51
+
StarboardAllowNSFW = 1 << 19,
52
+
StarboardAllowBots = 1 << 20,
53
+
StarboardAllowEdits = 1 << 21,
54
+
StarboardAllowSelf = 1 << 22,
55
+
StarboardDisplayReference = 1 << 23,
56
+
StarboardDeleteOnLoss = 1 << 24
57
+
}
58
+
59
+
export interface ApiV1GuildsGetResponse {
60
+
id: string;
61
+
name: string;
62
+
icon: string | null;
63
+
banner: string | null;
64
+
memberCount: number;
65
+
premiumTier: number;
66
+
inviteUrl: string | undefined;
67
+
description: string | null;
68
+
follownewsChannel?: {
69
+
id: string;
70
+
name: string;
71
+
};
72
+
tts: {
73
+
channelId: string | null;
74
+
logChannelId: string | null;
75
+
blacklistRoleId: string | null;
76
+
priorityRoleId: string | null;
77
+
maxLength: number | null;
78
+
};
79
+
flags: GuildFlags;
80
+
style: {
81
+
username: string | null;
82
+
avatar: string | null;
83
+
banner: string | null;
84
+
};
85
+
}
86
+
87
+
export interface ApiV1GuildsStylePatchResponse {
88
+
username: string | null;
89
+
avatar: string | null;
90
+
banner: string | null;
91
+
bio: string | null;
92
+
}
93
+
94
+
export interface ApiV1GuildsTopmembersGetResponse {
95
+
id: string;
96
+
username: string | null;
97
+
globalName: string | null;
98
+
avatar: string | null;
99
+
bot: true;
100
+
emoji: string | null;
101
+
activity: ApiV1UsersMeGetResponse["activity"] & {
102
+
formattedVoicetime: string;
103
+
};
104
+
}
105
+
106
+
export interface ApiV1GuildsTopmembersPaginationGetResponse {
107
+
messages: {
108
+
pages: number;
109
+
total: number;
110
+
};
111
+
voiceminutes: {
112
+
pages: number;
113
+
total: string;
114
+
formattedTotal: string;
115
+
};
116
+
invites: {
117
+
pages: number;
118
+
total: number;
119
+
};
120
+
}
121
+
122
+
export interface ApiV1GuildsChannelsGetResponse {
123
+
type: ChannelType;
124
+
name: string;
125
+
id: string;
126
+
/**
127
+
* @description permission bitfield for the bot in the channel
128
+
*/
129
+
permissions: number;
130
+
nsfw: boolean;
131
+
}
132
+
133
+
export interface ApiV1GuildsRolesGetResponse {
134
+
name: string;
135
+
id: string;
136
+
/**
137
+
* @description -1 represents the role being above the bot's highest role
138
+
*/
139
+
permissions: -1 | 0;
140
+
position: number;
141
+
color: number;
142
+
}
143
+
144
+
export interface ApiV1GuildsEmojisGetResponse {
145
+
name: string;
146
+
id: string;
147
+
animated: boolean;
148
+
}
149
+
150
+
export interface GuildEmbed {
151
+
title: string | null;
152
+
description: string | null;
153
+
thumbnail: string | null;
154
+
image: string | null;
155
+
color: number;
156
+
footer: {
157
+
text: string | null;
158
+
icon_url: string | null;
159
+
};
160
+
}
161
+
162
+
export interface ApiV1GuildsModulesWelcomeGetResponse {
163
+
channelId: string | null;
164
+
165
+
message: {
166
+
content?: string;
167
+
embed?: GuildEmbed;
168
+
};
169
+
170
+
roleIds: string[];
171
+
pingIds: string[];
172
+
deleteAfter?: number;
173
+
deleteAfterLeave?: boolean;
174
+
175
+
dm: {
176
+
message: {
177
+
content?: string;
178
+
embed?: GuildEmbed;
179
+
};
180
+
};
181
+
182
+
reactions: {
183
+
welcomeMessageEmojis: string[];
184
+
firstMessageEmojis: string[];
185
+
};
186
+
187
+
card: {
188
+
background?: string;
189
+
};
190
+
191
+
button: {
192
+
style: 1 | 2 | 3 | 4;
193
+
emoji?: string | null;
194
+
label?: string | null;
195
+
type: 0;
196
+
};
197
+
}
198
+
199
+
export interface ApiV1GuildsModulesByeGetResponse {
200
+
channelId: string | null;
201
+
202
+
message: {
203
+
content?: string;
204
+
embed?: GuildEmbed;
205
+
};
206
+
207
+
deleteAfter?: number;
208
+
209
+
card: {
210
+
background?: string;
211
+
};
212
+
}
213
+
214
+
export enum StarboardStyle {
215
+
Username = 0,
216
+
GlobalName = 1,
217
+
Nickname = 2,
218
+
NicknameAndGuildAvatar = 3,
219
+
Anonymous = 4
220
+
}
221
+
222
+
export interface ApiV1GuildsModulesStarboardGetResponse {
223
+
channelId?: string;
224
+
emoji: string;
225
+
requiredEmojis: number;
226
+
embedColor: number;
227
+
style: StarboardStyle;
228
+
229
+
blacklistRoleIds: string[];
230
+
blacklistChannelIds: string[];
231
+
}
232
+
233
+
export interface ApiV1GuildsModulesLeaderboardUpdatingPostResponse {
234
+
leaderboardId: string;
235
+
guildId: string;
236
+
237
+
channelId: string;
238
+
messageId: string;
239
+
240
+
type: "messages" | "voiceminutes" | "invites";
241
+
242
+
/**
243
+
* 0 - text based
244
+
* 1 - image grid
245
+
* 2 - image list
246
+
*/
247
+
structure: number;
248
+
styles: {
249
+
useQuotes: boolean;
250
+
rank: "**" | "__" | "*" | "`" | null;
251
+
number: "**" | "__" | "*" | "`" | null;
252
+
user: "**" | "__" | "*" | "`" | null;
253
+
};
254
+
255
+
range: "daily" | "weekly" | "monthly" | "alltime";
256
+
display: "mention" | "username" | "nickname" | "id";
257
+
258
+
background: string | null;
259
+
emoji: string | null;
260
+
261
+
updatedAt: string;
262
+
createdAt: string;
263
+
}
264
+
265
+
export interface ApiV1GuildsModulesLeaderboardGetResponse {
266
+
bannerUrl: string | null;
267
+
268
+
blacklistChannelIds: string[];
269
+
270
+
roles:
271
+
| {
272
+
messages: string[];
273
+
voiceminutes: string[];
274
+
}
275
+
| undefined;
276
+
277
+
updating: ApiV1GuildsModulesLeaderboardUpdatingPostResponse[];
278
+
}
279
+
280
+
export interface ApiV1GuildsModulesPassportGetResponse {
281
+
channelId: string | null;
282
+
/**
283
+
* 0 - Ban
284
+
* 1 - Kick
285
+
* 2 - Assign role
286
+
*/
287
+
punishment: 0 | 1 | 2;
288
+
punishmentRoleId: string | null;
289
+
290
+
successRoleId: string | null;
291
+
unverifiedRoleId: string | null;
292
+
}
293
+
294
+
export enum UserFlags {
295
+
Premium = 1 << 0,
296
+
ChatToSpeechIgnore = 1 << 4,
297
+
LeaderboardAlternateStyle = 1 << 5
298
+
}
299
+
300
+
export interface ApiV1UsersMeGetResponse {
301
+
flags: UserFlags;
302
+
voteCount?: number;
303
+
rank?: {
304
+
background?: string | null;
305
+
emoji?: string | null;
306
+
textColor?: number;
307
+
barColor?: number;
308
+
subText?: {
309
+
type: 0 | 1 | 2 | 3; // 0: off, 1: date, 2: relative, 3: custom
310
+
content?: string;
311
+
};
312
+
};
313
+
voice?: keyof typeof actor;
314
+
activity?: {
315
+
messages: number;
316
+
voiceminutes: number;
317
+
invites: number;
318
+
formattedVoicetime: string;
319
+
};
320
+
}
321
+
322
+
export enum ConnectionType {
323
+
Spotify = 0,
324
+
Bluesky = 1
325
+
}
326
+
327
+
export interface ApiV1UsersMeConnectionsGetResponse {
328
+
username: string;
329
+
avatar: string | null;
330
+
type: ConnectionType;
331
+
}
332
+
333
+
export interface ApiV1UsersMeBillingGetResponse {
334
+
subscriptionId: string;
335
+
status:
336
+
| "active"
337
+
| "canceled"
338
+
| "incomplete"
339
+
| "incomplete_expired"
340
+
| "past_due"
341
+
| "paused"
342
+
| "trialing"
343
+
| "unpaid";
344
+
priceId: string;
345
+
created: number;
346
+
currentPeriodEnd: number;
347
+
currentPeriodStart: number;
348
+
cancelAtPeriodEnd: boolean;
349
+
donationQuantity: number;
350
+
paymentMethod:
351
+
| {
352
+
brand: string | null;
353
+
last4: string | null;
354
+
}
355
+
| string
356
+
| null;
357
+
portalUrl: string;
358
+
guildIds: string[];
359
+
}
360
+
361
+
export interface ApiV1GuildsModulesTagsGetResponse {
362
+
id: string;
363
+
guildId: string;
364
+
applicationCommandId?: string;
365
+
366
+
name: string;
367
+
permission: string | null;
368
+
aliases: string[];
369
+
370
+
message: {
371
+
content: string | null;
372
+
embed?: GuildEmbed;
373
+
};
374
+
375
+
authorId: string;
376
+
377
+
createdAt: Date;
378
+
}
379
+
380
+
export enum AutomodType {
381
+
BlockServerInvites = "server_invites",
382
+
BlockBotInvites = "bot_invites",
383
+
BlockTwitter = "twitter"
384
+
}
385
+
386
+
export interface ApiV1GuildsModulesAutomodGetResponse {
387
+
status: Record<AutomodType, boolean>;
388
+
whitelistChannelIds: string[];
389
+
whitelistRoleIds: string[];
390
+
keywordFilter: string[];
391
+
}
392
+
393
+
export interface ApiV1UsersGetResponse {
394
+
id: string;
395
+
username: string;
396
+
globalName: string | null;
397
+
avatar: string | null;
398
+
399
+
bannerUrl: string | null;
400
+
voteCount: number;
401
+
likeCount: number;
402
+
403
+
activity: Required<ApiV1UsersMeGetResponse>["activity"];
404
+
guilds: {
405
+
guildId: string;
406
+
activity: Required<ApiV1UsersMeGetResponse>["activity"];
407
+
}[];
408
+
}
409
+
410
+
export enum NotificationType {
411
+
YouTube = 0,
412
+
Twitch = 1,
413
+
Bluesky = 2,
414
+
Reddit = 3
415
+
}
416
+
417
+
export enum BlueskyNotificationFlags {
418
+
SendReposts = 1 << 0,
419
+
SendReplies = 1 << 1,
420
+
SendQuotes = 1 << 2,
421
+
MustContainImage = 1 << 3
422
+
}
423
+
424
+
export enum YoutubeNotificationFlags {
425
+
SendVideos = 1 << 5,
426
+
SendShorts = 1 << 6
427
+
}
428
+
429
+
export interface ApiV1GuildsModulesNotificationsGetResponse {
430
+
id: string;
431
+
guildId: string;
432
+
channelId: string;
433
+
roleId: string | null;
434
+
435
+
type: NotificationType;
436
+
flags: BlueskyNotificationFlags | YoutubeNotificationFlags;
437
+
regex: string | null;
438
+
439
+
creatorId: string;
440
+
441
+
message: {
442
+
content: string | null;
443
+
embed?: GuildEmbed;
444
+
};
445
+
446
+
createdAt: Date;
447
+
448
+
creator: {
449
+
id: string;
450
+
username: string;
451
+
customUrl: string;
452
+
avatarUrl: string | null;
453
+
};
454
+
455
+
username: string | null;
456
+
avatar: string | null;
457
+
}
458
+
459
+
export interface ApiV1GuildsModulesNotificationStylePatchResponse {
460
+
username: string;
461
+
avatar: string | null;
462
+
}
463
+
464
+
export enum DailypostType {
465
+
Anime = 1,
466
+
Blahaj = 2,
467
+
NekosBest = 3
468
+
}
469
+
470
+
export interface ApiV1GuildsModulesDailypostsGetResponse {
471
+
id: string;
472
+
guildId: string;
473
+
channelId: string;
474
+
roleId: string | null;
475
+
476
+
runtimeHours: `${number}`[];
477
+
478
+
type: DailypostType;
479
+
query: string | null;
480
+
}
481
+
482
+
export interface ApiV1UsersMeRankEmojiPutResponse {
483
+
id: string;
484
+
url: string;
485
+
}
486
+
487
+
export interface ApiV1UsersMeRankEmojiDeleteResponse {
488
+
id: null;
489
+
url: null;
490
+
}
491
+
492
+
export interface PronounsResponse {
493
+
status: number;
494
+
content: string[];
495
+
}
496
+
497
+
export interface NekosticResponse {
498
+
event: string;
499
+
name: string;
500
+
uses: number;
501
+
users: number;
502
+
snapshot: string;
503
+
}
504
+
505
+
export enum PermissionFlagsBits {
506
+
CreateInstantInvite = 0x00_00_00_00_00_00_00_01,
507
+
KickMembers = 0x00_00_00_00_00_00_00_02,
508
+
BanMembers = 0x00_00_00_00_00_00_00_04,
509
+
Administrator = 0x00_00_00_00_00_00_00_08,
510
+
ManageChannels = 0x00_00_00_00_00_00_00_10,
511
+
ManageGuild = 0x00_00_00_00_00_00_00_20,
512
+
AddReactions = 0x00_00_00_00_00_00_00_40,
513
+
ViewAuditLog = 0x00_00_00_00_00_00_00_80,
514
+
PrioritySpeaker = 0x00_00_00_00_00_00_01_00,
515
+
Stream = 0x00_00_00_00_00_00_02_00,
516
+
ViewChannel = 0x00_00_00_00_00_00_04_00,
517
+
SendMessages = 0x00_00_00_00_00_00_08_00,
518
+
SendTtsMessages = 0x00_00_00_00_00_00_10_00,
519
+
ManageMessages = 0x00_00_00_00_00_00_20_00,
520
+
EmbedLinks = 0x00_00_00_00_00_00_40_00,
521
+
AttachFiles = 0x00_00_00_00_00_00_80_00,
522
+
ReadMessageHistory = 0x00_00_00_00_00_01_00_00,
523
+
MentionEveryone = 0x00_00_00_00_00_02_00_00,
524
+
UseExternalEmojis = 0x00_00_00_00_00_04_00_00,
525
+
ViewGuildInsights = 0x00_00_00_00_00_08_00_00,
526
+
Connect = 0x00_00_00_00_00_10_00_00,
527
+
Speak = 0x00_00_00_00_00_20_00_00,
528
+
MuteMembers = 0x00_00_00_00_00_40_00_00,
529
+
DeafenMembers = 0x00_00_00_00_00_80_00_00,
530
+
MoveMembers = 0x00_00_00_00_01_00_00_00,
531
+
UseVad = 0x00_00_00_00_02_00_00_00,
532
+
ChangeNickname = 0x00_00_00_00_04_00_00_00,
533
+
ManageNicknames = 0x00_00_00_00_08_00_00_00,
534
+
ManageRoles = 0x00_00_00_00_10_00_00_00,
535
+
ManageWebhooks = 0x00_00_00_00_20_00_00_00,
536
+
ManageGuildExpressions = 0x00_00_00_00_40_00_00_00,
537
+
UseApplicationCommands = 0x00_00_00_00_80_00_00_00,
538
+
RequestToSpeak = 0x00_00_00_01_00_00_00_00,
539
+
ManageEvents = 0x00_00_00_02_00_00_00_00,
540
+
ManageThreads = 0x00_00_00_04_00_00_00_00,
541
+
CreatePublicThreads = 0x00_00_00_08_00_00_00_00,
542
+
CreatePrivateThreads = 0x00_00_00_10_00_00_00_00,
543
+
UseExternalStickers = 0x00_00_00_20_00_00_00_00,
544
+
SendMessagesInThreads = 0x00_00_00_40_00_00_00_00,
545
+
UseEmbeddedActivities = 0x00_00_00_80_00_00_00_00,
546
+
ModerateMembers = 0x00_00_01_00_00_00_00_00,
547
+
ViewCreatorMonetizationAnalytics = 0x00_00_02_00_00_00_00_00,
548
+
UseSoundboard = 0x00_00_04_00_00_00_00_00,
549
+
CreateGuildExpressions = 0x00_00_08_00_00_00_00_00,
550
+
CreateEvents = 0x00_00_10_00_00_00_00_00,
551
+
UseExternalSounds = 0x00_00_20_00_00_00_00_00,
552
+
SendVoiceMessages = 0x00_00_40_00_00_00_00_00,
553
+
SendPolls = 0x00_02_00_00_00_00_00_00,
554
+
UseExternalApps = 0x00_04_00_00_00_00_00_00
588
555
}
+8
utils/bitfields.ts
+8
utils/bitfields.ts
···
15
15
return (this.flags & flag) === flag;
16
16
}
17
17
18
+
get() {
19
+
return this.flags;
20
+
}
21
+
18
22
toArray() {
19
23
const flags: number[] = [];
20
24
let field = this.flags;
···
39
43
name: name.replace(/[a-z][A-Z]/g, (s) => s[0] + " " + s[1]),
40
44
value
41
45
}));
46
+
}
47
+
48
+
export function transformer(value: boolean, flags: number, flag: number) {
49
+
return value ? flags | flag : flags & ~flag;
42
50
}
+5
-1
utils/deepMerge.ts
+5
-1
utils/deepMerge.ts
···
1
-
export function deepMerge<T>(target: T | undefined, source: Partial<T>): T | undefined {
1
+
type RecursivePartial<T> = {
2
+
[P in keyof T]?: RecursivePartial<T[P]>;
3
+
};
4
+
5
+
export function deepMerge<T>(target: T | undefined, source: RecursivePartial<T>): T | undefined {
2
6
if (typeof target !== "object" || typeof source !== "object" || !target) {
3
7
return target;
4
8
}
+2
-115
utils/tts.ts
+2
-115
utils/tts.ts
···
1
-
export const actor = {
2
-
en_us_001: ["English", "us", "Jessie"],
3
-
en_us_006: ["English", "us", "Joey"],
4
-
en_us_007: ["English", "us", "Professor"],
5
-
en_us_009: ["English", "us", "Scientist"],
6
-
en_us_010: ["English", "us", "Confidence"],
7
-
8
-
en_female_emotional: ["English", "us", "Emotional"],
9
-
en_female_samc: ["English", "us", "Empathetic"],
10
-
en_male_cody: ["English", "us", "Serious"],
11
-
en_male_narration: ["English", "us", "Narration"],
12
-
en_male_funny: ["English", "us", "Funny"],
13
-
en_male_jarvis: ["English", "us", "Alfred"],
14
-
en_male_santa_narration: ["English", "us", "Narration Santa"],
15
-
en_female_betty: ["English", "us", "Bae"],
16
-
en_female_makeup: ["English", "us", "Beauty Guru"],
17
-
en_female_richgirl: ["English", "us", "Bestie"],
18
-
en_male_cupid: ["English", "us", "Cupid"],
19
-
en_female_shenna: ["English", "us", "Debutante"],
20
-
en_female_grandma: ["English", "us", "Grandma"],
21
-
en_male_ukneighbor: ["English", "us", "Lord Cringe"],
22
-
en_male_wizard: ["English", "us", "Wizard"],
23
-
en_male_trevor: ["English", "us", "Marty"],
24
-
en_male_ukbutler: ["English", "us", "Mr. Meticulous"],
25
-
en_male_santa: ["English", "us", "Santa"],
26
-
en_male_santa_effect: ["English", "us", "Santa (w/ effect)"],
27
-
en_male_jomboy: ["English", "us", "Jomboy"],
28
-
en_male_ashmagic: ["English", "us", "Ashmagic"],
29
-
en_male_olantekkers: ["English", "us", "Olantekkers"],
30
-
en_female_pansino: ["English", "us", "Varsity"],
31
-
32
-
en_uk_001: ["English", "uk", "Narrator"],
33
-
en_uk_003: ["English", "uk", "Male"],
34
-
35
-
en_au_001: ["English", "au", "Metro"],
36
-
en_au_002: ["English", "au", "Smooth"],
37
-
38
-
fr_001: ["French", "fr", "Male 1"],
39
-
fr_002: ["French", "fr", "Male 2"],
40
-
41
-
de_001: ["German", "de", "Female"],
42
-
de_002: ["German", "de", "Male"],
43
-
44
-
es_002: ["Spanish", "es", "Male"],
45
-
es_male_m3: ["Spanish", "es", "Julio"],
46
-
es_female_f6: ["Spanish", "es", "Alejandra"],
47
-
es_female_fp1: ["Spanish", "es", "Mariana"],
48
-
es_mx_002: ["Spanish", "mx", "Male"],
49
-
es_mx_female_supermom: ["Spanish", "mx", "Super Mamá"],
50
-
51
-
br_003: ["Portuguese", "br", "Female"],
52
-
br_005: ["Portuguese", "br", "Male"],
53
-
54
-
pt_female_lhays: ["Portuguese", "pt", "Lhays Macedo"],
55
-
pt_female_laizza: ["Portuguese", "pt", "Laizza"],
56
-
pt_male_bueno: ["Portuguese", "pt", "Galvão Bueno"],
57
-
58
-
id_001: ["Indonesian", "id", "Female"],
59
-
id_male_darma: ["Indonesian", "id", "Darma"],
60
-
id_female_icha: ["Indonesian", "id", "Icha"],
61
-
id_male_putra: ["Indonesian", "id", "Putra"],
62
-
63
-
it_male_m18: ["Italian", "it", "male"],
64
-
65
-
jp_001: ["Japanese", "jp", "Female 1"],
66
-
jp_003: ["Japanese", "jp", "Female 2"],
67
-
jp_005: ["Japanese", "jp", "Female 3"],
68
-
jp_006: ["Japanese", "jp", "Male"],
69
-
jp_female_fujicochan: ["Japanese", "jp", "Fujicochan"],
70
-
jp_female_hasegawariona: ["Japanese", "jp", "Hasegawariona"],
71
-
jp_male_keiichinakano: ["Japanese", "jp", "Keiichinakano"],
72
-
jp_female_oomaeaika: ["Japanese", "jp", "Oomaeaika"],
73
-
jp_male_osada: ["Japanese", "jp", "Morisuke"],
74
-
jp_male_matsuo: ["Japanese", "jp", "Matsuo"],
75
-
jp_female_machikoriiita: ["Japanese", "jp", "Machikoriiita"],
76
-
jp_male_matsudake: ["Japanese", "jp", "Matsudake"],
77
-
jp_male_shuichiro: ["Japanese", "jp", "Shuichiro"],
78
-
jp_female_rei: ["Japanese", "jp", "Maruyama Rei"],
79
-
jp_male_hikakin: ["Japanese", "jp", "Hikakin"],
80
-
jp_female_yagishaki: ["Japanese", "jp", "Yagi Saki"],
81
-
82
-
kr_003: ["Korean", "kr", "Female"],
83
-
kr_002: ["Korean", "kr", "Male 1"],
84
-
kr_004: ["Korean", "kr", "Male 2"],
85
-
86
-
en_us_ghostface: ["English", "scream", "Ghostface"],
87
-
en_us_chewbacca: ["English", "star wars", "Chewbacca"],
88
-
en_us_c3po: ["English", "star wars", "C3PO"],
89
-
en_us_stormtrooper: ["English", "star wars", "Stormtrooper"],
90
-
en_us_stitch: ["English", "lilo & stitch", "Stitch"],
91
-
en_us_rocket: ["English", "GotG", "Rocket"],
92
-
en_female_madam_leota: ["English", "disney", "Madame Leota"],
93
-
en_male_deadpool: ["English", "deadpool", "Mr. GoodGuy"],
94
-
en_male_grinch: ["English", "grinch", "Trickster"],
95
-
en_male_ghosthost: ["English", "disney", "Ghost Host"],
96
-
en_male_pirate: ["English", "disney", "Pirate"],
97
-
98
-
en_female_f08_salut_damour: ["English", "singing", "Alto (Female)"],
99
-
en_female_f08_warmy_breeze: ["English", "singing", "Warmy Breeze (Female)"],
100
-
en_female_ht_f08_glorious: ["English", "singing", "Glorious (Female)"],
101
-
en_female_ht_f08_wonderful_world: ["English", "singing", "Dramatic (Female)"],
102
-
en_male_m03_lobby: ["English", "singing", "Tenor (Male)"],
103
-
en_male_m03_sunshine_soon: ["English", "singing", "Sunshine Soon (Male)"],
104
-
en_male_sing_funny_it_goes_up: ["English", "singing", "Chipmunk (Male)"],
105
-
en_male_m2_xhxs_m03_silly: ["English", "singing", "It Goes Up (Male)"],
106
-
en_male_sing_deep_jingle: ["English", "singing", "Caroler (Male)"],
107
-
en_male_m03_classical: ["English", "singing", "Classic Electric (Male)"],
108
-
en_male_m2_xhxs_m03_christmas: ["English", "singing", "Cozy (Male)"],
109
-
en_female_ht_f08_halloween: ["English", "singing", "Halloween (Female)"],
110
-
en_female_ht_f08_newyear: ["English", "singing", "NYE 2023 (Female)"],
111
-
en_male_sing_funny_thanksgiving: ["English", "singing", "Thanksgiving (Male)"],
112
-
en_female_f08_twinkle: ["English", "singing", "Pop Lullaby (Female)"]
113
-
} as const;
114
-
115
-
export const voices = Object.keys(actor) as (keyof typeof actor)[];
1
+
export const actor = JSON.parse(Buffer.from(process.env.NEXT_PUBLIC_VOICES_BASE64!, "base64").toString()) as Record<string, [string, string, string]>;
2
+
export const voices = Object.keys(actor);
116
3
117
4
export function getVoices(voice?: keyof typeof actor): string[] {
118
5
if (!voice) {