this repo has no description
0
fork

Configure Feed

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

feat: confetti

+20
+2
package.json
··· 16 16 "@neondatabase/serverless": "^1.0.2", 17 17 "@vercel/blob": "^2.2.0", 18 18 "better-auth": "^1.4.18", 19 + "canvas-confetti": "^1.9.4", 19 20 "class-variance-authority": "^0.7.1", 20 21 "clsx": "^2.1.1", 21 22 "date-fns": "^4.1.0", ··· 33 34 "devDependencies": { 34 35 "@biomejs/biome": "2.3.15", 35 36 "@tailwindcss/postcss": "^4.1.18", 37 + "@types/canvas-confetti": "^1.9.0", 36 38 "@types/node": "^25.2.3", 37 39 "@types/nodemailer": "^7.0.9", 38 40 "@types/react": "^19.2.14",
+16
pnpm-lock.yaml
··· 26 26 better-auth: 27 27 specifier: ^1.4.18 28 28 version: 1.4.18(drizzle-kit@0.31.9)(drizzle-orm@0.45.1(@neondatabase/serverless@1.0.2)(@types/pg@8.16.0)(kysely@0.28.11))(next@16.1.6(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) 29 + canvas-confetti: 30 + specifier: ^1.9.4 31 + version: 1.9.4 29 32 class-variance-authority: 30 33 specifier: ^0.7.1 31 34 version: 0.7.1 ··· 72 75 '@tailwindcss/postcss': 73 76 specifier: ^4.1.18 74 77 version: 4.1.18 78 + '@types/canvas-confetti': 79 + specifier: ^1.9.0 80 + version: 1.9.0 75 81 '@types/node': 76 82 specifier: ^25.2.3 77 83 version: 25.2.3 ··· 1241 1247 '@ts-morph/common@0.27.0': 1242 1248 resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==} 1243 1249 1250 + '@types/canvas-confetti@1.9.0': 1251 + resolution: {integrity: sha512-aBGj/dULrimR1XDZLtG9JwxX1b4HPRF6CX9Yfwh3NvstZEm1ZL7RBnel4keCPSqs1ANRu1u2Aoz9R+VmtjYuTg==} 1252 + 1244 1253 '@types/node@22.19.11': 1245 1254 resolution: {integrity: sha512-BH7YwL6rA93ReqeQS1c4bsPpcfOmJasG+Fkr6Y59q83f9M1WcBRHR2vM+P9eOisYRcN3ujQoiZY8uk5W+1WL8w==} 1246 1255 ··· 1439 1448 1440 1449 caniuse-lite@1.0.30001769: 1441 1450 resolution: {integrity: sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==} 1451 + 1452 + canvas-confetti@1.9.4: 1453 + resolution: {integrity: sha512-yxQbJkAVrFXWNbTUjPqjF7G+g6pDotOUHGbkZq2NELZUMDpiJ85rIEazVb8GTaAptNW2miJAXbs1BtioA251Pw==} 1442 1454 1443 1455 chalk@5.6.2: 1444 1456 resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} ··· 3756 3768 minimatch: 10.2.0 3757 3769 path-browserify: 1.0.1 3758 3770 3771 + '@types/canvas-confetti@1.9.0': {} 3772 + 3759 3773 '@types/node@22.19.11': 3760 3774 dependencies: 3761 3775 undici-types: 6.21.0 ··· 3923 3937 callsites@3.1.0: {} 3924 3938 3925 3939 caniuse-lite@1.0.30001769: {} 3940 + 3941 + canvas-confetti@1.9.4: {} 3926 3942 3927 3943 chalk@5.6.2: {} 3928 3944
+2
src/components/group.tsx
··· 13 13 } from "@hugeicons/core-free-icons"; 14 14 import { HugeiconsIcon } from "@hugeicons/react"; 15 15 import type { User } from "better-auth"; 16 + import confetti from "canvas-confetti"; 16 17 import { formatDistanceToNow } from "date-fns"; 17 18 import Link from "next/link"; 18 19 import { useState } from "react"; ··· 314 315 <Button 315 316 onClick={(e) => { 316 317 e.preventDefault(); 318 + confetti(); 317 319 redeemVoucher(voucher.id).then(async (res) => { 318 320 if (!res) return; 319 321 setRedemptions((prevRedemptions) => [