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

refactor guild booleans to flags

shi.gg 06c75731 bf7b0e98

verified
Changed files
+1146 -1347
app
[pathname]
dashboard
leaderboard
[guildId]
passport
[guildId]
profile
components
public
utils
+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
··· 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
··· 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
··· 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
··· 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
··· 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
··· 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
··· 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
··· 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
··· 37 37 src={avatarUrl} 38 38 /> 39 39 40 - <div className="space-y-2"> 40 + <div className="flex flex-col gap-2"> 41 41 <span className="text-3xl font-medium text-primary-foreground"> 42 42 {guild.style.username || "Wamellow"} 43 43 </span>
+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
··· 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
··· 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
··· 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
··· 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
··· 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
··· 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
··· 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
··· 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
+3 -4
components/button-fetch.tsx
··· 71 71 <Button 72 72 className="w-full" 73 73 onClick={handle} 74 - variant={ 75 - state === State.Success 76 - ? "success" 77 - : "flat" 74 + variant={state === State.Success 75 + ? "success" 76 + : "flat" 78 77 } 79 78 disabled={state !== State.Idle} 80 79 size={size}
+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
··· 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
··· 110 110 111 111 <div 112 112 className={cn( 113 - "scrollbar-hide overflow-y-scroll overflow-x-hidden max-h-[70vh] py-2 px-0.5", 113 + "scrollbar-hide overflow-y-scroll overflow-x-hidden max-h-[70vh] px-0.5", 114 114 className 115 115 )} 116 116 >
+1
eslint.config.mjs
··· 43 43 // Fixes 44 44 "react/prop-types": "off", 45 45 "react-hooks/exhaustive-deps": "off", 46 + "react-hooks/preserve-manual-memoization": "off", 46 47 47 48 // stylistic Rules 48 49 "@stylistic/array-bracket-newline": ["error", "consistent"],
+1 -1
next.config.js
··· 1 1 /** @type {import('next').NextConfig} */ 2 2 const nextConfig = { 3 - reactStrictMode: false, 3 + reactStrictMode: true, 4 4 eslint: { 5 5 ignoreDuringBuilds: true 6 6 },
+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
··· 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
··· 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
··· 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
··· 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
··· 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) {