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

Configure Feed

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

add responsive billing UI

Luna 229961be b26c332d

+113 -46
+32 -11
app/(home)/premium/page.tsx
··· 7 7 8 8 import Comment from "@/components/comment"; 9 9 import ImageGrid from "@/components/image-grid"; 10 + import { OverviewLink } from "@/components/overview-link"; 10 11 import { Badge } from "@/components/ui/badge"; 11 12 import { defaultFetchOptions } from "@/lib/api"; 12 13 import type { ApiV1TopguildsGetResponse } from "@/typings"; ··· 19 20 const maybe = null; 20 21 21 22 const items = [ 22 - { title: "Price", free: "$0", premium: "$4 /month" }, 23 + { title: "Price", free: "€0 /forever", premium: "€4 /month" }, 23 24 { title: "TTS Translations", free: 10_000, premium: 100_000, unit: "chars" }, 24 25 { title: "Custom commands", free: 30, premium: Infinity }, 25 26 { title: "Social notifications", free: 30, premium: Infinity }, 26 27 { title: "Dailyposts", free: 4, premium: 20 }, 27 28 { title: "Welcome roles", free: 5, premium: 10 }, 28 29 { title: "Welcome pings", free: 5, premium: 15 }, 29 - { title: "Passport bypass", free: false, premium: true }, 30 - { title: "Crosspost social notifications", free: false, premium: true } 30 + { title: "Bypass passport", free: false, premium: true }, 31 + { title: "Bypass Voting", free: false, premium: true }, 32 + { title: "Crosspost social notifications", free: false, premium: true }, 33 + { title: "Fast Support", free: true, premium: true } 31 34 ]; 32 35 33 36 export const revalidate = 3600; 34 37 35 38 export const generateMetadata = (): Metadata => { 36 39 37 - const title = "Premium"; 40 + const title = "Premium (˶˃ ᵕ ˂˶)"; 38 41 const description = "Get epic premium+ ULTRA HD features for wamellow to upgrade your servers to a whole new experience and unlock tons of premium features."; 39 42 const url = getCanonicalUrl("premium"); 40 43 ··· 65 68 const topGuilds = await fetch(`${process.env.NEXT_PUBLIC_API}/top-guilds`, defaultFetchOptions).then((res) => res.json()) as ApiV1TopguildsGetResponse[]; 66 69 67 70 return ( 68 - <div className="flex items-center flex-col w-full"> 71 + <div className="w-full"> 69 72 70 73 <div className="md:text-5xl text-4xl font-semibold md:mb-6 mb-4 dark:text-neutral-100 text-neutral-900 flex gap-2 items-center w-full"> 71 74 <h1 className={cn("flex gap-4", montserrat.className)}> 72 75 <span className="hidden md:block">Wamellow</span> 73 76 <span className="bg-gradient-to-r from-indigo-400 to-pink-400 bg-clip-text text-transparent break-keep">Premium</span> 74 77 </h1> 75 - <HiLightningBolt className="text-pink-400 rotate-6" /> 78 + <span className="text-pink-400 rotate-2 ml-2"> 79 + (˶˃ ᵕ ˂˶) 80 + </span> 76 81 </div> 77 82 78 83 {topGuilds && ··· 88 93 89 94 <div className="dark:bg-wamellow bg-wamellow-100 dark:text-neutral-300 text-neutral-700 mt-10 w-full p-4 rounded-xl text-xl divide-y divide-wamellow"> 90 95 91 - <div className="flex items-center py-4 text-2xl font-semibold"> 96 + <div className="flex items-center pb-4 text-2xl font-semibold"> 92 97 <span className="dark:text-neutral-100 text-neutral-900 w-2/4 block md:hidden">Features</span> 93 98 <span className="dark:text-neutral-100 text-neutral-900 w-2/4 hidden md:block">Pricing and Features</span> 94 99 <span className="bg-gradient-to-r from-red-400 to-pink-400 bg-clip-text text-transparent w-1/4 ">Free</span> ··· 119 124 120 125 </div> 121 126 122 - <div className="w-full flex"> 127 + <div className="w-full flex items-center gap-2"> 128 + <Link 129 + className="ml-auto text-violet-400/60 hover:text-violet-500/80 hover:underline duration-200 text-sm" 130 + href="/terms/payment" 131 + target="_blank" 132 + > 133 + Terms apply 134 + </Link> 135 + 123 136 <Link 124 - className="ml-auto mt-1 dark:text-violet-400/60 text-violet-600/60 hover:text-violet-400/80 dark:hover:text-violet-600/80 hover:underline duration-200 text-sm" 137 + className="text-violet-400/60 hover:text-violet-500/80 hover:underline duration-200 text-sm" 125 138 href="/support" 126 139 target="_blank" 127 140 > ··· 132 145 <Comment 133 146 username="@mwlica" 134 147 avatar="/luna.webp" 135 - bio="Cute femboy" 136 - content="buy it, buy it, buy it, buy it, buy it, buy it" 148 + bio="Developer" 149 + content="my goal isn't to make profit, but rather to create something that people will love — but I also have to cover server costs, and buy food" 150 + /> 151 + 152 + <OverviewLink 153 + className="mt-10" 154 + title="Donate one-time instead" 155 + message="Support me and the project by donating to me on Ko-fi (˶˃ ᵕ ˂˶)" 156 + url="https://ko-fi.com/mwlica" 157 + icon={<HiLightningBolt />} 137 158 /> 138 159 139 160 <div className="p-2 fixed z-10 bottom-0 left-0 w-full md:hidden">
+1 -1
app/(home)/premium/subscribe.component.tsx
··· 82 82 <HiArrowDown className="!size-3" /> 83 83 </Button> 84 84 </div> 85 - $ 85 + 86 86 </InputBaseAdornment> 87 87 <InputBaseControl> 88 88 <InputBaseInput
+43
app/(home)/terms/payment/page.tsx
··· 1 + import { readFile } from "fs/promises"; 2 + import type { Metadata } from "next"; 3 + 4 + import BeautifyMarkdown from "@/components/markdown"; 5 + import { getBaseUrl, getCanonicalUrl } from "@/utils/urls"; 6 + 7 + export const revalidate = false; 8 + 9 + export const generateMetadata = (): Metadata => { 10 + 11 + const title = "Payment Terms"; 12 + const description = "Read about Wamellow's Payment Terms."; 13 + const url = getCanonicalUrl("terms"); 14 + 15 + return { 16 + title, 17 + description, 18 + alternates: { 19 + canonical: url 20 + }, 21 + openGraph: { 22 + title, 23 + description, 24 + type: "website", 25 + url, 26 + images: `${getBaseUrl()}/waya-v3.webp` 27 + }, 28 + twitter: { 29 + card: "summary", 30 + site: "wamellow.com", 31 + title, 32 + description, 33 + images: `${getBaseUrl()}/waya-v3.webp` 34 + } 35 + }; 36 + }; 37 + 38 + const PATH = `${process.cwd()}/public/legal/payment-terms.md` as const; 39 + 40 + export default async function Home() { 41 + const terms = await readFile(PATH, { encoding: "utf-8" }); 42 + return <BeautifyMarkdown markdown={terms} />; 43 + }
+2 -2
app/layout.tsx
··· 195 195 Documentation 196 196 </Link> 197 197 <Link 198 - href="https://ko-fi.com/mwlica" 198 + href="/premium" 199 199 className="hidden sm:block hover:text-neutral-100 duration-100" 200 200 > 201 - Donate 201 + Premium 202 202 </Link> 203 203 </div> 204 204
+18 -15
app/profile/billing/page.tsx
··· 55 55 return ( 56 56 <div className="space-y-2"> 57 57 <Box 58 - className="flex justify-between" 58 + className="md:flex justify-between" 59 59 small 60 60 > 61 61 <div className="flex flex-col"> 62 62 <h2 className="font-bold text-3xl bg-gradient-to-r bg-clip-text text-transparent from-violet-400/80 to-indigo-400/80">Wamellow Premium</h2> 63 - <p className="text-muted-foreground">You have all premium features for <span className="font-semibold text-neutral-300">US${(4 + (data?.donationQuantity || 0)).toFixed(2)} / {data?.priceId.startsWith("monthly_") ? "Month" : "Year"}</span>!</p> 63 + <p className="text-muted-foreground">You have all premium features for <span className="font-semibold text-neutral-300">EUR {(4 + (data?.donationQuantity || 0)).toFixed(2)} / {data?.priceId.startsWith("monthly_") ? "Month" : "Year"}</span>!</p> 64 64 </div> 65 - <div className="flex gap-1"> 65 + <div className="flex gap-1 mt-4 md:mt-0"> 66 66 {isLoading 67 - ? <Skeleton className="h-10 w-20" /> 67 + ? <Skeleton className="h-10 w-full md:w-20" /> 68 68 : <PortalButton data={data!} /> 69 69 } 70 70 </div> 71 71 </Box> 72 72 73 - <div className="flex gap-4 pt-1"> 73 + <div className="flex-col lg:flex-row flex gap-4 pt-1"> 74 74 <Box 75 - className="w-1/2 text-sm" 75 + className="lg:w-1/2 text-sm" 76 76 small 77 77 > 78 - <h2 className="font-semibold text-xl text-neutral-300 relative bottom-2">Billing Cycle</h2> 78 + <h2 className="font-semibold text-xl text-neutral-300 mb-2 lg:mb-0 lg:relative lg:bottom-2">Billing Cycle</h2> 79 79 {isLoading 80 80 ? <Skeleton className="h-12 w-full" /> 81 81 : (data?.cancelAtPeriodEnd ··· 83 83 Your subscription will expire on <span className="font-semibold text-neutral-300">{new Date(data!.currentPeriodEnd * 1000).toLocaleDateString()}</span> and you will not be charged again. 84 84 </p> 85 85 : <p> 86 - Your subscription will be automatically renewed on <span className="font-semibold text-neutral-300">{new Date(data!.currentPeriodEnd * 1000).toLocaleDateString()}</span> and you{"'"}ll be charged <span className="font-semibold text-neutral-300">US${(4 + (data!.donationQuantity || 0)).toFixed(2)}</span>. 86 + Your subscription will be automatically renewed on <span className="font-semibold text-neutral-300">{new Date(data!.currentPeriodEnd * 1000).toLocaleDateString()}</span> and you{"'"}ll be charged <span className="font-semibold text-neutral-300">EUR {(4 + (data!.donationQuantity || 0)).toFixed(2)}</span>. 87 87 88 - You{"'"}re paying <span className="font-semibold text-neutral-300">US${(4).toFixed(2)} — Premium</span> and <span className="font-semibold text-neutral-300">US${(data!.donationQuantity || 0).toFixed(2)} — Donation{data!.donationQuantity ? "s" : ""}</span> 88 + You{"'"}re paying <span className="font-semibold text-neutral-300">EUR {(4).toFixed(2)} — Premium</span> and <span className="font-semibold text-neutral-300">EUR {(data!.donationQuantity || 0).toFixed(2)} — Donation{data!.donationQuantity ? "s" : ""}</span> 89 89 {" "} 90 90 (<Button 91 91 className="text-sm p-0 m-0 h-3 text-violet-400" ··· 100 100 } 101 101 </Box> 102 102 <Box 103 - className="w-1/2" 103 + className="lg:w-1/2" 104 104 small 105 105 > 106 - <h2 className="font-semibold text-xl text-neutral-300 relative bottom-2">Payment Method</h2> 106 + <h2 className="font-semibold text-xl text-neutral-300 mb-2 lg:mb-0 lg:relative lg:bottom-2">Payment Method</h2> 107 107 {isLoading 108 108 ? <Skeleton className="h-12 w-full" /> 109 109 : ··· 147 147 const path = getPortalPath(data); 148 148 149 149 return ( 150 - <Button asChild> 150 + <Button 151 + asChild 152 + className="w-full md:w-auto" 153 + > 151 154 <Link href={data.portalUrl + "/" + path}> 152 155 {path?.split("/").pop()?.replace(/^\w/, (char) => char.toUpperCase()) || "Manage"} 153 156 </Link> ··· 203 206 204 207 return ( 205 208 <MultiSelectMenu 206 - className="w-full md:w-1/3" 209 + className="w-full md:w-1/2 lg:w-1/3" 207 210 name="Premium Guilds" 208 211 url="/users/@me/billing/premium-guilds" 209 212 dataName="guildIds" ··· 294 297 <p className="text-sm text-neutral-500">You{"'"}ll recieve an invoice via email.</p> 295 298 </div> 296 299 297 - <span className="text-xl font-medium text-neutral-100">${dueToday.toFixed(2)}</span> 300 + <span className="text-xl font-medium text-neutral-100">€{dueToday.toFixed(2)}</span> 298 301 </div> 299 302 )} 300 303 ··· 304 307 <p className="text-sm text-neutral-500">The total amount you will be charged monthly.</p> 305 308 </div> 306 309 307 - <span className="text-xl font-medium text-neutral-100">${(donation + 4).toFixed(2)}</span> 310 + <span className="text-xl font-medium text-neutral-100">€{(donation + 4).toFixed(2)}</span> 308 311 </div> 309 312 </p> 310 313
+13 -13
bun.lock
··· 245 245 246 246 "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.7", "", { "dependencies": { "@emnapi/core": "^1.3.1", "@emnapi/runtime": "^1.3.1", "@tybys/wasm-util": "^0.9.0" } }, "sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw=="], 247 247 248 - "@next/env": ["@next/env@15.4.1", "", {}, "sha512-DXQwFGAE2VH+f2TJsKepRXpODPU+scf5fDbKOME8MMyeyswe4XwgRdiiIYmBfkXU+2ssliLYznajTrOQdnLR5A=="], 248 + "@next/env": ["@next/env@15.4.2", "", {}, "sha512-kd7MvW3pAP7tmk1NaiX4yG15xb2l4gNhteKQxt3f+NGR22qwPymn9RBuv26QKfIKmfo6z2NpgU8W2RT0s0jlvg=="], 249 249 250 - "@next/eslint-plugin-next": ["@next/eslint-plugin-next@15.4.1", "", { "dependencies": { "fast-glob": "3.3.1" } }, "sha512-lQnHUxN7mMksK7IxgKDIXNMWFOBmksVrjamMEURXiYfo7zgsc30lnU8u4y/MJktSh+nB80ktTQeQbWdQO6c8Ow=="], 250 + "@next/eslint-plugin-next": ["@next/eslint-plugin-next@15.4.2", "", { "dependencies": { "fast-glob": "3.3.1" } }, "sha512-k0rjdWjXBY6tAOty1ckrMETE6Mx66d85NsgcAIdDp7/cXOsTJ93ywmbg3uUcpxX5TUHFEcCWI5mb8nPhwCe9jg=="], 251 251 252 - "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.4.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-L+81yMsiHq82VRXS2RVq6OgDwjvA4kDksGU8hfiDHEXP+ncKIUhUsadAVB+MRIp2FErs/5hpXR0u2eluWPAhig=="], 252 + "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.4.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ovqjR8NjCBdBf1U+R/Gvn0RazTtXS9n6wqs84iFaCS1NHbw9ksVE4dfmsYcLoyUVd9BWE0bjkphOWrrz8uz/uw=="], 253 253 254 - "@next/swc-darwin-x64": ["@next/swc-darwin-x64@15.4.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-jfz1RXu6SzL14lFl05/MNkcN35lTLMJWPbqt7Xaj35+ZWAX342aePIJrN6xBdGeKl6jPXJm0Yqo3Xvh3Gpo3Uw=="], 254 + "@next/swc-darwin-x64": ["@next/swc-darwin-x64@15.4.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-I8d4W7tPqbdbHRI4z1iBfaoJIBrEG4fnWKIe+Rj1vIucNZ5cEinfwkBt3RcDF00bFRZRDpvKuDjgMFD3OyRBnw=="], 255 255 256 - "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@15.4.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-k0tOFn3dsnkaGfs6iQz8Ms6f1CyQe4GacXF979sL8PNQxjYS1swx9VsOyUQYaPoGV8nAZ7OX8cYaeiXGq9ahPQ=="], 256 + "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@15.4.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-lvhz02dU3Ec5thzfQ2RCUeOFADjNkS/px1W7MBt7HMhf0/amMfT8Z/aXOwEA+cVWN7HSDRSUc8hHILoHmvajsg=="], 257 257 258 - "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@15.4.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-4ogGQ/3qDzbbK3IwV88ltihHFbQVq6Qr+uEapzXHXBH1KsVBZOB50sn6BWHPcFjwSoMX2Tj9eH/fZvQnSIgc3g=="], 258 + "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@15.4.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-v+5PPfL8UP+KKHS3Mox7QMoeFdMlaV0zeNMIF7eLC4qTiVSO0RPNnK0nkBZSD5BEkkf//c+vI9s/iHxddCZchA=="], 259 259 260 - "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@15.4.1", "", { "os": "linux", "cpu": "x64" }, "sha512-Jj0Rfw3wIgp+eahMz/tOGwlcYYEFjlBPKU7NqoOkTX0LY45i5W0WcDpgiDWSLrN8KFQq/LW7fZq46gxGCiOYlQ=="], 260 + "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@15.4.2", "", { "os": "linux", "cpu": "x64" }, "sha512-PHLYOC9W2cu6I/JEKo77+LW4uPNvyEQiSkVRUQPsOIsf01PRr8PtPhwtz3XNnC9At8CrzPkzqQ9/kYDg4R4Inw=="], 261 261 262 - "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@15.4.1", "", { "os": "linux", "cpu": "x64" }, "sha512-9WlEZfnw1vFqkWsTMzZDgNL7AUI1aiBHi0S2m8jvycPyCq/fbZjtE/nDkhJRYbSjXbtRHYLDBlmP95kpjEmJbw=="], 262 + "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@15.4.2", "", { "os": "linux", "cpu": "x64" }, "sha512-lpmUF9FfLFns4JbTu+5aJGA8aR9dXaA12eoNe9CJbVkGib0FDiPa4kBGTwy0xDxKNGlv3bLDViyx1U+qafmuJQ=="], 263 263 264 - "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@15.4.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-WodRbZ9g6CQLRZsG3gtrA9w7Qfa9BwDzhFVdlI6sV0OCPq9JrOrJSp9/ioLsezbV8w9RCJ8v55uzJuJ5RgWLZg=="], 264 + "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@15.4.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-aMjogoGnRepas0LQ/PBPsvvUzj+IoXw2IoDSEShEtrsu2toBiaxEWzOQuPZ8nie8+1iF7TA63S7rlp3YWAjNEg=="], 265 265 266 - "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.4.1", "", { "os": "win32", "cpu": "x64" }, "sha512-y+wTBxelk2xiNofmDOVU7O5WxTHcvOoL3srOM0kxTzKDjQ57kPU0tpnPJ/BWrRnsOwXEv0+3QSbGR7hY4n9LkQ=="], 266 + "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.4.2", "", { "os": "win32", "cpu": "x64" }, "sha512-FxwauyexSFu78wEqR/+NB9MnqXVj6SxJKwcVs2CRjeSX/jBagDCgtR2W36PZUYm0WPgY1pQ3C1+nn7zSnwROuw=="], 267 267 268 268 "@nextui-org/accordion": ["@nextui-org/accordion@2.2.7", "", { "dependencies": { "@nextui-org/aria-utils": "2.2.7", "@nextui-org/divider": "2.2.5", "@nextui-org/dom-animation": "2.1.1", "@nextui-org/framer-utils": "2.1.6", "@nextui-org/react-utils": "2.1.3", "@nextui-org/shared-icons": "2.1.1", "@nextui-org/shared-utils": "2.1.2", "@nextui-org/use-aria-accordion": "2.2.2", "@react-aria/button": "3.11.0", "@react-aria/focus": "3.19.0", "@react-aria/interactions": "3.22.5", "@react-aria/utils": "3.26.0", "@react-stately/tree": "3.8.6", "@react-types/accordion": "3.0.0-alpha.25", "@react-types/shared": "3.26.0" }, "peerDependencies": { "@nextui-org/system": ">=2.4.0", "@nextui-org/theme": ">=2.4.0", "framer-motion": ">=11.5.6 || >=12.0.0-alpha.1", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "sha512-jdobOwUxSi617m+LpxHFzg64UhDuOfDJI2CMk3MP+b2WBJ7SNW4hmN2NW5Scx5JiY+kyBGmlxJ4Y++jZpZgQjQ=="], 269 269 ··· 705 705 706 706 "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], 707 707 708 - "@types/node": ["@types/node@22.16.4", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-PYRhNtZdm2wH/NT2k/oAJ6/f2VD2N2Dag0lGlx2vWgMSJXGNmlce5MiTQzoWAiIJtso30mjnfQCOKVH+kAQC/g=="], 708 + "@types/node": ["@types/node@22.16.5", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-bJFoMATwIGaxxx8VJPeM8TonI8t579oRvgAuT8zFugJsJZgzqv0Fu8Mhp68iecjzG7cnN3mO2dJQ5uUM2EFrgQ=="], 709 709 710 710 "@types/react": ["@types/react@19.1.8", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g=="], 711 711 ··· 1009 1009 1010 1010 "eslint": ["eslint@9.31.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.3.0", "@eslint/core": "^0.15.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.31.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ=="], 1011 1011 1012 - "eslint-config-next": ["eslint-config-next@15.4.1", "", { "dependencies": { "@next/eslint-plugin-next": "15.4.1", "@rushstack/eslint-patch": "^1.10.3", "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.37.0", "eslint-plugin-react-hooks": "^5.0.0" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", "typescript": ">=3.3.1" }, "optionalPeers": ["typescript"] }, "sha512-XIIN+lq8XuSwXUrcv+0uHMDFGJFPxLAw04/a4muFZYygSvStvVa15nY7kh4Il6yOVJyxdMUyVdQ9ApGedaeupw=="], 1012 + "eslint-config-next": ["eslint-config-next@15.4.2", "", { "dependencies": { "@next/eslint-plugin-next": "15.4.2", "@rushstack/eslint-patch": "^1.10.3", "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.37.0", "eslint-plugin-react-hooks": "^5.0.0" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", "typescript": ">=3.3.1" }, "optionalPeers": ["typescript"] }, "sha512-rAeZyTWn1/36Y+S+KpJ/W+RAUmM6fpBWsON4Uci+5l9DIKrhkMK0rgAZQ45ktx+xFk5tyYwkTBGit/9jalsHrw=="], 1013 1013 1014 1014 "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="], 1015 1015 ··· 1443 1443 1444 1444 "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], 1445 1445 1446 - "next": ["next@15.4.1", "", { "dependencies": { "@next/env": "15.4.1", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.4.1", "@next/swc-darwin-x64": "15.4.1", "@next/swc-linux-arm64-gnu": "15.4.1", "@next/swc-linux-arm64-musl": "15.4.1", "@next/swc-linux-x64-gnu": "15.4.1", "@next/swc-linux-x64-musl": "15.4.1", "@next/swc-win32-arm64-msvc": "15.4.1", "@next/swc-win32-x64-msvc": "15.4.1", "sharp": "^0.34.3" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-eNKB1q8C7o9zXF8+jgJs2CzSLIU3T6bQtX6DcTnCq1sIR1CJ0GlSyRs1BubQi3/JgCnr9Vr+rS5mOMI38FFyQw=="], 1446 + "next": ["next@15.4.2", "", { "dependencies": { "@next/env": "15.4.2", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.4.2", "@next/swc-darwin-x64": "15.4.2", "@next/swc-linux-arm64-gnu": "15.4.2", "@next/swc-linux-arm64-musl": "15.4.2", "@next/swc-linux-x64-gnu": "15.4.2", "@next/swc-linux-x64-musl": "15.4.2", "@next/swc-win32-arm64-msvc": "15.4.2", "@next/swc-win32-x64-msvc": "15.4.2", "sharp": "^0.34.3" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-oH1rmFso+84NIkocfuxaGKcXIjMUTmnzV2x0m8qsYtB4gD6iflLMESXt5XJ8cFgWMBei4v88rNr/j+peNg72XA=="], 1447 1447 1448 1448 "next-client-cookies": ["next-client-cookies@2.1.0", "", { "dependencies": { "js-cookie": "^3.0.5" }, "peerDependencies": { "next": ">= 15.0.0", "react": ">= 16.8.0" } }, "sha512-kC4xPjPi4H+n2qhMNfArG++FTg0fPe7eykJ2o15hbVudHMvMpXMmZYvnqHaCnisTZuRl1DqZPlwwercO1r5jDA=="], 1449 1449
+4 -4
package.json
··· 34 34 "discord-api-types": "^0.38.16", 35 35 "framer-motion": "12.16.0", 36 36 "lucide-react": "^0.513.0", 37 - "next": "^15.4.1", 37 + "next": "^15.4.2", 38 38 "next-client-cookies": "^2.1.0", 39 39 "postcss": "^8.5.6", 40 40 "react": "19.1.0", ··· 55 55 "zustand": "^5.0.6" 56 56 }, 57 57 "devDependencies": { 58 - "@next/eslint-plugin-next": "^15.4.1", 58 + "@next/eslint-plugin-next": "^15.4.2", 59 59 "@octokit/types": "^14.1.0", 60 60 "@stylistic/eslint-plugin": "^4.4.1", 61 - "@types/node": "^22.16.4", 61 + "@types/node": "^22.16.5", 62 62 "@types/react": "^19.1.8", 63 63 "@types/react-dom": "^19.1.6", 64 64 "eslint": "^9.31.0", 65 - "eslint-config-next": "^15.4.1", 65 + "eslint-config-next": "^15.4.2", 66 66 "eslint-plugin-path-alias": "^2.1.0", 67 67 "eslint-plugin-react": "^7.37.5", 68 68 "eslint-plugin-react-compiler": "19.1.0-rc.2",