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

Configure Feed

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

refactor: shadcn inputs (#29)

authored by

Luna Seemann and committed by
GitHub
c74e11aa d5b9b421

+1810 -1986
+2 -2
app/(home)/status/side.component.tsx
··· 1 1 "use client"; 2 2 3 - import DumbTextInput from "@/components/inputs/dumb-text-input"; 3 + import { ControlledInput } from "@/components/inputs/controlled-input"; 4 4 import { 5 5 Accordion, 6 6 AccordionContent, ··· 59 59 </Accordion> 60 60 61 61 <div> 62 - <DumbTextInput 62 + <ControlledInput 63 63 placeholder="Paste your Server Id" 64 64 value={guildId} 65 65 setValue={setGuildId}
+4 -4
app/(home)/text-to-speech/page.tsx
··· 1 1 "use client"; 2 2 3 - import SelectMenu from "@/components/inputs/select-menu"; 3 + import { InputSelect } from "@/components/inputs/select-menu"; 4 4 import { 5 5 AudioPlayerButton, 6 6 AudioPlayerDuration, ··· 75 75 <div> 76 76 <div className="rounded-xl bg-linear-to-br from-violet-300/8 to-violet-200/5 p-5 h-fit"> 77 77 <div className="flex flex-wrap items-center gap-3"> 78 - <SelectMenu 78 + <InputSelect 79 79 className="w-full" 80 - name="Voice & language" 80 + label="Voice & language" 81 81 items={voices.map((voiceKey) => ({ 82 82 name: getVoices(voiceKey)[0], 83 83 value: voiceKey 84 84 }))} 85 85 defaultState={voice} 86 - onSave={({ value }) => setVoice((value as string) || fallbackVoice)} 86 + onSave={(value) => setVoice((value as string) || fallbackVoice)} 87 87 showClear={false} 88 88 /> 89 89 </div>
+3 -3
app/dashboard/[guildId]/custom-commands/create.component.tsx
··· 1 1 "use client"; 2 2 3 - import DumbTextInput from "@/components/inputs/dumb-text-input"; 3 + import { ControlledInput } from "@/components/inputs/controlled-input"; 4 4 import Modal from "@/components/modal"; 5 5 import Notice from "@/components/notice"; 6 6 import { Button } from "@/components/ui/button"; ··· 67 67 > 68 68 <Notice message="Start the name with a '/' to create a slash command" /> 69 69 70 - <DumbTextInput 71 - name="Name" 70 + <ControlledInput 71 + label="Command Name" 72 72 placeholder="new-tag" 73 73 value={name} 74 74 setValue={(val) => setName((val || "").toLowerCase())}
+7 -7
app/dashboard/[guildId]/custom-commands/page.tsx
··· 3 3 import { guildStore } from "@/common/guilds"; 4 4 import { StatsBar } from "@/components/counter"; 5 5 import MessageCreatorEmbed from "@/components/embed-creator"; 6 - import SelectInput from "@/components/inputs/select-menu"; 7 - import TextInput from "@/components/inputs/text-input"; 6 + import { InputSelect } from "@/components/inputs/select-menu"; 7 + import { InputText } from "@/components/inputs/text-input"; 8 8 import { ScreenMessage } from "@/components/screen-message"; 9 9 import { Button } from "@/components/ui/button"; 10 10 import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; ··· 170 170 171 171 <div className="lg:flex gap-3 mt-6"> 172 172 <div className="lg:w-1/2"> 173 - <TextInput 173 + <InputText 174 174 key={tag.id} 175 - name="Name" 175 + label="Command Name" 176 176 url={url + "/" + tag.id} 177 177 dataName="name" 178 178 description="The name of the custom command." ··· 184 184 </div> 185 185 186 186 <div className="lg:w-1/2"> 187 - <SelectInput 187 + <InputSelect 188 188 key={tag.id} 189 - name="Permissions" 189 + label="Permissions" 190 190 url={url + "/" + tag.id} 191 191 items={ 192 192 Permissions.sort((a, b) => a.localeCompare(b)).map((p) => ( ··· 196 196 dataName="permission" 197 197 description="The permissions needed to execute this tag." 198 198 defaultState={tag.permission} 199 - onSave={(option) => editTag("permission", option.value)} 199 + onSave={(option) => editTag("permission", option)} 200 200 showClear 201 201 /> 202 202 </div>
+12 -12
app/dashboard/[guildId]/dailyposts/create.component.tsx
··· 1 1 "use client"; 2 2 3 3 import { guildStore } from "@/common/guilds"; 4 - import MultiSelectMenu from "@/components/inputs/multi-select-menu"; 5 - import SelectMenu from "@/components/inputs/select-menu"; 4 + import { InputMultiSelect } from "@/components/inputs/multi-select-menu"; 5 + import { InputSelect } from "@/components/inputs/select-menu"; 6 6 import Modal from "@/components/modal"; 7 7 import { Button } from "@/components/ui/button"; 8 8 import { type ApiV1GuildsModulesDailypostsGetResponse, DailypostType } from "@/typings"; ··· 89 89 }} 90 90 isDisabled={!hours.length || !type || !channelId} 91 91 > 92 - <SelectMenu 93 - name="Channel" 92 + <InputSelect 93 + label="Channel" 94 94 dataName="channelId" 95 95 items={createSelectableItems(channels, ["ViewChannel", "SendMessages", "AttachFiles"])} 96 96 description="Select a channel where dailyposts should be send into." 97 97 onSave={(o) => { 98 - setChannelId(o.value as string); 98 + setChannelId(o as string); 99 99 }} 100 100 /> 101 101 102 - <MultiSelectMenu 103 - name="Run at" 102 + <InputMultiSelect 103 + label="Run at" 104 104 items={hoursArray} 105 105 description="Select one or multiple hours when posts should be made." 106 + defaultState={hours} 106 107 onSave={(o) => { 107 - setHours(o.map((i) => i.value)); 108 + setHours(o); 108 109 }} 109 110 /> 110 111 111 - <SelectMenu 112 - name="Type" 113 - dataName="type" 112 + <InputSelect 113 + label="Type" 114 114 items={ 115 115 Object.entries(DailypostType) 116 116 .filter(([key]) => key.length > 2) ··· 118 118 } 119 119 description="Select what type of content should be posted daily." 120 120 onSave={(o) => { 121 - setType(o.value as number); 121 + setType(o as number); 122 122 }} 123 123 /> 124 124 </Modal>
+10 -10
app/dashboard/[guildId]/dailyposts/page.tsx
··· 5 5 import { useList } from "@/components/dashboard/lists/hook"; 6 6 import { Navigation } from "@/components/dashboard/lists/navigation"; 7 7 import { ItemSelector } from "@/components/dashboard/lists/selector"; 8 - import MultiSelectMenu from "@/components/inputs/multi-select-menu"; 9 - import SelectMenu from "@/components/inputs/select-menu"; 8 + import { InputMultiSelect } from "@/components/inputs/multi-select-menu"; 9 + import { InputSelect } from "@/components/inputs/select-menu"; 10 10 import { ScreenMessage } from "@/components/screen-message"; 11 11 import type { ApiV1GuildsModulesDailypostsGetResponse } from "@/typings"; 12 12 import { createSelectableItems } from "@/utils/create-selectable-items"; ··· 136 136 /> 137 137 138 138 <div className="flex md:gap-4 gap-2"> 139 - <SelectMenu 140 - name="Channel" 139 + <InputSelect 140 + label="Channel" 141 141 url={url + "/" + item.id} 142 142 dataName="channelId" 143 143 items={createSelectableItems(guild?.channels, ["ViewChannel", "SendMessages", "AttachFiles"])} 144 144 description="Select a channel where dailyposts should be send into." 145 145 defaultState={item.channelId} 146 - onSave={(o) => editItem("channelId", o.value as string)} 146 + onSave={(o) => editItem("channelId", o as string)} 147 147 /> 148 148 149 149 {/* <Fetch ··· 157 157 </div> 158 158 159 159 <div className="lg:flex gap-3"> 160 - <SelectMenu 160 + <InputSelect 161 161 className="lg:w-1/2 w-full" 162 - name="Ping role" 162 + label="Ping role" 163 163 url={url + "/" + item.id} 164 164 dataName="roleId" 165 165 items={[ ··· 169 169 ]} 170 170 description="Select a role which should get pinged on posts." 171 171 defaultState={item.roleId} 172 - onSave={(o) => editItem("roleId", o.value as string)} 172 + onSave={(o) => editItem("roleId", o as string)} 173 173 showClear 174 174 /> 175 - <MultiSelectMenu 175 + <InputMultiSelect 176 176 className="lg:w-1/2 w-full" 177 - name="Run at" 177 + label="Run at" 178 178 url={url + "/" + item.id} 179 179 dataName="runtimeHours" 180 180 items={hoursArray}
+14 -14
app/dashboard/[guildId]/greeting/farewell/page.tsx
··· 3 3 import { userStore } from "@/common/user"; 4 4 import Fetch from "@/components/button-fetch"; 5 5 import MessageCreatorEmbed from "@/components/embed-creator"; 6 - import ImageUrlInput from "@/components/inputs/image-url-input"; 7 - import NumberInput from "@/components/inputs/number-input"; 8 - import SelectMenu from "@/components/inputs/select-menu"; 9 - import Switch from "@/components/inputs/switch"; 6 + import { InputImageUrl } from "@/components/inputs/image-url-input"; 7 + import { InputNumber } from "@/components/inputs/number-input"; 8 + import { InputSelect } from "@/components/inputs/select-menu"; 9 + import { InputSwitch } from "@/components/inputs/switch"; 10 10 import Notice from "@/components/notice"; 11 11 import { Button } from "@/components/ui/button"; 12 12 import { useApi } from "@/lib/api/hook"; ··· 40 40 return (<> 41 41 <Head guildId={params.guildId as string} /> 42 42 43 - <Switch 43 + <InputSwitch 44 44 label="Enable Farewell" 45 45 endpoint={`/guilds/${guild?.id}`} 46 46 k="flags" ··· 49 49 onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.FarewellEnabled) })} 50 50 /> 51 51 52 - <NumberInput 53 - name="After how many seconds the message should be deleted" 52 + <InputNumber 53 + label="After how many seconds the message should be deleted" 54 54 description="Set to 0 to disable" 55 55 url={`/guilds/${guild?.id}/modules/bye`} 56 56 dataName="deleteAfter" ··· 60 60 /> 61 61 62 62 <div className="flex md:gap-4 gap-2"> 63 - <SelectMenu 64 - name="Channel" 63 + <InputSelect 64 + label="Channel" 65 65 url={`/guilds/${guild?.id}/modules/bye`} 66 66 dataName="channelId" 67 67 items={createSelectableItems(guild?.channels)} 68 68 description="Select the channel where the farewell message should be send into" 69 69 defaultState={data.channelId} 70 70 disabled={!enabled} 71 - onSave={(o) => edit("channelId", o.value)} 71 + onSave={(o) => edit("channelId", o as string)} 72 72 /> 73 73 74 74 <Fetch ··· 101 101 > 102 102 103 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")}> 104 - <Switch 104 + <InputSwitch 105 105 label="Show image card" 106 106 endpoint={`/guilds/${guild?.id}`} 107 107 k="flags" ··· 112 112 /> 113 113 114 114 {(guild!.flags & GuildFlags.FarewellCard) !== 0 && (<> 115 - <Switch 115 + <InputSwitch 116 116 label="Set image inside embed" 117 117 endpoint={`/guilds/${guild?.id}`} 118 118 k="flags" ··· 122 122 onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.FarewellCardInEmbed) })} 123 123 /> 124 124 125 - <ImageUrlInput 126 - name="Card Background" 125 + <InputImageUrl 126 + label="Card Background" 127 127 url={`/guilds/${guild?.id}/modules/bye`} 128 128 ratio="aspect-4/1" 129 129 dataName="card.background"
+7 -7
app/dashboard/[guildId]/greeting/passport/complete-setup.tsx
··· 1 1 import type { Guild } from "@/common/guilds"; 2 - import SelectMenu from "@/components/inputs/select-menu"; 2 + import { InputSelect } from "@/components/inputs/select-menu"; 3 3 import Modal from "@/components/modal"; 4 4 import type { ApiEdit } from "@/lib/api/hook"; 5 5 import { type ApiV1GuildsModulesPassportGetResponse, GuildFlags } from "@/typings"; ··· 62 62 isDisabled={!roleId} 63 63 onSuccess={() => edit("successRoleId", roleId)} 64 64 > 65 - <SelectMenu 66 - name="Role" 65 + <InputSelect 66 + label="Role" 67 67 items={createSelectableItems(guild?.roles, ["RoleHirachy"])} 68 68 description="Select what role members should get when completing verification." 69 69 defaultState={data.punishmentRoleId} 70 - onSave={(o) => setRoleId(o.value)} 70 + onSave={(o) => setRoleId(o)} 71 71 /> 72 72 </Modal> 73 73 ··· 91 91 isDisabled={!roleId} 92 92 onSuccess={() => edit("punishmentRoleId", roleId)} 93 93 > 94 - <SelectMenu 95 - name="Role" 94 + <InputSelect 95 + label="Role" 96 96 items={createSelectableItems(guild?.roles, ["RoleHirachy"])} 97 97 description="Select what role members should get when failing verification." 98 98 defaultState={data.punishmentRoleId} 99 - onSave={(o) => setRoleId(o.value)} 99 + onSave={(o) => setRoleId(o)} 100 100 /> 101 101 </Modal> 102 102 </>);
+18 -18
app/dashboard/[guildId]/greeting/passport/page.tsx
··· 2 2 3 3 import { guildStore } from "@/common/guilds"; 4 4 import { CopyToClipboardButton } from "@/components/copy-to-clipboard"; 5 - import SelectInput from "@/components/inputs/select-menu"; 6 - import Switch from "@/components/inputs/switch"; 5 + import { InputSelect } from "@/components/inputs/select-menu"; 6 + import { InputSwitch } from "@/components/inputs/switch"; 7 7 import Notice from "@/components/notice"; 8 8 import { OverviewLink } from "@/components/overview-link"; 9 9 import { Section } from "@/components/section"; ··· 53 53 edit={edit} 54 54 /> 55 55 56 - <Switch 56 + <InputSwitch 57 57 label="Enable Passport" 58 58 endpoint={`/guilds/${guild?.id}`} 59 59 k="flags" ··· 62 62 onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.PassportEnabled) })} 63 63 /> 64 64 65 - <SelectInput 66 - name="Logging channel" 65 + <InputSelect 66 + label="Channel" 67 67 url={`/guilds/${guild?.id}/modules/passport`} 68 68 dataName="channelId" 69 69 items={createSelectableItems(guild?.channels)} 70 70 description="Select the channel where verification logs should be send into." 71 71 defaultState={data.channelId} 72 72 disabled={!enabled} 73 - onSave={(o) => edit("channelId", o.value)} 73 + onSave={(o) => edit("channelId", o as string)} 74 74 /> 75 75 76 76 <div className="lg:flex gap-3"> 77 77 <div className="lg:w-1/2"> 78 - <SelectInput 79 - name="Unverified role" 78 + <InputSelect 79 + label="Unverified role" 80 80 url={`/guilds/${guild?.id}/modules/passport`} 81 81 dataName="unverifiedRoleId" 82 82 items={createSelectableItems(guild?.roles, ["RoleHirachy"])} ··· 84 84 defaultState={data.unverifiedRoleId} 85 85 showClear 86 86 disabled={!enabled} 87 - onSave={(o) => edit("unverifiedRoleId", o.value)} 87 + onSave={(o) => edit("unverifiedRoleId", o as string)} 88 88 /> 89 89 </div> 90 90 91 91 <div className="lg:w-1/2"> 92 - <SelectInput 93 - name="Verified role" 92 + <InputSelect 93 + label="Verified role" 94 94 url={`/guilds/${guild?.id}/modules/passport`} 95 95 dataName="successRoleId" 96 96 items={createSelectableItems(guild?.roles, ["RoleHirachy"])} 97 97 description="Select what role members should get when completing verification." 98 98 defaultState={data.successRoleId} 99 99 disabled={!enabled} 100 - onSave={(o) => edit("successRoleId", o.value)} 100 + onSave={(o) => edit("successRoleId", o as string)} 101 101 /> 102 102 </div> 103 103 </div> 104 104 105 105 <div className="lg:flex gap-3"> 106 106 <div className="lg:w-1/2"> 107 - <SelectInput 108 - name="Failed verification action" 107 + <InputSelect 108 + label="Failed verification action" 109 109 url={`/guilds/${guild?.id}/modules/passport`} 110 110 dataName="punishment" 111 111 items={[ ··· 116 116 description="Choose what should happen if a member failes verification." 117 117 defaultState={data.punishment} 118 118 disabled={!enabled} 119 - onSave={(o) => edit("punishment", o.value as ApiV1GuildsModulesPassportGetResponse["punishment"])} 119 + onSave={(o) => edit("punishment", o as ApiV1GuildsModulesPassportGetResponse["punishment"])} 120 120 /> 121 121 </div> 122 122 123 123 <div className="lg:w-1/2"> 124 - <SelectInput 125 - name="Punishment role" 124 + <InputSelect 125 + label="Punishment role" 126 126 url={`/guilds/${guild?.id}/modules/passport`} 127 127 dataName="punishmentRoleId" 128 128 items={createSelectableItems(guild?.roles, ["RoleHirachy"])} 129 129 description="Select what role members should get when failing verification." 130 130 defaultState={data.punishmentRoleId} 131 131 disabled={!enabled || data.punishment !== 2} 132 - onSave={(o) => edit("punishmentRoleId", o.value)} 132 + onSave={(o) => edit("punishmentRoleId", o as string)} 133 133 /> 134 134 </div> 135 135 </div>
+38 -38
app/dashboard/[guildId]/greeting/welcome/page.tsx
··· 3 3 import { userStore } from "@/common/user"; 4 4 import Fetch from "@/components/button-fetch"; 5 5 import MessageCreatorEmbed from "@/components/embed-creator"; 6 - import ImageUrlInput from "@/components/inputs/image-url-input"; 7 - import MultiSelectMenu from "@/components/inputs/multi-select-menu"; 8 - import NumberInput from "@/components/inputs/number-input"; 9 - import SelectMenu from "@/components/inputs/select-menu"; 10 - import Switch from "@/components/inputs/switch"; 6 + import { InputImageUrl } from "@/components/inputs/image-url-input"; 7 + import { InputMultiSelect } from "@/components/inputs/multi-select-menu"; 8 + import { InputNumber } from "@/components/inputs/number-input"; 9 + import { InputSelect } from "@/components/inputs/select-menu"; 10 + import { InputSwitch } from "@/components/inputs/switch"; 11 11 import Notice from "@/components/notice"; 12 12 import { Section } from "@/components/section"; 13 13 import { Button } from "@/components/ui/button"; ··· 42 42 return (<> 43 43 <Head guildId={params.guildId as string} /> 44 44 45 - <Switch 45 + <InputSwitch 46 46 label="Enable Welcome" 47 47 endpoint={`/guilds/${guild?.id}`} 48 48 k="flags" ··· 51 51 onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.WelcomeEnabled) })} 52 52 /> 53 53 54 - <Switch 54 + <InputSwitch 55 55 label="Restore roles and nickname on rejoin" 56 56 endpoint={`/guilds/${guild?.id}`} 57 57 k="flags" ··· 60 60 onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.WelcomeRestore) })} 61 61 /> 62 62 63 - <Switch 63 + <InputSwitch 64 64 label="Delete welcome message after leave" 65 65 description="This only takes affect if the user joined less than 24h ago." 66 66 endpoint={`/guilds/${guild?.id}/modules/welcome`} ··· 70 70 onSave={(s) => edit("deleteAfterLeave", s)} 71 71 /> 72 72 73 - <NumberInput 74 - name="After how many seconds the message should be deleted" 73 + <InputNumber 74 + label="After how many seconds the message should be deleted" 75 75 description="Set to 0 to disable." 76 76 url={`/guilds/${guild?.id}/modules/welcome`} 77 77 dataName="deleteAfter" ··· 81 81 /> 82 82 83 83 <div className="flex md:gap-4 gap-2"> 84 - <SelectMenu 84 + <InputSelect 85 85 className="w-2/3 md:w-5/6" 86 - name="Channel" 86 + label="Channel" 87 87 url={`/guilds/${guild?.id}/modules/welcome`} 88 88 dataName="channelId" 89 89 items={createSelectableItems(guild?.channels)} ··· 91 91 defaultState={data.channelId} 92 92 disabled={!enabled} 93 93 showClear 94 - onSave={(o) => edit("channelId", o.value)} 94 + onSave={(o) => edit("channelId", o as string)} 95 95 /> 96 96 97 97 <Fetch ··· 106 106 107 107 <div className="lg:flex gap-3"> 108 108 <div className="lg:w-1/2"> 109 - <MultiSelectMenu 110 - name="Roles" 109 + <InputMultiSelect 110 + label="Enabled" 111 111 url={`/guilds/${guild?.id}/modules/welcome`} 112 112 dataName="roleIds" 113 113 items={createSelectableItems(guild?.roles, ["RoleHirachy"])} ··· 115 115 defaultState={data.roleIds} 116 116 max={5} 117 117 disabled={!enabled} 118 - onSave={(o) => edit("roleIds", o.map(({ value }) => value))} 118 + onSave={(o) => edit("roleIds", o)} 119 119 /> 120 120 </div> 121 121 122 122 <div className="lg:w-1/2"> 123 - <MultiSelectMenu 124 - name="Pings" 123 + <InputMultiSelect 124 + label="Also send in DMs" 125 125 url={`/guilds/${guild?.id}/modules/welcome`} 126 126 dataName="pingIds" 127 127 items={createSelectableItems(guild?.channels, ["ViewChannel", "SendMessages"])} ··· 129 129 defaultState={data.pingIds} 130 130 max={5} 131 131 disabled={!enabled} 132 - onSave={(o) => edit("pingIds", o.map(({ value }) => value))} 132 + onSave={(o) => edit("pingIds", o)} 133 133 /> 134 134 </div> 135 135 </div> 136 136 137 137 <div className="lg:flex gap-3"> 138 138 <div className="lg:w-1/2"> 139 - <MultiSelectMenu 140 - name="First user message reactions" 139 + <InputMultiSelect 140 + label="First user message reactions" 141 141 url={`/guilds/${guild?.id}/modules/welcome`} 142 142 dataName="reactions.firstMessageEmojis" 143 143 items={createSelectableEmojiItems(guild?.emojis)} ··· 148 148 onSave={(o) => { 149 149 edit("reactions", { 150 150 ...data.reactions, 151 - firstMessageEmojis: o.map(({ value }) => value) 151 + firstMessageEmojis: o 152 152 }); 153 153 }} 154 154 /> 155 155 </div> 156 156 157 157 <div className="lg:w-1/2"> 158 - <MultiSelectMenu 159 - name="Welcome message reactions" 158 + <InputMultiSelect 159 + label="Welcome message reactions" 160 160 url={`/guilds/${guild?.id}/modules/welcome`} 161 161 dataName="reactions.welcomeMessageEmojis" 162 162 items={createSelectableEmojiItems(guild?.emojis)} ··· 167 167 onSave={(o) => { 168 168 edit("reactions", { 169 169 ...data.reactions, 170 - welcomeMessageEmojis: o.map(({ value }) => value) 170 + welcomeMessageEmojis: o 171 171 }); 172 172 }} 173 173 /> ··· 194 194 > 195 195 196 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")}> 197 - <Switch 197 + <InputSwitch 198 198 label="Show image card" 199 199 endpoint={`/guilds/${guild?.id}`} 200 200 k="flags" ··· 205 205 /> 206 206 207 207 {(guild!.flags & GuildFlags.WelcomeCard) !== 0 && (<> 208 - <Switch 208 + <InputSwitch 209 209 label="Set image inside embed" 210 210 endpoint={`/guilds/${guild?.id}`} 211 211 k="flags" ··· 215 215 onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.WelcomeCardInEmbed) })} 216 216 /> 217 217 218 - <ImageUrlInput 219 - name="Card Background" 218 + <InputImageUrl 219 + label="Card Avatar" 220 220 url={`/guilds/${guild?.id}/modules/welcome`} 221 221 ratio="aspect-4/1" 222 222 dataName="card.background" ··· 251 251 > 252 252 253 253 <div className="m-2"> 254 - <Switch 254 + <InputSwitch 255 255 label="Enable DM" 256 256 endpoint={`/guilds/${guild?.id}`} 257 257 k="flags" ··· 271 271 Bring Discord&apos;s &quot;Wave to say hi!&quot; feature on customized messages, just with a random greet! 272 272 </Section> 273 273 274 - <Switch 274 + <InputSwitch 275 275 label="Enable button" 276 276 endpoint={`/guilds/${guild?.id}`} 277 277 k="flags" ··· 281 281 onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.WelcomeButton) })} 282 282 /> 283 283 284 - <Switch 284 + <InputSwitch 285 285 label="Ping new member" 286 286 description="Whenever the mention in the greet message should ping or not." 287 287 endpoint={`/guilds/${guild?.id}`} ··· 294 294 295 295 <div className="lg:flex gap-3 pt-3"> 296 296 <div className="lg:w-1/2"> 297 - <SelectMenu 298 - name="Button color" 297 + <InputSelect 298 + label="Button color" 299 299 url={`/guilds/${guild?.id}/modules/welcome`} 300 300 dataName="button.style" 301 301 items={ ··· 317 317 onSave={(o) => { 318 318 edit("button", { 319 319 ...data.button, 320 - style: o.value as 1 320 + style: o as 1 321 321 }); 322 322 }} 323 323 /> 324 324 </div> 325 325 <div className="lg:w-1/2"> 326 - <SelectMenu 327 - name="Button emoji" 326 + <InputSelect 327 + label="Webhook Profile" 328 328 url={`/guilds/${guild?.id}/modules/welcome`} 329 329 dataName="button.emoji" 330 330 items={createSelectableEmojiItems(guild?.emojis)} ··· 334 334 onSave={(o) => { 335 335 edit("button", { 336 336 ...data.button, 337 - emoji: o.value 337 + emoji: o as string 338 338 }); 339 339 }} 340 340 />
+13 -13
app/dashboard/[guildId]/leaderboards/page.tsx
··· 1 1 "use client"; 2 2 3 3 import { type Guild, guildStore } from "@/common/guilds"; 4 - import ImageUrlInput from "@/components/inputs/image-url-input"; 5 - import MultiSelectMenu from "@/components/inputs/multi-select-menu"; 6 - import Switch from "@/components/inputs/switch"; 4 + import { InputImageUrl } from "@/components/inputs/image-url-input"; 5 + import { InputMultiSelect } from "@/components/inputs/multi-select-menu"; 6 + import { InputSwitch } from "@/components/inputs/switch"; 7 7 import { ScreenMessage } from "@/components/screen-message"; 8 8 import { Section, SubSection } from "@/components/section"; 9 9 import { useApi } from "@/lib/api/hook"; ··· 43 43 44 44 return (<> 45 45 <div className="flex flex-col-reverse md:flex-row gap-6"> 46 - <div> 46 + <div className="w-full"> 47 47 <OverviewLink 48 48 title="View Leaderboard" 49 49 message="Easily access and view the top chatters, voice timers, and inviters from this server in the web." ··· 51 51 icon={<HiChartBar />} 52 52 /> 53 53 54 - <ImageUrlInput 55 - name="Banner" 54 + <InputImageUrl 55 + label="Enabled" 56 56 url={url} 57 57 ratio="aspect-4/1" 58 58 dataName="banner" ··· 75 75 76 76 <div className="lg:flex gap-3 mt-5"> 77 77 <div className="lg:w-1/2"> 78 - <MultiSelectMenu 79 - name="Top messager roles" 78 + <InputMultiSelect 79 + label="Top messager roles" 80 80 url={url} 81 81 dataName="roles.messages" 82 82 items={createSelectableItems(guild?.roles)} ··· 86 86 /> 87 87 </div> 88 88 <div className="lg:w-1/2"> 89 - <MultiSelectMenu 90 - name="Top voice roles" 89 + <InputMultiSelect 90 + label="Blacklisted roles" 91 91 url={url} 92 92 dataName="roles.voiceminutes" 93 93 items={createSelectableItems(guild?.roles)} ··· 99 99 </div> 100 100 101 101 <div className="lg:w-1/2"> 102 - <MultiSelectMenu 103 - name="Blacklisted channels" 102 + <InputMultiSelect 103 + label="Blacklisted channels" 104 104 url={url} 105 105 dataName="blacklistChannelIds" 106 106 items={createSelectableItems(guild?.channels, [], [ChannelType.GuildCategory, ChannelType.GuildText, ChannelType.GuildAnnouncement, ChannelType.GuildVoice])} ··· 128 128 Manage the privacy of the leaderboard. 129 129 </Section> 130 130 131 - <Switch 131 + <InputSwitch 132 132 label="Hide leaderboard website" 133 133 description="Disable the public website for the leaderboard." 134 134 endpoint={`/guilds/${params.guildId}`}
+26 -26
app/dashboard/[guildId]/leaderboards/updating.component.tsx
··· 1 1 "use client"; 2 2 3 3 import type { Guild } from "@/common/guilds"; 4 - import SelectInput from "@/components/inputs/select-menu"; 5 - import Switch from "@/components/inputs/switch"; 6 - import TextInput from "@/components/inputs/text-input"; 4 + import { InputSelect } from "@/components/inputs/select-menu"; 5 + import { InputSwitch } from "@/components/inputs/switch"; 6 + import { InputText } from "@/components/inputs/text-input"; 7 7 import Modal from "@/components/modal"; 8 8 import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; 9 9 import type { ApiV1GuildsModulesLeaderboardUpdatingPostResponse } from "@/typings"; ··· 166 166 } 167 167 > 168 168 169 - <SelectInput 170 - name="Channel" 169 + <InputSelect 170 + label="Channel" 171 171 items={createSelectableItems(guild.channels, ["ViewChannel", "SendMessages", "EmbedLinks", "AttachFiles"])} 172 172 description="Select a channel where the leaderboard should be send into." 173 173 defaultState={leaderboard?.channelId} 174 - onSave={(o) => setChannelId(o.value as string)} 174 + onSave={(o) => setChannelId(o as string)} 175 175 /> 176 176 177 177 <div className="mb-3"> ··· 203 203 204 204 {structure === 0 && (<> 205 205 {!leaderboard?.channelId && ( 206 - <TextInput 207 - name="Title" 206 + <InputText 207 + label="Mode" 208 208 description="The title of the embed" 209 209 defaultState={`☕ ${type.replace(/^\w/, (match) => match.toUpperCase())} leaderboard`} 210 210 max={256} 211 211 onSave={(v) => { 212 212 setEmbed({ 213 213 ...embed, 214 - title: v as string 214 + title: v 215 215 }); 216 216 }} 217 217 /> 218 218 )} 219 219 220 220 <div className="flex gap-2"> 221 - <SelectInput 222 - name="Rank" 221 + <InputSelect 222 + label="Sorting direction" 223 223 items={stylesList} 224 224 defaultState={leaderboard?.styles?.rank || undefined} 225 225 onSave={(o) => { 226 - setStyles({ ...styles, rank: o.value as null }); 226 + setStyles({ ...styles, rank: o as null }); 227 227 }} 228 228 /> 229 - <SelectInput 230 - name="Number" 229 + <InputSelect 230 + label="Show numbers" 231 231 items={stylesList} 232 232 defaultState={leaderboard?.styles?.number || undefined} 233 233 onSave={(o) => { 234 - setStyles({ ...styles, number: o.value as null }); 234 + setStyles({ ...styles, number: o as null }); 235 235 }} 236 236 /> 237 - <SelectInput 238 - name="User" 237 + <InputSelect 238 + label="Maximum entries" 239 239 items={stylesList} 240 240 defaultState={leaderboard?.styles?.user || undefined} 241 241 onSave={(o) => { 242 - setStyles({ ...styles, user: o.value as null }); 242 + setStyles({ ...styles, user: o as null }); 243 243 }} 244 244 /> 245 245 </div> 246 246 247 - <SelectInput 248 - name="Display name" 247 + <InputSelect 248 + label="Show nickname" 249 249 items={ 250 250 ["mention", "username", "nickname", "id"].map((key) => ({ 251 251 name: key.replace(/^\w/, (char) => char.toUpperCase()), ··· 256 256 defaultState={leaderboard?.display} 257 257 showClear 258 258 onSave={(o) => { 259 - setDisplay(o.value as ApiV1GuildsModulesLeaderboardUpdatingPostResponse["display"]); 259 + setDisplay(o as ApiV1GuildsModulesLeaderboardUpdatingPostResponse["display"]); 260 260 }} 261 261 /> 262 262 263 - <SelectInput 264 - name="Emoji" 263 + <InputSelect 264 + label="Emoji" 265 265 items={createSelectableEmojiItems(guild.emojis)} 266 - description="Select a emots which will be between shown after the data count." 266 + description="Select an emoji which will be shown after the data count." 267 267 defaultState={leaderboard?.emoji || undefined} 268 268 showClear 269 269 onSave={(o) => { 270 - setEmoji(o.value as string); 270 + setEmoji(o as string); 271 271 }} 272 272 /> 273 273 274 - <Switch 274 + <InputSwitch 275 275 label="Use quotes for text" 276 276 isTickbox 277 277 defaultState={leaderboard?.styles?.useQuotes || false}
+12 -12
app/dashboard/[guildId]/moderation/page.tsx
··· 1 1 "use client"; 2 2 3 3 import { guildStore } from "@/common/guilds"; 4 - import MultiSelectMenu from "@/components/inputs/multi-select-menu"; 5 - import Switch from "@/components/inputs/switch"; 6 - import TextInput from "@/components/inputs/text-input"; 4 + import { InputMultiSelect } from "@/components/inputs/multi-select-menu"; 5 + import { InputSwitch } from "@/components/inputs/switch"; 6 + import { InputText } from "@/components/inputs/text-input"; 7 7 import Notice from "@/components/notice"; 8 8 import { useApi } from "@/lib/api/hook"; 9 9 import { type ApiV1GuildsModulesAutomodGetResponse, AutomodType } from "@/typings"; ··· 34 34 35 35 return (<> 36 36 {AUTOMOD_TYPES.map((type) => ( 37 - <Switch 37 + <InputSwitch 38 38 key={type} 39 39 label={`Block ${type.replace(/_/g, " ").replace(/(^| +)\w/g, (c) => c.toUpperCase())}`} 40 40 description={`Prevent ${type.replace(/_/, " ")} links from being sent.`} ··· 50 50 51 51 <div className="lg:flex gap-3"> 52 52 <div className="lg:w-1/2"> 53 - <MultiSelectMenu 54 - name="Whitelist channels" 53 + <InputMultiSelect 54 + label="Whitelist channels" 55 55 url={url} 56 56 dataName="whitelistChannelIds" 57 57 items={createSelectableItems(guild?.channels, [], [ChannelType.GuildCategory, ChannelType.GuildText, ChannelType.GuildAnnouncement])} ··· 60 60 max={50} 61 61 disabled={!enabled} 62 62 onSave={(value) => { 63 - edit("whitelistChannelIds", value.map((entry) => entry.value)); 63 + edit("whitelistChannelIds", value); 64 64 }} 65 65 /> 66 66 </div> 67 67 <div className="lg:w-1/2"> 68 - <MultiSelectMenu 69 - name="Whitelist roles" 68 + <InputMultiSelect 69 + label="Whitelist roles" 70 70 url={url} 71 71 dataName="whitelistRoleIds" 72 72 items={createSelectableItems(guild?.roles)} ··· 75 75 max={20} 76 76 disabled={!enabled} 77 77 onSave={(value) => { 78 - edit("whitelistRoleIds", value.map((entry) => entry.value)); 78 + edit("whitelistRoleIds", value); 79 79 }} 80 80 /> 81 81 </div> 82 82 </div> 83 83 84 - <TextInput 85 - name="Keyword filter" 84 + <InputText 85 + label="Keyword filter" 86 86 url={url} 87 87 dataName="keywordFilter" 88 88 description="Separate words or phrases with a comma (dog, cat, tiger) or new line. For each word, use * at the beginning, end, or both for partial matching."
+7 -8
app/dashboard/[guildId]/notifications/create-bluesky.component.tsx
··· 1 1 "use client"; 2 2 3 3 import { guildStore } from "@/common/guilds"; 4 - import DumbTextInput from "@/components/inputs/dumb-text-input"; 5 - import SelectMenu from "@/components/inputs/select-menu"; 4 + import { ControlledInput } from "@/components/inputs/controlled-input"; 5 + import { InputSelect } from "@/components/inputs/select-menu"; 6 6 import Modal from "@/components/modal"; 7 7 import { Section } from "@/components/section"; 8 8 import { type ApiV1GuildsModulesNotificationsGetResponse, NotificationType } from "@/typings"; ··· 80 80 }} 81 81 isDisabled={!name || !channelId} 82 82 > 83 - <DumbTextInput 84 - name="Bluesky user" 83 + <ControlledInput 84 + label="Bluesky user" 85 85 placeholder="wamellow.bsky.social" 86 86 value={name} 87 87 setValue={setName} 88 88 /> 89 89 90 - <SelectMenu 91 - name="Channel" 92 - dataName="channelId" 90 + <InputSelect 91 + label="Channel" 93 92 items={createSelectableItems(channels)} 94 93 description="Select a channel where notifications should be send into." 95 94 onSave={(o) => { 96 - setChannelId(o.value as string); 95 + setChannelId(o as string); 97 96 }} 98 97 /> 99 98
+7 -8
app/dashboard/[guildId]/notifications/create-reddit.component.tsx
··· 1 1 "use client"; 2 2 3 3 import { guildStore } from "@/common/guilds"; 4 - import DumbTextInput from "@/components/inputs/dumb-text-input"; 5 - import SelectMenu from "@/components/inputs/select-menu"; 4 + import { ControlledInput } from "@/components/inputs/controlled-input"; 5 + import { InputSelect } from "@/components/inputs/select-menu"; 6 6 import Modal from "@/components/modal"; 7 7 import { Section } from "@/components/section"; 8 8 import { type ApiV1GuildsModulesNotificationsGetResponse, NotificationType } from "@/typings"; ··· 71 71 }} 72 72 isDisabled={!name || !channelId} 73 73 > 74 - <DumbTextInput 75 - name="Subreddit" 74 + <ControlledInput 75 + label="Subreddit" 76 76 placeholder="r/wamellow" 77 77 value={name} 78 78 setValue={setName} 79 79 /> 80 80 81 - <SelectMenu 82 - name="Channel" 83 - dataName="channelId" 81 + <InputSelect 82 + label="Channel" 84 83 items={createSelectableItems(channels)} 85 84 description="Select a channel where notifications should be send into." 86 85 onSave={(o) => { 87 - setChannelId(o.value as string); 86 + setChannelId(o as string); 88 87 }} 89 88 /> 90 89
+7 -8
app/dashboard/[guildId]/notifications/create-twitch.component.tsx
··· 1 1 "use client"; 2 2 3 3 import { guildStore } from "@/common/guilds"; 4 - import DumbTextInput from "@/components/inputs/dumb-text-input"; 5 - import SelectMenu from "@/components/inputs/select-menu"; 4 + import { ControlledInput } from "@/components/inputs/controlled-input"; 5 + import { InputSelect } from "@/components/inputs/select-menu"; 6 6 import Modal from "@/components/modal"; 7 7 import { Section } from "@/components/section"; 8 8 import TutorialPic from "@/public/docs-assets/notifications-channel-urls.webp"; ··· 73 73 }} 74 74 isDisabled={!name || !channelId} 75 75 > 76 - <DumbTextInput 77 - name="Streamer's username" 76 + <ControlledInput 77 + label="Streamer's username" 78 78 placeholder="DarkViperAU" 79 79 value={name} 80 80 setValue={setName} 81 81 /> 82 82 83 - <SelectMenu 84 - name="Channel" 85 - dataName="channelId" 83 + <InputSelect 84 + label="Channel" 86 85 items={createSelectableItems(channels)} 87 86 description="Select a channel where notifications should be send into." 88 87 onSave={(o) => { 89 - setChannelId(o.value as string); 88 + setChannelId(o as string); 90 89 }} 91 90 /> 92 91
+7 -8
app/dashboard/[guildId]/notifications/create-youtube.component.tsx
··· 1 1 "use client"; 2 2 3 3 import { guildStore } from "@/common/guilds"; 4 - import DumbTextInput from "@/components/inputs/dumb-text-input"; 5 - import SelectMenu from "@/components/inputs/select-menu"; 4 + import { ControlledInput } from "@/components/inputs/controlled-input"; 5 + import { InputSelect } from "@/components/inputs/select-menu"; 6 6 import Modal from "@/components/modal"; 7 7 import { Section } from "@/components/section"; 8 8 import TutorialPic from "@/public/docs-assets/notifications-channel-urls.webp"; ··· 82 82 }} 83 83 isDisabled={!name || !channelId} 84 84 > 85 - <DumbTextInput 86 - name="Creator's @handle, id or URL" 85 + <ControlledInput 86 + label="Creator's @handle, id or URL" 87 87 placeholder="@LinusTechTips" 88 88 value={name} 89 89 setValue={setName} 90 90 /> 91 91 92 - <SelectMenu 93 - name="Channel" 94 - dataName="channelId" 92 + <InputSelect 93 + label="Channel" 95 94 items={createSelectableItems(channels)} 96 95 description="Select a channel where notifications should be send into." 97 96 onSave={(o) => { 98 - setChannelId(o.value as string); 97 + setChannelId(o as string); 99 98 }} 100 99 /> 101 100
+21 -21
app/dashboard/[guildId]/notifications/page.tsx
··· 7 7 import { Navigation } from "@/components/dashboard/lists/navigation"; 8 8 import { ItemSelector } from "@/components/dashboard/lists/selector"; 9 9 import MessageCreatorEmbed from "@/components/embed-creator"; 10 - import MultiSelectMenu from "@/components/inputs/multi-select-menu"; 11 - import SelectMenu from "@/components/inputs/select-menu"; 12 - import Switch from "@/components/inputs/switch"; 13 - import TextInput from "@/components/inputs/text-input"; 10 + import { InputMultiSelect } from "@/components/inputs/multi-select-menu"; 11 + import { InputSelect } from "@/components/inputs/select-menu"; 12 + import { InputSwitch } from "@/components/inputs/switch"; 13 + import { InputText } from "@/components/inputs/text-input"; 14 14 import { ScreenMessage } from "@/components/screen-message"; 15 15 import { AvatarBadge } from "@/components/ui/avatar"; 16 16 import { Button } from "@/components/ui/button"; ··· 164 164 /> 165 165 166 166 <div className="flex md:gap-4 gap-2"> 167 - <SelectMenu 168 - name="Channel" 167 + <InputSelect 168 + label="Channel" 169 169 url={url + "/" + item.id} 170 170 dataName="channelId" 171 171 items={createSelectableItems(guild?.channels, ["ViewChannel", "SendMessages", "EmbedLinks", item.username ? "ManageWebhooks" : null, item.roleId ? "MentionEveryone" : null])} 172 172 description="Select a channel where notifications should be send into." 173 173 defaultState={item.channelId} 174 - onSave={(o) => editItem("channelId", o.value as string)} 174 + onSave={(o) => editItem("channelId", o as string)} 175 175 /> 176 176 177 177 <TestButton ··· 190 190 </div> 191 191 192 192 <div className="flex md:gap-4 gap-2"> 193 - <SelectMenu 193 + <InputSelect 194 194 className="md:w-1/2 w-full" 195 - name="Ping role" 195 + label="Ping role" 196 196 url={url + "/" + item.id} 197 197 dataName="roleId" 198 198 items={[ ··· 202 202 ]} 203 203 description="Select a role which should get pinged on uploads." 204 204 defaultState={item.roleId} 205 - onSave={(o) => editItem("roleId", o.value as string)} 205 + onSave={(o) => editItem("roleId", o as string)} 206 206 showClear 207 207 /> 208 208 209 209 {platformFlags 210 - ? <MultiSelectMenu 210 + ? <InputMultiSelect 211 211 className="md:w-1/2 w-full" 212 - name="Filter" 212 + label="Filter" 213 213 url={url + "/" + item.id} 214 214 dataName="flags" 215 215 items={bitfieldToArray(platformFlags)} ··· 219 219 } 220 220 defaultState={flags.toArray()} 221 221 onSave={(o) => { 222 - const flags = o.map((flag) => Number(flag.value)); 222 + const flags = o.map((flag) => Number(flag)); 223 223 editItem("flags", flags.reduce((a, b) => a | b, 0)); 224 224 }} 225 225 /> 226 - : <TextInput 226 + : <InputText 227 227 className="md:w-1/2 w-full" 228 - name={flags.has(NotificationFlags.MustNotMatchRegex) 228 + label={flags.has(NotificationFlags.MustNotMatchRegex) 229 229 ? "Blacklist regex" 230 230 : "Whitelist regex" 231 231 } ··· 236 236 : "Only posts that match the provided regex will be sent." 237 237 } 238 238 defaultState={item.regex || ""} 239 - onSave={(value) => editItem("regex", value as string)} 239 + onSave={(value) => editItem("regex", value)} 240 240 /> 241 241 } 242 242 </div> 243 243 244 244 {platformFlags && ( 245 - <TextInput 245 + <InputText 246 246 className="md:w-1/2 w-full" 247 - name={flags.has(NotificationFlags.MustNotMatchRegex) 247 + label={flags.has(NotificationFlags.MustNotMatchRegex) 248 248 ? "Blacklist regex" 249 249 : "Whitelist regex" 250 250 } ··· 255 255 : "Only posts that match the provided regex will be sent." 256 256 } 257 257 defaultState={item.regex || ""} 258 - onSave={(value) => editItem("regex", value as string)} 258 + onSave={(value) => editItem("regex", value)} 259 259 /> 260 260 )} 261 261 262 - <Switch 262 + <InputSwitch 263 263 className="mt-2" 264 264 label="Inverted regex (blacklist)" 265 265 endpoint={url + "/" + item.id} ··· 270 270 /> 271 271 272 272 {item.type === NotificationType.Twitch && ( 273 - <Switch 273 + <InputSwitch 274 274 className="mt-2" 275 275 label="Delete after stream ends" 276 276 endpoint={url + "/" + item.id}
+3 -3
app/dashboard/[guildId]/notifications/style.component.tsx
··· 2 2 import { guildStore } from "@/common/guilds"; 3 3 import { DiscordMarkdown } from "@/components/discord/markdown"; 4 4 import DiscordMessage from "@/components/discord/message"; 5 - import DumbTextInput from "@/components/inputs/dumb-text-input"; 5 + import { ControlledInput } from "@/components/inputs/controlled-input"; 6 6 import Modal from "@/components/modal"; 7 7 import { Section } from "@/components/section"; 8 8 import { UserAvatar } from "@/components/ui/avatar"; ··· 200 200 }} 201 201 isDisabled={!name || Boolean(error)} 202 202 > 203 - <DumbTextInput 204 - name="Username" 203 + <ControlledInput 204 + label="Username" 205 205 placeholder="DarkViperAU" 206 206 value={name} 207 207 setValue={setName}
+2 -2
app/dashboard/[guildId]/page.tsx
··· 1 1 "use client"; 2 2 3 3 import { guildStore } from "@/common/guilds"; 4 - import Switch from "@/components/inputs/switch"; 4 + import { InputSwitch } from "@/components/inputs/switch"; 5 5 import { Section } from "@/components/section"; 6 6 import { GuildFlags } from "@/typings"; 7 7 import { transformer } from "@/utils/bitfields"; ··· 45 45 Small tools that improve chatting to insanity. 46 46 </Section> 47 47 48 - <Switch 48 + <InputSwitch 49 49 label="Embed message links" 50 50 description="Reply with the original content of a message if a message link is sent." 51 51 endpoint={`/guilds/${params.guildId}`}
+33 -34
app/dashboard/[guildId]/starboard/page.tsx
··· 4 4 import { DiscordMarkdown } from "@/components/discord/markdown"; 5 5 import DiscordMessage from "@/components/discord/message"; 6 6 import DiscordMessageEmbed from "@/components/discord/message-embed"; 7 - import MultiSelectMenu from "@/components/inputs/multi-select-menu"; 8 - import NumberInput from "@/components/inputs/number-input"; 9 - import SelectMenu from "@/components/inputs/select-menu"; 10 - import Switch from "@/components/inputs/switch"; 11 - import TextInput from "@/components/inputs/text-input"; 7 + import { InputColor } from "@/components/inputs/color-input"; 8 + import { InputMultiSelect } from "@/components/inputs/multi-select-menu"; 9 + import { InputNumber } from "@/components/inputs/number-input"; 10 + import { InputSelect } from "@/components/inputs/select-menu"; 11 + import { InputSwitch } from "@/components/inputs/switch"; 12 12 import Notice from "@/components/notice"; 13 13 import { Button } from "@/components/ui/button"; 14 14 import { useApi } from "@/lib/api/hook"; ··· 60 60 </Button> 61 61 </div> 62 62 63 - <Switch 63 + <InputSwitch 64 64 label="Enable Starboard" 65 65 endpoint={`/guilds/${guild?.id}`} 66 66 k="flags" ··· 69 69 onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.StarboardEnabled) })} 70 70 /> 71 71 72 - <Switch 72 + <InputSwitch 73 73 label="Allow bots, apps and webhooks" 74 74 endpoint={`/guilds/${guild?.id}`} 75 75 k="flags" ··· 78 78 onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.StarboardAllowBots) })} 79 79 /> 80 80 81 - <Switch 81 + <InputSwitch 82 82 label="Allow NSFW channels" 83 83 endpoint={`/guilds/${guild?.id}`} 84 84 k="flags" ··· 87 87 onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.StarboardAllowNSFW) })} 88 88 /> 89 89 90 - <Switch 90 + <InputSwitch 91 91 label="Allow message edits" 92 92 description="If a message is being edited, update it in the data." 93 93 endpoint={`/guilds/${guild?.id}`} ··· 97 97 onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.StarboardAllowEdits) })} 98 98 /> 99 99 100 - <Switch 100 + <InputSwitch 101 101 label="Allow author reaction" 102 102 description="Lets the message author star their own messages." 103 103 endpoint={`/guilds/${guild?.id}`} ··· 107 107 onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.StarboardAllowSelf) })} 108 108 /> 109 109 110 - <Switch 111 - label="Display stared message reference" 110 + <InputSwitch 111 + label="Display starred message reference" 112 112 description="Repost the message reply in the data." 113 113 endpoint={`/guilds/${guild?.id}`} 114 114 k="flags" ··· 117 117 onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.StarboardDisplayReference) })} 118 118 /> 119 119 120 - <Switch 120 + <InputSwitch 121 121 label="Delete message from starboard upon losing reactions" 122 122 description="If a message in the starboard looses the required reactions, it gets deleted." 123 123 endpoint={`/guilds/${guild?.id}`} ··· 127 127 onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.StarboardDeleteOnLoss) })} 128 128 /> 129 129 130 - <NumberInput 131 - name="Number of reactions required" 130 + <InputNumber 131 + label="Number of reactions required" 132 132 description="Sets the number of reactions needed to get a message onto the data." 133 133 url={url} 134 134 dataName="requiredEmojis" ··· 138 138 onSave={(v) => edit("requiredEmojis", v)} 139 139 /> 140 140 141 - <SelectMenu 142 - name="Channel" 141 + <InputSelect 142 + label="Channel" 143 143 url={url} 144 144 dataName="channelId" 145 145 items={createSelectableItems(guild?.channels)} 146 146 description="Select the channel where the starboard messages should be send into." 147 147 defaultState={data.channelId} 148 148 disabled={!enabled} 149 - onSave={(o) => edit("channelId", o.value as string)} 149 + onSave={(o) => edit("channelId", o as string)} 150 150 /> 151 151 152 152 <div className="lg:flex gap-3"> 153 153 <div className="lg:w-1/2"> 154 - <SelectMenu 155 - name="Emoji" 154 + <InputSelect 155 + label="Emoji" 156 156 url={url} 157 157 dataName="emoji" 158 158 items={[ ··· 175 175 description="Select the emoji that needs to be reacted with." 176 176 defaultState={data.emoji} 177 177 disabled={!enabled} 178 - onSave={(o) => edit("emoji", o.value as string)} 178 + onSave={(o) => edit("emoji", o as string)} 179 179 /> 180 180 </div> 181 181 <div className="lg:w-1/2"> 182 - <SelectMenu 183 - name="Profile display style" 182 + <InputSelect 183 + label="Profile display style" 184 184 url={url} 185 185 dataName="style" 186 186 items={[ ··· 208 208 description="The style members profile gets displayed." 209 209 defaultState={data.style} 210 210 disabled={!enabled} 211 - onSave={(o) => edit("style", o.value as number)} 211 + onSave={(o) => edit("style", o as number)} 212 212 /> 213 213 </div> 214 214 </div> 215 215 216 216 <div className="lg:flex gap-3"> 217 217 <div className="lg:w-1/2"> 218 - <MultiSelectMenu 219 - name="Blacklisted channels" 218 + <InputMultiSelect 219 + label="Blacklisted channels" 220 220 url={url} 221 221 dataName="blacklistChannelIds" 222 222 items={createSelectableItems(guild?.channels)} ··· 224 224 defaultState={data.blacklistChannelIds || []} 225 225 max={500} 226 226 disabled={!enabled} 227 - onSave={(o) => edit("blacklistChannelIds", o.map(({ value }) => value))} 227 + onSave={(o) => edit("blacklistChannelIds", o)} 228 228 /> 229 229 </div> 230 230 <div className="lg:w-1/2"> 231 - <MultiSelectMenu 232 - name="Blacklisted roles" 231 + <InputMultiSelect 232 + label="Blacklisted roles" 233 233 url={url} 234 234 dataName="blacklistRoleIds" 235 235 items={createSelectableItems(guild?.roles)} ··· 237 237 defaultState={data.blacklistRoleIds || []} 238 238 max={500} 239 239 disabled={!enabled} 240 - onSave={(o) => edit("blacklistRoleIds", o.map(({ value }) => value))} 240 + onSave={(o) => edit("blacklistRoleIds", o)} 241 241 /> 242 242 </div> 243 243 </div> 244 244 245 245 <div className="lg:flex gap-3"> 246 246 <div className="w-1/2"> 247 - <TextInput 248 - name="Color" 247 + <InputColor 248 + label="Color" 249 249 url={url} 250 250 dataName="embedColor" 251 251 description="Color used for the side of the embed." 252 - type="color" 253 252 defaultState={data.embedColor ?? 0} 254 - onSave={(o) => edit("embedColor", o as number)} 253 + onSave={(o) => edit("embedColor", o)} 255 254 /> 256 255 </div> 257 256 </div>
+5 -5
app/dashboard/[guildId]/style.component.tsx
··· 1 1 "use client"; 2 2 import { guildStore } from "@/common/guilds"; 3 3 import DiscordMessage from "@/components/discord/message"; 4 - import DumbTextInput from "@/components/inputs/dumb-text-input"; 4 + import { ControlledInput } from "@/components/inputs/controlled-input"; 5 5 import Modal from "@/components/modal"; 6 6 import { Section } from "@/components/section"; 7 7 import { UserAvatar } from "@/components/ui/avatar"; ··· 201 201 }} 202 202 isDisabled={(!name && typeof avatar === "string" && typeof banner === "string") || Boolean(error)} 203 203 > 204 - <DumbTextInput 205 - name="Username" 204 + <ControlledInput 205 + label="Username" 206 206 placeholder="DarkViperAU" 207 207 value={name} 208 208 setValue={setName} 209 209 max={32} 210 210 /> 211 211 212 - <DumbTextInput 213 - name="Bio" 212 + <ControlledInput 213 + label="Bio" 214 214 placeholder="gaming" 215 215 value={bio} 216 216 setValue={setBio}
+20 -20
app/dashboard/[guildId]/tts.component.tsx
··· 1 1 import { type Guild, guildStore } from "@/common/guilds"; 2 - import NumberInput from "@/components/inputs/number-input"; 3 - import SelectMenu from "@/components/inputs/select-menu"; 4 - import Switch from "@/components/inputs/switch"; 2 + import { InputNumber } from "@/components/inputs/number-input"; 3 + import { InputSelect } from "@/components/inputs/select-menu"; 4 + import { InputSwitch } from "@/components/inputs/switch"; 5 5 import { TTSFaq } from "@/components/tts-faq"; 6 6 import { GuildFlags } from "@/typings"; 7 7 import { transformer } from "@/utils/bitfields"; ··· 28 28 return ( 29 29 <div className="lg:flex gap-6 mt-5"> 30 30 <div className="lg:w-1/2 flex flex-col gap-2"> 31 - <SelectMenu 32 - name="Chat to Speech channel" 31 + <InputSelect 32 + label="Chat to Speech channel" 33 33 url={`/guilds/${params.guildId}`} 34 34 dataName="tts.channelId" 35 35 items={createSelectableItems(guild?.channels, ["ViewChannel", "SendMessages", "EmbedLinks"], [ChannelType.GuildText, ChannelType.GuildVoice])} 36 36 description="Select a channel what channel should be used for tts." 37 37 defaultState={guild?.tts.channelId} 38 - onSave={(o) => edit("channelId", o.value)} 38 + onSave={(o) => edit("channelId", o as string)} 39 39 showClear 40 40 /> 41 - <SelectMenu 42 - name="Usage logs" 41 + <InputSelect 42 + label="Usage logs" 43 43 url={`/guilds/${params.guildId}`} 44 44 dataName="tts.logChannelId" 45 45 items={createSelectableItems(guild?.channels)} 46 46 description="Select a channel where usage logs should be posted into." 47 47 defaultState={guild?.tts.logChannelId} 48 - onSave={(o) => edit("logChannelId", o.value)} 48 + onSave={(o) => edit("logChannelId", o as string)} 49 49 showClear 50 50 /> 51 - <SelectMenu 52 - name="Priority role" 51 + <InputSelect 52 + label="Priority role" 53 53 url={`/guilds/${params.guildId}`} 54 54 dataName="tts.priorityRoleId" 55 55 items={createSelectableItems(guild?.roles)} 56 56 description="People with this role bypass the queue and speak immediately." 57 57 defaultState={guild?.tts.priorityRoleId} 58 - onSave={(o) => edit("priorityRoleId", o.value)} 58 + onSave={(o) => edit("priorityRoleId", o as string)} 59 59 showClear 60 60 /> 61 - <SelectMenu 62 - name="Blacklist role" 61 + <InputSelect 62 + label="Blacklist role" 63 63 url={`/guilds/${params.guildId}`} 64 64 dataName="tts.blacklistRoleId" 65 65 items={createSelectableItems(guild?.roles)} 66 66 description="People with this role are not allowed to use tts." 67 67 defaultState={guild?.tts.blacklistRoleId} 68 - onSave={(o) => edit("blacklistRoleId", o.value)} 68 + onSave={(o) => edit("blacklistRoleId", o as string)} 69 69 showClear 70 70 /> 71 - <Switch 71 + <InputSwitch 72 72 label="Announce user" 73 73 badge="Experimental" 74 74 endpoint={`/guilds/${params.guildId}`} ··· 77 77 transform={(value) => transformer(value, guild!.flags, GuildFlags.TextToSpeechAnnounceUsers)} 78 78 onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.TextToSpeechAnnounceUsers) })} 79 79 /> 80 - <Switch 80 + <InputSwitch 81 81 label="Queue messages" 82 82 endpoint={`/guilds/${params.guildId}`} 83 83 k="flags" ··· 85 85 transform={(value) => transformer(value, guild!.flags, GuildFlags.TextToSpeechQueueMessages)} 86 86 onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.TextToSpeechQueueMessages) })} 87 87 /> 88 - <Switch 88 + <InputSwitch 89 89 label="Allow bots, apps and webhooks" 90 90 endpoint={`/guilds/${params.guildId}`} 91 91 k="flags" ··· 93 93 transform={(value) => transformer(value, guild!.flags, GuildFlags.TextToSpeechAllowBots)} 94 94 onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.TextToSpeechAllowBots) })} 95 95 /> 96 - <NumberInput 97 - name="Max message length" 96 + <InputNumber 97 + label="Max message length" 98 98 description="The maximum length of a message that can be spoken." 99 99 url={`/guilds/${params.guildId}`} 100 100 dataName="tts.maxLength"
+4 -4
app/dashboard/[guildId]/updates.component.tsx
··· 1 1 "use client"; 2 2 3 3 import { guildStore } from "@/common/guilds"; 4 - import SelectMenu from "@/components/inputs/select-menu"; 4 + import { InputSelect } from "@/components/inputs/select-menu"; 5 5 import Modal from "@/components/modal"; 6 6 import { createSelectableItems } from "@/utils/create-selectable-items"; 7 7 import { useState } from "react"; ··· 72 72 }} 73 73 isDisabled={!channelId} 74 74 > 75 - <SelectMenu 76 - name="Channel" 75 + <InputSelect 76 + label="Channel" 77 77 dataName="channelId" 78 78 items={createSelectableItems(guild?.channels, ["ViewChannel", "ManageWebhooks"])} 79 79 description="Select a channel where updates should be send into." 80 80 defaultState={guild?.follownewsChannel?.id} 81 81 onSave={(o) => { 82 - setChannelId(o.value as string); 82 + setChannelId(o as string); 83 83 }} 84 84 /> 85 85 </Modal>
+4 -4
app/profile/billing/page.tsx
··· 4 4 import { userStore } from "@/common/user"; 5 5 import Box from "@/components/box"; 6 6 import ImageReduceMotion from "@/components/image-reduce-motion"; 7 - import MultiSelectMenu from "@/components/inputs/multi-select-menu"; 8 - import InputSwitch from "@/components/inputs/switch"; 7 + import { InputMultiSelect } from "@/components/inputs/multi-select-menu"; 8 + import { InputSwitch } from "@/components/inputs/switch"; 9 9 import Modal from "@/components/modal"; 10 10 import Notice from "@/components/notice"; 11 11 import { OverviewLink } from "@/components/overview-link"; ··· 236 236 if (error) return <Notice message={error} />; 237 237 238 238 return ( 239 - <MultiSelectMenu 239 + <InputMultiSelect 240 240 className="w-full md:w-1/2 lg:w-1/3" 241 - name="Premium Guilds" 241 + label="Premium Guilds" 242 242 url="/users/@me/billing/premium-guilds" 243 243 dataName="guildIds" 244 244 items={(data || [])
+3 -3
app/profile/connections/page.tsx
··· 1 1 "use client"; 2 2 3 - import DumbTextInput from "@/components/inputs/dumb-text-input"; 3 + import { ControlledInput } from "@/components/inputs/controlled-input"; 4 4 import Modal from "@/components/modal"; 5 5 import Notice, { NoticeType } from "@/components/notice"; 6 6 import { ScreenMessage } from "@/components/screen-message"; ··· 135 135 }} 136 136 buttonName="Continue" 137 137 > 138 - <DumbTextInput 139 - name="Your Bluesky or Atproto Handle" 138 + <ControlledInput 139 + label="Your Bluesky or Atproto Handle" 140 140 placeholder="shi.gg" 141 141 value={handle} 142 142 setValue={setHandle}
+8 -10
app/profile/page.tsx
··· 1 1 "use client"; 2 2 3 3 import ImageReduceMotion from "@/components/image-reduce-motion"; 4 - import DumbTextInput from "@/components/inputs/dumb-text-input"; 4 + import { ControlledInput } from "@/components/inputs/controlled-input"; 5 5 import { ScreenMessage } from "@/components/screen-message"; 6 6 import { Button } from "@/components/ui/button"; 7 7 import { useApi } from "@/lib/api/hook"; ··· 54 54 55 55 return (<div className="flex flex-col w-full"> 56 56 57 - <div className="flex flex-col md:flex-row md:items-center md:justify-between gap-2"> 58 - <div className="relative top-2 w-full"> 59 - <DumbTextInput 60 - value={search} 61 - setValue={setSearch} 62 - placeholder="Search by name or id" 63 - thin 64 - /> 65 - </div> 57 + <div className="flex flex-col md:flex-row md:justify-between gap-2"> 58 + <ControlledInput 59 + thin 60 + value={search} 61 + setValue={setSearch} 62 + placeholder="Search by name or id" 63 + /> 66 64 67 65 <div className="flex gap-2 md:mt-0"> 68 66 <Button
+13 -15
app/profile/rank/page.tsx
··· 1 1 "use client"; 2 2 3 3 import { type User, userStore } from "@/common/user"; 4 - import ImageUrlInput from "@/components/inputs/image-url-input"; 5 - import SelectInput from "@/components/inputs/select-menu"; 6 - import TextInput from "@/components/inputs/text-input"; 4 + import { InputColor } from "@/components/inputs/color-input"; 5 + import { InputImageUrl } from "@/components/inputs/image-url-input"; 6 + import { InputSelect } from "@/components/inputs/select-menu"; 7 7 import { Section } from "@/components/section"; 8 8 import { deepMerge } from "@/utils/deepMerge"; 9 9 ··· 18 18 return (<> 19 19 <div className="lg:flex gap-3"> 20 20 <div className="lg:w-1/2"> 21 - <SelectInput 22 - name="Secondary text" 21 + <InputSelect 22 + label="Secondary text" 23 23 url="/users/@me/rank" 24 24 dataName="subText.type" 25 25 description="This text will be displayed bellow the /rank progressbar." ··· 43 43 } 44 44 ]} 45 45 defaultState={user?.extended?.rank?.subText?.type} 46 - onSave={(options) => { 47 - userStore.setState(deepMerge<User>(user, { extended: { rank: { subText: { type: Number(options.value) as 0 | 1 | 2 | 3 } } } })); 46 + onSave={(value) => { 47 + userStore.setState(deepMerge<User>(user, { extended: { rank: { subText: { type: Number(value) as 0 | 1 | 2 | 3 } } } })); 48 48 }} 49 49 /> 50 50 </div> 51 51 52 52 <div className="lg:w-1/2 flex gap-2 w-full"> 53 53 <div className="w-1/2"> 54 - <TextInput 55 - name="Text color" 54 + <InputColor 55 + label="Text color" 56 56 url="/users/@me/rank" 57 57 dataName="textColor" 58 58 description="Color used for your username." 59 - type="color" 60 59 defaultState={user?.extended?.rank?.textColor ?? 0} 61 60 onSave={(value) => { 62 61 userStore.setState(deepMerge<User>(user, { extended: { rank: { textColor: Number(value) } } })); ··· 64 63 /> 65 64 </div> 66 65 <div className="w-1/2"> 67 - <TextInput 68 - name="Bar color" 66 + <InputColor 67 + label="Bar color" 69 68 url="/users/@me/rank" 70 69 dataName="barColor" 71 70 description="Color used for the progress bar." 72 - type="color" 73 71 defaultState={user?.extended?.rank?.barColor ?? 0} 74 72 onSave={(value) => { 75 73 userStore.setState(deepMerge<User>(user, { extended: { rank: { barColor: Number(value) } } })); ··· 79 77 </div> 80 78 </div> 81 79 82 - <ImageUrlInput 83 - name="Background" 80 + <InputImageUrl 81 + label="Background" 84 82 url="/users/@me/rank" 85 83 ratio="aspect-4/1" 86 84 dataName="background"
+7 -7
app/profile/text-to-speech/page.tsx
··· 1 1 "use client"; 2 2 3 3 import { type User, userStore } from "@/common/user"; 4 - import SelectInput from "@/components/inputs/select-menu"; 5 - import Switch from "@/components/inputs/switch"; 4 + import { InputSelect } from "@/components/inputs/select-menu"; 5 + import { InputSwitch } from "@/components/inputs/switch"; 6 6 import { TTSFaq } from "@/components/tts-faq"; 7 7 import { UserFlags } from "@/typings"; 8 8 import { transformer } from "@/utils/bitfields"; ··· 18 18 <div> 19 19 <div className="lg:flex gap-6 mt-5"> 20 20 <div className="lg:w-1/2"> 21 - <SelectInput 22 - name="Default Speaker" 21 + <InputSelect 22 + label="Default Speaker" 23 23 url="/users/@me/text-to-speech" 24 24 dataName="voice" 25 25 description="This is the default voice for any text to speech conversion." ··· 28 28 value: voice 29 29 }))} 30 30 defaultState={user?.extended?.voice} 31 - onSave={(options) => { 32 - userStore.setState(deepMerge<User>(user, { extended: { voice: options.value as keyof typeof actor } })); 31 + onSave={(value) => { 32 + userStore.setState(deepMerge<User>(user, { extended: { voice: value as keyof typeof actor } })); 33 33 }} 34 34 /> 35 - <Switch 35 + <InputSwitch 36 36 label="Chat to Speech" 37 37 description="Whenever your messages should be spoken aloud in chat to speech channels." 38 38 inverted
+300 -518
bun.lock
··· 1 1 { 2 2 "lockfileVersion": 1, 3 - "configVersion": 0, 3 + "configVersion": 1, 4 4 "workspaces": { 5 5 "": { 6 6 "name": "mwya-web", 7 7 "dependencies": { 8 - "@discordjs/collection": "^2.1.1", 9 - "@discordjs/rest": "^2.6.0", 10 - "@marsidev/react-turnstile": "^1.3.1", 11 - "@odiffey/discord-markdown": "^3.3.0", 12 - "@radix-ui/primitive": "1.1.3", 13 - "@radix-ui/react-accordion": "^1.2.12", 14 - "@radix-ui/react-avatar": "^1.1.11", 15 - "@radix-ui/react-checkbox": "^1.3.3", 16 - "@radix-ui/react-compose-refs": "1.1.2", 17 - "@radix-ui/react-dialog": "^1.1.15", 18 - "@radix-ui/react-dropdown-menu": "^2.1.16", 19 - "@radix-ui/react-popover": "^1.1.15", 20 - "@radix-ui/react-primitive": "2.1.4", 21 - "@radix-ui/react-scroll-area": "^1.2.10", 22 - "@radix-ui/react-separator": "^1.1.8", 23 - "@radix-ui/react-slider": "^1.3.6", 24 - "@radix-ui/react-slot": "^1.2.4", 25 - "@radix-ui/react-switch": "^1.2.6", 26 - "@radix-ui/react-tabs": "^1.1.13", 27 - "@radix-ui/react-tooltip": "^1.2.8", 28 - "@sentry/nextjs": "^10.28.0", 29 - "@tailwindcss/postcss": "^4.1.17", 30 - "caniuse-lite": "^1.0.30001759", 31 - "class-variance-authority": "^0.7.1", 32 - "clsx": "^2.1.1", 33 - "discord-api-types": "^0.38.36", 34 - "lucide-react": "^0.555.0", 35 - "next": "16.0.7", 36 - "motion": "^12.23.26", 37 - "next-client-cookies": "^2.1.0", 38 - "postcss": "^8.5.6", 39 - "react": "19.2.1", 40 - "react-countup": "^6.5.3", 41 - "react-dom": "19.2.1", 42 - "react-icons": "^5.5.0", 43 - "react-loading-icons": "^1.1.0", 44 - "react-markdown": "10.1.0", 45 - "react-query": "^3.39.3", 46 - "rehype-raw": "^7.0.0", 47 - "sharp": "^0.34.5", 48 - "tailwind-merge": "^3.4.0", 49 - "tailwindcss": "^4.1.17", 50 - "tailwindcss-animate": "^1.0.7", 51 - "tw-animate-css": "^1.4.0", 52 - "typescript": "^5.9.3", 53 - "vaul": "^1.1.2", 54 - "zustand": "^5.0.9", 8 + "@discordjs/collection": "latest", 9 + "@discordjs/rest": "latest", 10 + "@marsidev/react-turnstile": "latest", 11 + "@odiffey/discord-markdown": "latest", 12 + "@radix-ui/primitive": "latest", 13 + "@radix-ui/react-accordion": "latest", 14 + "@radix-ui/react-avatar": "latest", 15 + "@radix-ui/react-checkbox": "latest", 16 + "@radix-ui/react-compose-refs": "latest", 17 + "@radix-ui/react-dialog": "latest", 18 + "@radix-ui/react-dropdown-menu": "latest", 19 + "@radix-ui/react-popover": "latest", 20 + "@radix-ui/react-primitive": "latest", 21 + "@radix-ui/react-scroll-area": "latest", 22 + "@radix-ui/react-separator": "latest", 23 + "@radix-ui/react-slider": "latest", 24 + "@radix-ui/react-slot": "latest", 25 + "@radix-ui/react-switch": "latest", 26 + "@radix-ui/react-tabs": "latest", 27 + "@radix-ui/react-tooltip": "latest", 28 + "@sentry/nextjs": "latest", 29 + "@tailwindcss/postcss": "latest", 30 + "caniuse-lite": "latest", 31 + "class-variance-authority": "latest", 32 + "clsx": "latest", 33 + "discord-api-types": "latest", 34 + "lucide-react": "latest", 35 + "motion": "latest", 36 + "next": "latest", 37 + "next-client-cookies": "latest", 38 + "postcss": "latest", 39 + "react": "latest", 40 + "react-countup": "latest", 41 + "react-dom": "latest", 42 + "react-icons": "latest", 43 + "react-loading-icons": "latest", 44 + "react-markdown": "latest", 45 + "react-query": "latest", 46 + "rehype-raw": "latest", 47 + "sharp": "latest", 48 + "tailwind-merge": "latest", 49 + "tailwindcss": "latest", 50 + "tailwindcss-animate": "latest", 51 + "tw-animate-css": "latest", 52 + "typescript": "latest", 53 + "vaul": "latest", 54 + "zustand": "latest", 55 55 }, 56 56 "devDependencies": { 57 - "@next/eslint-plugin-next": "^16.0.7", 58 - "@octokit/types": "^16.0.0", 59 - "@stylistic/eslint-plugin": "^5.6.1", 60 - "@types/node": "^24.10.1", 61 - "@types/react": "^19.2.7", 62 - "@types/react-dom": "^19.2.3", 63 - "eslint": "^9.39.1", 64 - "eslint-config-next": "^16.0.7", 65 - "eslint-plugin-import-x": "^4.16.1", 66 - "eslint-plugin-react": "^7.37.5", 67 - "eslint-plugin-react-compiler": "19.1.0-rc.2", 68 - "eslint-plugin-react-hooks": "^7.0.1", 69 - "eslint-plugin-simple-import-sort": "^12.1.1", 70 - "eslint-plugin-unicorn": "^62.0.0", 71 - "typescript-eslint": "^8.48.1", 57 + "@next/eslint-plugin-next": "latest", 58 + "@octokit/types": "latest", 59 + "@stylistic/eslint-plugin": "latest", 60 + "@types/node": "latest", 61 + "@types/react": "latest", 62 + "@types/react-dom": "latest", 63 + "eslint": "latest", 64 + "eslint-config-next": "latest", 65 + "eslint-plugin-import-x": "latest", 66 + "eslint-plugin-react": "latest", 67 + "eslint-plugin-react-compiler": "latest", 68 + "eslint-plugin-react-hooks": "latest", 69 + "eslint-plugin-simple-import-sort": "latest", 70 + "eslint-plugin-unicorn": "latest", 71 + "typescript-eslint": "latest", 72 72 }, 73 73 }, 74 74 }, 75 75 "packages": { 76 76 "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], 77 77 78 - "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], 79 - 80 78 "@apm-js-collab/code-transformer": ["@apm-js-collab/code-transformer@0.8.2", "", {}, "sha512-YRjJjNq5KFSjDUoqu5pFUWrrsvGOxl6c3bu+uMFc9HNNptZ2rNU/TI2nLw4jnhQNtka972Ee2m3uqbvDQtPeCA=="], 81 79 82 80 "@apm-js-collab/tracing-hooks": ["@apm-js-collab/tracing-hooks@0.3.1", "", { "dependencies": { "@apm-js-collab/code-transformer": "^0.8.0", "debug": "^4.4.1", "module-details-from-path": "^1.0.4" } }, "sha512-Vu1CbmPURlN5fTboVuKMoJjbO5qcq9fA5YXpskx3dXe/zTBvjODFoerw+69rVBlRLrJpwPqSDqEuJDEKIrTldw=="], 83 81 84 - "@babel/code-frame": ["@babel/code-frame@7.26.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ=="], 82 + "@babel/code-frame": ["@babel/code-frame@7.28.6", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q=="], 85 83 86 - "@babel/compat-data": ["@babel/compat-data@7.26.8", "", {}, "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ=="], 84 + "@babel/compat-data": ["@babel/compat-data@7.28.6", "", {}, "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg=="], 87 85 88 - "@babel/core": ["@babel/core@7.26.10", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.10", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", "@babel/helpers": "^7.26.10", "@babel/parser": "^7.26.10", "@babel/template": "^7.26.9", "@babel/traverse": "^7.26.10", "@babel/types": "^7.26.10", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ=="], 86 + "@babel/core": ["@babel/core@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/generator": "^7.28.6", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/template": "^7.28.6", "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw=="], 89 87 90 - "@babel/generator": ["@babel/generator@7.26.10", "", { "dependencies": { "@babel/parser": "^7.26.10", "@babel/types": "^7.26.10", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang=="], 88 + "@babel/generator": ["@babel/generator@7.28.6", "", { "dependencies": { "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw=="], 91 89 92 - "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.25.9", "", { "dependencies": { "@babel/types": "^7.25.9" } }, "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g=="], 90 + "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="], 93 91 94 - "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.26.5", "", { "dependencies": { "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA=="], 92 + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.28.6", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA=="], 95 93 96 - "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.26.9", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", "@babel/helper-replace-supers": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", "@babel/traverse": "^7.26.9", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg=="], 94 + "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.28.6", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow=="], 97 95 98 - "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.25.9", "", { "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ=="], 96 + "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], 99 97 100 - "@babel/helper-module-imports": ["@babel/helper-module-imports@7.25.9", "", { "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw=="], 98 + "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.28.5", "", { "dependencies": { "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5" } }, "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg=="], 101 99 102 - "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.26.0", "", { "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", "@babel/traverse": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw=="], 100 + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.28.6", "", { "dependencies": { "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw=="], 103 101 104 - "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.25.9", "", { "dependencies": { "@babel/types": "^7.25.9" } }, "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ=="], 102 + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA=="], 105 103 106 - "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.26.5", "", {}, "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg=="], 104 + "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.27.1", "", { "dependencies": { "@babel/types": "^7.27.1" } }, "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw=="], 107 105 108 - "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.26.5", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", "@babel/traverse": "^7.26.5" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg=="], 106 + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.28.6", "", {}, "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug=="], 109 107 110 - "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.25.9", "", { "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA=="], 108 + "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.28.6", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg=="], 109 + 110 + "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg=="], 111 111 112 - "@babel/helper-string-parser": ["@babel/helper-string-parser@7.25.9", "", {}, "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="], 112 + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], 113 113 114 114 "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], 115 115 116 - "@babel/helper-validator-option": ["@babel/helper-validator-option@7.25.9", "", {}, "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw=="], 116 + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], 117 117 118 - "@babel/helpers": ["@babel/helpers@7.26.10", "", { "dependencies": { "@babel/template": "^7.26.9", "@babel/types": "^7.26.10" } }, "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g=="], 118 + "@babel/helpers": ["@babel/helpers@7.28.6", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw=="], 119 119 120 - "@babel/parser": ["@babel/parser@7.26.10", "", { "dependencies": { "@babel/types": "^7.26.10" }, "bin": "./bin/babel-parser.js" }, "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA=="], 120 + "@babel/parser": ["@babel/parser@7.28.6", "", { "dependencies": { "@babel/types": "^7.28.6" }, "bin": "./bin/babel-parser.js" }, "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ=="], 121 121 122 122 "@babel/plugin-proposal-private-methods": ["@babel/plugin-proposal-private-methods@7.18.6", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA=="], 123 123 124 - "@babel/runtime": ["@babel/runtime@7.26.10", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw=="], 124 + "@babel/runtime": ["@babel/runtime@7.28.6", "", {}, "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA=="], 125 125 126 - "@babel/template": ["@babel/template@7.26.9", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/parser": "^7.26.9", "@babel/types": "^7.26.9" } }, "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA=="], 126 + "@babel/template": ["@babel/template@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="], 127 127 128 - "@babel/traverse": ["@babel/traverse@7.26.10", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.10", "@babel/parser": "^7.26.10", "@babel/template": "^7.26.9", "@babel/types": "^7.26.10", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A=="], 128 + "@babel/traverse": ["@babel/traverse@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/generator": "^7.28.6", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.6", "@babel/template": "^7.28.6", "@babel/types": "^7.28.6", "debug": "^4.3.1" } }, "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg=="], 129 129 130 - "@babel/types": ["@babel/types@7.26.10", "", { "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ=="], 130 + "@babel/types": ["@babel/types@7.28.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg=="], 131 131 132 132 "@discordjs/collection": ["@discordjs/collection@2.1.1", "", {}, "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg=="], 133 133 134 134 "@discordjs/rest": ["@discordjs/rest@2.6.0", "", { "dependencies": { "@discordjs/collection": "^2.1.1", "@discordjs/util": "^1.1.1", "@sapphire/async-queue": "^1.5.3", "@sapphire/snowflake": "^3.5.3", "@vladfrangu/async_event_emitter": "^2.4.6", "discord-api-types": "^0.38.16", "magic-bytes.js": "^1.10.0", "tslib": "^2.6.3", "undici": "6.21.3" } }, "sha512-RDYrhmpB7mTvmCKcpj+pc5k7POKszS4E2O9TYc+U+Y4iaCP+r910QdO43qmpOja8LRr1RJ0b3U+CqVsnPqzf4w=="], 135 135 136 - "@discordjs/util": ["@discordjs/util@1.1.1", "", {}, "sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g=="], 136 + "@discordjs/util": ["@discordjs/util@1.2.0", "", { "dependencies": { "discord-api-types": "^0.38.33" } }, "sha512-3LKP7F2+atl9vJFhaBjn4nOaSWahZ/yWjOvA4e5pnXkt2qyXRCHLxoBQy81GFtLGCq7K9lPm9R517M1U+/90Qg=="], 137 137 138 - "@emnapi/core": ["@emnapi/core@1.5.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg=="], 138 + "@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="], 139 139 140 - "@emnapi/runtime": ["@emnapi/runtime@1.7.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q=="], 140 + "@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="], 141 141 142 142 "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], 143 143 144 - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], 144 + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="], 145 145 146 - "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], 146 + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], 147 147 148 148 "@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=="], 149 149 ··· 151 151 152 152 "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], 153 153 154 - "@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=="], 154 + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.3", "", { "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.1", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ=="], 155 155 156 - "@eslint/js": ["@eslint/js@9.39.1", "", {}, "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw=="], 156 + "@eslint/js": ["@eslint/js@9.39.2", "", {}, "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA=="], 157 157 158 158 "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], 159 159 160 160 "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], 161 161 162 - "@floating-ui/core": ["@floating-ui/core@1.6.9", "", { "dependencies": { "@floating-ui/utils": "^0.2.9" } }, "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw=="], 162 + "@floating-ui/core": ["@floating-ui/core@1.7.3", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w=="], 163 163 164 - "@floating-ui/dom": ["@floating-ui/dom@1.6.13", "", { "dependencies": { "@floating-ui/core": "^1.6.0", "@floating-ui/utils": "^0.2.9" } }, "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w=="], 164 + "@floating-ui/dom": ["@floating-ui/dom@1.7.4", "", { "dependencies": { "@floating-ui/core": "^1.7.3", "@floating-ui/utils": "^0.2.10" } }, "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA=="], 165 165 166 - "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.2", "", { "dependencies": { "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A=="], 166 + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.6", "", { "dependencies": { "@floating-ui/dom": "^1.7.4" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw=="], 167 167 168 - "@floating-ui/utils": ["@floating-ui/utils@0.2.9", "", {}, "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg=="], 168 + "@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="], 169 169 170 170 "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], 171 171 172 - "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], 172 + "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="], 173 173 174 174 "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], 175 175 176 - "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.2", "", {}, "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ=="], 176 + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], 177 177 178 178 "@img/colour": ["@img/colour@1.0.0", "", {}, "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw=="], 179 179 ··· 225 225 226 226 "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], 227 227 228 + "@isaacs/balanced-match": ["@isaacs/balanced-match@4.0.1", "", {}, "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ=="], 229 + 230 + "@isaacs/brace-expansion": ["@isaacs/brace-expansion@5.0.0", "", { "dependencies": { "@isaacs/balanced-match": "^4.0.1" } }, "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA=="], 231 + 228 232 "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], 229 233 230 - "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], 234 + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], 231 235 232 236 "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], 233 237 234 238 "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], 235 239 236 - "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="], 237 - 238 240 "@jridgewell/source-map": ["@jridgewell/source-map@0.3.11", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA=="], 239 241 240 242 "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], 241 243 242 - "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], 244 + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], 243 245 244 246 "@khanacademy/perseus-core": ["@khanacademy/perseus-core@1.5.0", "", {}, "sha512-QR9tGBr8nAUFuARSbzgzL6ZkyjDur0Cz9tgQREjC0L+Sug5aj0DHuK86lhosZAbtgAzitX3KVRAsOMbKqU2fYg=="], 245 247 246 248 "@khanacademy/simple-markdown": ["@khanacademy/simple-markdown@0.12.1", "", { "dependencies": { "@khanacademy/perseus-core": "1.5.0" }, "peerDependencies": { "react": "16.14.0", "react-dom": "16.14.0" } }, "sha512-GnrK+mxULyO58pWjPQSU1bVUd892teNIzf7stdBB9mucFDXk2TiplPD9BJDUZ10uGfliyDVKlvwV3BIjHPhL5g=="], 247 249 248 - "@marsidev/react-turnstile": ["@marsidev/react-turnstile@1.3.1", "", { "peerDependencies": { "react": "^17.0.2 || ^18.0.0 || ^19.0", "react-dom": "^17.0.2 || ^18.0.0 || ^19.0" } }, "sha512-h2THG/75k4Y049hgjSGPIcajxXnh+IZAiXVbryQyVmagkboN7pJtBgR16g8akjwUBSfRrg6jw6KvPDjscQflog=="], 250 + "@marsidev/react-turnstile": ["@marsidev/react-turnstile@1.4.1", "", { "peerDependencies": { "react": "^17.0.2 || ^18.0.0 || ^19.0", "react-dom": "^17.0.2 || ^18.0.0 || ^19.0" } }, "sha512-1jE0IjvB8z+q1NFRs3149gXzXwIzXQWqQjn9fmAr13BiE3RYLWck5Me6flHYE90shW5L12Jkm6R1peS1OnA9oQ=="], 249 251 250 252 "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" } }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="], 251 253 252 - "@next/env": ["@next/env@16.0.7", "", {}, "sha512-gpaNgUh5nftFKRkRQGnVi5dpcYSKGcZZkQffZ172OrG/XkrnS7UBTQ648YY+8ME92cC4IojpI2LqTC8sTDhAaw=="], 254 + "@next/env": ["@next/env@16.1.3", "", {}, "sha512-BLP14oBOvZWXgfdJf9ao+VD8O30uE+x7PaV++QtACLX329WcRSJRO5YJ+Bcvu0Q+c/lei41TjSiFf6pXqnpbQA=="], 253 255 254 - "@next/eslint-plugin-next": ["@next/eslint-plugin-next@16.0.7", "", { "dependencies": { "fast-glob": "3.3.1" } }, "sha512-hFrTNZcMEG+k7qxVxZJq3F32Kms130FAhG8lvw2zkKBgAcNOJIxlljNiCjGygvBshvaGBdf88q2CqWtnqezDHA=="], 256 + "@next/eslint-plugin-next": ["@next/eslint-plugin-next@16.1.3", "", { "dependencies": { "fast-glob": "3.3.1" } }, "sha512-MqBh3ltFAy0AZCRFVdjVjjeV7nEszJDaVIpDAnkQcn8U9ib6OEwkSnuK6xdYxMGPhV/Y4IlY6RbDipPOpLfBqQ=="], 255 257 256 - "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@16.0.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-LlDtCYOEj/rfSnEn/Idi+j1QKHxY9BJFmxx7108A6D8K0SB+bNgfYQATPk/4LqOl4C0Wo3LACg2ie6s7xqMpJg=="], 258 + "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@16.1.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-CpOD3lmig6VflihVoGxiR/l5Jkjfi4uLaOR4ziriMv0YMDoF6cclI+p5t2nstM8TmaFiY6PCTBgRWB57/+LiBA=="], 257 259 258 - "@next/swc-darwin-x64": ["@next/swc-darwin-x64@16.0.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rtZ7BhnVvO1ICf3QzfW9H3aPz7GhBrnSIMZyr4Qy6boXF0b5E3QLs+cvJmg3PsTCG2M1PBoC+DANUi4wCOKXpA=="], 260 + "@next/swc-darwin-x64": ["@next/swc-darwin-x64@16.1.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-aF4us2JXh0zn3hNxvL1Bx3BOuh8Lcw3p3Xnurlvca/iptrDH1BrpObwkw9WZra7L7/0qB9kjlREq3hN/4x4x+Q=="], 259 261 260 - "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@16.0.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-mloD5WcPIeIeeZqAIP5c2kdaTa6StwP4/2EGy1mUw8HiexSHGK/jcM7lFuS3u3i2zn+xH9+wXJs6njO7VrAqww=="], 262 + "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@16.1.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-8VRkcpcfBtYvhGgXAF7U3MBx6+G1lACM1XCo1JyaUr4KmAkTNP8Dv2wdMq7BI+jqRBw3zQE7c57+lmp7jCFfKA=="], 261 263 262 - "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@16.0.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-+ksWNrZrthisXuo9gd1XnjHRowCbMtl/YgMpbRvFeDEqEBd523YHPWpBuDjomod88U8Xliw5DHhekBC3EOOd9g=="], 264 + "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@16.1.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-UbFx69E2UP7MhzogJRMFvV9KdEn4sLGPicClwgqnLht2TEi204B71HuVfps3ymGAh0c44QRAF+ZmvZZhLLmhNg=="], 263 265 264 - "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@16.0.7", "", { "os": "linux", "cpu": "x64" }, "sha512-4WtJU5cRDxpEE44Ana2Xro1284hnyVpBb62lIpU5k85D8xXxatT+rXxBgPkc7C1XwkZMWpK5rXLXTh9PFipWsA=="], 266 + "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@16.1.3", "", { "os": "linux", "cpu": "x64" }, "sha512-SzGTfTjR5e9T+sZh5zXqG/oeRQufExxBF6MssXS7HPeZFE98JDhCRZXpSyCfWrWrYrzmnw/RVhlP2AxQm+wkRQ=="], 265 267 266 - "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@16.0.7", "", { "os": "linux", "cpu": "x64" }, "sha512-HYlhqIP6kBPXalW2dbMTSuB4+8fe+j9juyxwfMwCe9kQPPeiyFn7NMjNfoFOfJ2eXkeQsoUGXg+O2SE3m4Qg2w=="], 268 + "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@16.1.3", "", { "os": "linux", "cpu": "x64" }, "sha512-HlrDpj0v+JBIvQex1mXHq93Mht5qQmfyci+ZNwGClnAQldSfxI6h0Vupte1dSR4ueNv4q7qp5kTnmLOBIQnGow=="], 267 269 268 - "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@16.0.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-EviG+43iOoBRZg9deGauXExjRphhuYmIOJ12b9sAPy0eQ6iwcPxfED2asb/s2/yiLYOdm37kPaiZu8uXSYPs0Q=="], 270 + "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@16.1.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-3gFCp83/LSduZMSIa+lBREP7+5e7FxpdBoc9QrCdmp+dapmTK9I+SLpY60Z39GDmTXSZA4huGg9WwmYbr6+WRw=="], 269 271 270 - "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@16.0.7", "", { "os": "win32", "cpu": "x64" }, "sha512-gniPjy55zp5Eg0896qSrf3yB1dw4F/3s8VK1ephdsZZ129j2n6e1WqCbE2YgcKhW9hPB9TVZENugquWJD5x0ug=="], 272 + "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@16.1.3", "", { "os": "win32", "cpu": "x64" }, "sha512-1SZVfFT8zmMB+Oblrh5OKDvUo5mYQOkX2We6VGzpg7JUVZlqe4DYOFGKYZKTweSx1gbMixyO1jnFT4thU+nNHQ=="], 271 273 272 274 "@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=="], 273 275 ··· 287 289 288 290 "@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.208.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-CjruKY9V6NMssL/T1kAFgzosF1v9o6oeN+aX5JB/C/xPNtmgIJqcXHG7fA82Ou1zCpWGl4lROQUKwUNE1pMCyg=="], 289 291 290 - "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@2.2.0", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-qRkLWiUEZNAmYapZ7KGS5C4OmBLcP/H2foXeOEaowYCR0wi89fHejrfYfbuLVCMLp/dWZXKvQusdbUEZjERfwQ=="], 292 + "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@2.4.0", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-jn0phJ+hU7ZuvaoZE/8/Euw3gvHJrn2yi+kXrymwObEPVPjtwCmkvXDRQCWli+fCTTF/aSOtXaLr7CLIvv3LQg=="], 291 293 292 - "@opentelemetry/core": ["@opentelemetry/core@2.2.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw=="], 294 + "@opentelemetry/core": ["@opentelemetry/core@2.4.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-KtcyFHssTn5ZgDu6SXmUznS80OFs/wN7y6MyFRRcKU6TOw8hNcGxKvt8hsdaLJfhzUszNSjURetq5Qpkad14Gw=="], 293 295 294 296 "@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.208.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.208.0", "import-in-the-middle": "^2.0.0", "require-in-the-middle": "^8.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-Eju0L4qWcQS+oXxi6pgh7zvE2byogAkcsVv0OjHF/97iOz1N/aKE6etSGowYkie+YA1uo6DNwdSxaaNnLvcRlA=="], 295 297 ··· 339 341 340 342 "@opentelemetry/redis-common": ["@opentelemetry/redis-common@0.38.2", "", {}, "sha512-1BCcU93iwSRZvDAgwUxC/DV4T/406SkMfxGqu5ojc3AvNI+I9GhV7v0J1HljsczuuhcnFLYqD5VmwVXfCGHzxA=="], 341 343 342 - "@opentelemetry/resources": ["@opentelemetry/resources@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A=="], 344 + "@opentelemetry/resources": ["@opentelemetry/resources@2.4.0", "", { "dependencies": { "@opentelemetry/core": "2.4.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-RWvGLj2lMDZd7M/5tjkI/2VHMpXebLgPKvBUd9LRasEWR2xAynDwEYZuLvY9P2NGG73HF07jbbgWX2C9oavcQg=="], 343 345 344 - "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw=="], 346 + "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.4.0", "", { "dependencies": { "@opentelemetry/core": "2.4.0", "@opentelemetry/resources": "2.4.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-WH0xXkz/OHORDLKqaxcUZS0X+t1s7gGlumr2ebiEgNZQl2b0upK2cdoD0tatf7l8iP74woGJ/Kmxe82jdvcWRw=="], 345 347 346 - "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.37.0", "", {}, "sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA=="], 348 + "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.39.0", "", {}, "sha512-R5R9tb2AXs2IRLNKLBJDynhkfmx7mX0vi8NkhZb3gUkPWHn6HXk5J8iQ/dql0U3ApfWym4kXXmBDRGO+oeOfjg=="], 347 349 348 350 "@opentelemetry/sql-common": ["@opentelemetry/sql-common@0.41.2", "", { "dependencies": { "@opentelemetry/core": "^2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0" } }, "sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ=="], 349 351 ··· 439 441 440 442 "@rollup/pluginutils": ["@rollup/pluginutils@5.3.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q=="], 441 443 442 - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.52.5", "", { "os": "android", "cpu": "arm" }, "sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ=="], 444 + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.55.1", "", { "os": "android", "cpu": "arm" }, "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg=="], 443 445 444 - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.52.5", "", { "os": "android", "cpu": "arm64" }, "sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA=="], 446 + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.55.1", "", { "os": "android", "cpu": "arm64" }, "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg=="], 445 447 446 - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.52.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA=="], 448 + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.55.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg=="], 447 449 448 - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.52.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA=="], 450 + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.55.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ=="], 449 451 450 - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.52.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA=="], 452 + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.55.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg=="], 451 453 452 - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.52.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ=="], 454 + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.55.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw=="], 453 455 454 - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.52.5", "", { "os": "linux", "cpu": "arm" }, "sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ=="], 456 + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.55.1", "", { "os": "linux", "cpu": "arm" }, "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ=="], 455 457 456 - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.52.5", "", { "os": "linux", "cpu": "arm" }, "sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ=="], 458 + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.55.1", "", { "os": "linux", "cpu": "arm" }, "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg=="], 457 459 458 - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.52.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg=="], 460 + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.55.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ=="], 459 461 460 - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.52.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q=="], 462 + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.55.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA=="], 461 463 462 - "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.52.5", "", { "os": "linux", "cpu": "none" }, "sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA=="], 464 + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g=="], 463 465 464 - "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.52.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw=="], 466 + "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw=="], 465 467 466 - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.52.5", "", { "os": "linux", "cpu": "none" }, "sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw=="], 468 + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.55.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw=="], 467 469 468 - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.52.5", "", { "os": "linux", "cpu": "none" }, "sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg=="], 470 + "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.55.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw=="], 471 + 472 + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw=="], 473 + 474 + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg=="], 475 + 476 + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.55.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg=="], 469 477 470 - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.52.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ=="], 478 + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.55.1", "", { "os": "linux", "cpu": "x64" }, "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg=="], 471 479 472 - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.52.5", "", { "os": "linux", "cpu": "x64" }, "sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q=="], 480 + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.55.1", "", { "os": "linux", "cpu": "x64" }, "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w=="], 473 481 474 - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.52.5", "", { "os": "linux", "cpu": "x64" }, "sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg=="], 482 + "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.55.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg=="], 475 483 476 - "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.52.5", "", { "os": "none", "cpu": "arm64" }, "sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw=="], 484 + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.55.1", "", { "os": "none", "cpu": "arm64" }, "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw=="], 477 485 478 - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.52.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w=="], 486 + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.55.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g=="], 479 487 480 - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.52.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg=="], 488 + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.55.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA=="], 481 489 482 - "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.52.5", "", { "os": "win32", "cpu": "x64" }, "sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ=="], 490 + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.55.1", "", { "os": "win32", "cpu": "x64" }, "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg=="], 483 491 484 - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.52.5", "", { "os": "win32", "cpu": "x64" }, "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg=="], 492 + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.55.1", "", { "os": "win32", "cpu": "x64" }, "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw=="], 485 493 486 494 "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], 487 495 ··· 489 497 490 498 "@sapphire/snowflake": ["@sapphire/snowflake@3.5.5", "", {}, "sha512-xzvBr1Q1c4lCe7i6sRnrofxeO1QTP/LKQ6A6qy0iB4x5yfiSfARMEQEghojzTNALDTcv8En04qYNIco9/K9eZQ=="], 491 499 492 - "@sentry-internal/browser-utils": ["@sentry-internal/browser-utils@10.28.0", "", { "dependencies": { "@sentry/core": "10.28.0" } }, "sha512-FYcslFXo+Lq5/9/G83NSVK2vQlcXRkbJ6AHrMwZyPv1Qd9KJ08qoZo4buxMv63MzYDicNF591HBAqCxsv5gXsA=="], 500 + "@sentry-internal/browser-utils": ["@sentry-internal/browser-utils@10.34.0", "", { "dependencies": { "@sentry/core": "10.34.0" } }, "sha512-0YNr60rGHyedmwkO0lbDBjNx2KAmT3kWamjaqu7Aw+jsESoPLgt+fzaTVvUBvkftBDui2PeTSzXm/nqzssctYg=="], 493 501 494 - "@sentry-internal/feedback": ["@sentry-internal/feedback@10.28.0", "", { "dependencies": { "@sentry/core": "10.28.0" } }, "sha512-vIv59ZN7Ig/oa6se/qGR69Odx3SQRoW2sIcbmJpxbjRF44Re0ZLFk6vBB3AyUvU3Lqnvabbw3y5AAwJt7Z//ug=="], 502 + "@sentry-internal/feedback": ["@sentry-internal/feedback@10.34.0", "", { "dependencies": { "@sentry/core": "10.34.0" } }, "sha512-wgGnq+iNxsFSOe9WX/FOvtoItSTjgLJJ4dQkVYtcVM6WGBVIg4wgNYfECCnRNztUTPzpZHLjC9r+4Pym451DDQ=="], 495 503 496 - "@sentry-internal/replay": ["@sentry-internal/replay@10.28.0", "", { "dependencies": { "@sentry-internal/browser-utils": "10.28.0", "@sentry/core": "10.28.0" } }, "sha512-umFBdM5eVJJYnUbrjrSJdjfqs21OMDz5pJtNPTNO8+KjTNSMg/QozBkEyaQZEEfdjYZy9MAcwfQPDPfEMvfUuQ=="], 504 + "@sentry-internal/replay": ["@sentry-internal/replay@10.34.0", "", { "dependencies": { "@sentry-internal/browser-utils": "10.34.0", "@sentry/core": "10.34.0" } }, "sha512-Vmea0GcOg57z/S1bVSj3saFcRvDqdLzdy4wd9fQMpMgy5OCbTlo7lxVUndKzbcZnanma6zF6VxwnWER1WuN9RA=="], 497 505 498 - "@sentry-internal/replay-canvas": ["@sentry-internal/replay-canvas@10.28.0", "", { "dependencies": { "@sentry-internal/replay": "10.28.0", "@sentry/core": "10.28.0" } }, "sha512-/5KnIJXms0DHiqwOsND23fBMIJ1wUzAH5DiGHdY5yHGQTYy9BmVgUxW/Pv57kXqkgA3nBvE38z5Nu6+Cq6uixw=="], 506 + "@sentry-internal/replay-canvas": ["@sentry-internal/replay-canvas@10.34.0", "", { "dependencies": { "@sentry-internal/replay": "10.34.0", "@sentry/core": "10.34.0" } }, "sha512-XWH/9njtgMD+LLWjc4KKgBpb+dTCkoUEIFDxcvzG/87d+jirmzf0+r8EfpLwKG+GrqNiiGRV39zIqu0SfPl+cw=="], 499 507 500 - "@sentry/babel-plugin-component-annotate": ["@sentry/babel-plugin-component-annotate@4.6.1", "", {}, "sha512-aSIk0vgBqv7PhX6/Eov+vlI4puCE0bRXzUG5HdCsHBpAfeMkI8Hva6kSOusnzKqs8bf04hU7s3Sf0XxGTj/1AA=="], 508 + "@sentry/babel-plugin-component-annotate": ["@sentry/babel-plugin-component-annotate@4.6.2", "", {}, "sha512-6VTjLJXtIHKwxMmThtZKwi1+hdklLNzlbYH98NhbH22/Vzb/c6BlSD2b5A0NGN9vFB807rD4x4tuP+Su7BxQXQ=="], 501 509 502 - "@sentry/browser": ["@sentry/browser@10.28.0", "", { "dependencies": { "@sentry-internal/browser-utils": "10.28.0", "@sentry-internal/feedback": "10.28.0", "@sentry-internal/replay": "10.28.0", "@sentry-internal/replay-canvas": "10.28.0", "@sentry/core": "10.28.0" } }, "sha512-OJY5L/2IDB82Eh5Ko83I9YgBN45VBtFi0TFUxSrVDcdeha1tC9YS/975U294K9T2B0kKG65jF8JkWa6x3Gi6HA=="], 510 + "@sentry/browser": ["@sentry/browser@10.34.0", "", { "dependencies": { "@sentry-internal/browser-utils": "10.34.0", "@sentry-internal/feedback": "10.34.0", "@sentry-internal/replay": "10.34.0", "@sentry-internal/replay-canvas": "10.34.0", "@sentry/core": "10.34.0" } }, "sha512-8WCsAXli5Z+eIN8dMY8KGQjrS3XgUp1np/pjdeWNrVPVR8q8XpS34qc+f+y/LFrYQC9bs2Of5aIBwRtDCIvRsg=="], 503 511 504 - "@sentry/bundler-plugin-core": ["@sentry/bundler-plugin-core@4.6.1", "", { "dependencies": { "@babel/core": "^7.18.5", "@sentry/babel-plugin-component-annotate": "4.6.1", "@sentry/cli": "^2.57.0", "dotenv": "^16.3.1", "find-up": "^5.0.0", "glob": "^10.5.0", "magic-string": "0.30.8", "unplugin": "1.0.1" } }, "sha512-WPeRbnMXm927m4Kr69NTArPfI+p5/34FHftdCRI3LFPMyhZDzz6J3wLy4hzaVUgmMf10eLzmq2HGEMvpQmdynA=="], 512 + "@sentry/bundler-plugin-core": ["@sentry/bundler-plugin-core@4.6.2", "", { "dependencies": { "@babel/core": "^7.18.5", "@sentry/babel-plugin-component-annotate": "4.6.2", "@sentry/cli": "^2.57.0", "dotenv": "^16.3.1", "find-up": "^5.0.0", "glob": "^10.5.0", "magic-string": "0.30.8", "unplugin": "1.0.1" } }, "sha512-JkOc3JkVzi/fbXsFp8R9uxNKmBrPRaU4Yu4y1i3ihWfugqymsIYaN0ixLENZbGk2j4xGHIk20PAJzBJqBMTHew=="], 505 513 506 - "@sentry/cli": ["@sentry/cli@2.58.2", "", { "dependencies": { "https-proxy-agent": "^5.0.0", "node-fetch": "^2.6.7", "progress": "^2.0.3", "proxy-from-env": "^1.1.0", "which": "^2.0.2" }, "optionalDependencies": { "@sentry/cli-darwin": "2.58.2", "@sentry/cli-linux-arm": "2.58.2", "@sentry/cli-linux-arm64": "2.58.2", "@sentry/cli-linux-i686": "2.58.2", "@sentry/cli-linux-x64": "2.58.2", "@sentry/cli-win32-arm64": "2.58.2", "@sentry/cli-win32-i686": "2.58.2", "@sentry/cli-win32-x64": "2.58.2" }, "bin": { "sentry-cli": "bin/sentry-cli" } }, "sha512-U4u62V4vaTWF+o40Mih8aOpQKqKUbZQt9A3LorIJwaE3tO3XFLRI70eWtW2se1Qmy0RZ74zB14nYcFNFl2t4Rw=="], 514 + "@sentry/cli": ["@sentry/cli@2.58.4", "", { "dependencies": { "https-proxy-agent": "^5.0.0", "node-fetch": "^2.6.7", "progress": "^2.0.3", "proxy-from-env": "^1.1.0", "which": "^2.0.2" }, "optionalDependencies": { "@sentry/cli-darwin": "2.58.4", "@sentry/cli-linux-arm": "2.58.4", "@sentry/cli-linux-arm64": "2.58.4", "@sentry/cli-linux-i686": "2.58.4", "@sentry/cli-linux-x64": "2.58.4", "@sentry/cli-win32-arm64": "2.58.4", "@sentry/cli-win32-i686": "2.58.4", "@sentry/cli-win32-x64": "2.58.4" }, "bin": { "sentry-cli": "bin/sentry-cli" } }, "sha512-ArDrpuS8JtDYEvwGleVE+FgR+qHaOp77IgdGSacz6SZy6Lv90uX0Nu4UrHCQJz8/xwIcNxSqnN22lq0dH4IqTg=="], 507 515 508 - "@sentry/cli-darwin": ["@sentry/cli-darwin@2.58.2", "", { "os": "darwin" }, "sha512-MArsb3zLhA2/cbd4rTm09SmTpnEuZCoZOpuZYkrpDw1qzBVJmRFA1W1hGAQ9puzBIk/ubY3EUhhzuU3zN2uD6w=="], 516 + "@sentry/cli-darwin": ["@sentry/cli-darwin@2.58.4", "", { "os": "darwin" }, "sha512-kbTD+P4X8O+nsNwPxCywtj3q22ecyRHWff98rdcmtRrvwz8CKi/T4Jxn/fnn2i4VEchy08OWBuZAqaA5Kh2hRQ=="], 509 517 510 - "@sentry/cli-linux-arm": ["@sentry/cli-linux-arm@2.58.2", "", { "os": [ "linux", "android", "freebsd", ], "cpu": "arm" }, "sha512-HU9lTCzcHqCz/7Mt5n+cv+nFuJdc1hGD2h35Uo92GgxX3/IujNvOUfF+nMX9j6BXH6hUt73R5c0Ycq9+a3Parg=="], 518 + "@sentry/cli-linux-arm": ["@sentry/cli-linux-arm@2.58.4", "", { "os": [ "linux", "android", "freebsd", ], "cpu": "arm" }, "sha512-rdQ8beTwnN48hv7iV7e7ZKucPec5NJkRdrrycMJMZlzGBPi56LqnclgsHySJ6Kfq506A2MNuQnKGaf/sBC9REA=="], 511 519 512 - "@sentry/cli-linux-arm64": ["@sentry/cli-linux-arm64@2.58.2", "", { "os": [ "linux", "android", "freebsd", ], "cpu": "arm64" }, "sha512-ay3OeObnbbPrt45cjeUyQjsx5ain1laj1tRszWj37NkKu55NZSp4QCg1gGBZ0gBGhckI9nInEsmKtix00alw2g=="], 520 + "@sentry/cli-linux-arm64": ["@sentry/cli-linux-arm64@2.58.4", "", { "os": [ "linux", "android", "freebsd", ], "cpu": "arm64" }, "sha512-0g0KwsOozkLtzN8/0+oMZoOuQ0o7W6O+hx+ydVU1bktaMGKEJLMAWxOQNjsh1TcBbNIXVOKM/I8l0ROhaAb8Ig=="], 513 521 514 - "@sentry/cli-linux-i686": ["@sentry/cli-linux-i686@2.58.2", "", { "os": [ "linux", "android", "freebsd", ], "cpu": "ia32" }, "sha512-CN9p0nfDFsAT1tTGBbzOUGkIllwS3hygOUyTK7LIm9z+UHw5uNgNVqdM/3Vg+02ymjkjISNB3/+mqEM5osGXdA=="], 522 + "@sentry/cli-linux-i686": ["@sentry/cli-linux-i686@2.58.4", "", { "os": [ "linux", "android", "freebsd", ], "cpu": "ia32" }, "sha512-NseoIQAFtkziHyjZNPTu1Gm1opeQHt7Wm1LbLrGWVIRvUOzlslO9/8i6wETUZ6TjlQxBVRgd3Q0lRBG2A8rFYA=="], 515 523 516 - "@sentry/cli-linux-x64": ["@sentry/cli-linux-x64@2.58.2", "", { "os": [ "linux", "android", "freebsd", ], "cpu": "x64" }, "sha512-oX/LLfvWaJO50oBVOn4ZvG2SDWPq0MN8SV9eg5tt2nviq+Ryltfr7Rtoo+HfV+eyOlx1/ZXhq9Wm7OT3cQuz+A=="], 524 + "@sentry/cli-linux-x64": ["@sentry/cli-linux-x64@2.58.4", "", { "os": [ "linux", "android", "freebsd", ], "cpu": "x64" }, "sha512-d3Arz+OO/wJYTqCYlSN3Ktm+W8rynQ/IMtSZLK8nu0ryh5mJOh+9XlXY6oDXw4YlsM8qCRrNquR8iEI1Y/IH+Q=="], 517 525 518 - "@sentry/cli-win32-arm64": ["@sentry/cli-win32-arm64@2.58.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-+cl3x2HPVMpoSVGVM1IDWlAEREZrrVQj4xBb0TRKII7g3hUxRsAIcsrr7+tSkie++0FuH4go/b5fGAv51OEF3w=="], 526 + "@sentry/cli-win32-arm64": ["@sentry/cli-win32-arm64@2.58.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-bqYrF43+jXdDBh0f8HIJU3tbvlOFtGyRjHB8AoRuMQv9TEDUfENZyCelhdjA+KwDKYl48R1Yasb4EHNzsoO83w=="], 519 527 520 - "@sentry/cli-win32-i686": ["@sentry/cli-win32-i686@2.58.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-omFVr0FhzJ8oTJSg1Kf+gjLgzpYklY0XPfLxZ5iiMiYUKwF5uo1RJRdkUOiEAv0IqpUKnmKcmVCLaDxsWclB7Q=="], 528 + "@sentry/cli-win32-i686": ["@sentry/cli-win32-i686@2.58.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-3triFD6jyvhVcXOmGyttf+deKZcC1tURdhnmDUIBkiDPJKGT/N5xa4qAtHJlAB/h8L9jgYih9bvJnvvFVM7yug=="], 521 529 522 - "@sentry/cli-win32-x64": ["@sentry/cli-win32-x64@2.58.2", "", { "os": "win32", "cpu": "x64" }, "sha512-2NAFs9UxVbRztQbgJSP5i8TB9eJQ7xraciwj/93djrSMHSEbJ0vC47TME0iifgvhlHMs5vqETOKJtfbbpQAQFA=="], 530 + "@sentry/cli-win32-x64": ["@sentry/cli-win32-x64@2.58.4", "", { "os": "win32", "cpu": "x64" }, "sha512-cSzN4PjM1RsCZ4pxMjI0VI7yNCkxiJ5jmWncyiwHXGiXrV1eXYdQ3n1LhUYLZ91CafyprR0OhDcE+RVZ26Qb5w=="], 523 531 524 - "@sentry/core": ["@sentry/core@10.28.0", "", {}, "sha512-9yFIPxyfWkDzt+IaRjboeNiXOKi22ZRGG3ELmZlLak8JCC+vA+q/+AmF/8Jnw59WlL3/KVC1Q8+t8bLCkxlswg=="], 532 + "@sentry/core": ["@sentry/core@10.34.0", "", {}, "sha512-4FFpYBMf0VFdPcsr4grDYDOR87mRu6oCfb51oQjU/Pndmty7UgYo0Bst3LEC/8v0SpytBtzXq+Wx/fkwulBesg=="], 525 533 526 - "@sentry/nextjs": ["@sentry/nextjs@10.28.0", "", { "dependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/semantic-conventions": "^1.37.0", "@rollup/plugin-commonjs": "28.0.1", "@sentry-internal/browser-utils": "10.28.0", "@sentry/bundler-plugin-core": "^4.6.1", "@sentry/core": "10.28.0", "@sentry/node": "10.28.0", "@sentry/opentelemetry": "10.28.0", "@sentry/react": "10.28.0", "@sentry/vercel-edge": "10.28.0", "@sentry/webpack-plugin": "^4.6.1", "resolve": "1.22.8", "rollup": "^4.35.0", "stacktrace-parser": "^0.1.10" }, "peerDependencies": { "next": "^13.2.0 || ^14.0 || ^15.0.0-rc.0 || ^16.0.0-0" } }, "sha512-tLGXlxVEQKlK/YdgOXxnwBiViNtqsQrOYkIDvfJ6weGSxSbkC3Sc5KI9yAkriz3m+b0go494TWd3B6fw8qzjew=="], 534 + "@sentry/nextjs": ["@sentry/nextjs@10.34.0", "", { "dependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/semantic-conventions": "^1.37.0", "@rollup/plugin-commonjs": "28.0.1", "@sentry-internal/browser-utils": "10.34.0", "@sentry/bundler-plugin-core": "^4.6.1", "@sentry/core": "10.34.0", "@sentry/node": "10.34.0", "@sentry/opentelemetry": "10.34.0", "@sentry/react": "10.34.0", "@sentry/vercel-edge": "10.34.0", "@sentry/webpack-plugin": "^4.6.1", "rollup": "^4.35.0", "stacktrace-parser": "^0.1.10" }, "peerDependencies": { "next": "^13.2.0 || ^14.0 || ^15.0.0-rc.0 || ^16.0.0-0" } }, "sha512-Dozk4j2WSJkDy1phsdzFtPBaCzHuj1ESAMOhXim8/RVPGusxSc3z68+Sf3qjDKYjVK+8TsMQZHr+8j2WCTAKgQ=="], 527 535 528 - "@sentry/node": ["@sentry/node@10.28.0", "", { "dependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^2.2.0", "@opentelemetry/core": "^2.2.0", "@opentelemetry/instrumentation": "^0.208.0", "@opentelemetry/instrumentation-amqplib": "0.55.0", "@opentelemetry/instrumentation-connect": "0.52.0", "@opentelemetry/instrumentation-dataloader": "0.26.0", "@opentelemetry/instrumentation-express": "0.57.0", "@opentelemetry/instrumentation-fs": "0.28.0", "@opentelemetry/instrumentation-generic-pool": "0.52.0", "@opentelemetry/instrumentation-graphql": "0.56.0", "@opentelemetry/instrumentation-hapi": "0.55.0", "@opentelemetry/instrumentation-http": "0.208.0", "@opentelemetry/instrumentation-ioredis": "0.56.0", "@opentelemetry/instrumentation-kafkajs": "0.18.0", "@opentelemetry/instrumentation-knex": "0.53.0", "@opentelemetry/instrumentation-koa": "0.57.0", "@opentelemetry/instrumentation-lru-memoizer": "0.53.0", "@opentelemetry/instrumentation-mongodb": "0.61.0", "@opentelemetry/instrumentation-mongoose": "0.55.0", "@opentelemetry/instrumentation-mysql": "0.54.0", "@opentelemetry/instrumentation-mysql2": "0.55.0", "@opentelemetry/instrumentation-pg": "0.61.0", "@opentelemetry/instrumentation-redis": "0.57.0", "@opentelemetry/instrumentation-tedious": "0.27.0", "@opentelemetry/instrumentation-undici": "0.19.0", "@opentelemetry/resources": "^2.2.0", "@opentelemetry/sdk-trace-base": "^2.2.0", "@opentelemetry/semantic-conventions": "^1.37.0", "@prisma/instrumentation": "6.19.0", "@sentry/core": "10.28.0", "@sentry/node-core": "10.28.0", "@sentry/opentelemetry": "10.28.0", "import-in-the-middle": "^2", "minimatch": "^9.0.0" } }, "sha512-aih3iqagUU/9Xa6RObgdS9cKL3q5eerYNMJoO9SflMgeyhHBM5BRqo0IPSMQ9nuogrDBp443sgtW450VXYO7Bg=="], 536 + "@sentry/node": ["@sentry/node@10.34.0", "", { "dependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^2.2.0", "@opentelemetry/core": "^2.2.0", "@opentelemetry/instrumentation": "^0.208.0", "@opentelemetry/instrumentation-amqplib": "0.55.0", "@opentelemetry/instrumentation-connect": "0.52.0", "@opentelemetry/instrumentation-dataloader": "0.26.0", "@opentelemetry/instrumentation-express": "0.57.0", "@opentelemetry/instrumentation-fs": "0.28.0", "@opentelemetry/instrumentation-generic-pool": "0.52.0", "@opentelemetry/instrumentation-graphql": "0.56.0", "@opentelemetry/instrumentation-hapi": "0.55.0", "@opentelemetry/instrumentation-http": "0.208.0", "@opentelemetry/instrumentation-ioredis": "0.56.0", "@opentelemetry/instrumentation-kafkajs": "0.18.0", "@opentelemetry/instrumentation-knex": "0.53.0", "@opentelemetry/instrumentation-koa": "0.57.0", "@opentelemetry/instrumentation-lru-memoizer": "0.53.0", "@opentelemetry/instrumentation-mongodb": "0.61.0", "@opentelemetry/instrumentation-mongoose": "0.55.0", "@opentelemetry/instrumentation-mysql": "0.54.0", "@opentelemetry/instrumentation-mysql2": "0.55.0", "@opentelemetry/instrumentation-pg": "0.61.0", "@opentelemetry/instrumentation-redis": "0.57.0", "@opentelemetry/instrumentation-tedious": "0.27.0", "@opentelemetry/instrumentation-undici": "0.19.0", "@opentelemetry/resources": "^2.2.0", "@opentelemetry/sdk-trace-base": "^2.2.0", "@opentelemetry/semantic-conventions": "^1.37.0", "@prisma/instrumentation": "6.19.0", "@sentry/core": "10.34.0", "@sentry/node-core": "10.34.0", "@sentry/opentelemetry": "10.34.0", "import-in-the-middle": "^2.0.1", "minimatch": "^9.0.0" } }, "sha512-bEOyH97HuVtWZYAZ5mp0NhYNc+n6QCfiKuLee2P75n2kt4cIPTGvLOSdUwwjllf795uOdKZJuM1IUN0W+YMcVg=="], 529 537 530 - "@sentry/node-core": ["@sentry/node-core@10.28.0", "", { "dependencies": { "@apm-js-collab/tracing-hooks": "^0.3.1", "@sentry/core": "10.28.0", "@sentry/opentelemetry": "10.28.0", "import-in-the-middle": "^2" }, "peerDependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^1.30.1 || ^2.1.0 || ^2.2.0", "@opentelemetry/core": "^1.30.1 || ^2.1.0 || ^2.2.0", "@opentelemetry/instrumentation": ">=0.57.1 <1", "@opentelemetry/resources": "^1.30.1 || ^2.1.0 || ^2.2.0", "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.1.0 || ^2.2.0", "@opentelemetry/semantic-conventions": "^1.37.0" } }, "sha512-OOmNtMSPHjiVb+dmTC9Lq+uIrC2FplZSdst033mH+ucBF7xjyY1/WAk02pw+hqNVFQKwaItqhGNFTmC7aST60Q=="], 538 + "@sentry/node-core": ["@sentry/node-core@10.34.0", "", { "dependencies": { "@apm-js-collab/tracing-hooks": "^0.3.1", "@sentry/core": "10.34.0", "@sentry/opentelemetry": "10.34.0", "import-in-the-middle": "^2.0.1" }, "peerDependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^1.30.1 || ^2.1.0 || ^2.2.0", "@opentelemetry/core": "^1.30.1 || ^2.1.0 || ^2.2.0", "@opentelemetry/instrumentation": ">=0.57.1 <1", "@opentelemetry/resources": "^1.30.1 || ^2.1.0 || ^2.2.0", "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.1.0 || ^2.2.0", "@opentelemetry/semantic-conventions": "^1.37.0" } }, "sha512-FrGfC8GzD1cnZDO3zwQ4cjyoY1ZwNHvZbXSvXRYxpjhXidZhvaPurjgLRSB0xGaFgoemmOp1ufsx/w6fQOGA6Q=="], 531 539 532 - "@sentry/opentelemetry": ["@sentry/opentelemetry@10.28.0", "", { "dependencies": { "@sentry/core": "10.28.0" }, "peerDependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^1.30.1 || ^2.1.0 || ^2.2.0", "@opentelemetry/core": "^1.30.1 || ^2.1.0 || ^2.2.0", "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.1.0 || ^2.2.0", "@opentelemetry/semantic-conventions": "^1.37.0" } }, "sha512-SiSLN294vlxipDG0/FvMYIFmyXEffXmPvvdyp5DUqY8NyJytYPPUJ3DuQhc9XRVyEd9XeOgra661nxNIKPr1pg=="], 540 + "@sentry/opentelemetry": ["@sentry/opentelemetry@10.34.0", "", { "dependencies": { "@sentry/core": "10.34.0" }, "peerDependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^1.30.1 || ^2.1.0 || ^2.2.0", "@opentelemetry/core": "^1.30.1 || ^2.1.0 || ^2.2.0", "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.1.0 || ^2.2.0", "@opentelemetry/semantic-conventions": "^1.37.0" } }, "sha512-uKuULBOmdVu3bYdD8doMLqKgN0PP3WWtI7Shu11P9PVrhSNT4U9yM9Z6v1aFlQcbrgyg3LynZuXs8lyjt90UbA=="], 533 541 534 - "@sentry/react": ["@sentry/react@10.28.0", "", { "dependencies": { "@sentry/browser": "10.28.0", "@sentry/core": "10.28.0", "hoist-non-react-statics": "^3.3.2" }, "peerDependencies": { "react": "^16.14.0 || 17.x || 18.x || 19.x" } }, "sha512-n8RCgjqoRh4R9B39jvAUMwRCs2eTIG96CZStZ5TMcRozQyOQ92Cj+aWRrX70nMjoyN3SVI1aLJ6wKB8Lqyw89A=="], 542 + "@sentry/react": ["@sentry/react@10.34.0", "", { "dependencies": { "@sentry/browser": "10.34.0", "@sentry/core": "10.34.0" }, "peerDependencies": { "react": "^16.14.0 || 17.x || 18.x || 19.x" } }, "sha512-LDpg9WDrEwo6lr/YOAA54id/g5D1PGKEIiOGxqRZbBVyjzrsquwzhSG2CMqnp+YO6lz/r96LWuqm2cvfpht2zA=="], 535 543 536 - "@sentry/vercel-edge": ["@sentry/vercel-edge@10.28.0", "", { "dependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/resources": "^2.2.0", "@sentry/core": "10.28.0" } }, "sha512-pPHadU0AehitN2ZkNc5zU9ynZqqmcHVjNOxBbSfGumRRpyBbTgkl1vxmwYP61GQErjRJemtwClA1CRqb8etQmg=="], 544 + "@sentry/vercel-edge": ["@sentry/vercel-edge@10.34.0", "", { "dependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/resources": "^2.2.0", "@sentry/core": "10.34.0" } }, "sha512-yphK7YX8zR1Gbt51AVakCfNHMjsrXdNNCjRrnhxKIfVnx7OrVmmG7iFFnOCqNRttCxA1HN+2KiM8TSSFE6a98Q=="], 537 545 538 - "@sentry/webpack-plugin": ["@sentry/webpack-plugin@4.6.1", "", { "dependencies": { "@sentry/bundler-plugin-core": "4.6.1", "unplugin": "1.0.1", "uuid": "^9.0.0" }, "peerDependencies": { "webpack": ">=4.40.0" } }, "sha512-CJgT/t2pQWsPsMx9VJ86goU/orCQhL2HhDj5ZYBol6fPPoEGeTqKOPCnv/xsbCAfGSp1uHpyRLTA/Gx96u7VVA=="], 546 + "@sentry/webpack-plugin": ["@sentry/webpack-plugin@4.6.2", "", { "dependencies": { "@sentry/bundler-plugin-core": "4.6.2", "unplugin": "1.0.1", "uuid": "^9.0.0" }, "peerDependencies": { "webpack": ">=4.40.0" } }, "sha512-uyb4nAqstVvO6ep86TQRlSxuynYhFec/HYfrA8wN5qYLx31gJQsOiuAeEzocJ2GGrhJq/ySH9nYfcnpjgk4J2w=="], 539 547 540 - "@stylistic/eslint-plugin": ["@stylistic/eslint-plugin@5.6.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.0", "@typescript-eslint/types": "^8.47.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-JCs+MqoXfXrRPGbGmho/zGS/jMcn3ieKl/A8YImqib76C8kjgZwq5uUFzc30lJkMvcchuRn6/v8IApLxli3Jyw=="], 548 + "@stylistic/eslint-plugin": ["@stylistic/eslint-plugin@5.7.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/types": "^8.52.0", "eslint-visitor-keys": "^5.0.0", "espree": "^11.0.0", "estraverse": "^5.3.0", "picomatch": "^4.0.3" }, "peerDependencies": { "eslint": ">=9.0.0" } }, "sha512-PsSugIf9ip1H/mWKj4bi/BlEoerxXAda9ByRFsYuwsmr6af9NxJL0AaiNXs8Le7R21QR5KMiD/KdxZZ71LjAxQ=="], 541 549 542 550 "@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="], 543 551 544 - "@tailwindcss/node": ["@tailwindcss/node@4.1.17", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "enhanced-resolve": "^5.18.3", "jiti": "^2.6.1", "lightningcss": "1.30.2", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.1.17" } }, "sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg=="], 552 + "@tailwindcss/node": ["@tailwindcss/node@4.1.18", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "enhanced-resolve": "^5.18.3", "jiti": "^2.6.1", "lightningcss": "1.30.2", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.1.18" } }, "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ=="], 545 553 546 - "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.17", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.17", "@tailwindcss/oxide-darwin-arm64": "4.1.17", "@tailwindcss/oxide-darwin-x64": "4.1.17", "@tailwindcss/oxide-freebsd-x64": "4.1.17", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.17", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.17", "@tailwindcss/oxide-linux-arm64-musl": "4.1.17", "@tailwindcss/oxide-linux-x64-gnu": "4.1.17", "@tailwindcss/oxide-linux-x64-musl": "4.1.17", "@tailwindcss/oxide-wasm32-wasi": "4.1.17", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.17", "@tailwindcss/oxide-win32-x64-msvc": "4.1.17" } }, "sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA=="], 554 + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.18", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.18", "@tailwindcss/oxide-darwin-arm64": "4.1.18", "@tailwindcss/oxide-darwin-x64": "4.1.18", "@tailwindcss/oxide-freebsd-x64": "4.1.18", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", "@tailwindcss/oxide-linux-x64-musl": "4.1.18", "@tailwindcss/oxide-wasm32-wasi": "4.1.18", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" } }, "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A=="], 547 555 548 - "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.17", "", { "os": "android", "cpu": "arm64" }, "sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ=="], 556 + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.18", "", { "os": "android", "cpu": "arm64" }, "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q=="], 549 557 550 - "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.17", "", { "os": "darwin", "cpu": "arm64" }, "sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg=="], 558 + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.18", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A=="], 551 559 552 - "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.17", "", { "os": "darwin", "cpu": "x64" }, "sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog=="], 560 + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.18", "", { "os": "darwin", "cpu": "x64" }, "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw=="], 553 561 554 - "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.17", "", { "os": "freebsd", "cpu": "x64" }, "sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g=="], 562 + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.18", "", { "os": "freebsd", "cpu": "x64" }, "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA=="], 555 563 556 - "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17", "", { "os": "linux", "cpu": "arm" }, "sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ=="], 564 + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18", "", { "os": "linux", "cpu": "arm" }, "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA=="], 557 565 558 - "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.17", "", { "os": "linux", "cpu": "arm64" }, "sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ=="], 566 + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.18", "", { "os": "linux", "cpu": "arm64" }, "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw=="], 559 567 560 - "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.17", "", { "os": "linux", "cpu": "arm64" }, "sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg=="], 568 + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.18", "", { "os": "linux", "cpu": "arm64" }, "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg=="], 561 569 562 - "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.17", "", { "os": "linux", "cpu": "x64" }, "sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ=="], 570 + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.18", "", { "os": "linux", "cpu": "x64" }, "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g=="], 563 571 564 - "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.17", "", { "os": "linux", "cpu": "x64" }, "sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ=="], 572 + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.18", "", { "os": "linux", "cpu": "x64" }, "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ=="], 565 573 566 - "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.17", "", { "dependencies": { "@emnapi/core": "^1.6.0", "@emnapi/runtime": "^1.6.0", "@emnapi/wasi-threads": "^1.1.0", "@napi-rs/wasm-runtime": "^1.0.7", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.4.0" }, "cpu": "none" }, "sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg=="], 574 + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.18", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@emnapi/wasi-threads": "^1.1.0", "@napi-rs/wasm-runtime": "^1.1.0", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.4.0" }, "cpu": "none" }, "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA=="], 567 575 568 - "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.17", "", { "os": "win32", "cpu": "arm64" }, "sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A=="], 576 + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.18", "", { "os": "win32", "cpu": "arm64" }, "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA=="], 569 577 570 - "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.17", "", { "os": "win32", "cpu": "x64" }, "sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw=="], 578 + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.18", "", { "os": "win32", "cpu": "x64" }, "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q=="], 571 579 572 - "@tailwindcss/postcss": ["@tailwindcss/postcss@4.1.17", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.1.17", "@tailwindcss/oxide": "4.1.17", "postcss": "^8.4.41", "tailwindcss": "4.1.17" } }, "sha512-+nKl9N9mN5uJ+M7dBOOCzINw94MPstNR/GtIhz1fpZysxL/4a+No64jCBD6CPN+bIHWFx3KWuu8XJRrj/572Dw=="], 580 + "@tailwindcss/postcss": ["@tailwindcss/postcss@4.1.18", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.1.18", "@tailwindcss/oxide": "4.1.18", "postcss": "^8.4.41", "tailwindcss": "4.1.18" } }, "sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g=="], 573 581 574 582 "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], 575 583 ··· 597 605 598 606 "@types/mysql": ["@types/mysql@2.15.27", "", { "dependencies": { "@types/node": "*" } }, "sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA=="], 599 607 600 - "@types/node": ["@types/node@24.10.1", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ=="], 608 + "@types/node": ["@types/node@25.0.9", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw=="], 601 609 602 610 "@types/pg": ["@types/pg@8.15.6", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^2.2.0" } }, "sha512-NoaMtzhxOrubeL/7UZuNTrejB4MPAJ0RpxZqXQf2qXuVlTPuG6Y8p4u9dKRaue4yjmC7ZhzVO2/Yyyn25znrPQ=="], 603 611 604 612 "@types/pg-pool": ["@types/pg-pool@2.0.6", "", { "dependencies": { "@types/pg": "*" } }, "sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ=="], 605 613 606 - "@types/react": ["@types/react@19.2.7", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg=="], 614 + "@types/react": ["@types/react@19.2.8", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-3MbSL37jEchWZz2p2mjntRZtPt837ij10ApxKfgmXCTuHWagYg7iA5bqPw6C8BMPfwidlvfPI/fxOc42HLhcyg=="], 607 615 608 616 "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], 609 617 ··· 611 619 612 620 "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], 613 621 614 - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.48.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.48.1", "@typescript-eslint/type-utils": "8.48.1", "@typescript-eslint/utils": "8.48.1", "@typescript-eslint/visitor-keys": "8.48.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.48.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-X63hI1bxl5ohelzr0LY5coufyl0LJNthld+abwxpCoo6Gq+hSqhKwci7MUWkXo67mzgUK6YFByhmaHmUcuBJmA=="], 622 + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.53.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.53.0", "@typescript-eslint/type-utils": "8.53.0", "@typescript-eslint/utils": "8.53.0", "@typescript-eslint/visitor-keys": "8.53.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.53.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-eEXsVvLPu8Z4PkFibtuFJLJOTAV/nPdgtSjkGoPpddpFk3/ym2oy97jynY6ic2m6+nc5M8SE1e9v/mHKsulcJg=="], 615 623 616 - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.48.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.48.1", "@typescript-eslint/types": "8.48.1", "@typescript-eslint/typescript-estree": "8.48.1", "@typescript-eslint/visitor-keys": "8.48.1", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-PC0PDZfJg8sP7cmKe6L3QIL8GZwU5aRvUFedqSIpw3B+QjRSUZeeITC2M5XKeMXEzL6wccN196iy3JLwKNvDVA=="], 624 + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.53.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.53.0", "@typescript-eslint/types": "8.53.0", "@typescript-eslint/typescript-estree": "8.53.0", "@typescript-eslint/visitor-keys": "8.53.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-npiaib8XzbjtzS2N4HlqPvlpxpmZ14FjSJrteZpPxGUaYPlvhzlzUZ4mZyABo0EFrOWnvyd0Xxroq//hKhtAWg=="], 617 625 618 - "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.48.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.48.1", "@typescript-eslint/types": "^8.48.1", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-HQWSicah4s9z2/HifRPQ6b6R7G+SBx64JlFQpgSSHWPKdvCZX57XCbszg/bapbRsOEv42q5tayTYcEFpACcX1w=="], 626 + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.53.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.53.0", "@typescript-eslint/types": "^8.53.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-Bl6Gdr7NqkqIP5yP9z1JU///Nmes4Eose6L1HwpuVHwScgDPPuEWbUVhvlZmb8hy0vX9syLk5EGNL700WcBlbg=="], 619 627 620 - "@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=="], 628 + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.53.0", "", { "dependencies": { "@typescript-eslint/types": "8.53.0", "@typescript-eslint/visitor-keys": "8.53.0" } }, "sha512-kWNj3l01eOGSdVBnfAF2K1BTh06WS0Yet6JUgb9Cmkqaz3Jlu0fdVUjj9UI8gPidBWSMqDIglmEXifSgDT/D0g=="], 621 629 622 - "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.48.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-k0Jhs4CpEffIBm6wPaCXBAD7jxBtrHjrSgtfCjUvPp9AZ78lXKdTR8fxyZO5y4vWNlOvYXRtngSZNSn+H53Jkw=="], 630 + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.53.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-K6Sc0R5GIG6dNoPdOooQ+KtvT5KCKAvTcY8h2rIuul19vxH5OTQk7ArKkd4yTzkw66WnNY0kPPzzcmWA+XRmiA=="], 623 631 624 - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.48.1", "", { "dependencies": { "@typescript-eslint/types": "8.48.1", "@typescript-eslint/typescript-estree": "8.48.1", "@typescript-eslint/utils": "8.48.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-1jEop81a3LrJQLTf/1VfPQdhIY4PlGDBc/i67EVWObrtvcziysbLN3oReexHOM6N3jyXgCrkBsZpqwH0hiDOQg=="], 632 + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.53.0", "", { "dependencies": { "@typescript-eslint/types": "8.53.0", "@typescript-eslint/typescript-estree": "8.53.0", "@typescript-eslint/utils": "8.53.0", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-BBAUhlx7g4SmcLhn8cnbxoxtmS7hcq39xKCgiutL3oNx1TaIp+cny51s8ewnKMpVUKQUGb41RAUWZ9kxYdovuw=="], 625 633 626 - "@typescript-eslint/types": ["@typescript-eslint/types@8.47.0", "", {}, "sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A=="], 634 + "@typescript-eslint/types": ["@typescript-eslint/types@8.53.0", "", {}, "sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ=="], 627 635 628 - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.48.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.48.1", "@typescript-eslint/tsconfig-utils": "8.48.1", "@typescript-eslint/types": "8.48.1", "@typescript-eslint/visitor-keys": "8.48.1", "debug": "^4.3.4", "minimatch": "^9.0.4", "semver": "^7.6.0", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-/9wQ4PqaefTK6POVTjJaYS0bynCgzh6ClJHGSBj06XEHjkfylzB+A3qvyaXnErEZSaxhIo4YdyBgq6j4RysxDg=="], 636 + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.53.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.53.0", "@typescript-eslint/tsconfig-utils": "8.53.0", "@typescript-eslint/types": "8.53.0", "@typescript-eslint/visitor-keys": "8.53.0", "debug": "^4.4.3", "minimatch": "^9.0.5", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-pw0c0Gdo7Z4xOG987u3nJ8akL9093yEEKv8QTJ+Bhkghj1xyj8cgPaavlr9rq8h7+s6plUJ4QJYw2gCZodqmGw=="], 629 637 630 - "@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=="], 638 + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.53.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.53.0", "@typescript-eslint/types": "8.53.0", "@typescript-eslint/typescript-estree": "8.53.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-XDY4mXTez3Z1iRDI5mbRhH4DFSt46oaIFsLg+Zn97+sYrXACziXSQcSelMybnVZ5pa1P6xYkPr5cMJyunM1ZDA=="], 631 639 632 - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.48.1", "", { "dependencies": { "@typescript-eslint/types": "8.48.1", "eslint-visitor-keys": "^4.2.1" } }, "sha512-BmxxndzEWhE4TIEEMBs8lP3MBWN3jFPs/p6gPm/wkv02o41hI6cq9AuSmGAaTTHPtA1FTi2jBre4A9rm5ZmX+Q=="], 640 + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.53.0", "", { "dependencies": { "@typescript-eslint/types": "8.53.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-LZ2NqIHFhvFwxG0qZeLL9DvdNAHPGCY5dIRwBhyYeU+LfLhcStE1ImjsuTG/WaVh3XysGaeLW8Rqq7cGkPCFvw=="], 633 641 634 642 "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], 635 643 ··· 671 679 672 680 "@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.11.1", "", { "os": "win32", "cpu": "x64" }, "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g=="], 673 681 674 - "@unrs/rspack-resolver-binding-darwin-arm64": ["@unrs/rspack-resolver-binding-darwin-arm64@1.1.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-myn6gHyM77Y6XXGls9Wkfuu+yexGkmhPBDmBUkThrbkXtHq38vsr7o1Dyzruiqtt/okSs0tFF9P77kI6wWF9iQ=="], 675 - 676 - "@unrs/rspack-resolver-binding-darwin-x64": ["@unrs/rspack-resolver-binding-darwin-x64@1.1.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-A/5xK8zb8lJlom+mznrp9YA8lYzHjD2QcUdQ3PkWha8x996fPjSns4ilNYHW+eGXFcEAnfVwf78q9vYf59JJmA=="], 677 - 678 - "@unrs/rspack-resolver-binding-freebsd-x64": ["@unrs/rspack-resolver-binding-freebsd-x64@1.1.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-Ew3bqEa8roijTPUS8xvb1X4K8S//rw6oDGKPhwQ8WoABVrrGZtMKlUEfH1+zBduJZtJAbpiDebFhh9OEoFM9Lw=="], 679 - 680 - "@unrs/rspack-resolver-binding-linux-arm-gnueabihf": ["@unrs/rspack-resolver-binding-linux-arm-gnueabihf@1.1.1", "", { "os": "linux", "cpu": "arm" }, "sha512-9Mm53MmrXQHfrUFotM19407A/9GjtdXyo9GkF7W1pb/ZXS7j7GTpruj8txWdaQrlxg0yjhjJst/xuNMbBFi1hQ=="], 681 - 682 - "@unrs/rspack-resolver-binding-linux-arm64-gnu": ["@unrs/rspack-resolver-binding-linux-arm64-gnu@1.1.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-yXs9e7hk7LzNT7LFwG6pxSnzVt6feC1SjFJM6naIRgFI8/4KngY8BUjM/Xx7rCS4Iz6FnCVIolpSrNqsRHpRrg=="], 683 - 684 - "@unrs/rspack-resolver-binding-linux-arm64-musl": ["@unrs/rspack-resolver-binding-linux-arm64-musl@1.1.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-5i/Jq2Bb3He0JYCLOBzLxj+eX57rip2fOQUZX4i7H/ReZm9U64vVmWGNq7HlC0kNGo5AhGtRXCg5HbsBiBsyBw=="], 685 - 686 - "@unrs/rspack-resolver-binding-linux-x64-gnu": ["@unrs/rspack-resolver-binding-linux-x64-gnu@1.1.1", "", { "os": "linux", "cpu": "x64" }, "sha512-gAUWCEvtLGoKn2+dPrWXqE2xMfUjyvsUDa1+8yjKnyEqfGCyKcyaSSWkXq7k2VQnS5XxOThQJPPnZol4EOBxpw=="], 687 - 688 - "@unrs/rspack-resolver-binding-linux-x64-musl": ["@unrs/rspack-resolver-binding-linux-x64-musl@1.1.1", "", { "os": "linux", "cpu": "x64" }, "sha512-o1Ik61ahhy+UHIWQB3t/kGwOUPmECbyXVuiW6D/ieKUWslspGE6qjFnyDxWqj9bDGsgjlbl/+O5QabXuAdUsJQ=="], 689 - 690 - "@unrs/rspack-resolver-binding-wasm32-wasi": ["@unrs/rspack-resolver-binding-wasm32-wasi@1.1.1", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.7" }, "cpu": "none" }, "sha512-uGqUQlEe9NUtw/VQOVLpuEPD6RBNmdUoGSHH8lGfKI5B3xHZYZ7nhKW38JeAnK9IymFJQpsyMHZXAyFR+NK8iw=="], 691 - 692 - "@unrs/rspack-resolver-binding-win32-arm64-msvc": ["@unrs/rspack-resolver-binding-win32-arm64-msvc@1.1.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-UfpkOv54SOqD/TyzGIVCPQHSuXIVjeIIbMqrhl06695Sjlu5ls4Wxq6nllofC3Igak4h5ovulGvLLH/GRMdVYQ=="], 693 - 694 - "@unrs/rspack-resolver-binding-win32-x64-msvc": ["@unrs/rspack-resolver-binding-win32-x64-msvc@1.1.1", "", { "os": "win32", "cpu": "x64" }, "sha512-oBZjxVKfLVQxCdFDbafibNtJQKhT6DTW5FcNM25Vay86Yi7Mw4ftYg5NknR70WxM5qSNXIOgTHgzEUFfZ3Q7JA=="], 695 - 696 - "@vladfrangu/async_event_emitter": ["@vladfrangu/async_event_emitter@2.4.6", "", {}, "sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA=="], 682 + "@vladfrangu/async_event_emitter": ["@vladfrangu/async_event_emitter@2.4.7", "", {}, "sha512-Xfe6rpCTxSxfbswi/W/Pz7zp1WWSNn4A0eW4mLkQUewCrXXtMj31lCg+iQyTkh/CkusZSq9eDflu7tjEDXUY6g=="], 697 683 698 684 "@webassemblyjs/ast": ["@webassemblyjs/ast@1.14.1", "", { "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ=="], 699 685 ··· 753 739 754 740 "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], 755 741 756 - "aria-hidden": ["aria-hidden@1.2.4", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A=="], 742 + "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="], 757 743 758 744 "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], 759 745 760 746 "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], 761 747 762 - "array-includes": ["array-includes@3.1.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" } }, "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ=="], 748 + "array-includes": ["array-includes@3.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.0", "es-object-atoms": "^1.1.1", "get-intrinsic": "^1.3.0", "is-string": "^1.1.1", "math-intrinsics": "^1.1.0" } }, "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ=="], 763 749 764 750 "array.prototype.findlast": ["array.prototype.findlast@1.2.5", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ=="], 765 751 ··· 779 765 780 766 "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], 781 767 782 - "axe-core": ["axe-core@4.10.3", "", {}, "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg=="], 768 + "axe-core": ["axe-core@4.11.1", "", {}, "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A=="], 783 769 784 770 "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], 785 771 ··· 787 773 788 774 "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], 789 775 790 - "baseline-browser-mapping": ["baseline-browser-mapping@2.8.9", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-hY/u2lxLrbecMEWSB0IpGzGyDyeoMFQhCvZd2jGFSE5I17Fh01sYUBPCJtkWERw7zrac9+cIghxm/ytJa2X8iA=="], 776 + "baseline-browser-mapping": ["baseline-browser-mapping@2.9.15", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-kX8h7K2srmDyYnXRIppo4AH/wYgzWVCs+eKr3RusRSQ5PvRYoEFmR/I0PbdTjKFAoKqp5+kbxnNTFO9jOfSVJg=="], 791 777 792 778 "big-integer": ["big-integer@1.6.52", "", {}, "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg=="], 793 779 794 780 "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], 795 781 796 - "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], 782 + "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], 797 783 798 784 "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], 799 785 800 786 "broadcast-channel": ["broadcast-channel@3.7.0", "", { "dependencies": { "@babel/runtime": "^7.7.2", "detect-node": "^2.1.0", "js-sha3": "0.8.0", "microseconds": "0.2.0", "nano-time": "1.0.0", "oblivious-set": "1.0.0", "rimraf": "3.0.2", "unload": "2.2.0" } }, "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg=="], 801 787 802 - "browserslist": ["browserslist@4.26.3", "", { "dependencies": { "baseline-browser-mapping": "^2.8.9", "caniuse-lite": "^1.0.30001746", "electron-to-chromium": "^1.5.227", "node-releases": "^2.0.21", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w=="], 788 + "browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="], 803 789 804 790 "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], 805 791 ··· 813 799 814 800 "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], 815 801 816 - "caniuse-lite": ["caniuse-lite@1.0.30001759", "", {}, "sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw=="], 802 + "caniuse-lite": ["caniuse-lite@1.0.30001765", "", {}, "sha512-LWcNtSyZrakjECqmpP4qdg0MMGdN368D7X8XvvAqOcqMv0RxnlqVKZl2V6/mBR68oYMxOZPLw/gO7DuisMHUvQ=="], 817 803 818 804 "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], 819 805 ··· 835 821 836 822 "ci-info": ["ci-info@4.3.1", "", {}, "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA=="], 837 823 838 - "cjs-module-lexer": ["cjs-module-lexer@1.4.3", "", {}, "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q=="], 824 + "cjs-module-lexer": ["cjs-module-lexer@2.2.0", "", {}, "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ=="], 839 825 840 826 "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], 841 827 ··· 853 839 854 840 "commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], 855 841 856 - "comment-parser": ["comment-parser@1.4.1", "", {}, "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg=="], 842 + "comment-parser": ["comment-parser@1.4.4", "", {}, "sha512-0D6qSQ5IkeRrGJFHRClzaMOenMeT0gErz3zIw3AprKMqhRN6LNU2jQOdkPG/FZ+8bCgXE1VidrgSzlBBDZRr8A=="], 857 843 858 844 "commondir": ["commondir@1.0.1", "", {}, "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="], 859 845 ··· 861 847 862 848 "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], 863 849 864 - "core-js-compat": ["core-js-compat@3.46.0", "", { "dependencies": { "browserslist": "^4.26.3" } }, "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law=="], 850 + "core-js-compat": ["core-js-compat@3.47.0", "", { "dependencies": { "browserslist": "^4.28.0" } }, "sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ=="], 865 851 866 - "countup.js": ["countup.js@2.8.0", "", {}, "sha512-f7xEhX0awl4NOElHulrl4XRfKoNH3rB+qfNSZZyjSZhaAoUk6elvhH+MNxMmlmuUJ2/QNTWPSA7U4mNtIAKljQ=="], 852 + "countup.js": ["countup.js@2.9.0", "", {}, "sha512-llqrvyXztRFPp6+i8jx25phHWcVWhrHO4Nlt0uAOSKHB8778zzQswa4MU3qKBvkXfJKftRYFJuVHez67lyKdHg=="], 867 853 868 854 "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], 869 855 ··· 879 865 880 866 "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], 881 867 882 - "decode-named-character-reference": ["decode-named-character-reference@1.1.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w=="], 868 + "decode-named-character-reference": ["decode-named-character-reference@1.2.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q=="], 883 869 884 870 "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], 885 871 ··· 897 883 898 884 "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], 899 885 900 - "discord-api-types": ["discord-api-types@0.38.36", "", {}, "sha512-qrbUbjjwtyeBg5HsAlm1C859epfOyiLjPqAOzkdWlCNsZCWJrertnETF/NwM8H+waMFU58xGSc5eXUfXah+WTQ=="], 886 + "discord-api-types": ["discord-api-types@0.38.37", "", {}, "sha512-Cv47jzY1jkGkh5sv0bfHYqGgKOWO1peOrGMkDFM4UmaGMOTgOW8QSexhvixa9sVOiz8MnVOBryWYyw/CEVhj7w=="], 901 887 902 888 "doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], 903 889 ··· 907 893 908 894 "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], 909 895 910 - "electron-to-chromium": ["electron-to-chromium@1.5.227", "", {}, "sha512-ITxuoPfJu3lsNWUi2lBM2PaBPYgH3uqmxut5vmBxgYvyI4AlJ6P3Cai1O76mOrkJCBzq0IxWg/NtqOrpu/0gKA=="], 896 + "electron-to-chromium": ["electron-to-chromium@1.5.267", "", {}, "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw=="], 911 897 912 898 "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], 913 899 914 - "enhanced-resolve": ["enhanced-resolve@5.18.3", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww=="], 900 + "enhanced-resolve": ["enhanced-resolve@5.18.4", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q=="], 915 901 916 - "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], 902 + "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], 917 903 918 - "es-abstract": ["es-abstract@1.23.9", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.3", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.0", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-regex": "^1.2.1", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.0", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.18" } }, "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA=="], 904 + "es-abstract": ["es-abstract@1.24.1", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw=="], 919 905 920 906 "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], 921 907 922 908 "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], 923 909 924 - "es-iterator-helpers": ["es-iterator-helpers@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.6", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.4", "safe-array-concat": "^1.1.3" } }, "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w=="], 910 + "es-iterator-helpers": ["es-iterator-helpers@1.2.2", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.1", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.3.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.5", "safe-array-concat": "^1.1.3" } }, "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w=="], 925 911 926 - "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], 912 + "es-module-lexer": ["es-module-lexer@2.0.0", "", {}, "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw=="], 927 913 928 914 "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], 929 915 ··· 937 923 938 924 "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], 939 925 940 - "eslint": ["eslint@9.39.1", "", { "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.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.39.1", "@eslint/plugin-kit": "^0.4.1", "@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-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g=="], 926 + "eslint": ["eslint@9.39.2", "", { "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.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.39.2", "@eslint/plugin-kit": "^0.4.1", "@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-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw=="], 941 927 942 - "eslint-config-next": ["eslint-config-next@16.0.7", "", { "dependencies": { "@next/eslint-plugin-next": "16.0.7", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.37.0", "eslint-plugin-react-hooks": "^7.0.0", "globals": "16.4.0", "typescript-eslint": "^8.46.0" }, "peerDependencies": { "eslint": ">=9.0.0", "typescript": ">=3.3.1" }, "optionalPeers": ["typescript"] }, "sha512-WubFGLFHfk2KivkdRGfx6cGSFhaQqhERRfyO8BRx+qiGPGp7WLKcPvYC4mdx1z3VhVRcrfFzczjjTrbJZOpnEQ=="], 928 + "eslint-config-next": ["eslint-config-next@16.1.3", "", { "dependencies": { "@next/eslint-plugin-next": "16.1.3", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.37.0", "eslint-plugin-react-hooks": "^7.0.0", "globals": "16.4.0", "typescript-eslint": "^8.46.0" }, "peerDependencies": { "eslint": ">=9.0.0", "typescript": ">=3.3.1" }, "optionalPeers": ["typescript"] }, "sha512-q2Z87VSsoJcv+vgR+Dm8NPRf+rErXcRktuBR5y3umo/j5zLjIWH7rqBCh3X804gUGKbOrqbgsLUkqDE35C93Gw=="], 943 929 944 930 "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=="], 945 931 946 932 "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="], 947 933 948 - "eslint-import-resolver-typescript": ["eslint-import-resolver-typescript@3.9.1", "", { "dependencies": { "@nolyfill/is-core-module": "1.0.39", "debug": "^4.4.0", "get-tsconfig": "^4.10.0", "is-bun-module": "^1.3.0", "rspack-resolver": "^1.1.0", "stable-hash": "^0.0.5", "tinyglobby": "^0.2.12" }, "peerDependencies": { "eslint": "*", "eslint-plugin-import": "*", "eslint-plugin-import-x": "*" }, "optionalPeers": ["eslint-plugin-import", "eslint-plugin-import-x"] }, "sha512-euxa5rTGqHeqVxmOHT25hpk58PxkQ4mNoX6Yun4ooGaCHAxOCojJYNvjmyeOQxj/LyW+3fulH0+xtk+p2kPPTw=="], 934 + "eslint-import-resolver-typescript": ["eslint-import-resolver-typescript@3.10.1", "", { "dependencies": { "@nolyfill/is-core-module": "1.0.39", "debug": "^4.4.0", "get-tsconfig": "^4.10.0", "is-bun-module": "^2.0.0", "stable-hash": "^0.0.5", "tinyglobby": "^0.2.13", "unrs-resolver": "^1.6.2" }, "peerDependencies": { "eslint": "*", "eslint-plugin-import": "*", "eslint-plugin-import-x": "*" }, "optionalPeers": ["eslint-plugin-import", "eslint-plugin-import-x"] }, "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ=="], 949 935 950 936 "eslint-module-utils": ["eslint-module-utils@2.12.1", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw=="], 951 937 ··· 967 953 968 954 "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], 969 955 970 - "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], 956 + "eslint-visitor-keys": ["eslint-visitor-keys@5.0.0", "", {}, "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q=="], 971 957 972 - "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], 958 + "espree": ["espree@11.0.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.0" } }, "sha512-+gMeWRrIh/NsG+3NaLeWHuyeyk70p2tbvZIWBYcqQ4/7Xvars6GYTZNhF1sIeLcc6Wb11He5ffz3hsHyXFrw5A=="], 973 959 974 - "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], 960 + "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="], 975 961 976 962 "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], 977 963 ··· 997 983 998 984 "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], 999 985 1000 - "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], 986 + "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], 1001 987 1002 - "fdir": ["fdir@6.4.3", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw=="], 988 + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], 1003 989 1004 990 "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], 1005 991 ··· 1019 1005 1020 1006 "forwarded-parse": ["forwarded-parse@2.1.2", "", {}, "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw=="], 1021 1007 1022 - "framer-motion": ["framer-motion@12.23.25", "", { "dependencies": { "motion-dom": "^12.23.23", "motion-utils": "^12.23.6", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-gUHGl2e4VG66jOcH0JHhuJQr6ZNwrET9g31ZG0xdXzT0CznP7fHX4P8Bcvuc4MiUB90ysNnWX2ukHRIggkl6hQ=="], 1008 + "framer-motion": ["framer-motion@12.27.0", "", { "dependencies": { "motion-dom": "^12.27.0", "motion-utils": "^12.24.10", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-gJtqOKEDJH/jrn0PpsWp64gdOjBvGX8hY6TWstxjDot/85daIEtJHl1UsiwHSXiYmJF2QXUoXP6/3gGw5xY2YA=="], 1023 1009 1024 1010 "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], 1025 1011 ··· 1030 1016 "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="], 1031 1017 1032 1018 "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], 1019 + 1020 + "generator-function": ["generator-function@2.0.1", "", {}, "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g=="], 1033 1021 1034 1022 "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], 1035 1023 ··· 1041 1029 1042 1030 "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], 1043 1031 1044 - "get-tsconfig": ["get-tsconfig@4.10.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A=="], 1032 + "get-tsconfig": ["get-tsconfig@4.13.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ=="], 1045 1033 1046 1034 "glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], 1047 1035 ··· 1057 1045 1058 1046 "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], 1059 1047 1060 - "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], 1061 - 1062 1048 "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], 1063 1049 1064 1050 "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], ··· 1081 1067 1082 1068 "hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.6", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg=="], 1083 1069 1084 - "hast-util-to-parse5": ["hast-util-to-parse5@8.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^6.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw=="], 1070 + "hast-util-to-parse5": ["hast-util-to-parse5@8.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA=="], 1085 1071 1086 1072 "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], 1087 1073 ··· 1093 1079 1094 1080 "highlight.js": ["highlight.js@11.11.1", "", {}, "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w=="], 1095 1081 1096 - "hoist-non-react-statics": ["hoist-non-react-statics@3.3.2", "", { "dependencies": { "react-is": "^16.7.0" } }, "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="], 1097 - 1098 1082 "html-url-attributes": ["html-url-attributes@3.0.1", "", {}, "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ=="], 1099 1083 1100 1084 "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], ··· 1105 1089 1106 1090 "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], 1107 1091 1108 - "import-in-the-middle": ["import-in-the-middle@2.0.0", "", { "dependencies": { "acorn": "^8.14.0", "acorn-import-attributes": "^1.9.5", "cjs-module-lexer": "^1.2.2", "module-details-from-path": "^1.0.3" } }, "sha512-yNZhyQYqXpkT0AKq3F3KLasUSK4fHvebNH5hOsKQw2dhGSALvQ4U0BqUc5suziKvydO5u5hgN2hy1RJaho8U5A=="], 1092 + "import-in-the-middle": ["import-in-the-middle@2.0.4", "", { "dependencies": { "acorn": "^8.15.0", "acorn-import-attributes": "^1.9.5", "cjs-module-lexer": "^2.2.0", "module-details-from-path": "^1.0.4" } }, "sha512-Al0kMpa0BqfvDnxjxGlab9vdQ0vTDs82TBKrD59X9jReUoPAzSGBb6vGDzMUMFBGyyDF03RpLT4oxGn6BpASzQ=="], 1109 1093 1110 1094 "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], 1111 1095 ··· 1115 1099 1116 1100 "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], 1117 1101 1118 - "inline-style-parser": ["inline-style-parser@0.2.4", "", {}, "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q=="], 1102 + "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="], 1119 1103 1120 1104 "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=="], 1121 1105 ··· 1135 1119 1136 1120 "is-builtin-module": ["is-builtin-module@5.0.0", "", { "dependencies": { "builtin-modules": "^5.0.0" } }, "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA=="], 1137 1121 1138 - "is-bun-module": ["is-bun-module@1.3.0", "", { "dependencies": { "semver": "^7.6.3" } }, "sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA=="], 1122 + "is-bun-module": ["is-bun-module@2.0.0", "", { "dependencies": { "semver": "^7.7.1" } }, "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ=="], 1139 1123 1140 1124 "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], 1141 1125 ··· 1153 1137 1154 1138 "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], 1155 1139 1156 - "is-generator-function": ["is-generator-function@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ=="], 1140 + "is-generator-function": ["is-generator-function@1.1.2", "", { "dependencies": { "call-bound": "^1.0.4", "generator-function": "^2.0.0", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA=="], 1157 1141 1158 1142 "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], 1159 1143 ··· 1207 1191 1208 1192 "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], 1209 1193 1210 - "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], 1194 + "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], 1211 1195 1212 1196 "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], 1213 1197 ··· 1267 1251 1268 1252 "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], 1269 1253 1270 - "lucide-react": ["lucide-react@0.555.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-D8FvHUGbxWBRQM90NZeIyhAvkFfsh3u9ekrMvJ30Z6gnpBHS6HC6ldLg7tL45hwiIz/u66eKDtdA23gwwGsAHA=="], 1254 + "lucide-react": ["lucide-react@0.562.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-82hOAu7y0dbVuFfmO4bYF1XEwYk/mEbM5E+b1jgci/udUBEE/R7LF5Ip0CCEmXe8AybRM8L+04eP+LGZeDvkiw=="], 1271 1255 1272 - "magic-bytes.js": ["magic-bytes.js@1.10.0", "", {}, "sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ=="], 1256 + "magic-bytes.js": ["magic-bytes.js@1.12.1", "", {}, "sha512-ThQLOhN86ZkJ7qemtVRGYM+gRgR8GEXNli9H/PMvpnZsE44Xfh3wx9kGJaldg314v85m+bFW6WBMaVHJc/c3zA=="], 1273 1257 1274 - "magic-string": ["magic-string@0.30.19", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw=="], 1258 + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], 1275 1259 1276 1260 "match-sorter": ["match-sorter@6.4.0", "", { "dependencies": { "@babel/runtime": "^7.23.8", "remove-accents": "0.5.0" } }, "sha512-d4664ahzdL1QTTvmK1iI0JsrxWeJ6gn33qkYtnPg3mcn+naBLtXSgSPOe+X2vUgtgGwaAk3eiaj7gwKjjMAq+Q=="], 1277 1261 ··· 1287 1271 1288 1272 "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="], 1289 1273 1290 - "mdast-util-to-hast": ["mdast-util-to-hast@13.2.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA=="], 1274 + "mdast-util-to-hast": ["mdast-util-to-hast@13.2.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA=="], 1291 1275 1292 1276 "mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA=="], 1293 1277 ··· 1355 1339 1356 1340 "module-details-from-path": ["module-details-from-path@1.0.4", "", {}, "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w=="], 1357 1341 1358 - "motion-dom": ["motion-dom@12.23.23", "", { "dependencies": { "motion-utils": "^12.23.6" } }, "sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA=="], 1342 + "motion": ["motion@12.27.0", "", { "dependencies": { "framer-motion": "^12.27.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-5/WbUMUV0QPOlgimOKJRhKwE+/pIHBI38SVgEpsfadOa5lYDgkgJAEav7KqNahdX3i3xkvogD5JR4K41w+9Hzw=="], 1359 1343 1360 - "motion-utils": ["motion-utils@12.23.6", "", {}, "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ=="], 1344 + "motion-dom": ["motion-dom@12.27.0", "", { "dependencies": { "motion-utils": "^12.24.10" } }, "sha512-oDjl0WoAsWIWKl3GCDxmh7GITrNjmLX+w5+jwk4+pzLu3VnFvsOv2E6+xCXeH72O65xlXsr84/otiOYQKW/nQA=="], 1345 + 1346 + "motion-utils": ["motion-utils@12.24.10", "", {}, "sha512-x5TFgkCIP4pPsRLpKoI86jv/q8t8FQOiM/0E8QKBzfMozWHfkKap2gA1hOki+B5g3IsBNpxbUnfOum1+dgvYww=="], 1361 1347 1362 1348 "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], 1363 1349 ··· 1365 1351 1366 1352 "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], 1367 1353 1368 - "napi-postinstall": ["napi-postinstall@0.3.3", "", { "bin": { "napi-postinstall": "lib/cli.js" } }, "sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow=="], 1354 + "napi-postinstall": ["napi-postinstall@0.3.4", "", { "bin": { "napi-postinstall": "lib/cli.js" } }, "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ=="], 1369 1355 1370 1356 "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], 1371 1357 1372 1358 "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], 1373 1359 1374 - "next": ["next@16.0.7", "", { "dependencies": { "@next/env": "16.0.7", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.0.7", "@next/swc-darwin-x64": "16.0.7", "@next/swc-linux-arm64-gnu": "16.0.7", "@next/swc-linux-arm64-musl": "16.0.7", "@next/swc-linux-x64-gnu": "16.0.7", "@next/swc-linux-x64-musl": "16.0.7", "@next/swc-win32-arm64-msvc": "16.0.7", "@next/swc-win32-x64-msvc": "16.0.7", "sharp": "^0.34.4" }, "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-3mBRJyPxT4LOxAJI6IsXeFtKfiJUbjCLgvXO02fV8Wy/lIhPvP94Fe7dGhUgHXcQy4sSuYwQNcOLhIfOm0rL0A=="], 1360 + "next": ["next@16.1.3", "", { "dependencies": { "@next/env": "16.1.3", "@swc/helpers": "0.5.15", "baseline-browser-mapping": "^2.8.3", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.1.3", "@next/swc-darwin-x64": "16.1.3", "@next/swc-linux-arm64-gnu": "16.1.3", "@next/swc-linux-arm64-musl": "16.1.3", "@next/swc-linux-x64-gnu": "16.1.3", "@next/swc-linux-x64-musl": "16.1.3", "@next/swc-win32-arm64-msvc": "16.1.3", "@next/swc-win32-x64-msvc": "16.1.3", "sharp": "^0.34.4" }, "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-gthG3TRD+E3/mA0uDQb9lqBmx1zVosq5kIwxNN6+MRNd085GzD+9VXMPUs+GGZCbZ+GDZdODUq4Pm7CTXK6ipw=="], 1375 1361 1376 1362 "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=="], 1377 1363 1378 1364 "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], 1379 1365 1380 - "node-releases": ["node-releases@2.0.21", "", {}, "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw=="], 1366 + "node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], 1381 1367 1382 1368 "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], 1383 1369 ··· 1415 1401 1416 1402 "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], 1417 1403 1418 - "parse5": ["parse5@7.2.1", "", { "dependencies": { "entities": "^4.5.0" } }, "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ=="], 1404 + "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], 1419 1405 1420 1406 "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], 1421 1407 ··· 1429 1415 1430 1416 "pg-int8": ["pg-int8@1.0.1", "", {}, "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="], 1431 1417 1432 - "pg-protocol": ["pg-protocol@1.10.3", "", {}, "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ=="], 1418 + "pg-protocol": ["pg-protocol@1.11.0", "", {}, "sha512-pfsxk2M9M3BuGgDOfuy37VNRRX3jmKgMjcvAcWqNDpZSf4cUmv8HSOl5ViRQFsfARFn0KuUQTgLxVMbNq5NW3g=="], 1433 1419 1434 1420 "pg-types": ["pg-types@2.2.0", "", { "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="], 1435 1421 ··· 1445 1431 1446 1432 "postgres-array": ["postgres-array@2.0.0", "", {}, "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="], 1447 1433 1448 - "postgres-bytea": ["postgres-bytea@1.0.0", "", {}, "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w=="], 1434 + "postgres-bytea": ["postgres-bytea@1.0.1", "", {}, "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ=="], 1449 1435 1450 1436 "postgres-date": ["postgres-date@1.0.7", "", {}, "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="], 1451 1437 ··· 1457 1443 1458 1444 "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], 1459 1445 1460 - "property-information": ["property-information@7.0.0", "", {}, "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg=="], 1446 + "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], 1461 1447 1462 1448 "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], 1463 1449 ··· 1467 1453 1468 1454 "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], 1469 1455 1470 - "react": ["react@19.2.1", "", {}, "sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw=="], 1456 + "react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], 1471 1457 1472 1458 "react-countup": ["react-countup@6.5.3", "", { "dependencies": { "countup.js": "^2.8.0" }, "peerDependencies": { "react": ">= 16.3.0" } }, "sha512-udnqVQitxC7QWADSPDOxVWULkLvKUWrDapn5i53HE4DPRVgs+Y5rr4bo25qEl8jSh+0l2cToJgGMx+clxPM3+w=="], 1473 1459 1474 - "react-dom": ["react-dom@19.2.1", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.1" } }, "sha512-ibrK8llX2a4eOskq1mXKu/TGZj9qzomO+sNfO98M6d9zIPOEhlBkMkBUBLd1vgS0gQsLDBzA+8jJBVXDnfHmJg=="], 1460 + "react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], 1475 1461 1476 1462 "react-icons": ["react-icons@5.5.0", "", { "peerDependencies": { "react": "*" } }, "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw=="], 1477 1463 ··· 1483 1469 1484 1470 "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=="], 1485 1471 1486 - "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=="], 1472 + "react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "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-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="], 1487 1473 1488 1474 "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=="], 1489 1475 ··· 1492 1478 "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], 1493 1479 1494 1480 "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=="], 1495 - 1496 - "regenerator-runtime": ["regenerator-runtime@0.14.1", "", {}, "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="], 1497 1481 1498 1482 "regexp-tree": ["regexp-tree@0.1.27", "", { "bin": { "regexp-tree": "bin/regexp-tree" } }, "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA=="], 1499 1483 ··· 1505 1489 1506 1490 "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], 1507 1491 1508 - "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=="], 1492 + "remark-rehype": ["remark-rehype@11.1.2", "", { "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-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="], 1509 1493 1510 1494 "remove-accents": ["remove-accents@0.5.0", "", {}, "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A=="], 1511 1495 ··· 1523 1507 1524 1508 "rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], 1525 1509 1526 - "rollup": ["rollup@4.52.5", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.52.5", "@rollup/rollup-android-arm64": "4.52.5", "@rollup/rollup-darwin-arm64": "4.52.5", "@rollup/rollup-darwin-x64": "4.52.5", "@rollup/rollup-freebsd-arm64": "4.52.5", "@rollup/rollup-freebsd-x64": "4.52.5", "@rollup/rollup-linux-arm-gnueabihf": "4.52.5", "@rollup/rollup-linux-arm-musleabihf": "4.52.5", "@rollup/rollup-linux-arm64-gnu": "4.52.5", "@rollup/rollup-linux-arm64-musl": "4.52.5", "@rollup/rollup-linux-loong64-gnu": "4.52.5", "@rollup/rollup-linux-ppc64-gnu": "4.52.5", "@rollup/rollup-linux-riscv64-gnu": "4.52.5", "@rollup/rollup-linux-riscv64-musl": "4.52.5", "@rollup/rollup-linux-s390x-gnu": "4.52.5", "@rollup/rollup-linux-x64-gnu": "4.52.5", "@rollup/rollup-linux-x64-musl": "4.52.5", "@rollup/rollup-openharmony-arm64": "4.52.5", "@rollup/rollup-win32-arm64-msvc": "4.52.5", "@rollup/rollup-win32-ia32-msvc": "4.52.5", "@rollup/rollup-win32-x64-gnu": "4.52.5", "@rollup/rollup-win32-x64-msvc": "4.52.5", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw=="], 1527 - 1528 - "rspack-resolver": ["rspack-resolver@1.1.1", "", { "optionalDependencies": { "@unrs/rspack-resolver-binding-darwin-arm64": "1.1.1", "@unrs/rspack-resolver-binding-darwin-x64": "1.1.1", "@unrs/rspack-resolver-binding-freebsd-x64": "1.1.1", "@unrs/rspack-resolver-binding-linux-arm-gnueabihf": "1.1.1", "@unrs/rspack-resolver-binding-linux-arm64-gnu": "1.1.1", "@unrs/rspack-resolver-binding-linux-arm64-musl": "1.1.1", "@unrs/rspack-resolver-binding-linux-x64-gnu": "1.1.1", "@unrs/rspack-resolver-binding-linux-x64-musl": "1.1.1", "@unrs/rspack-resolver-binding-wasm32-wasi": "1.1.1", "@unrs/rspack-resolver-binding-win32-arm64-msvc": "1.1.1", "@unrs/rspack-resolver-binding-win32-x64-msvc": "1.1.1" } }, "sha512-SwTjuIOS9jIYViQpYiDOmLTf/nuP6j9fz9VSxdNyIFiFaivEt6TOO5z0qQAwVloTz8RqjbPAzhVr1isiyHNRHw=="], 1510 + "rollup": ["rollup@4.55.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.55.1", "@rollup/rollup-android-arm64": "4.55.1", "@rollup/rollup-darwin-arm64": "4.55.1", "@rollup/rollup-darwin-x64": "4.55.1", "@rollup/rollup-freebsd-arm64": "4.55.1", "@rollup/rollup-freebsd-x64": "4.55.1", "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", "@rollup/rollup-linux-arm-musleabihf": "4.55.1", "@rollup/rollup-linux-arm64-gnu": "4.55.1", "@rollup/rollup-linux-arm64-musl": "4.55.1", "@rollup/rollup-linux-loong64-gnu": "4.55.1", "@rollup/rollup-linux-loong64-musl": "4.55.1", "@rollup/rollup-linux-ppc64-gnu": "4.55.1", "@rollup/rollup-linux-ppc64-musl": "4.55.1", "@rollup/rollup-linux-riscv64-gnu": "4.55.1", "@rollup/rollup-linux-riscv64-musl": "4.55.1", "@rollup/rollup-linux-s390x-gnu": "4.55.1", "@rollup/rollup-linux-x64-gnu": "4.55.1", "@rollup/rollup-linux-x64-musl": "4.55.1", "@rollup/rollup-openbsd-x64": "4.55.1", "@rollup/rollup-openharmony-arm64": "4.55.1", "@rollup/rollup-win32-arm64-msvc": "4.55.1", "@rollup/rollup-win32-ia32-msvc": "4.55.1", "@rollup/rollup-win32-x64-gnu": "4.55.1", "@rollup/rollup-win32-x64-msvc": "4.55.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A=="], 1529 1511 1530 1512 "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], 1531 1513 ··· 1541 1523 1542 1524 "schema-utils": ["schema-utils@4.3.3", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA=="], 1543 1525 1544 - "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], 1526 + "semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], 1545 1527 1546 1528 "serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="], 1547 1529 ··· 1611 1593 1612 1594 "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], 1613 1595 1614 - "style-to-js": ["style-to-js@1.1.16", "", { "dependencies": { "style-to-object": "1.0.8" } }, "sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw=="], 1596 + "style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="], 1615 1597 1616 - "style-to-object": ["style-to-object@1.0.8", "", { "dependencies": { "inline-style-parser": "0.2.4" } }, "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g=="], 1598 + "style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="], 1617 1599 1618 1600 "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], 1619 1601 ··· 1623 1605 1624 1606 "tailwind-merge": ["tailwind-merge@3.4.0", "", {}, "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g=="], 1625 1607 1626 - "tailwindcss": ["tailwindcss@4.1.17", "", {}, "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q=="], 1608 + "tailwindcss": ["tailwindcss@4.1.18", "", {}, "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw=="], 1627 1609 1628 1610 "tailwindcss-animate": ["tailwindcss-animate@1.0.7", "", { "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders" } }, "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA=="], 1629 1611 1630 1612 "tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="], 1631 1613 1632 - "terser": ["terser@5.44.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w=="], 1614 + "terser": ["terser@5.46.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg=="], 1633 1615 1634 - "terser-webpack-plugin": ["terser-webpack-plugin@5.3.14", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw=="], 1616 + "terser-webpack-plugin": ["terser-webpack-plugin@5.3.16", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q=="], 1635 1617 1636 - "tinyglobby": ["tinyglobby@0.2.12", "", { "dependencies": { "fdir": "^6.4.3", "picomatch": "^4.0.2" } }, "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww=="], 1618 + "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], 1637 1619 1638 1620 "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], 1639 1621 ··· 1643 1625 1644 1626 "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], 1645 1627 1646 - "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], 1628 + "ts-api-utils": ["ts-api-utils@2.4.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA=="], 1647 1629 1648 1630 "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=="], 1649 1631 ··· 1665 1647 1666 1648 "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], 1667 1649 1668 - "typescript-eslint": ["typescript-eslint@8.48.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.48.1", "@typescript-eslint/parser": "8.48.1", "@typescript-eslint/typescript-estree": "8.48.1", "@typescript-eslint/utils": "8.48.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-FbOKN1fqNoXp1hIl5KYpObVrp0mCn+CLgn479nmu2IsRMrx2vyv74MmsBLVlhg8qVwNFGbXSp8fh1zp8pEoC2A=="], 1650 + "typescript-eslint": ["typescript-eslint@8.53.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.53.0", "@typescript-eslint/parser": "8.53.0", "@typescript-eslint/typescript-estree": "8.53.0", "@typescript-eslint/utils": "8.53.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-xHURCQNxZ1dsWn0sdOaOfCSQG0HKeqSj9OexIxrz6ypU6wHYOdX2I3D2b8s8wFSsSOYJb+6q283cLiLlkEsBYw=="], 1669 1651 1670 1652 "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=="], 1671 1653 ··· 1675 1657 1676 1658 "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], 1677 1659 1678 - "unist-util-is": ["unist-util-is@6.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw=="], 1660 + "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], 1679 1661 1680 1662 "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], 1681 1663 ··· 1683 1665 1684 1666 "unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="], 1685 1667 1686 - "unist-util-visit-parents": ["unist-util-visit-parents@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw=="], 1668 + "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="], 1687 1669 1688 1670 "unload": ["unload@2.2.0", "", { "dependencies": { "@babel/runtime": "^7.6.2", "detect-node": "^2.0.4" } }, "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA=="], 1689 1671 ··· 1691 1673 1692 1674 "unrs-resolver": ["unrs-resolver@1.11.1", "", { "dependencies": { "napi-postinstall": "^0.3.0" }, "optionalDependencies": { "@unrs/resolver-binding-android-arm-eabi": "1.11.1", "@unrs/resolver-binding-android-arm64": "1.11.1", "@unrs/resolver-binding-darwin-arm64": "1.11.1", "@unrs/resolver-binding-darwin-x64": "1.11.1", "@unrs/resolver-binding-freebsd-x64": "1.11.1", "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", "@unrs/resolver-binding-linux-x64-musl": "1.11.1", "@unrs/resolver-binding-wasm32-wasi": "1.11.1", "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" } }, "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg=="], 1693 1675 1694 - "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], 1676 + "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], 1695 1677 1696 1678 "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], 1697 1679 ··· 1699 1681 1700 1682 "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.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-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], 1701 1683 1702 - "use-sync-external-store": ["use-sync-external-store@1.5.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A=="], 1684 + "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="], 1703 1685 1704 1686 "uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], 1705 1687 ··· 1709 1691 1710 1692 "vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="], 1711 1693 1712 - "vfile-message": ["vfile-message@4.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw=="], 1694 + "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], 1713 1695 1714 - "watchpack": ["watchpack@2.4.4", "", { "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA=="], 1696 + "watchpack": ["watchpack@2.5.1", "", { "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg=="], 1715 1697 1716 1698 "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], 1717 1699 1718 1700 "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], 1719 1701 1720 - "webpack": ["webpack@5.102.1", "", { "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.15.0", "acorn-import-phases": "^1.0.3", "browserslist": "^4.26.3", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.3", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.4", "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ=="], 1702 + "webpack": ["webpack@5.104.1", "", { "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.15.0", "acorn-import-phases": "^1.0.3", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.4", "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", "terser-webpack-plugin": "^5.3.16", "watchpack": "^2.4.4", "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA=="], 1721 1703 1722 1704 "webpack-sources": ["webpack-sources@3.3.3", "", {}, "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg=="], 1723 1705 ··· 1733 1715 1734 1716 "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], 1735 1717 1736 - "which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="], 1718 + "which-typed-array": ["which-typed-array@1.1.20", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg=="], 1737 1719 1738 1720 "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], 1739 1721 ··· 1749 1731 1750 1732 "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], 1751 1733 1752 - "zod": ["zod@3.24.2", "", {}, "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ=="], 1734 + "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], 1753 1735 1754 - "zod-validation-error": ["zod-validation-error@3.4.0", "", { "peerDependencies": { "zod": "^3.18.0" } }, "sha512-ZOPR9SVY6Pb2qqO5XHt+MkkTRxGXb4EVtnjc9JpXUOtUB1T9Ru7mZOT361AN3MsetVe7R0a1KZshJDZdgp9miQ=="], 1736 + "zod-validation-error": ["zod-validation-error@3.5.4", "", { "peerDependencies": { "zod": "^3.24.4" } }, "sha512-+hEiRIiPobgyuFlEojnqjJnhFvg4r/i3cqgcm67eehZf/WBaK3g6cD02YU9mtdVxZjv8CzCA9n/Rhrs3yAAvAw=="], 1755 1737 1756 - "zustand": ["zustand@5.0.9", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-ALBtUj0AfjJt3uNRQoL1tL2tMvj6Gp/6e39dnfT6uzpelGru8v1tPOGBzayOWbPJvujM8JojDk3E1LxeFisBNg=="], 1738 + "zustand": ["zustand@5.0.10", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-U1AiltS1O9hSy3rul+Ub82ut2fqIAefiSuwECWt6jlMVUGejvf+5omLcRBSzqbRagSM3hQZbtzdeRc6QVScXTg=="], 1757 1739 1758 1740 "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], 1759 1741 1760 - "@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="], 1761 - 1762 - "@babel/core/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], 1763 - 1764 1742 "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], 1765 1743 1766 - "@babel/helper-compilation-targets/browserslist": ["browserslist@4.24.4", "", { "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" } }, "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A=="], 1767 - 1768 1744 "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], 1769 1745 1770 1746 "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], 1771 1747 1772 - "@babel/helper-module-transforms/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="], 1773 - 1774 - "@babel/traverse/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], 1775 - 1776 - "@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], 1777 - 1778 - "@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="], 1779 - 1780 - "@discordjs/rest/discord-api-types": ["discord-api-types@0.38.21", "", {}, "sha512-E6KtXUNjZVIYP1GMjmeRdAC1xRql9xtSahRwJYpP74/hJ6Q2i2oTp6ZbFG/FUN0WqtdW2igHDsJyF2u9hV8pHQ=="], 1781 - 1782 1748 "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], 1783 1749 1784 - "@eslint/eslintrc/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], 1785 - 1786 - "@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=="], 1750 + "@eslint/eslintrc/espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], 1787 1751 1788 1752 "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], 1789 1753 1790 - "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], 1791 - 1792 - "@jridgewell/gen-mapping/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], 1793 - 1794 - "@jridgewell/trace-mapping/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], 1795 - 1796 - "@napi-rs/wasm-runtime/@emnapi/runtime": ["@emnapi/runtime@1.5.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ=="], 1797 - 1798 - "@opentelemetry/sql-common/@opentelemetry/core": ["@opentelemetry/core@2.1.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-RMEtHsxJs/GiHHxYT58IY57UXAQTuUnZVco6ymDEqTNlJKTimM4qPUPVe8InNFyBjhHBEAx4k3Q8LtNayBsbUQ=="], 1754 + "@opentelemetry/instrumentation-http/@opentelemetry/core": ["@opentelemetry/core@2.2.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw=="], 1799 1755 1800 1756 "@radix-ui/react-accordion/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], 1801 1757 ··· 1851 1807 1852 1808 "@sentry/bundler-plugin-core/magic-string": ["magic-string@0.30.8", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ=="], 1853 1809 1854 - "@sentry/nextjs/resolve": ["resolve@1.22.8", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw=="], 1855 - 1856 1810 "@sentry/node/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], 1857 1811 1858 - "@tailwindcss/node/magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], 1812 + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="], 1859 1813 1860 - "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.7.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-pJdKGq/1iquWYtv1RRSljZklxHCOCAJFJrImO5ZLKPJVJlVUcs8yFwNQlqS0Lo8xT1VAXXTCZocF9n26FWEKsw=="], 1861 - 1862 - "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.7.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q=="], 1814 + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="], 1863 1815 1864 1816 "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], 1865 1817 1866 - "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.0.7", "", { "dependencies": { "@emnapi/core": "^1.5.0", "@emnapi/runtime": "^1.5.0", "@tybys/wasm-util": "^0.10.1" }, "bundled": true }, "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw=="], 1818 + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" }, "bundled": true }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="], 1867 1819 1868 1820 "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], 1869 1821 1870 1822 "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], 1871 1823 1872 - "@types/connect/@types/node": ["@types/node@24.8.1", "", { "dependencies": { "undici-types": "~7.14.0" } }, "sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q=="], 1873 - 1874 - "@types/estree-jsx/@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], 1875 - 1876 - "@types/mysql/@types/node": ["@types/node@24.8.1", "", { "dependencies": { "undici-types": "~7.14.0" } }, "sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q=="], 1877 - 1878 - "@types/pg-pool/@types/pg": ["@types/pg@8.15.5", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^2.2.0" } }, "sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ=="], 1879 - 1880 - "@types/tedious/@types/node": ["@types/node@24.8.1", "", { "dependencies": { "undici-types": "~7.14.0" } }, "sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q=="], 1881 - 1882 - "@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.48.1", "", { "dependencies": { "@typescript-eslint/types": "8.48.1", "@typescript-eslint/visitor-keys": "8.48.1" } }, "sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w=="], 1883 - 1884 - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@8.48.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.48.1", "@typescript-eslint/types": "8.48.1", "@typescript-eslint/typescript-estree": "8.48.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-fAnhLrDjiVfey5wwFRwrweyRlCmdz5ZxXz2G/4cLn0YDLjTapmN4gcCsTBR1N2rWnZSDeWpYtgLDsJt+FpmcwA=="], 1885 - 1886 1824 "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], 1887 1825 1888 - "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.48.1", "", { "dependencies": { "@typescript-eslint/types": "8.48.1", "@typescript-eslint/visitor-keys": "8.48.1" } }, "sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w=="], 1889 - 1890 - "@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@8.48.1", "", {}, "sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q=="], 1891 - 1892 - "@typescript-eslint/project-service/@typescript-eslint/types": ["@typescript-eslint/types@8.48.1", "", {}, "sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q=="], 1893 - 1894 - "@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@8.44.1", "", {}, "sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ=="], 1895 - 1896 - "@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=="], 1897 - 1898 - "@typescript-eslint/type-utils/@typescript-eslint/types": ["@typescript-eslint/types@8.48.1", "", {}, "sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q=="], 1899 - 1900 - "@typescript-eslint/type-utils/@typescript-eslint/utils": ["@typescript-eslint/utils@8.48.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.48.1", "@typescript-eslint/types": "8.48.1", "@typescript-eslint/typescript-estree": "8.48.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-fAnhLrDjiVfey5wwFRwrweyRlCmdz5ZxXz2G/4cLn0YDLjTapmN4gcCsTBR1N2rWnZSDeWpYtgLDsJt+FpmcwA=="], 1901 - 1902 - "@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@8.48.1", "", {}, "sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q=="], 1903 - 1904 1826 "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], 1905 1827 1906 - "@typescript-eslint/typescript-estree/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], 1828 + "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], 1907 1829 1908 - "@typescript-eslint/typescript-estree/tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], 1830 + "ajv-formats/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], 1909 1831 1910 - "@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.44.1", "", {}, "sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ=="], 1911 - 1912 - "@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=="], 1913 - 1914 - "@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@8.48.1", "", {}, "sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q=="], 1915 - 1916 - "@unrs/rspack-resolver-binding-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.7", "", { "dependencies": { "@emnapi/core": "^1.3.1", "@emnapi/runtime": "^1.3.1", "@tybys/wasm-util": "^0.9.0" } }, "sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw=="], 1917 - 1918 - "ajv-formats/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], 1832 + "ajv-keywords/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], 1919 1833 1920 1834 "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], 1921 1835 1922 - "browserslist/caniuse-lite": ["caniuse-lite@1.0.30001751", "", {}, "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw=="], 1923 - 1924 1836 "chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], 1925 1837 1926 1838 "clean-regexp/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], 1927 1839 1928 - "eslint-import-context/get-tsconfig": ["get-tsconfig@4.10.1", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ=="], 1840 + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], 1841 + 1842 + "eslint/espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], 1929 1843 1930 1844 "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], 1931 1845 1932 - "eslint-import-resolver-node/resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], 1933 - 1934 - "eslint-import-resolver-typescript/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], 1846 + "eslint-import-resolver-node/resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], 1935 1847 1936 1848 "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], 1937 1849 1938 - "eslint-plugin-import/array-includes": ["array-includes@3.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.0", "es-object-atoms": "^1.1.1", "get-intrinsic": "^1.3.0", "is-string": "^1.1.1", "math-intrinsics": "^1.1.0" } }, "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ=="], 1939 - 1940 1850 "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], 1941 1851 1942 1852 "eslint-plugin-import/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], 1943 1853 1944 - "eslint-plugin-import-x/@typescript-eslint/types": ["@typescript-eslint/types@8.44.1", "", {}, "sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ=="], 1945 - 1946 - "eslint-plugin-import-x/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], 1854 + "eslint-plugin-import-x/minimatch": ["minimatch@10.1.1", "", { "dependencies": { "@isaacs/brace-expansion": "^5.0.0" } }, "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ=="], 1947 1855 1948 1856 "eslint-plugin-react/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], 1949 1857 1950 - "eslint-plugin-react-hooks/zod": ["zod@4.1.12", "", {}, "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ=="], 1858 + "eslint-plugin-react-hooks/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], 1951 1859 1952 1860 "eslint-plugin-react-hooks/zod-validation-error": ["zod-validation-error@4.0.2", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ=="], 1953 1861 1954 - "eslint-plugin-unicorn/@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=="], 1955 - 1956 - "eslint-plugin-unicorn/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], 1862 + "eslint-plugin-unicorn/globals": ["globals@16.5.0", "", {}, "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ=="], 1957 1863 1958 1864 "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], 1959 1865 1960 1866 "glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], 1961 1867 1962 - "hast-util-to-jsx-runtime/@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], 1963 - 1964 - "hast-util-to-parse5/property-information": ["property-information@6.5.0", "", {}, "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig=="], 1965 - 1966 - "is-bun-module/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], 1967 - 1968 - "jest-worker/@types/node": ["@types/node@24.8.1", "", { "dependencies": { "undici-types": "~7.14.0" } }, "sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q=="], 1969 - 1970 1868 "jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], 1971 - 1972 - "lightningcss/detect-libc": ["detect-libc@2.1.0", "", {}, "sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg=="], 1973 - 1974 - "micromark/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], 1975 1869 1976 1870 "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], 1977 1871 ··· 1986 1880 "rimraf/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], 1987 1881 1988 1882 "schema-utils/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], 1989 - 1990 - "sharp/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], 1991 1883 1992 1884 "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], 1993 1885 ··· 1995 1887 1996 1888 "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 1997 1889 1998 - "tinyglobby/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], 1999 - 2000 1890 "tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], 2001 - 2002 - "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@8.48.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.48.1", "@typescript-eslint/types": "8.48.1", "@typescript-eslint/typescript-estree": "8.48.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-fAnhLrDjiVfey5wwFRwrweyRlCmdz5ZxXz2G/4cLn0YDLjTapmN4gcCsTBR1N2rWnZSDeWpYtgLDsJt+FpmcwA=="], 2003 - 2004 - "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=="], 2005 1891 2006 1892 "webpack/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], 2007 1893 ··· 2011 1897 2012 1898 "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 2013 1899 2014 - "@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001705", "", {}, "sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg=="], 2015 - 2016 - "@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.119", "", {}, "sha512-Ku4NMzUjz3e3Vweh7PhApPrZSS4fyiCIbcIrG9eKrriYVLmbMepETR/v6SU7xPm98QTqMSYiCwfO89QNjXLkbQ=="], 2017 - 2018 - "@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], 2019 - 2020 - "@eslint/eslintrc/espree/acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="], 2021 - 2022 - "@eslint/eslintrc/espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.0", "", {}, "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw=="], 1900 + "@eslint/eslintrc/espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], 2023 1901 2024 1902 "@radix-ui/react-accordion/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], 2025 1903 ··· 2051 1929 2052 1930 "@radix-ui/react-visually-hidden/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], 2053 1931 2054 - "@sentry/node/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 2055 - 2056 - "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime/@emnapi/core": ["@emnapi/core@1.5.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg=="], 2057 - 2058 - "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime/@emnapi/runtime": ["@emnapi/runtime@1.5.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ=="], 2059 - 2060 - "@types/connect/@types/node/undici-types": ["undici-types@7.14.0", "", {}, "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA=="], 2061 - 2062 - "@types/mysql/@types/node/undici-types": ["undici-types@7.14.0", "", {}, "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA=="], 2063 - 2064 - "@types/pg-pool/@types/pg/@types/node": ["@types/node@24.8.1", "", { "dependencies": { "undici-types": "~7.14.0" } }, "sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q=="], 2065 - 2066 - "@types/tedious/@types/node/undici-types": ["undici-types@7.14.0", "", {}, "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA=="], 2067 - 2068 - "@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@8.48.1", "", {}, "sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q=="], 2069 - 2070 - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.48.1", "", {}, "sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q=="], 1932 + "@sentry/node/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], 2071 1933 2072 - "@typescript-eslint/type-utils/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.48.1", "", { "dependencies": { "@typescript-eslint/types": "8.48.1", "@typescript-eslint/visitor-keys": "8.48.1" } }, "sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w=="], 2073 - 2074 - "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 2075 - 2076 - "@typescript-eslint/typescript-estree/tinyglobby/fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], 2077 - 2078 - "@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=="], 2079 - 2080 - "@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=="], 2081 - 2082 - "@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=="], 2083 - 2084 - "@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=="], 2085 - 2086 - "@typescript-eslint/utils/@typescript-eslint/typescript-estree/fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], 2087 - 2088 - "@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], 2089 - 2090 - "@unrs/rspack-resolver-binding-wasm32-wasi/@napi-rs/wasm-runtime/@emnapi/core": ["@emnapi/core@1.3.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.1", "tslib": "^2.4.0" } }, "sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog=="], 2091 - 2092 - "@unrs/rspack-resolver-binding-wasm32-wasi/@napi-rs/wasm-runtime/@emnapi/runtime": ["@emnapi/runtime@1.3.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw=="], 2093 - 2094 - "@unrs/rspack-resolver-binding-wasm32-wasi/@napi-rs/wasm-runtime/@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="], 1934 + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], 2095 1935 2096 1936 "ajv-formats/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], 2097 1937 2098 - "eslint-plugin-import-x/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 2099 - 2100 - "eslint-plugin-import/array-includes/es-abstract": ["es-abstract@1.24.0", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg=="], 2101 - 2102 - "eslint-plugin-unicorn/@eslint/plugin-kit/@eslint/core": ["@eslint/core@0.16.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q=="], 2103 - 2104 - "glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 2105 - 2106 - "jest-worker/@types/node/undici-types": ["undici-types@7.14.0", "", {}, "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA=="], 1938 + "ajv-keywords/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], 2107 1939 2108 - "next/postcss/nanoid": ["nanoid@3.3.10", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg=="], 1940 + "glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], 2109 1941 2110 1942 "schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], 2111 1943 2112 1944 "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 2113 1945 2114 - "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.48.1", "", { "dependencies": { "@typescript-eslint/types": "8.48.1", "@typescript-eslint/visitor-keys": "8.48.1" } }, "sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w=="], 2115 - 2116 - "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.48.1", "", {}, "sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q=="], 2117 - 2118 - "vaul/@radix-ui/react-dialog/@radix-ui/primitive": ["@radix-ui/primitive@1.1.1", "", {}, "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA=="], 2119 - 2120 - "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=="], 2121 - 2122 - "vaul/@radix-ui/react-dialog/@radix-ui/react-context": ["@radix-ui/react-context@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q=="], 2123 - 2124 - "vaul/@radix-ui/react-dialog/@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.5", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-escape-keydown": "1.1.0" }, "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-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg=="], 2125 - 2126 - "vaul/@radix-ui/react-dialog/@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg=="], 2127 - 2128 - "vaul/@radix-ui/react-dialog/@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0" }, "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-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA=="], 2129 - 2130 - "vaul/@radix-ui/react-dialog/@radix-ui/react-id": ["@radix-ui/react-id@1.1.0", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA=="], 2131 - 2132 - "vaul/@radix-ui/react-dialog/@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.4", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-layout-effect": "1.1.0" }, "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-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA=="], 2133 - 2134 - "vaul/@radix-ui/react-dialog/@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.0" }, "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-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg=="], 2135 - 2136 - "vaul/@radix-ui/react-dialog/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.0.2", "", { "dependencies": { "@radix-ui/react-slot": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w=="], 2137 - 2138 - "vaul/@radix-ui/react-dialog/@radix-ui/react-slot": ["@radix-ui/react-slot@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ=="], 2139 - 2140 - "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=="], 2141 - 2142 1946 "webpack/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], 2143 1947 2144 1948 "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], 2145 1949 2146 1950 "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 2147 - 2148 - "@types/pg-pool/@types/pg/@types/node/undici-types": ["undici-types@7.14.0", "", {}, "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA=="], 2149 - 2150 - "@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=="], 2151 - 2152 - "@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=="], 2153 - 2154 - "@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=="], 2155 - 2156 - "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=="], 2157 - 2158 - "vaul/@radix-ui/react-dialog/@radix-ui/react-dismissable-layer/@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@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-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw=="], 2159 - 2160 - "vaul/@radix-ui/react-dialog/@radix-ui/react-focus-scope/@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=="], 2161 - 2162 - "vaul/@radix-ui/react-dialog/@radix-ui/react-id/@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w=="], 2163 - 2164 - "vaul/@radix-ui/react-dialog/@radix-ui/react-portal/@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w=="], 2165 - 2166 - "vaul/@radix-ui/react-dialog/@radix-ui/react-presence/@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w=="], 2167 - 2168 - "vaul/@radix-ui/react-dialog/@radix-ui/react-use-controllable-state/@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=="], 2169 1951 } 2170 1952 }
+19 -21
components/embed-creator.tsx
··· 8 8 import { DiscordMarkdown } from "./discord/markdown"; 9 9 import DiscordMessage from "./discord/message"; 10 10 import DiscordMessageEmbed from "./discord/message-embed"; 11 - import DumbColorInput from "./inputs/dumb-color-input"; 12 - import DumbTextInput from "./inputs/dumb-text-input"; 11 + import { ControlledColorInput } from "./inputs/controlled-color-input"; 12 + import { ControlledInput } from "./inputs/controlled-input"; 13 13 import { Button } from "./ui/button"; 14 14 15 15 enum State { ··· 187 187 188 188 <div className="lg:w-3/6 m-1"> 189 189 190 - <DumbTextInput placeholder="Content" value={content} setValue={setContent} max={2_000} disabled={disabled} /> 191 - <DumbTextInput placeholder="Embed Title" value={embed} setValue={setEmbed} max={256} dataName="title" disabled={disabled} /> 192 - <DumbTextInput placeholder="Embed Description" value={embed} setValue={setEmbed} max={4_096} dataName="description" disabled={disabled} /> 190 + <ControlledInput placeholder="Content" value={content} setValue={setContent} max={2_000} disabled={disabled} /> 191 + <ControlledInput placeholder="Embed Title" value={embed} setValue={setEmbed} max={256} dataName="title" disabled={disabled} /> 192 + <ControlledInput placeholder="Embed Description" value={embed} setValue={setEmbed} max={4_096} dataName="description" disabled={disabled} /> 193 193 <div className="flex gap-2"> 194 - <DumbColorInput placeholder="Embed Color" value={embed} setValue={setEmbed} dataName="color" disabled={disabled} /> 195 - <DumbTextInput placeholder="Embed Thumbnail" value={embed} setValue={setEmbed} max={256} dataName="thumbnail" disabled={disabled} /> 194 + <ControlledColorInput placeholder="Embed Color" value={embed} setValue={setEmbed} dataName="color" disabled={disabled} /> 195 + <ControlledInput placeholder="Embed Thumbnail" value={embed} setValue={setEmbed} max={256} dataName="thumbnail" disabled={disabled} /> 196 196 </div> 197 - <DumbTextInput placeholder="Embed Image" value={embed} setValue={setEmbed} max={256} dataName="image" disabled={disabled} /> 197 + <ControlledInput placeholder="Embed Image" value={embed} setValue={setEmbed} max={256} dataName="image" disabled={disabled} /> 198 198 <div className="flex gap-2"> 199 - <DumbTextInput placeholder="Embed Footer Icon" value={embedfooter} setValue={setEmbedfooter} max={256} dataName="icon_url" disabled={disabled} /> 200 - <DumbTextInput placeholder="Embed Footer" value={embedfooter} setValue={setEmbedfooter} max={256} dataName="text" disabled={disabled} /> 199 + <ControlledInput placeholder="Embed Footer Icon" value={embedfooter} setValue={setEmbedfooter} max={256} dataName="icon_url" disabled={disabled} /> 200 + <ControlledInput placeholder="Embed Footer" value={embedfooter} setValue={setEmbedfooter} max={256} dataName="text" disabled={disabled} /> 201 201 </div> 202 202 203 203 <Button ··· 266 266 </div> 267 267 268 268 </div> 269 - <div className="text-sm m-1 text-neutral-500"> 270 - The preview might display things wrong* 271 - </div> 272 269 270 + <div className="flex justify-between"> 271 + <div className="text-sm m-1 text-neutral-500"> 272 + The preview might display things wrong* 273 + </div> 274 + <div className="flex gap-2"> 275 + {error && <div className="ml-auto text-red-500 text-sm">{error}</div>} 276 + {state === State.Success && <div className="ml-auto text-green-500 text-sm">Saved</div>} 277 + </div> 278 + </div> 273 279 </div>} 274 280 275 281 </div> 276 - 277 - <div className="flex relative bottom-3"> 278 - <div className="ml-auto mb-2"> 279 - {error && <div className="ml-auto text-red-500 text-sm">{error}</div>} 280 - {state === State.Success && <div className="ml-auto text-green-500 text-sm">Saved</div>} 281 - </div> 282 - </div> 283 - 284 282 </div> 285 283 ); 286 284 }
+113 -98
components/inputs/color-input.tsx
··· 1 - import type { ApiError } from "@/typings"; 2 - import { useEffect, useState } from "react"; 1 + "use client"; 2 + 3 + import { cn } from "@/utils/cn"; 4 + import { type InputProps, InputState, useInput } from "@/utils/input"; 5 + import { AnimatePresence, motion } from "motion/react"; 6 + import Link from "next/link"; 7 + import { useId, useState } from "react"; 8 + import { AiOutlineEdit } from "react-icons/ai"; 3 9 import { TailSpin } from "react-loading-icons"; 4 10 5 - import DumbColorInput from "./dumb-color-input"; 6 - import { useStateDebounced } from "../../utils/useDebounce"; 7 - 8 - enum State { 9 - Idle = 0, 10 - Loading = 1, 11 - Success = 2 12 - } 11 + import { Badge } from "../ui/badge"; 13 12 14 13 interface Props { 15 - name: string; 16 - url: string; 17 - dataName: string; 18 - disabled?: boolean; 19 - description?: string; 20 - defaultState: string | number; 21 - resetState?: string | number; 22 - 14 + link?: string; 15 + badge?: string; 16 + resetState?: number; 23 17 placeholder?: string; 18 + } 24 19 25 - onSave?: (value: string | number) => void; 26 - } 20 + export function InputColor({ 21 + className, 27 22 28 - export default function ColorInput({ 29 - name, 30 - url, 31 - dataName, 32 - disabled, 23 + label, 24 + name, // @deprecated using label 25 + link, 26 + badge, 33 27 description, 34 - defaultState, 28 + disabled, 35 29 resetState, 36 30 placeholder, 37 - onSave 38 - }: Props) { 39 - const [state, setState] = useState<State>(State.Idle); 40 - const [error, setError] = useState<string | null>(null); 41 31 42 - const [valuedebounced, setValuedebounced] = useStateDebounced<string | number>("", 1_000); 43 - const [value, setValue] = useState<string | number>(""); 44 - const [defaultStatealue, setdefaultStatealue] = useState<string | number>(""); 32 + endpoint, 33 + url, // @deprecated - use endpoint instead 34 + k, 35 + dataName, // @deprecated - use k instead 45 36 46 - useEffect(() => { 47 - if (!defaultStatealue) setdefaultStatealue(defaultState); 48 - setValue(defaultState); 49 - }, [defaultState]); 37 + defaultState, 38 + transform, 50 39 51 - useEffect(() => { 52 - if (defaultStatealue === value) return; 53 - setError(null); 54 - setState(State.Loading); 40 + onSave 41 + }: InputProps<number> & Props) { 42 + const { 43 + value, 44 + state, 45 + error, 46 + update, 47 + reset 48 + } = useInput({ 49 + endpoint, 50 + url, 51 + k, 52 + dataName, 55 53 56 - fetch(`${process.env.NEXT_PUBLIC_API}${url}`, { 57 - method: "PATCH", 58 - credentials: "include", 59 - headers: { 60 - "Content-Type": "application/json" 61 - }, 62 - body: JSON.stringify({ [dataName]: value || 0x00_00_00 }) 63 - }) 64 - .then(async (res) => { 65 - const response = await res.json(); 66 - if (!response) return; 54 + defaultState, 55 + transform: transform ?? ((v) => v || 0x00_00_00), 67 56 68 - switch (res.status) { 69 - case 200: { 70 - setValue(value || 0x00_00_00); 71 - onSave?.(value || 0x00_00_00); 72 - setdefaultStatealue(value || 0x00_00_00); 57 + onSave, 58 + debounceMs: 1_000 59 + }); 73 60 74 - setState(State.Success); 75 - setTimeout(() => setState(State.Idle), 1_000 * 8); 76 - break; 77 - } 78 - default: { 79 - setState(State.Idle); 80 - setError((response as unknown as ApiError).message); 81 - break; 82 - } 83 - } 61 + const inputId = useId(); 62 + const [isHovered, setIsHovered] = useState(false); 84 63 85 - }) 86 - .catch(() => { 87 - setState(State.Idle); 88 - setError("Error while updatung"); 89 - }); 64 + const colorHex = value ? `#${value.toString(16).padStart(6, "0")}` : "#ffffff"; 90 65 91 - }, [valuedebounced]); 66 + const isDisabled = state === InputState.Loading || disabled; 92 67 93 68 return ( 94 - <div className="relative w-full"> 69 + <div className={cn("relative w-full", description && "mb-2", className)}> 70 + <div className="flex items-center gap-2 mb-1"> 71 + <span className="sm:text-lg font-medium text-neutral-100"> 72 + {label || name} 73 + </span> 74 + 75 + {badge && ( 76 + <Badge variant="flat" size="sm"> 77 + {badge} 78 + </Badge> 79 + )} 95 80 96 - <div className="flex items-center gap-2"> 97 - <span className="text-lg dark:text-neutral-300 text-neutral-700 font-medium">{name}</span> 98 - {state === State.Loading && <TailSpin stroke="#d4d4d4" strokeWidth={8} className="relative h-3 w-3 overflow-visible" />} 81 + {state === InputState.Loading && ( 82 + <TailSpin stroke="#d4d4d4" strokeWidth={8} className="relative h-3 w-3 overflow-visible" /> 83 + )} 99 84 100 - {(resetState && resetState !== value) && 85 + {resetState !== undefined && resetState !== value && ( 101 86 <button 102 87 className="text-sm ml-auto text-violet-400/60 hover:text-violet-400/90 duration-200" 103 - onClick={() => { 104 - setValue(resetState); 105 - setValuedebounced(resetState); 106 - setState(State.Idle); 107 - }} 88 + onClick={reset} 108 89 disabled={disabled} 109 90 > 110 91 reset 111 92 </button> 112 - } 93 + )} 113 94 </div> 114 95 115 - <DumbColorInput 116 - value={value} 117 - setValue={(v) => { 118 - setValue(v); 119 - setValuedebounced(v); 120 - setState(State.Idle); 96 + {/* Hidden color input */} 97 + <input 98 + className="absolute -bottom-2 left-0 w-0 h-0 opacity-0 pointer-events-none" 99 + id={inputId} 100 + placeholder={placeholder} 101 + onChange={(e) => { 102 + const color = Number.parseInt(e.target.value.slice(1), 16); 103 + update(color || 0); 121 104 }} 122 - disabled={disabled} 123 - placeholder={placeholder} 124 - description={description} 105 + value={colorHex} 106 + disabled={isDisabled} 107 + type="color" 125 108 /> 126 109 127 - <div className="flex absolute right-0 bottom-0"> 128 - {error && 129 - <div className="ml-auto text-red-500 text-sm"> 110 + {/* Color display label */} 111 + <label 112 + htmlFor={inputId} 113 + className={cn( 114 + "block w-full h-12 rounded-lg cursor-pointer relative overflow-hidden", 115 + "focus-within:outline-violet-400 focus-within:outline-2 focus-within:outline-offset-2", 116 + isDisabled && "cursor-not-allowed opacity-50" 117 + )} 118 + style={{ backgroundColor: colorHex }} 119 + onPointerEnter={() => setIsHovered(true)} 120 + onPointerLeave={() => setIsHovered(false)} 121 + > 122 + <AnimatePresence initial={false} mode="wait"> 123 + {isHovered && ( 124 + <motion.div 125 + initial={{ opacity: 0 }} 126 + animate={{ opacity: 1 }} 127 + exit={{ opacity: 0 }} 128 + transition={{ duration: 0.15, ease: "easeInOut" }} 129 + className="absolute inset-0 bg-black/50 flex items-center justify-center" 130 + > 131 + <AiOutlineEdit className="w-6 h-6 text-white/80" /> 132 + </motion.div> 133 + )} 134 + </AnimatePresence> 135 + </label> 136 + 137 + <div className="mt-1"> 138 + {description && ( 139 + <div className="text-neutral-500 text-sm"> 140 + {description} {link && <Link href={link} target="_blank" className="text-violet-400 hover:underline">Learn more</Link>} 141 + </div> 142 + )} 143 + 144 + {error && ( 145 + <div className="text-red-500 text-sm"> 130 146 {error} 131 147 </div> 132 - } 148 + )} 133 149 </div> 134 - 135 150 </div> 136 151 ); 137 152 }
+116
components/inputs/controlled-color-input.tsx
··· 1 + "use client"; 2 + 3 + import { cn } from "@/utils/cn"; 4 + import { AnimatePresence, motion } from "motion/react"; 5 + import { useId, useMemo, useState } from "react"; 6 + import { AiOutlineEdit } from "react-icons/ai"; 7 + 8 + interface Props { 9 + className?: string; 10 + label?: string; 11 + placeholder?: string; 12 + 13 + value: string | number; 14 + setValue: (value: string) => void; 15 + 16 + disabled?: boolean; 17 + description?: string; 18 + 19 + dataName?: string; 20 + } 21 + 22 + export function ControlledColorInput({ 23 + className, 24 + label, 25 + value, 26 + setValue, 27 + disabled, 28 + description, 29 + dataName 30 + }: Props) { 31 + const inputId = useId(); 32 + const [isHovered, setIsHovered] = useState(false); 33 + 34 + const actualValue = useMemo(() => { 35 + if (dataName) { 36 + if (typeof value !== "string") { 37 + console.warn("ControlledColorInput: dataName is set but value is not a string"); 38 + return 0; 39 + } 40 + try { 41 + return JSON.parse(value)[dataName] ?? 0; 42 + } catch { 43 + return 0; 44 + } 45 + } 46 + return typeof value === "number" ? value : 0; 47 + }, [dataName, value]); 48 + 49 + const colorHex = actualValue ? `#${actualValue.toString(16).padStart(6, "0")}` : "#ffffff"; 50 + 51 + const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => { 52 + const color = Number.parseInt(e.target.value.slice(1), 16); 53 + 54 + if (dataName && typeof value === "string") { 55 + try { 56 + const parsed = JSON.parse(value); 57 + setValue(JSON.stringify({ ...parsed, [dataName]: color })); 58 + } catch { 59 + setValue(JSON.stringify({ [dataName]: color })); 60 + } 61 + } else { 62 + setValue(String(color)); 63 + } 64 + }; 65 + 66 + return ( 67 + <div className={cn("relative select-none w-full max-w-full mb-3", className)}> 68 + {label && ( 69 + <div className="flex items-center gap-2 mb-1"> 70 + <span className="text-lg dark:text-neutral-300 text-neutral-700 font-medium">{label}</span> 71 + </div> 72 + )} 73 + 74 + <input 75 + className="absolute -bottom-2 left-0 w-0 h-0 opacity-0 pointer-events-none" 76 + id={inputId} 77 + onChange={handleChange} 78 + value={colorHex} 79 + disabled={disabled} 80 + type="color" 81 + /> 82 + 83 + <label 84 + htmlFor={inputId} 85 + className={cn( 86 + "block w-full h-12 rounded-lg cursor-pointer relative overflow-hidden", 87 + "focus-within:outline-violet-400 focus-within:outline-2 focus-within:outline-offset-2", 88 + disabled && "cursor-not-allowed opacity-50" 89 + )} 90 + style={{ backgroundColor: colorHex }} 91 + onPointerEnter={() => setIsHovered(true)} 92 + onPointerLeave={() => setIsHovered(false)} 93 + > 94 + <AnimatePresence initial={false} mode="wait"> 95 + {isHovered && ( 96 + <motion.div 97 + initial={{ opacity: 0 }} 98 + animate={{ opacity: 1 }} 99 + exit={{ opacity: 0 }} 100 + transition={{ duration: 0.15, ease: "easeInOut" }} 101 + className="absolute inset-0 bg-black/50 flex items-center justify-center" 102 + > 103 + <AiOutlineEdit className="w-6 h-6 text-white/80" /> 104 + </motion.div> 105 + )} 106 + </AnimatePresence> 107 + </label> 108 + 109 + {description && ( 110 + <div className="dark:text-neutral-500 text-neutral-400 text-sm mt-1"> 111 + {description} 112 + </div> 113 + )} 114 + </div> 115 + ); 116 + }
+121
components/inputs/controlled-input.tsx
··· 1 + "use client"; 2 + 3 + import { cn } from "@/utils/cn"; 4 + import { useMemo } from "react"; 5 + 6 + import { Input } from "../ui/input"; 7 + import { Textarea } from "../ui/textarea"; 8 + 9 + interface Props { 10 + className?: string; 11 + label?: string; 12 + placeholder?: string; 13 + 14 + value: string | null; 15 + setValue: (value: string) => void; 16 + 17 + disabled?: boolean; 18 + description?: string; 19 + max?: number; 20 + multiline?: boolean; 21 + type?: string; 22 + thin?: boolean; 23 + 24 + /** For use with JSON state - specifies which key to update */ 25 + dataName?: string; 26 + } 27 + 28 + /** 29 + * A controlled input component without API integration. 30 + * Use this for local state management in forms/modals. 31 + */ 32 + export function ControlledInput({ 33 + className, 34 + label, 35 + placeholder, 36 + value, 37 + setValue, 38 + disabled, 39 + description, 40 + max = 256, 41 + multiline, 42 + type, 43 + thin, 44 + dataName 45 + }: Props) { 46 + // Get actual value from JSON if dataName is provided 47 + const actualValue = useMemo(() => { 48 + if (dataName && typeof value === "string") { 49 + try { 50 + return JSON.parse(value)[dataName] ?? ""; 51 + } catch { 52 + return ""; 53 + } 54 + } 55 + return value ?? ""; 56 + }, [dataName, value]); 57 + 58 + const handleChange = (newValue: string) => { 59 + if (dataName && typeof value === "string") { 60 + try { 61 + const parsed = JSON.parse(value); 62 + setValue(JSON.stringify({ ...parsed, [dataName]: newValue || null })); 63 + } catch { 64 + setValue(JSON.stringify({ [dataName]: newValue || null })); 65 + } 66 + } else { 67 + setValue(newValue); 68 + } 69 + }; 70 + 71 + const length = actualValue?.length || 0; 72 + const showCharCount = type !== "color" && max - 64 < length; 73 + const nearLimit = max - 8 < length; 74 + 75 + return ( 76 + <div className={cn("relative select-none w-full max-w-full mb-3", className)}> 77 + {label && ( 78 + <div className="flex items-center gap-2 mb-1"> 79 + <span className="text-lg dark:text-neutral-300 text-neutral-700 font-medium">{label}</span> 80 + </div> 81 + )} 82 + 83 + {showCharCount && ( 84 + <div className={cn( 85 + "ml-auto text-xs absolute top-1 right-2", 86 + nearLimit ? "text-red-500" : "text-neutral-500" 87 + )}> 88 + {length}/{max} 89 + </div> 90 + )} 91 + 92 + {multiline || max > 300 ? ( 93 + <Textarea 94 + className="dark:bg-wamellow bg-wamellow-100 border-none resize-y min-h-28" 95 + placeholder={placeholder} 96 + value={actualValue} 97 + onChange={(e) => handleChange(e.target.value)} 98 + disabled={disabled} 99 + maxLength={max} 100 + rows={3} 101 + /> 102 + ) : ( 103 + <Input 104 + className={cn("dark:bg-wamellow bg-wamellow-100 border-none", thin && "h-10")} 105 + placeholder={placeholder} 106 + value={actualValue} 107 + onChange={(e) => handleChange(e.target.value)} 108 + disabled={disabled} 109 + maxLength={max} 110 + type={type} 111 + /> 112 + )} 113 + 114 + {description && ( 115 + <div className="dark:text-neutral-500 text-neutral-400 text-sm mt-1"> 116 + {description} 117 + </div> 118 + )} 119 + </div> 120 + ); 121 + }
-101
components/inputs/dumb-color-input.tsx
··· 1 - import { cn } from "@/utils/cn"; 2 - import { AnimatePresence, motion } from "motion/react"; 3 - import React, { useState } from "react"; 4 - import { AiOutlineEdit } from "react-icons/ai"; 5 - 6 - interface Props { 7 - name?: string; 8 - placeholder?: string; 9 - 10 - // eslint-disable-next-line @typescript-eslint/no-explicit-any 11 - value: any; 12 - // eslint-disable-next-line @typescript-eslint/no-explicit-any 13 - setValue: React.Dispatch<React.SetStateAction<any>>; 14 - 15 - disabled?: boolean; 16 - description?: string; 17 - thin?: boolean; 18 - 19 - dataName?: string; 20 - } 21 - 22 - export default function DumbColorInput({ 23 - name, 24 - placeholder, 25 - value, 26 - setValue, 27 - disabled, 28 - description, 29 - thin, 30 - dataName 31 - }: Props) { 32 - const className = cn( 33 - "mt-1 resize-none w-full dark:bg-wamellow bg-wamellow-100 rounded-lg flex items-center px-4 py-2 focus:outline-solid outline-violet-400 outline-2", 34 - thin ? "h-10" : "h-12", 35 - thin && "relative bottom-1", 36 - disabled && "cursor-not-allowed opacity-50" 37 - ); 38 - 39 - // this cuz there can be multiple color inputs on the same page, so it will bug, so we need to identify them 40 - const [inputId] = useState<string>(() => Math.random().toString(36).slice(2, 15) + Math.random().toString(36).slice(2, 15)); 41 - 42 - const [isHovered, setIsHovered] = useState<boolean>(false); 43 - 44 - return ( 45 - <div className="relative select-none w-full max-w-full mb-3"> 46 - {name && 47 - <div className="flex items-center gap-2"> 48 - <span className="text-lg dark:text-neutral-300 text-neutral-700 font-medium">{name}</span> 49 - </div> 50 - } 51 - 52 - <input 53 - className="absolute -bottom-2 left-0 w-0 h-0 opacity-0 pointer-events-none" 54 - id={inputId} 55 - placeholder={placeholder} 56 - onChange={(e) => { 57 - if (dataName) { 58 - setValue(JSON.stringify(Object.assign(JSON.parse(value), { [dataName]: Number.parseInt(e.target.value.slice(1), 16) }))); 59 - } else { 60 - setValue(Number.parseInt(e.target.value.slice(1), 16)); 61 - } 62 - }} 63 - value={(dataName ? JSON.parse(value)[dataName] : value) ? `#${(dataName ? JSON.parse(value)[dataName] : value)?.toString(16)}` : "#ffffff"} 64 - disabled={disabled} 65 - type={"color"} 66 - /> 67 - 68 - <label 69 - htmlFor={inputId} 70 - className={className} 71 - onPointerEnter={() => setIsHovered(true)} 72 - onPointerLeave={() => setIsHovered(false)} 73 - style={{ 74 - backgroundColor: (dataName ? JSON.parse(value)[dataName] : value) ? `#${(dataName ? JSON.parse(value)[dataName] : value)?.toString(16)}` : "#ffffff" 75 - }} 76 - > 77 - <AnimatePresence initial={false} mode="wait"> 78 - {isHovered && <motion.div 79 - initial={{ opacity: 0 }} 80 - animate={{ opacity: 1 }} 81 - exit={{ opacity: 0 }} 82 - transition={{ 83 - duration: 0.15, 84 - ease: "easeInOut" 85 - }} 86 - className="absolute top-0 left-0 w-full h-full bg-wamellow-900-alpha rounded-md pointer-events-none flex items-center justify-center"> 87 - <AiOutlineEdit className="w-6 h-6 text-[rgba(255,255,255,0.8)]" /> 88 - </motion.div> 89 - } 90 - </AnimatePresence> 91 - </label> 92 - 93 - {description && 94 - <div className="dark:text-neutral-500 text-neutral-400 text-sm mt-1"> 95 - {description} 96 - </div> 97 - } 98 - 99 - </div> 100 - ); 101 - }
-125
components/inputs/dumb-text-input.tsx
··· 1 - import { cn } from "@/utils/cn"; 2 - import React, { useMemo } from "react"; 3 - 4 - interface Props { 5 - name?: string; 6 - placeholder?: string; 7 - 8 - // eslint-disable-next-line @typescript-eslint/no-explicit-any 9 - value: any; 10 - // eslint-disable-next-line @typescript-eslint/no-explicit-any 11 - setValue: React.Dispatch<React.SetStateAction<any>>; 12 - 13 - disabled?: boolean; 14 - description?: string; 15 - max?: number; 16 - thin?: boolean; 17 - type?: string; 18 - multiline?: boolean; 19 - 20 - dataName?: string; 21 - } 22 - 23 - export default function DumbTextInput({ 24 - name, 25 - placeholder, 26 - value, 27 - setValue, 28 - disabled, 29 - description, 30 - max = 256, 31 - thin, 32 - type, 33 - multiline, 34 - dataName 35 - }: Props) { 36 - const className = cn( 37 - "resize-y w-full dark:bg-wamellow bg-wamellow-100 rounded-lg flex items-center px-3.5 py-2 focus:outline-violet-400 focus:outline-2", 38 - max > 300 ? "h-28" : (thin ? "h-10" : "h-12"), 39 - thin && "relative bottom-1", 40 - disabled && "cursor-not-allowed opacity-50" 41 - ); 42 - 43 - const length = useMemo(() => dataName ? JSON.parse(value)[dataName]?.length : value?.length || 0, [dataName, value]); 44 - 45 - return ( 46 - <div className="relative select-none w-full max-w-full mb-3"> 47 - {name && 48 - <div className="flex items-center gap-2"> 49 - <span className="text-lg dark:text-neutral-300 text-neutral-700 font-medium">{name}</span> 50 - </div> 51 - } 52 - 53 - {type !== "color" && (max - 64 < length) && 54 - <div className={`ml-auto text-xs absolute top-1 right-2 ${max - 8 < length ? "dark:text-red-500 text-red-400" : "dark:text-neutral-500 text-neutral-400"}`}> 55 - {value && <span>{length}</span>} 56 - / 57 - <span>{max}</span> 58 - </div> 59 - } 60 - 61 - {type === "color" ? 62 - <div 63 - className={cn(className, "mt-1 h-12 w-full rounded-md border dark:border-wamellow border-wamellow-100 bg-none")} 64 - style={{ backgroundColor: `#${(dataName ? JSON.parse(value)[dataName] : value)?.toString(16)}` }} 65 - > 66 - <input 67 - className="opacity-0 w-full h-full cursor-pointer" 68 - type="color" 69 - value={`#${(dataName ? JSON.parse(value)[dataName] : value)?.toString(16)}`} 70 - onChange={(e) => { 71 - const color = Number.parseInt(e.target.value.replace(/#/, ""), 16); 72 - 73 - if (dataName) { 74 - setValue(JSON.stringify(Object.assign(JSON.parse(value), { [dataName]: color || null }))); 75 - } else { 76 - setValue(color || null); 77 - } 78 - }} 79 - disabled={disabled} 80 - /> 81 - </div> 82 - : 83 - (max > 300 || multiline) ? 84 - <textarea 85 - className={className} 86 - placeholder={placeholder} 87 - onChange={(e) => { 88 - if (dataName) { 89 - setValue(JSON.stringify(Object.assign(JSON.parse(value), { [dataName]: e.target.value || null }))); 90 - } else { 91 - setValue(e.target.value || null); 92 - } 93 - }} 94 - value={(dataName ? JSON.parse(value)[dataName] : value) || ""} 95 - disabled={disabled} 96 - rows={2} 97 - maxLength={max || Infinity} 98 - /> 99 - : 100 - <input 101 - className={className} 102 - placeholder={placeholder} 103 - onChange={(e) => { 104 - if (dataName) { 105 - setValue(JSON.stringify(Object.assign(JSON.parse(value), { [dataName]: e.target.value || null }))); 106 - } else { 107 - setValue(e.target.value || null); 108 - } 109 - }} 110 - value={(dataName ? JSON.parse(value)[dataName] : value) || ""} 111 - disabled={disabled} 112 - type={type} 113 - maxLength={max || Infinity} 114 - /> 115 - } 116 - 117 - {description && 118 - <div className="dark:text-neutral-500 text-neutral-400 text-sm mt-1"> 119 - {description} 120 - </div> 121 - } 122 - 123 - </div> 124 - ); 125 - }
+155 -131
components/inputs/image-url-input.tsx
··· 1 - import type { ApiError } from "@/typings"; 1 + "use client"; 2 + 2 3 import { cn } from "@/utils/cn"; 3 - import { useEffect, useState } from "react"; 4 + import { type InputProps, InputState, useInput } from "@/utils/input"; 5 + import Link from "next/link"; 6 + import { useEffect, useRef, useState } from "react"; 4 7 import { TailSpin } from "react-loading-icons"; 5 8 6 - import DumbTextInput from "./dumb-text-input"; 9 + import { Badge } from "../ui/badge"; 10 + import { Input } from "../ui/input"; 7 11 8 - enum State { 12 + enum ImageState { 9 13 Idle = 0, 10 14 Loading = 1, 11 - Success = 2 12 - } 13 - 14 - enum ImageState { 15 - Errored = 1, 16 - Success = 2 15 + Errored = 2, 16 + Success = 3 17 17 } 18 18 19 19 interface Props { 20 - name: string; 21 - url: string; 22 - dataName: string; 23 - disabled?: boolean; 24 - description?: string; 25 - defaultState: string; 26 - ratio: `aspect-${number}/${number}`; 27 - 28 - onSave?: (value: string) => void; 20 + link?: string; 21 + badge?: string; 22 + ratio?: `aspect-${string}`; 29 23 } 30 24 31 - export default function ImageUrlInput({ 32 - name, 33 - url, 34 - dataName, 35 - disabled, 25 + export function InputImageUrl({ 26 + className, 27 + 28 + label, 29 + link, 30 + badge, 36 31 description, 32 + disabled, 33 + ratio = "aspect-[906/256]", 34 + 35 + endpoint, 36 + url, // @deprecated - use endpoint instead 37 + k, 38 + dataName, // @deprecated - use k instead 39 + 37 40 defaultState, 38 - onSave, 39 - ratio 40 - }: Props) { 41 - const [state, setState] = useState<State>(State.Idle); 42 - const [error, setError] = useState<string | null>(null); 41 + transform, 43 42 44 - const [value, setValue] = useState<string>(""); 45 - const [defaultStatealue, setdefaultStatealue] = useState<string>(""); 46 - const [imagestate, setImagestate] = useState<ImageState | undefined>(undefined); 43 + onSave 44 + }: InputProps<string> & Props) { 45 + const { 46 + value, 47 + state, 48 + error, 49 + update, 50 + save 51 + } = useInput({ 52 + endpoint, 53 + url, 54 + k, 55 + dataName, 56 + 57 + defaultState, 58 + transform: transform ?? ((v) => v || null), 47 59 48 - useEffect(() => { 49 - if (!defaultStatealue) setdefaultStatealue(defaultState); 50 - setValue(defaultState); 51 - }, [defaultState]); 60 + onSave, 61 + manual: true // Only save when image loads successfully 62 + }); 52 63 53 - useEffect(() => { 54 - if (!value?.length) setImagestate(ImageState.Success); 55 - }, [value]); 64 + const [imageState, setImageState] = useState<ImageState>(ImageState.Idle); 65 + const [debouncedUrl, setDebouncedUrl] = useState(value); 66 + const debounceRef = useRef<NodeJS.Timeout | null>(null); 56 67 68 + // Debounce URL changes before attempting to load image 57 69 useEffect(() => { 58 - if (imagestate !== ImageState.Success || defaultStatealue === value) return; 59 - setError(null); 60 - setState(State.Loading); 70 + if (debounceRef.current) { 71 + clearTimeout(debounceRef.current); 72 + } 61 73 62 - fetch(`${process.env.NEXT_PUBLIC_API}${url}`, { 63 - method: "PATCH", 64 - credentials: "include", 65 - headers: { 66 - "Content-Type": "application/json" 67 - }, 68 - body: JSON.stringify(dataName.includes(".") ? 69 - { [dataName.split(".")[0]]: { [dataName.split(".")[1]]: value || null } } 70 - : 71 - { [dataName]: value || null } 72 - ) 73 - }) 74 - .then(async (res) => { 75 - const response = await res.json(); 76 - if (!response) return; 74 + // If empty, update immediately 75 + if (!value?.length) { 76 + debounceRef.current = setTimeout(() => { 77 + setDebouncedUrl(value); 78 + setImageState(ImageState.Idle); 79 + }, 0); 80 + return () => { 81 + if (debounceRef.current) { 82 + clearTimeout(debounceRef.current); 83 + } 84 + }; 85 + } 77 86 78 - switch (res.status) { 79 - case 200: { 80 - setValue(value); 81 - setdefaultStatealue(value); 82 - onSave?.(value); 87 + setImageState(ImageState.Loading); 83 88 84 - setState(State.Success); 85 - setTimeout(() => setState(State.Idle), 1_000 * 8); 86 - break; 87 - } 88 - default: { 89 - setState(State.Idle); 90 - setError((response as unknown as ApiError).message); 91 - break; 92 - } 93 - } 89 + debounceRef.current = setTimeout(() => { 90 + setDebouncedUrl(value); 91 + }, 800); 94 92 95 - }) 96 - .catch(() => { 97 - setState(State.Idle); 98 - setError("Error while updatung"); 99 - }); 93 + return () => { 94 + if (debounceRef.current) { 95 + clearTimeout(debounceRef.current); 96 + } 97 + }; 98 + }, [value]); 100 99 101 - }, [imagestate]); 100 + const handleImageLoad = () => { 101 + setImageState(ImageState.Success); 102 + // Image loaded successfully, now save 103 + save(); 104 + }; 105 + 106 + const handleImageError = () => { 107 + setImageState(ImageState.Errored); 108 + // Don't save - image failed to load 109 + }; 110 + 111 + const isDisabled = state === InputState.Loading || disabled; 102 112 103 113 return ( 104 - <div className="relative"> 114 + <div className={cn("relative w-full", description && "mb-2", className)}> 115 + <div className="flex items-center gap-2 mb-1"> 116 + <span className="sm:text-lg font-medium text-neutral-100"> 117 + {label} 118 + </span> 105 119 106 - <div className="flex items-center gap-2"> 107 - <span className="text-lg dark:text-neutral-300 text-neutral-700 font-medium">{name}</span> 108 - {state === State.Loading && <TailSpin stroke="#d4d4d4" strokeWidth={8} className="relative h-3 w-3 overflow-visible" />} 120 + {badge && ( 121 + <Badge variant="flat" size="sm"> 122 + {badge} 123 + </Badge> 124 + )} 125 + 126 + {state === InputState.Loading && ( 127 + <TailSpin stroke="#d4d4d4" strokeWidth={8} className="relative h-3 w-3 overflow-visible" /> 128 + )} 109 129 </div> 110 130 111 - <div className="lg:flex mt-1 w-full gap-4"> 131 + <div className="lg:flex w-full gap-4"> 132 + <div className="flex-1"> 133 + <Input 134 + className="dark:bg-wamellow bg-wamellow-100 border-none h-12" 135 + placeholder="Paste a direct image url..." 136 + value={value || ""} 137 + onChange={(e) => update(e.target.value)} 138 + disabled={isDisabled} 139 + maxLength={256} 140 + /> 112 141 113 - <DumbTextInput 114 - value={value} 115 - setValue={(v) => { 116 - setValue(v); 117 - setState(State.Idle); 118 - if (imagestate === ImageState.Success) setImagestate(undefined); 119 - }} 120 - disabled={disabled} 121 - placeholder="Paste a direct image url..." 122 - max={256} 123 - description={description + " At this time, only .PNG files are supported."} 124 - /> 142 + {description && ( 143 + <div className="text-neutral-500 text-sm mt-1"> 144 + {description} 145 + {link && <> <Link href={link} target="_blank" className="text-violet-400 hover:underline">Learn more</Link></>} 146 + </div> 147 + )} 125 148 126 - <div className="max-w-1/2 w-full"> 149 + {error && ( 150 + <div className="text-red-500 text-sm mt-1"> 151 + {error} 152 + </div> 153 + )} 154 + </div> 127 155 128 - {value && imagestate !== ImageState.Errored ? 129 - /* eslint-disable-next-line @next/next/no-img-element */ 130 - <img 131 - src={value} 132 - alt="upload" 133 - className={cn("rounded-lg w-full h-full object-cover aspect-906/256", ratio)} 134 - onError={() => setImagestate(ImageState.Errored)} 135 - onLoad={() => setImagestate(ImageState.Success)} 136 - /> 137 - : 156 + <div className="lg:max-w-1/2 w-full mt-2 lg:mt-0"> 157 + {debouncedUrl && imageState !== ImageState.Errored ? ( 158 + <div className="relative"> 159 + {/* eslint-disable-next-line @next/next/no-img-element */} 160 + <img 161 + src={debouncedUrl} 162 + alt="Preview" 163 + className={cn( 164 + "rounded-lg w-full h-full object-cover", 165 + ratio, 166 + imageState === ImageState.Loading && "opacity-50" 167 + )} 168 + onError={handleImageError} 169 + onLoad={handleImageLoad} 170 + /> 171 + {imageState === ImageState.Loading && ( 172 + <div className="absolute inset-0 flex items-center justify-center"> 173 + <TailSpin stroke="#d4d4d4" strokeWidth={8} className="h-8 w-8" /> 174 + </div> 175 + )} 176 + </div> 177 + ) : ( 138 178 <div className={cn( 139 - "w-full border-2 rounded-md flex items-center justify-center dark:border-wamellow border-wamellow-100", 140 - imagestate === ImageState.Errored && "dark:border-red-500 border-red-300", 179 + "w-full border-2 rounded-lg flex items-center justify-center dark:border-wamellow border-wamellow-100", 180 + imageState === ImageState.Errored && "dark:border-red-500 border-red-300", 141 181 ratio 142 182 )}> 143 - {imagestate === ImageState.Errored ? 144 - <div className="text-red-400 m-4"> 183 + {imageState === ImageState.Errored ? ( 184 + <div className="text-red-400 m-4 text-center"> 145 185 <div className="font-medium">Enter a valid image url!</div> 146 - <div className="text-xs"> 186 + <div className="text-xs mt-1"> 147 187 <div>Recommended resolution: 1024x256</div> 148 188 <div>Supported types: .png, .jpg, .jpeg, .webp</div> 149 189 </div> 150 - {/* eslint-disable-next-line @next/next/no-img-element */} 151 - <img 152 - src={value} 153 - className="w-0 h-0" 154 - onLoad={() => setImagestate(ImageState.Success)} 155 - /> 156 190 </div> 157 - : 158 - <span className="text-neutral-400">Enter a image url to preview</span> 159 - } 191 + ) : ( 192 + <span className="text-neutral-400">Enter an image url to preview</span> 193 + )} 160 194 </div> 161 - } 162 - 195 + )} 163 196 </div> 164 - 165 - </div> 166 - 167 - <div className="flex"> 168 - {error && ( 169 - <div className="ml-auto text-red-500 text-sm"> 170 - {error} 171 - </div> 172 - )} 173 197 </div> 174 198 </div> 175 199 );
+190 -178
components/inputs/multi-select-menu.tsx
··· 1 - import type { ApiError } from "@/typings"; 1 + "use client"; 2 + 2 3 import { cn } from "@/utils/cn"; 3 - import { useEffect, useState } from "react"; 4 - import { HiCheck, HiChevronDown, HiExclamationCircle, HiX } from "react-icons/hi"; 4 + import { type InputProps, InputState, useInput } from "@/utils/input"; 5 + import Link from "next/link"; 6 + import { useCallback, useEffect, useRef, useState } from "react"; 7 + import { HiChevronDown, HiExclamationCircle, HiX } from "react-icons/hi"; 5 8 import { TailSpin } from "react-loading-icons"; 6 9 7 - import { ClickOutside } from "../click-outside"; 8 - 9 - enum State { 10 - Idle = 0, 11 - Loading = 1, 12 - Success = 2 13 - } 10 + import { Badge } from "../ui/badge"; 11 + import { 12 + DropdownMenu, 13 + DropdownMenuCheckboxItem, 14 + DropdownMenuContent, 15 + DropdownMenuTrigger 16 + } from "../ui/dropdown-menu"; 14 17 15 - interface Item<T extends string | number> { 18 + export interface MultiSelectItem<T extends string | number> { 16 19 icon?: React.ReactNode; 17 20 name: string; 18 21 value: T; ··· 21 24 } 22 25 23 26 interface Props<T extends string | number> { 24 - className?: string; 25 - 26 - name: string; 27 - url?: string; 28 - dataName?: string; 29 - items: Item<T>[]; 30 - disabled?: boolean; 27 + link?: string; 28 + badge?: string; 29 + items: MultiSelectItem<T>[]; 31 30 max?: number; 32 - description?: string; 33 - defaultState?: T[]; 34 - 35 - onSave?: (options: { name: string; value: T; error?: string; }[]) => void; 36 31 } 37 32 38 - export default function MultiSelectMenu<T extends string | number>({ 33 + export function InputMultiSelect<T extends string | number>({ 39 34 className, 40 - name, 41 - url, 42 - dataName, 43 - items = [], 35 + 36 + label, 37 + name, // @deprecated - use label instead 38 + link, 39 + badge, 40 + description, 44 41 disabled, 42 + items = [], 45 43 max = Infinity, 46 - description, 44 + 45 + endpoint, 46 + url, // @deprecated - use endpoint instead 47 + k, 48 + dataName, // @deprecated - use k instead 49 + 47 50 defaultState, 51 + transform, 52 + 48 53 onSave 49 - }: Props<T>) { 50 - const [state, setState] = useState<State>(State.Idle); 51 - const [error, setError] = useState<string | null>(null); 54 + }: InputProps<T[]> & Props<T>) { 55 + const { 56 + value, 57 + state, 58 + error, 59 + update, 60 + save 61 + } = useInput({ 62 + endpoint, 63 + url, 64 + k, 65 + dataName, 52 66 53 - const [open, setOpen] = useState<boolean>(false); 54 - const [defaultvalue, setDefaultalue] = useState<T[]>([]); 55 - const [values, setValues] = useState<Item<T>[]>([]); 67 + defaultState, 68 + transform, 56 69 57 - useEffect(() => { 58 - if (!defaultState) return; 70 + onSave, 71 + manual: true // Save only when menu closes or after debounce 72 + }); 59 73 60 - setValues(items.filter((i) => defaultState?.includes(i.value))); 61 - setDefaultalue(defaultState); 62 - }, [defaultState, items]); 74 + const [open, setOpen] = useState(false); 75 + const debounceRef = useRef<NodeJS.Timeout | null>(null); 76 + const valueRef = useRef(value); 63 77 78 + // Keep valueRef in sync 64 79 useEffect(() => { 65 - if (values.some((v) => Boolean(v.error)) || JSON.stringify(values.map((v) => v.value)) === JSON.stringify(defaultvalue)) { 66 - setState(State.Idle); 67 - return; 80 + valueRef.current = value; 81 + }, [value]); 82 + 83 + // Debounce save after 5 seconds of inactivity while menu is open 84 + const debouncedSave = useCallback(() => { 85 + if (debounceRef.current) { 86 + clearTimeout(debounceRef.current); 68 87 } 88 + debounceRef.current = setTimeout(() => { 89 + save(); 90 + }, 5_000); 91 + }, [save]); 69 92 70 - setError(null); 93 + // Clear debounce on unmount 94 + useEffect(() => { 95 + return () => { 96 + if (debounceRef.current) { 97 + clearTimeout(debounceRef.current); 98 + } 99 + }; 100 + }, []); 71 101 72 - if (!url) { 73 - if (!onSave) throw new Error("Warning: <MultiSelectMenu.onSave> must be defined when not using <MultiSelectMenu.url>."); 74 - onSave(values); 75 - setState(State.Idle); 76 - return; 77 - } 102 + const selectedItems = items.filter((i) => value.includes(i.value)); 78 103 79 - if (!dataName) throw new Error("Warning: <MultiSelectMenu.dataName> must be defined when using <MultiSelectMenu.url>."); 104 + const handleToggle = (item: MultiSelectItem<T>) => { 105 + if (item.error) return; 80 106 81 - setState(State.Loading); 107 + const isSelected = value.includes(item.value); 82 108 83 - fetch(`${process.env.NEXT_PUBLIC_API}${url}`, { 84 - method: "PATCH", 85 - credentials: "include", 86 - headers: { 87 - "Content-Type": "application/json" 88 - }, 89 - body: JSON.stringify(dataName.includes(".") ? 90 - { [dataName.split(".")[0]]: { [dataName.split(".")[1]]: values.map((v) => v.value) } } 91 - : 92 - { [dataName]: values.map((v) => v.value) } 93 - ) 94 - }) 95 - .then(async (res) => { 96 - const response = await res.json(); 97 - if (!response) return; 109 + if (isSelected) { 110 + update(value.filter((v) => v !== item.value)); 111 + } else if (value.length < max) { 112 + update([...value, item.value]); 113 + } 98 114 99 - switch (res.status) { 100 - case 200: { 101 - onSave?.(values); 102 - setState(State.Success); 103 - setTimeout(() => setState(State.Idle), 1_000 * 8); 104 - break; 105 - } 106 - default: { 107 - setState(State.Idle); 108 - setError((response as unknown as ApiError).message); 109 - break; 110 - } 111 - } 115 + // Trigger debounced save 116 + debouncedSave(); 117 + }; 112 118 113 - }) 114 - .catch(() => { 115 - setState(State.Idle); 116 - setError("Error while updating"); 117 - }); 119 + const handleRemove = (e: React.PointerEvent, itemValue: T) => { 120 + // Prevent the dropdown from opening 121 + e.preventDefault(); 122 + e.stopPropagation(); 123 + const newValue = value.filter((v) => v !== itemValue); 124 + update(newValue); 125 + save(newValue); 126 + }; 118 127 119 - }, [open]); 128 + const handleOpenChange = (isOpen: boolean) => { 129 + setOpen(isOpen); 130 + 131 + if (!isOpen) { 132 + // Menu closed - save and clear any pending debounce 133 + if (debounceRef.current) { 134 + clearTimeout(debounceRef.current); 135 + debounceRef.current = null; 136 + } 137 + save(); 138 + } 139 + }; 140 + 141 + const isDisabled = state === InputState.Loading || disabled; 142 + const hasErrors = selectedItems.some((v) => Boolean(v.error)); 120 143 121 144 return ( 122 - <div className={cn("select-none w-full max-w-full mb-3 relative", className)}> 123 - <div className="flex items-center gap-2"> 124 - <span className="text-lg dark:text-neutral-300 text-neutral-700 font-medium">{name}</span> 125 - {state === State.Loading && <TailSpin stroke="#d4d4d4" strokeWidth={8} className="relative h-3 w-3 overflow-visible" />} 126 - </div> 145 + <div className={cn("select-none w-full max-w-full relative", description && "mb-2", className)}> 146 + <div className="flex items-center gap-2 mb-1"> 147 + <span className="sm:text-lg font-medium text-neutral-100"> 148 + {label || name} 149 + </span> 127 150 128 - <button 129 - className={cn( 130 - "mt-1 min-h-12 w-full bg-wamellow rounded-lg flex items-center px-3 duration-100 wamellow-modal", 131 - open && "outline-solid outline-violet-400 outline-2", 132 - (values.some((v) => Boolean(v.error)) || error) && !open && "outline-solid outline-red-500 outline-1", 133 - state === State.Success && !open && "outline-solid outline-green-500 outline-1", 134 - (state === State.Loading || disabled) && "cursor-not-allowed opacity-50" 151 + {badge && ( 152 + <Badge variant="flat" size="sm"> 153 + {badge} 154 + </Badge> 135 155 )} 136 - onClick={() => { 137 - setOpen(!open); 138 - if (!open) setDefaultalue(values.map((v) => v.value)); 139 - }} 140 - disabled={state === State.Loading || disabled} 141 - > 142 - <div 156 + 157 + {state === InputState.Loading && ( 158 + <TailSpin stroke="#d4d4d4" strokeWidth={8} className="relative h-3 w-3 overflow-visible" /> 159 + )} 160 + </div> 161 + 162 + <DropdownMenu open={open} onOpenChange={handleOpenChange}> 163 + <DropdownMenuTrigger 143 164 className={cn( 144 - "flex flex-wrap overflow-x-hidden gap-1 py-3 dark:text-neutral-600 text-neutral-400", 145 - values.length && "dark:text-neutral-300 text-neutral-700" 165 + "min-h-12 w-full dark:bg-wamellow bg-wamellow-100 rounded-lg flex items-center px-3 text-left", 166 + "focus:outline-violet-400 focus:outline-2 focus:outline-offset-2", 167 + hasErrors && "outline-solid outline-red-500 outline-1", 168 + state === InputState.Success && "outline-solid outline-green-500 outline-1", 169 + isDisabled && "cursor-not-allowed opacity-50" 146 170 )} 171 + disabled={isDisabled} 147 172 > 148 - {!values.length && <span>Select..</span>} 149 - {values.map((v) => ( 150 - <button 151 - key={"multiselected-" + v.value} 152 - className={cn( 153 - "relative px-2 bg-wamellow rounded-md flex items-center gap-1 wamellow-modal", 154 - open && "hover:bg-red-500/50! text-neutral-100 duration-200" 155 - )} 156 - onClick={(e) => { 157 - if (!open) return; 158 - e.stopPropagation(); 159 - setValues((_v) => { 160 - return _v.filter((i) => i.value !== v.value); 161 - }); 162 - }} 163 - > 164 - {v.icon && <span>{v.icon}</span>} 165 - <span>{v.name}</span> 166 - {open && <HiX className="h-4 w-4" />} 167 - </button> 168 - ))} 169 - </div> 170 - <div className="ml-auto flex items-center gap-2"> 171 - {values.some((v) => Boolean(v.error)) && 172 - <div className="text-sm flex items-center gap-1 text-red-500"> 173 - <HiExclamationCircle /> {values.find((v) => v.error)?.error} 174 - </div> 175 - } 176 - {max !== Infinity && 177 - <span className="dark:text-neutral-600 text-neutral-400"> 178 - {values.length}/{max} 179 - </span> 180 - } 181 - <HiChevronDown /> 182 - </div> 183 - </button> 173 + <div 174 + className={cn( 175 + "flex flex-wrap overflow-x-hidden gap-1 py-2", 176 + selectedItems.length ? "text-neutral-100" : "text-neutral-500" 177 + )} 178 + > 179 + {!selectedItems.length && <span>Select..</span>} 180 + {selectedItems.map((item) => ( 181 + <button 182 + key={"multiselected-" + item.value} 183 + className={cn( 184 + "relative px-2 py-0.5 bg-wamellow rounded-md flex items-center gap-1", 185 + "hover:bg-red-500/50 text-neutral-100 duration-200 group" 186 + )} 187 + onPointerDown={(e) => handleRemove(e, item.value)} 188 + > 189 + {item.icon && <span className="group-hover:hidden">{item.icon}</span>} 190 + <HiX className="size-4 hidden group-hover:block" /> 191 + <span>{item.name}</span> 192 + </button> 193 + ))} 194 + </div> 184 195 185 - {open && 186 - <div className="absolute mt-2 w-full bg-wamellow backdrop-blur-lg backdrop-brightness-50 rounded-lg max-h-40 overflow-y-scroll shadow-lg z-20 wamellow-modal"> 187 - <ClickOutside onClose={(() => setOpen(false))} /> 196 + <div className="ml-auto flex items-center gap-2"> 197 + {hasErrors && ( 198 + <div className="text-sm flex items-center gap-1 text-red-500"> 199 + <HiExclamationCircle /> {selectedItems.find((v) => v.error)?.error} 200 + </div> 201 + )} 202 + {max !== Infinity && ( 203 + <span className="text-neutral-500"> 204 + {value.length}/{max} 205 + </span> 206 + )} 207 + <HiChevronDown /> 208 + </div> 209 + </DropdownMenuTrigger> 210 + 211 + <DropdownMenuContent className="w-[var(--radix-dropdown-menu-trigger-width)] max-h-40"> 188 212 {items.map((item) => ( 189 - <button 213 + <DropdownMenuCheckboxItem 214 + key={"multiselect-" + item.value} 190 215 className={cn( 191 - "p-4 py-2 w-full text-left duration-200 flex items-center hover:bg-wamellow", 216 + "cursor-pointer", 192 217 item.error && "dark:bg-red-500/10 dark:hover:bg-red-500/25 bg-red-500/30 hover:bg-red-500/40" 193 218 )} 194 219 style={item.color ? { color: `#${item.color.toString(16)}` } : {}} 195 - key={"multiselect-" + item.value} 196 - onClick={() => { 197 - setState(State.Idle); 198 - setValues((v) => { 199 - if (v.length >= max || v.some((i) => i.value === item.value)) return v.filter((i) => i.value !== item.value); 200 - return [...v, item]; 201 - }); 202 - }} 220 + checked={value.includes(item.value)} 221 + onCheckedChange={() => handleToggle(item)} 222 + onSelect={(e) => e.preventDefault()} // Prevent menu from closing 223 + disabled={Boolean(item.error) || (!value.includes(item.value) && value.length >= max)} 203 224 > 204 - {item?.icon && 205 - <span className="mr-2"> 206 - {item?.icon} 207 - </span> 208 - } 225 + {item.icon && <span className="mr-2">{item.icon}</span>} 209 226 210 227 <span className="max-w-[calc(100%-1rem)] truncate"> 211 228 {item.name} 212 229 </span> 213 230 214 - {values.find((v) => v.value === item.value) && 215 - <HiCheck className="relative left-1 top-px" /> 216 - } 217 - 218 - {item.error && 231 + {item.error && ( 219 232 <div className="ml-auto text-sm flex items-center gap-1 text-red-500"> 220 233 <HiExclamationCircle /> {item.error} 221 234 </div> 222 - } 223 - </button> 235 + )} 236 + </DropdownMenuCheckboxItem> 224 237 ))} 225 - </div> 226 - } 238 + </DropdownMenuContent> 239 + </DropdownMenu> 227 240 228 - <div className={cn("mt-1 flex md:block", open && "opacity-0")}> 229 - {description && 230 - <div className="dark:text-neutral-500 text-neutral-400 text-sm"> 231 - {description} 241 + <div className="mt-1"> 242 + {description && ( 243 + <div className="text-neutral-500 text-sm"> 244 + {description} {link && <Link href={link} target="_blank" className="text-violet-400 hover:underline">Learn more</Link>} 232 245 </div> 233 - } 246 + )} 234 247 235 - {error && 236 - <div className="ml-auto text-red-500 text-sm"> 248 + {error && ( 249 + <div className="text-red-500 text-sm"> 237 250 {error} 238 251 </div> 239 - } 252 + )} 240 253 </div> 241 - 242 254 </div> 243 255 ); 244 256 }
+114 -157
components/inputs/number-input.tsx
··· 1 - import { webStore } from "@/common/webstore"; 2 - import type { ApiError } from "@/typings"; 1 + "use client"; 2 + 3 3 import { cn } from "@/utils/cn"; 4 + import { type InputProps, InputState, useInput } from "@/utils/input"; 5 + import Link from "next/link"; 4 6 import { useEffect, useRef, useState } from "react"; 5 7 import { HiMinus, HiPlus } from "react-icons/hi"; 6 8 import { TailSpin } from "react-loading-icons"; 7 9 10 + import { Badge } from "../ui/badge"; 8 11 import { Button } from "../ui/button"; 9 - 10 - enum State { 11 - Idle = 0, 12 - Loading = 1, 13 - Success = 2 14 - } 12 + import { Input } from "../ui/input"; 15 13 16 14 interface Props { 17 - className?: string; 18 - 19 - name: string; 20 - url?: string; 21 - dataName?: string; 22 - disabled?: boolean; 23 - description?: string; 24 - defaultState: number; 25 - 15 + link?: string; 16 + badge?: string; 26 17 min?: number; 27 18 max?: number; 28 - 29 - onSave?: (state: number) => void; 30 19 } 31 20 32 - export default function NumberInput({ 21 + export function InputNumber({ 33 22 className, 34 - name, 35 - url, 36 - dataName, 37 - disabled, 23 + 24 + label, 25 + link, 26 + badge, 38 27 description, 39 - defaultState, 28 + disabled, 40 29 41 30 min = 0, 42 31 max = Infinity, 43 32 33 + endpoint, 34 + url, // @deprecated - use endpoint instead 35 + k, 36 + dataName, // @deprecated - use k instead 37 + 38 + defaultState, 39 + transform, 40 + 44 41 onSave 45 - }: Props) { 46 - const web = webStore((w) => w); 42 + }: InputProps<number> & Props) { 43 + const { 44 + value, 45 + state, 46 + error, 47 + isDirty, 48 + update, 49 + save 50 + } = useInput({ 51 + endpoint, 52 + url, 53 + k, 54 + dataName, 47 55 48 - const [state, setState] = useState<State>(State.Idle); 49 - const [error, setError] = useState<string>(); 56 + defaultState, 57 + transform, 58 + 59 + onSave, 60 + manual: true // Require explicit save 61 + }); 50 62 51 63 const [hold, setHold] = useState<"+" | "-">(); 52 64 const intervalRef = useRef<NodeJS.Timeout | null>(null); 53 - 54 - const [value, setValue] = useState<number>(); 55 - const [def, setDef] = useState<number>(); 56 65 57 66 useEffect(() => { 58 67 if (!hold) { ··· 64 73 intervalRef.current = setInterval(() => { 65 74 if (Date.now() - start < 200) return; 66 75 67 - switch (hold) { 68 - case "+": 69 - setValue((prevCount) => { 70 - if ((prevCount ?? 0) + 1 > max) return max; 71 - return (prevCount ?? 0) + 1; 72 - }); 73 - break; 74 - case "-": 75 - setValue((prevCount) => { 76 - if ((prevCount ?? 0) - 1 < min) return min; 77 - return (prevCount ?? 0) - 1; 78 - }); 79 - break; 76 + if (hold === "+") { 77 + update(Math.min((value ?? 0) + 1, max)); 78 + } else { 79 + update(Math.max((value ?? 0) - 1, min)); 80 80 } 81 - 82 81 }, 50); 83 - }, [hold]); 84 82 85 - useEffect(() => { 86 - setValue(defaultState); 87 - setDef(defaultState); 88 - }, [defaultState]); 83 + return () => { 84 + if (intervalRef.current) clearInterval(intervalRef.current); 85 + }; 86 + }, [hold, value, min, max, update]); 89 87 90 - function handleSave() { 91 - if (def === value || value === undefined) return; 92 - setError(undefined); 93 - setState(State.Loading); 88 + const increment = () => { 89 + if ((value ?? 0) + 1 > max) update(max); 90 + else update((value ?? 0) + 1); 91 + }; 94 92 95 - if (!url) { 96 - if (!onSave) { 97 - setValue(def); 98 - throw new Error("Warning: <Switch.onSave> must be defined when not using <Switch.url>."); 99 - } 93 + const decrement = () => { 94 + if ((value ?? 0) - 1 < min) update(min); 95 + else update((value ?? 0) - 1); 96 + }; 100 97 101 - setState(State.Idle); 102 - setDef(value); 103 - return; 104 - } 98 + const isDisabled = state === InputState.Loading || disabled; 105 99 106 - if (!dataName) { 107 - setValue(def); 108 - throw new Error("Warning: <Switch.dataName> must be defined when using <Switch.url>."); 109 - } 100 + return ( 101 + <div className={cn("relative", description && "mb-6", className)}> 102 + <div className="flex items-center justify-between gap-2 mb-1"> 103 + <div className="flex items-center gap-2"> 104 + <span className="sm:text-lg font-medium text-neutral-100"> 105 + {label} 106 + </span> 110 107 111 - fetch(`${process.env.NEXT_PUBLIC_API}${url}`, { 112 - method: "PATCH", 113 - credentials: "include", 114 - headers: { 115 - "Content-Type": "application/json" 116 - }, 117 - body: JSON.stringify(dataName.includes(".") ? 118 - { [dataName.split(".")[0]]: { [dataName.split(".")[1]]: value } } 119 - : 120 - { [dataName]: value } 121 - ) 122 - }) 123 - .then(async (res) => { 124 - const response = await res.json(); 125 - if (!response) return; 126 - 127 - switch (res.status) { 128 - case 200: { 129 - onSave?.(value); 130 - setDef(value); 131 - 132 - setState(State.Success); 133 - setTimeout(() => setState(State.Idle), 1_000 * 8); 134 - break; 135 - } 136 - default: { 137 - setState(State.Idle); 138 - setError((response as unknown as ApiError).message); 139 - break; 140 - } 141 - } 142 - 143 - }) 144 - .catch(() => { 145 - setState(State.Idle); 146 - setError("Error while updating"); 147 - }); 148 - } 108 + {badge && ( 109 + <Badge variant="flat" size="sm"> 110 + {badge} 111 + </Badge> 112 + )} 149 113 150 - return ( 151 - <div className={cn("relative", className)}> 152 - <div className="flex items-center mb-6"> 153 - <div> 154 - <div className="flex gap-2"> 155 - <span className={`sm:text-lg ${value ? "dark:text-neutral-300 text-neutral-700" : "dark:text-neutral-400 text-neutral-600"} font-medium`}>{name}</span> 156 - {state === State.Loading && <TailSpin stroke="#d4d4d4" strokeWidth={8} className="relative h-3 w-3 overflow-visible" />} 157 - </div> 158 - 159 - {description && 160 - <div className={cn("w-full relative bottom-1 text-neutral-500 text-sm", web.width > 880 && "flex")}> 161 - {description} 162 - </div> 163 - } 114 + {state === InputState.Loading && ( 115 + <TailSpin stroke="#d4d4d4" strokeWidth={8} className="relative h-3 w-3 overflow-visible" /> 116 + )} 164 117 </div> 165 118 166 - <div 167 - className={cn( 168 - "ml-auto relative flex items-center cursor-pointer h-8", 169 - (state === State.Loading || disabled) && "opacity-50" 170 - )} 171 - > 172 - {def !== value && 119 + <div className={cn( 120 + "flex items-center", 121 + isDisabled && "opacity-50" 122 + )}> 123 + {isDirty && ( 173 124 <Button 174 - onClick={handleSave} 175 - className="mr-2 h-8 rounded-xl" 176 - loading={state === State.Loading} 125 + onClick={() => save()} 126 + className="h-8 rounded-lg mr-2" 127 + loading={state === InputState.Loading} 177 128 disabled={disabled} 178 129 size="sm" 179 130 color="secondary" ··· 181 132 > 182 133 Save 183 134 </Button> 184 - } 135 + )} 185 136 186 137 <button 187 138 onMouseDown={() => setHold("-")} 188 139 onMouseUp={() => setHold(undefined)} 189 - onClick={() => { 190 - if ((value ?? 0) - 1 < min) setValue(min); 191 - else setValue((value ?? 0) - 1); 192 - }} 140 + onMouseLeave={() => setHold(undefined)} 141 + onClick={decrement} 193 142 className={cn( 194 - "dark:bg-wamellow bg-wamellow-100 hover:dark:bg-wamellow-light hover:bg-wamellow-100-light h-full w-12 rounded-l-xl duration-100", 195 - (state === State.Loading || disabled) ? "cursor-not-allowed" : "cursor-pointer" 143 + "dark:bg-wamellow bg-wamellow-100 hover:dark:bg-wamellow-light hover:bg-wamellow-100-light h-8 w-12 rounded-l-lg duration-100", 144 + isDisabled ? "cursor-not-allowed" : "cursor-pointer" 196 145 )} 197 - disabled={state === State.Loading || disabled} 146 + disabled={isDisabled} 198 147 > 199 148 <HiMinus className="m-auto text-xl font-thin dark:text-neutral-300 text-neutral-700 p-1" /> 200 149 </button> 201 150 202 - <input 151 + <Input 203 152 className={cn( 204 - "outline-hidden text-center w-12 min-h-full dark:bg-wamellow bg-wamellow-100 font-semibold text-lg flex items-center text-neutral-500 rounded-none", 205 - (state === State.Loading || disabled) ? "cursor-not-allowed" : "cursor-text" 153 + "text-center w-14 h-8 dark:bg-wamellow bg-wamellow-100 font-semibold text-lg text-neutral-500 rounded-none border-none px-0", 154 + isDisabled ? "cursor-not-allowed" : "cursor-text" 206 155 )} 207 156 onChange={(e) => { 208 - if (/^\d+$/.test(e.target.value) || !e.target.value) setValue(e.target.value ? Number.parseInt(e.target.value, 10) : undefined); 157 + const val = e.target.value; 158 + if (/^\d*$/.test(val)) { 159 + update(val ? Number.parseInt(val, 10) : min); 160 + } 209 161 }} 210 - value={value} 211 - disabled={state === State.Loading || disabled} 162 + value={value ?? 0} 163 + disabled={isDisabled} 212 164 inputMode="numeric" 213 165 /> 214 166 215 167 <button 216 168 onMouseDown={() => setHold("+")} 217 169 onMouseUp={() => setHold(undefined)} 218 - onClick={() => { 219 - if ((value ?? 0) + 1 > max) setValue(max); 220 - else setValue((value ?? 0) + 1); 221 - }} 170 + onMouseLeave={() => setHold(undefined)} 171 + onClick={increment} 222 172 className={cn( 223 - "dark:bg-wamellow bg-wamellow-100 hover:dark:bg-wamellow-light hover:bg-wamellow-100-light h-full w-12 rounded-r-xl duration-100", 224 - (state === State.Loading || disabled) ? "cursor-not-allowed" : "cursor-pointer" 173 + "dark:bg-wamellow bg-wamellow-100 hover:dark:bg-wamellow-light hover:bg-wamellow-100-light h-8 w-12 rounded-r-lg duration-100", 174 + isDisabled ? "cursor-not-allowed" : "cursor-pointer" 225 175 )} 226 - disabled={state === State.Loading || disabled} 176 + disabled={isDisabled} 227 177 > 228 178 <HiPlus className="m-auto text-xl font-thin dark:text-neutral-300 text-neutral-700 p-1" /> 229 179 </button> 180 + </div> 181 + </div> 230 182 231 - {error && 232 - <div className="ml-auto text-red-500 text-sm"> 233 - {error} 234 - </div> 235 - } 236 - </div> 183 + <div className="absolute top-6 mt-0.5"> 184 + {description && ( 185 + <div className="text-neutral-500 text-sm"> 186 + {description} {link && <Link href={link} target="_blank" className="text-violet-400 hover:underline">Learn more</Link>} 187 + </div> 188 + )} 237 189 190 + {error && ( 191 + <div className="text-red-500 text-sm"> 192 + {error} 193 + </div> 194 + )} 238 195 </div> 239 196 </div> 240 197 );
+122 -162
components/inputs/select-menu.tsx
··· 1 - import type { ApiError } from "@/typings"; 1 + "use client"; 2 + 2 3 import { cn } from "@/utils/cn"; 3 - import { useEffect, useState } from "react"; 4 + import { type InputProps, InputState, useInput } from "@/utils/input"; 5 + import Link from "next/link"; 4 6 import { HiCheck, HiChevronDown, HiExclamationCircle, HiX } from "react-icons/hi"; 5 7 import { TailSpin } from "react-loading-icons"; 6 8 7 - import { ClickOutside } from "../click-outside"; 8 - 9 - enum State { 10 - Idle = 0, 11 - Loading = 1, 12 - Success = 2 13 - } 9 + import { Badge } from "../ui/badge"; 10 + import { 11 + DropdownMenu, 12 + DropdownMenuContent, 13 + DropdownMenuItem, 14 + DropdownMenuTrigger 15 + } from "../ui/dropdown-menu"; 14 16 15 - interface Item<T extends string | number> { 17 + export interface SelectItem<T extends string | number> { 16 18 icon?: React.ReactNode; 17 19 name: string; 18 20 value: T | null; ··· 21 23 } 22 24 23 25 interface Props<T extends string | number> { 24 - className?: string; 25 - 26 - name: string; 27 - url?: string; 28 - dataName?: string; 29 - items: Item<T>[]; 30 - disabled?: boolean; 31 - description?: string; 32 - defaultState?: T | null; 26 + link?: string; 27 + badge?: string; 28 + items: SelectItem<T>[]; 33 29 showClear?: boolean; 34 - 35 - onSave?: (options: { name: string; value: T | null; error?: string; }) => void; 36 30 } 37 31 38 - export default function SelectMenu<T extends string | number>({ 32 + export function InputSelect<T extends string | number>({ 39 33 className, 40 - name, 41 - url, 42 - dataName, 43 - items = [], 44 - disabled, 34 + 35 + label, 36 + name, // @deprecated - use label instead 37 + link, 38 + badge, 45 39 description, 46 - defaultState, 40 + disabled, 41 + items = [], 47 42 showClear, 48 - onSave 49 - }: Props<T>) { 50 - const [state, setState] = useState<State>(State.Idle); 51 - const [error, setError] = useState<string | null>(null); 52 43 53 - const [open, setOpen] = useState<boolean>(false); 54 - const [defaultvalue, setDefaultalue] = useState<T | null | undefined>(); 55 - const [value, setValue] = useState<Item<T> | undefined>(); 44 + endpoint, 45 + url, // @deprecated - use endpoint instead 46 + k, 47 + dataName, // @deprecated - use k instead 56 48 57 - useEffect(() => { 58 - setValue(items.find((i) => i.value === defaultState)); 59 - setDefaultalue(defaultState); 60 - }, [defaultState]); 49 + defaultState, 50 + transform, 61 51 62 - useEffect(() => { 63 - setError(null); 52 + onSave 53 + }: Omit<InputProps<T | null>, "defaultState"> & Props<T> & { defaultState?: T | null; }) { 54 + const { 55 + value, 56 + state, 57 + error, 58 + update 59 + } = useInput({ 60 + endpoint, 61 + url, 62 + k, 63 + dataName, 64 64 65 - if (!value || value.error || value.value === defaultvalue) { 66 - setState(State.Idle); 67 - return; 68 - } 65 + defaultState: defaultState ?? null, 66 + transform, 69 67 70 - if (!url) { 71 - if (!onSave) throw new Error("Warning: <SelectInput.onSave> must be defined when not using <SelectInput.url>."); 72 - onSave(value); 73 - setState(State.Idle); 74 - return; 75 - } 68 + onSave 69 + }); 76 70 77 - if (!dataName) throw new Error("Warning: <SelectInput.dataName> must be defined when using <SelectInput.url>."); 71 + const selectedItem = items.find((i) => i.value === value); 78 72 79 - setState(State.Loading); 73 + const handleSelect = (item: SelectItem<T>) => { 74 + if (item.error) return; // Don't select items with errors 75 + update(item.value); 76 + }; 80 77 81 - fetch(`${process.env.NEXT_PUBLIC_API}${url}`, { 82 - method: "PATCH", 83 - credentials: "include", 84 - headers: { 85 - "Content-Type": "application/json" 86 - }, 87 - body: JSON.stringify(dataName.includes(".") ? 88 - { [dataName.split(".")[0]]: { [dataName.split(".")[1]]: value.value } } 89 - : 90 - { [dataName]: value.value } 91 - ) 92 - }) 93 - .then(async (res) => { 94 - const response = await res.json(); 95 - if (!response) return; 78 + const handleClear = (e: React.MouseEvent) => { 79 + e.stopPropagation(); 80 + update(null as T | null); 81 + }; 96 82 97 - switch (res.status) { 98 - case 200: { 99 - onSave?.(value); 100 - setState(State.Success); 101 - setTimeout(() => setState(State.Idle), 1_000 * 8); 102 - break; 103 - } 104 - default: { 105 - setState(State.Idle); 106 - setError((response as unknown as ApiError).message); 107 - break; 108 - } 109 - } 83 + const isDisabled = state === InputState.Loading || disabled; 110 84 111 - }) 112 - .catch(() => { 113 - setState(State.Idle); 114 - setError("Error while updating"); 115 - }); 85 + return ( 86 + <div className={cn("select-none w-full max-w-full relative", description && "mb-2", className)}> 87 + <div className="flex items-center gap-2 mb-1"> 88 + <span className="sm:text-lg font-medium text-neutral-100"> 89 + {label || name} 90 + </span> 116 91 117 - }, [value]); 92 + {badge && ( 93 + <Badge variant="flat" size="sm"> 94 + {badge} 95 + </Badge> 96 + )} 118 97 119 - return ( 120 - <div className={cn("select-none w-full max-w-full mb-2 relative", className)}> 121 - <div className="flex items-center gap-2"> 122 - <span className="text-lg dark:text-neutral-300 text-neutral-700 font-medium">{name}</span> 123 - {state === State.Loading && <TailSpin stroke="#d4d4d4" strokeWidth={8} className="relative h-3 w-3 overflow-visible" />} 98 + {state === InputState.Loading && ( 99 + <TailSpin stroke="#d4d4d4" strokeWidth={8} className="relative h-3 w-3 overflow-visible" /> 100 + )} 124 101 </div> 125 102 126 - <button 127 - className={cn( 128 - "mt-1 h-12 w-full bg-wamellow rounded-lg flex items-center px-3 wamellow-modal", 129 - open && "outline-solid outline-violet-400 outline-offset-2 outline-2", 130 - (value?.error || error) && !open && "outline-solid outline-red-500 outline-1", 131 - state === State.Success && !open && "outline-solid outline-green-500 outline-1", 132 - (state === State.Loading || disabled) && "cursor-not-allowed opacity-50" 133 - )} 134 - onClick={() => setOpen(!open)} 135 - disabled={state === State.Loading || disabled} 136 - > 137 - <div 103 + <DropdownMenu> 104 + <DropdownMenuTrigger 138 105 className={cn( 139 - "flex items-center flex-wrap overflow-x-hidden py-3 gap-2 dark:text-neutral-600 text-neutral-400", 140 - value?.name && "dark:text-neutral-300 text-neutral-700" 106 + "h-12 w-full dark:bg-wamellow bg-wamellow-100 rounded-lg flex items-center px-3 text-left", 107 + "focus:outline-violet-400 focus:outline-2 focus:outline-offset-2", 108 + selectedItem?.error && "outline-solid outline-red-500 outline-1", 109 + state === InputState.Success && "outline-solid outline-green-500 outline-1", 110 + isDisabled && "cursor-not-allowed opacity-50" 141 111 )} 142 - style={value?.color ? { color: `#${value.color.toString(16)}` } : {}} 112 + disabled={isDisabled} 143 113 > 144 - {value?.icon && <span>{value?.icon}</span>} 145 - {value?.name || "Select.."} 146 - </div> 147 - <div className="ml-auto flex items-center gap-2"> 148 - {value?.error && 149 - <div className="text-sm flex items-center gap-1 text-red-500"> 150 - <HiExclamationCircle /> {value.error} 151 - </div> 152 - } 153 - {value?.name && showClear && 154 - <button 155 - onClick={() => { 156 - setOpen(false); 157 - setValue({ value: null, name: "" }); 158 - }} 159 - > 160 - <HiX /> 161 - </button> 162 - } 163 - <HiChevronDown /> 164 - </div> 165 - </button> 114 + <div 115 + className={cn( 116 + "flex items-center flex-wrap overflow-x-hidden gap-2", 117 + selectedItem?.name ? "text-neutral-100" : "text-neutral-500" 118 + )} 119 + style={selectedItem?.color ? { color: `#${selectedItem.color.toString(16)}` } : {}} 120 + > 121 + {selectedItem?.icon && <span>{selectedItem.icon}</span>} 122 + {selectedItem?.name || "Select.."} 123 + </div> 166 124 167 - {open && 168 - <div className="absolute mt-2 w-full bg-wamellow backdrop-blur-lg backdrop-brightness-50 rounded-lg max-h-40 overflow-y-scroll shadow-lg z-20 wamellow-modal"> 169 - <ClickOutside onClose={(() => setOpen(false))} /> 125 + <div className="ml-auto flex items-center gap-2"> 126 + {selectedItem?.error && ( 127 + <div className="text-sm flex items-center gap-1 text-red-500"> 128 + <HiExclamationCircle /> {selectedItem.error} 129 + </div> 130 + )} 131 + {selectedItem?.name && showClear && ( 132 + <button onClick={handleClear} className="hover:text-neutral-300"> 133 + <HiX /> 134 + </button> 135 + )} 136 + <HiChevronDown /> 137 + </div> 138 + </DropdownMenuTrigger> 139 + 140 + <DropdownMenuContent className="w-[var(--radix-dropdown-menu-trigger-width)] max-h-40"> 170 141 {items.map((item) => ( 171 - <button 142 + <DropdownMenuItem 172 143 key={"select-" + item.value} 173 144 className={cn( 174 - "p-4 py-2 w-full text-left duration-200 flex items-center hover:bg-wamellow", 145 + "cursor-pointer", 175 146 item.error && "dark:bg-red-500/10 dark:hover:bg-red-500/25 bg-red-500/30 hover:bg-red-500/40" 176 147 )} 177 148 style={item.color ? { color: `#${item.color.toString(16)}` } : {}} 178 - onClick={() => { 179 - setOpen(false); 180 - setState(State.Idle); 181 - if (value?.value) setDefaultalue(value.value); 182 - setValue(item); 183 - }} 149 + onClick={() => handleSelect(item)} 150 + disabled={Boolean(item.error)} 184 151 > 185 - {item?.icon && 186 - <span className="mr-2"> 187 - {item?.icon} 188 - </span> 189 - } 152 + {item.icon && <span className="mr-2">{item.icon}</span>} 190 153 191 154 <span className={cn("truncate", item.error && "max-w-[calc(100%-13rem)]")}> 192 155 {item.name} 193 156 </span> 194 157 195 - {value?.value === item.value && 196 - <HiCheck className="ml-1" /> 197 - } 158 + {value === item.value && <HiCheck className="ml-auto" />} 198 159 199 - {item.error && 160 + {item.error && ( 200 161 <div className="ml-auto text-sm flex items-center gap-1 text-red-500"> 201 162 <HiExclamationCircle /> {item.error} 202 163 </div> 203 - } 204 - </button> 164 + )} 165 + </DropdownMenuItem> 205 166 ))} 206 - </div> 207 - } 167 + </DropdownMenuContent> 168 + </DropdownMenu> 208 169 209 - <div className={cn("mt-1 flex md:block", open && "opacity-0")}> 210 - {description && 211 - <div className="dark:text-neutral-500 text-neutral-400 text-sm"> 212 - {description} 170 + <div className="mt-1"> 171 + {description && ( 172 + <div className="text-neutral-500 text-sm"> 173 + {description} {link && <Link href={link} target="_blank" className="text-violet-400 hover:underline">Learn more</Link>} 213 174 </div> 214 - } 175 + )} 215 176 216 - {error && 217 - <div className="ml-auto text-red-500 text-sm"> 177 + {error && ( 178 + <div className="text-red-500 text-sm"> 218 179 {error} 219 180 </div> 220 - } 181 + )} 221 182 </div> 222 - 223 183 </div> 224 184 ); 225 185 }
+1 -1
components/inputs/switch.tsx
··· 14 14 inverted: boolean; 15 15 } 16 16 17 - export default function InputSwitch({ 17 + export function InputSwitch({ 18 18 className, 19 19 20 20 label,
+108 -127
components/inputs/text-input.tsx
··· 1 1 "use client"; 2 2 3 - import type { ApiError } from "@/typings"; 4 3 import { cn } from "@/utils/cn"; 5 - import { useEffect, useState } from "react"; 4 + import { type InputProps, InputState, useInput } from "@/utils/input"; 5 + import Link from "next/link"; 6 6 import { TailSpin } from "react-loading-icons"; 7 7 8 - import DumbTextInput from "./dumb-text-input"; 9 - import { useStateDebounced } from "../../utils/useDebounce"; 10 - 11 - type Type<T extends "text" | "color"> = T extends "text" ? string : number; 12 - 13 - enum State { 14 - Idle = 0, 15 - Loading = 1, 16 - Success = 2 17 - } 18 - 19 - interface Props<T extends "text" | "color"> { 20 - className?: string; 8 + import { Badge } from "../ui/badge"; 9 + import { Input } from "../ui/input"; 10 + import { Textarea } from "../ui/textarea"; 21 11 22 - name?: string; 23 - url?: string; 24 - dataName?: string; 25 - disabled?: boolean; 26 - description?: string; 27 - defaultState: Type<T>; 28 - resetState?: Type<T>; 29 - 30 - type?: T; 12 + interface Props { 13 + link?: string; 14 + badge?: string; 31 15 max?: number; 32 16 placeholder?: string; 33 - 34 - onSave?: (value: Type<T> | null) => void; 17 + multiline?: boolean; 18 + resetState?: string; 35 19 } 36 20 37 - export default function TextInput<T extends "text" | "color" = "text">({ 21 + export function InputText({ 38 22 className, 39 - name, 40 - url, 41 - dataName, 23 + 24 + label, 25 + link, 26 + badge, 27 + description, 42 28 disabled, 43 - description, 44 - defaultState, 45 - resetState, 46 - type = "text" as T, 47 - max, 29 + max = 256, 48 30 placeholder, 49 - onSave 50 - }: Props<T>) { 51 - const [state, setState] = useState<State>(State.Idle); 52 - const [error, setError] = useState<string | null>(null); 53 - 54 - const [valuedebounced, setValueDebounced] = useStateDebounced<T extends "text" ? string : number>((type === "text" ? "" : 0) as Type<T>, 1_000); 55 - const [value, setValue] = useState<T extends "text" ? string : number>((type === "text" ? "" : 0) as Type<T>); 56 - const [defaultStateValue, setdefaultStateValue] = useState<T extends "text" ? string : number>((type === "text" ? "" : 0) as Type<T>); 31 + multiline, 32 + resetState, 57 33 58 - useEffect(() => { 59 - if (!defaultStateValue) setdefaultStateValue(defaultState); 60 - setValue(defaultState); 61 - }, [defaultState]); 34 + endpoint, 35 + url, // @deprecated - use endpoint instead 36 + k, 37 + dataName, // @deprecated - use k instead 62 38 63 - useEffect(() => { 64 - if (defaultStateValue === value) return; 65 - setError(null); 39 + defaultState, 40 + transform, 66 41 67 - if (!url) { 68 - if (!onSave) throw new Error("Warning: <TextInput.onSave> must be defined when not using <TextInput.url>."); 42 + onSave 43 + }: InputProps<string> & Props) { 44 + const { 45 + value, 46 + state, 47 + error, 48 + update, 49 + reset 50 + } = useInput({ 51 + endpoint, 52 + url, 53 + k, 54 + dataName, 69 55 70 - onSave(value); 71 - setState(State.Idle); 72 - return; 73 - } 56 + defaultState, 57 + transform, 74 58 75 - if (!dataName) throw new Error("Warning: <TextInput.dataName> must be defined when using <TextInput.url>."); 59 + onSave, 60 + debounceMs: 1_000 61 + }); 76 62 77 - setState(State.Loading); 78 - 79 - const def = type === "color" 80 - ? 0 81 - : null; 82 - 83 - fetch(`${process.env.NEXT_PUBLIC_API}${url}`, { 84 - method: "PATCH", 85 - credentials: "include", 86 - headers: { 87 - "Content-Type": "application/json" 88 - }, 89 - body: JSON.stringify({ [dataName]: value || def }) 90 - }) 91 - .then(async (res) => { 92 - const response = await res.json(); 93 - if (!response) return; 94 - 95 - switch (res.status) { 96 - case 200: { 97 - setValue(value || def || (type === "text" ? "" : 0) as Type<T>); 98 - onSave?.(value || def || (type === "text" ? "" : 0) as Type<T>); 99 - setdefaultStateValue(value || def || (type === "text" ? "" : 0) as Type<T>); 100 - 101 - setState(State.Success); 102 - setTimeout(() => setState(State.Idle), 1_000 * 8); 103 - break; 104 - } 105 - default: { 106 - setState(State.Idle); 107 - setError((response as unknown as ApiError).message); 108 - break; 109 - } 110 - } 111 - 112 - }) 113 - .catch(() => { 114 - setState(State.Idle); 115 - setError("Error while updatung"); 116 - }); 117 - 118 - }, [valuedebounced]); 63 + const showCharCount = max - 64 < (value?.length || 0); 64 + const nearLimit = max - 8 < (value?.length || 0); 119 65 120 66 return ( 121 67 <div className={cn("relative w-full", className)}> 68 + <div className="flex items-center gap-2 mb-1"> 69 + <span className="sm:text-lg font-medium text-neutral-100"> 70 + {label} 71 + </span> 122 72 123 - <div className="flex items-center gap-2 mb-1"> 124 - <span className="text-lg dark:text-neutral-300 text-neutral-700 font-medium">{name}</span> 125 - {state === State.Loading && <TailSpin stroke="#d4d4d4" strokeWidth={8} className="relative h-3 w-3 overflow-visible" />} 73 + {badge && ( 74 + <Badge variant="flat" size="sm"> 75 + {badge} 76 + </Badge> 77 + )} 78 + 79 + {state === InputState.Loading && ( 80 + <TailSpin stroke="#d4d4d4" strokeWidth={8} className="relative h-3 w-3 overflow-visible" /> 81 + )} 126 82 127 - {(resetState && resetState !== value) && 83 + {resetState !== undefined && resetState !== value && ( 128 84 <button 129 85 className="text-sm ml-auto text-violet-400/60 hover:text-violet-400/90 duration-200" 130 - onClick={() => { 131 - setValue(resetState); 132 - setValueDebounced(resetState); 133 - setState(State.Idle); 134 - }} 86 + onClick={reset} 135 87 disabled={disabled} 136 88 > 137 89 reset 138 90 </button> 139 - } 91 + )} 92 + 93 + {showCharCount && ( 94 + <span className={cn( 95 + "ml-auto text-xs", 96 + nearLimit ? "text-red-500" : "text-neutral-500" 97 + )}> 98 + {value?.length || 0}/{max} 99 + </span> 100 + )} 140 101 </div> 141 102 142 - <DumbTextInput 143 - value={value} 144 - setValue={(v) => { 145 - setValue(v); 146 - setValueDebounced(v); 147 - setState(State.Idle); 148 - }} 149 - disabled={disabled} 150 - placeholder={placeholder} 151 - max={max} 152 - type={type} 153 - description={description} 154 - /> 103 + {multiline || max > 300 ? ( 104 + <Textarea 105 + className="dark:bg-wamellow bg-wamellow-100 border-none resize-y min-h-28" 106 + placeholder={placeholder} 107 + value={value || ""} 108 + onChange={(e) => { 109 + const newValue = e.target.value; 110 + if (newValue.length > max) return; 111 + update(newValue); 112 + }} 113 + disabled={disabled} 114 + maxLength={max} 115 + rows={3} 116 + /> 117 + ) : ( 118 + <Input 119 + className="dark:bg-wamellow bg-wamellow-100 border-none" 120 + placeholder={placeholder} 121 + value={value || ""} 122 + onChange={(e) => { 123 + const newValue = e.target.value; 124 + if (newValue.length > max) return; 125 + update(newValue); 126 + }} 127 + disabled={disabled} 128 + maxLength={max} 129 + /> 130 + )} 155 131 156 - <div className="flex absolute right-0 bottom-0"> 157 - {error && 158 - <div className="ml-auto text-red-500 text-sm"> 132 + <div className="mt-1"> 133 + {description && ( 134 + <div className="text-neutral-500 text-sm"> 135 + {description} {link && <Link href={link} target="_blank" className="text-violet-400 hover:underline">Learn more</Link>} 136 + </div> 137 + )} 138 + 139 + {error && ( 140 + <div className="text-red-500 text-sm"> 159 141 {error} 160 142 </div> 161 - } 143 + )} 162 144 </div> 163 - 164 145 </div> 165 146 ); 166 147 }
+2 -2
components/list.tsx
··· 94 94 }; 95 95 }, []); 96 96 97 - const defaultValue = searchParamName 97 + const currentValue = searchParamName 98 98 ? params.get(searchParamName) 99 99 : path.split(url)[1].split("/").slice(0, 2).join("/"); 100 100 ··· 102 102 <div className="mt-2 mb-4 flex items-center relative"> 103 103 <Tabs 104 104 className="w-full" 105 - defaultValue={defaultValue || tabs[0].value} 105 + value={currentValue || tabs[0].value} 106 106 onValueChange={handleChange} 107 107 > 108 108 <TabsList
+1 -1
components/modal.tsx
··· 119 119 120 120 <div 121 121 className={cn( 122 - "scrollbar-none overflow-y-scroll overflow-x-hidden max-h-[70vh] px-0.5", 122 + "scrollbar-none overflow-y-scroll overflow-x-hidden max-h-[70vh] px-1", 123 123 className 124 124 )} 125 125 >
+4 -4
components/ui/dropdown-menu.tsx
··· 64 64 ref={ref} 65 65 sideOffset={sideOffset} 66 66 className={cn( 67 - "z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-lg bg-wamellow backdrop-brightness-50 backdrop-blur-xl p-1 text-primary-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]", 67 + "z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-lg bg-wamellow backdrop-brightness-50 backdrop-blur-xl p-1 text-primary-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", 68 68 className 69 69 )} 70 70 {...props} ··· 98 98 <DropdownMenuPrimitive.CheckboxItem 99 99 ref={ref} 100 100 className={cn( 101 - "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", 101 + "relative flex cursor-default select-none items-center rounded-sm py-1.5 pr-8 pl-2 text-sm outline-none transition-colors focus:bg-wamellow focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", 102 102 className 103 103 )} 104 104 checked={checked} 105 105 {...props} 106 106 > 107 - <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center"> 107 + {children} 108 + <span className="absolute right-2 flex h-3.5 w-3.5 items-center justify-center"> 108 109 <DropdownMenuPrimitive.ItemIndicator> 109 110 <Check className="h-4 w-4" /> 110 111 </DropdownMenuPrimitive.ItemIndicator> 111 112 </span> 112 - {children} 113 113 </DropdownMenuPrimitive.CheckboxItem> 114 114 )); 115 115 DropdownMenuCheckboxItem.displayName =
+21
components/ui/input.tsx
··· 1 + import { cn } from "@/utils/cn"; 2 + import * as React from "react"; 3 + 4 + const Input = React.forwardRef<HTMLInputElement, React.ComponentProps<"input">>( 5 + ({ className, type, ...props }, ref) => { 6 + return ( 7 + <input 8 + type={type} 9 + className={cn( 10 + "flex h-12 w-full rounded-lg border border-input bg-background px-3 py-2 text-base file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", 11 + className 12 + )} 13 + ref={ref} 14 + {...props} 15 + /> 16 + ); 17 + } 18 + ); 19 + Input.displayName = "Input"; 20 + 21 + export { Input };
+21
components/ui/textarea.tsx
··· 1 + import { cn } from "@/utils/cn"; 2 + import * as React from "react"; 3 + 4 + const Textarea = React.forwardRef< 5 + HTMLTextAreaElement, 6 + React.ComponentProps<"textarea"> 7 + >(({ className, ...props }, ref) => { 8 + return ( 9 + <textarea 10 + className={cn( 11 + "flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-base placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", 12 + className 13 + )} 14 + ref={ref} 15 + {...props} 16 + /> 17 + ); 18 + }); 19 + Textarea.displayName = "Textarea"; 20 + 21 + export { Textarea };
+19 -19
package.json
··· 15 15 "dependencies": { 16 16 "@discordjs/collection": "^2.1.1", 17 17 "@discordjs/rest": "^2.6.0", 18 - "@marsidev/react-turnstile": "^1.3.1", 18 + "@marsidev/react-turnstile": "^1.4.1", 19 19 "@odiffey/discord-markdown": "^3.3.0", 20 20 "@radix-ui/primitive": "1.1.3", 21 21 "@radix-ui/react-accordion": "^1.2.12", ··· 33 33 "@radix-ui/react-switch": "^1.2.6", 34 34 "@radix-ui/react-tabs": "^1.1.13", 35 35 "@radix-ui/react-tooltip": "^1.2.8", 36 - "@sentry/nextjs": "^10.28.0", 37 - "@tailwindcss/postcss": "^4.1.17", 38 - "caniuse-lite": "^1.0.30001759", 36 + "@sentry/nextjs": "^10.34.0", 37 + "@tailwindcss/postcss": "^4.1.18", 38 + "caniuse-lite": "^1.0.30001765", 39 39 "class-variance-authority": "^0.7.1", 40 40 "clsx": "^2.1.1", 41 - "discord-api-types": "^0.38.36", 42 - "lucide-react": "^0.555.0", 43 - "next": "16.0.7", 44 - "motion": "^12.23.26", 41 + "discord-api-types": "^0.38.37", 42 + "lucide-react": "^0.562.0", 43 + "next": "16.1.3", 44 + "motion": "^12.27.0", 45 45 "next-client-cookies": "^2.1.0", 46 46 "postcss": "^8.5.6", 47 - "react": "19.2.1", 47 + "react": "19.2.3", 48 48 "react-countup": "^6.5.3", 49 - "react-dom": "19.2.1", 49 + "react-dom": "19.2.3", 50 50 "react-icons": "^5.5.0", 51 51 "react-loading-icons": "^1.1.0", 52 52 "react-markdown": "10.1.0", ··· 54 54 "rehype-raw": "^7.0.0", 55 55 "sharp": "^0.34.5", 56 56 "tailwind-merge": "^3.4.0", 57 - "tailwindcss": "^4.1.17", 57 + "tailwindcss": "^4.1.18", 58 58 "tailwindcss-animate": "^1.0.7", 59 59 "tw-animate-css": "^1.4.0", 60 60 "typescript": "^5.9.3", 61 61 "vaul": "^1.1.2", 62 - "zustand": "^5.0.9" 62 + "zustand": "^5.0.10" 63 63 }, 64 64 "devDependencies": { 65 - "@next/eslint-plugin-next": "^16.0.7", 65 + "@next/eslint-plugin-next": "^16.1.3", 66 66 "@octokit/types": "^16.0.0", 67 - "@stylistic/eslint-plugin": "^5.6.1", 68 - "@types/node": "^24.10.1", 69 - "@types/react": "^19.2.7", 67 + "@stylistic/eslint-plugin": "^5.7.0", 68 + "@types/node": "^25.0.9", 69 + "@types/react": "^19.2.8", 70 70 "@types/react-dom": "^19.2.3", 71 - "eslint": "^9.39.1", 72 - "eslint-config-next": "^16.0.7", 71 + "eslint": "^9.39.2", 72 + "eslint-config-next": "^16.1.3", 73 73 "eslint-plugin-import-x": "^4.16.1", 74 74 "eslint-plugin-react": "^7.37.5", 75 75 "eslint-plugin-react-compiler": "19.1.0-rc.2", 76 76 "eslint-plugin-react-hooks": "^7.0.1", 77 77 "eslint-plugin-simple-import-sort": "^12.1.1", 78 78 "eslint-plugin-unicorn": "^62.0.0", 79 - "typescript-eslint": "^8.48.1" 79 + "typescript-eslint": "^8.53.0" 80 80 } 81 81 }
+66 -15
utils/input.ts
··· 1 1 import type { ApiError } from "@/typings"; 2 2 import type { HTMLProps } from "react"; 3 - import { useCallback, useRef, useState } from "react"; 3 + import { useCallback, useEffect, useRef, useState } from "react"; 4 4 5 5 export enum InputState { 6 6 Idle = 0, ··· 10 10 11 11 interface InputOptions<T> { 12 12 endpoint?: string; 13 + /** @deprecated Use `endpoint` instead. Kept for backward compatibility. */ 14 + url?: string; 13 15 k?: string; 16 + /** @deprecated Use `k` instead. Kept for backward compatibility. */ 17 + dataName?: string; 14 18 15 19 defaultState: T; 16 20 transform?: (value: T) => unknown; 17 21 18 22 onSave?: (value: T) => void; 23 + 24 + manual?: boolean; 25 + debounceMs?: number; 19 26 } 20 27 21 28 export type InputProps<T> = InputOptions<T> & HTMLProps<HTMLDivElement> & { 22 - label: string; 29 + label?: string; 23 30 description?: string; 24 31 disabled?: boolean; 25 32 }; 26 33 27 34 export function useInput<T>(options: InputOptions<T>) { 28 35 const [value, setValue] = useState<T>(options.defaultState); 36 + const [savedValue, setSavedValue] = useState<T>(options.defaultState); 29 37 const [state, setState] = useState<InputState>(InputState.Idle); 30 38 const [error, setError] = useState<string | null>(null); 31 39 const timeout = useRef<NodeJS.Timeout | null>(null); 40 + const debounceRef = useRef<NodeJS.Timeout | null>(null); 41 + 42 + const endpoint = options.endpoint || options.url; 43 + const k = options.k || options.dataName; 44 + 45 + const defaultStateKey = JSON.stringify(options.defaultState); 46 + useEffect(() => { 47 + setValue(options.defaultState); 48 + setSavedValue(options.defaultState); 32 49 33 - const onSave = useCallback( 34 - async (val: T) => { 35 - options.onSave?.(val); 50 + return () => { 51 + if (timeout.current) { 52 + clearTimeout(timeout.current); 53 + timeout.current = null; 54 + } 55 + 56 + if (debounceRef.current) { 57 + clearTimeout(debounceRef.current); 58 + debounceRef.current = null; 59 + } 60 + }; 61 + }, [defaultStateKey]); 62 + 63 + const save = useCallback( 64 + async (val?: T) => { 65 + const valueToSave = val === undefined ? value : val; 66 + options.onSave?.(valueToSave); 67 + setSavedValue(valueToSave); 36 68 37 - if (!options.endpoint || !options.k) return; 69 + if (!endpoint || !k) return; 38 70 39 71 if (timeout.current) { 40 72 clearTimeout(timeout.current); ··· 44 76 setState(InputState.Loading); 45 77 setError(null); 46 78 47 - const res = await fetch(process.env.NEXT_PUBLIC_API + options.endpoint, { 79 + const res = await fetch(process.env.NEXT_PUBLIC_API + endpoint, { 48 80 method: "PATCH", 49 81 credentials: "include", 50 82 headers: { 51 83 "Content-Type": "application/json" 52 84 }, 53 - body: JSON.stringify(options.k.includes(".") 54 - ? { [options.k.split(".")[0]]: { [options.k.split(".")[1]]: options.transform?.(val) ?? val } } 55 - : { [options.k]: options.transform?.(val) ?? val } 85 + body: JSON.stringify(k.includes(".") 86 + ? { [k.split(".")[0]]: { [k.split(".")[1]]: options.transform?.(valueToSave) ?? valueToSave } } 87 + : { [k]: options.transform?.(valueToSave) ?? valueToSave } 56 88 ) 57 89 }) 58 90 .catch((error) => String(error)); ··· 76 108 setState(InputState.Success); 77 109 timeout.current = setTimeout(() => setState(InputState.Idle), 1_000 * 8); 78 110 }, 79 - [options.onSave, options.endpoint, options.k, options.transform] 111 + [options.onSave, endpoint, k, options.transform, value] 112 + ); 113 + 114 + const update = useCallback( 115 + (val: T) => { 116 + setValue(val); 117 + 118 + if (options.manual) return; 119 + 120 + if (debounceRef.current) { 121 + clearTimeout(debounceRef.current); 122 + } 123 + 124 + if (options.debounceMs) { 125 + debounceRef.current = setTimeout(() => save(val), options.debounceMs); 126 + } else { 127 + save(val); 128 + } 129 + }, 130 + [options.manual, options.debounceMs, save] 80 131 ); 81 132 82 133 return { 83 134 value, 84 135 state, 85 136 error, 86 - update: (val: T) => { 87 - setValue(val); 88 - onSave(val); 89 - } 137 + isDirty: value !== savedValue, 138 + update, 139 + save, 140 + reset: () => setValue(savedValue) 90 141 }; 91 142 }